# For those usages not covered by the Apache License, Version 2.0 please
# contact: bdiaz@whitestack.com or glavado@whitestack.com
##
+import asyncio
import logging
+import os
import sys
import unittest
import uuid
from kafka import KafkaProducer
from osm_common.dbmongo import DbMongo
-from peewee import SqliteDatabase
+from playhouse.db_url import connect
-from osm_policy_module.common.db_client import DbClient
+from osm_policy_module.common.common_db_client import CommonDbClient
from osm_policy_module.common.mon_client import MonClient
from osm_policy_module.core import database
from osm_policy_module.core.agent import PolicyModuleAgent
-from osm_policy_module.core.database import ScalingGroup, ScalingAlarm, ScalingPolicy, ScalingCriteria
+from osm_policy_module.core.config import Config
+from osm_policy_module.core.database import ScalingGroup, ScalingAlarm, ScalingPolicy, ScalingCriteria, VnfAlarm, \
+ AlarmAction
log = logging.getLogger()
log.level = logging.INFO
"ssh-authorized-key": None,
"name-ref": "cirros_ns",
"nsd": {
- "name": "cirros_vdu_scaling_ns",
"_id": "d7c8bd3c-eb39-4514-8847-19f01345524f",
- "vld": [
- {
- "id": "cirros_nsd_vld1",
- "name": "cirros_nsd_vld1",
- "type": "ELAN",
- "mgmt-network": "true",
- "vnfd-connection-point-ref": [
- {
- "vnfd-id-ref": "cirros_vdu_scaling_vnf",
- "member-vnf-index-ref": 1,
- "vnfd-connection-point-ref": "eth0"
- },
- {
- "vnfd-id-ref": "cirros_vdu_scaling_vnf",
- "member-vnf-index-ref": 2,
- "vnfd-connection-point-ref": "eth0"
- }
- ]
- }
- ],
- "vendor": "OSM",
- "constituent-vnfd": [
- {
- "member-vnf-index": "1",
- "vnfd-id-ref": "cirros_vdu_scaling_vnf"
- },
- {
- "member-vnf-index": "2",
- "vnfd-id-ref": "cirros_vdu_scaling_vnf"
- }
- ],
- "version": "1.0",
- "id": "cirros_vdu_scaling_ns",
- "description": "Simple NS example with a cirros_vdu_scaling_vnf",
- "logo": "osm.png",
"_admin": {
"created": 1535392246.499733,
"userDefinedData": {
"admin"
]
},
- "short-name": "cirros_vdu_scaling_ns"
+ "id": "cirros_vdu_scaling_ns",
+ "name": "cirros_vdu_scaling_ns",
+ "description": "Simple NS example with a cirros_vdu_scaling_vnf",
+ "designer": "OSM", "version": "1.0",
+ "vnfd-id": ["cirros_vdu_scaling_vnf"],
+ "df": [{
+ "id": "default-df",
+ "vnf-profile": [
+ {
+ "id": "1",
+ "vnfd-id": "cirros_vdu_scaling_vnf",
+ "virtual-link-connectivity": [{
+ "virtual-link-profile-id": "cirros_nsd_vld1",
+ "constituent-cpd-id": [{
+ "constituent-base-element-id": "1",
+ "constituent-cpd-id": "eth0-ext"
+ }]
+ }]
+ }, {
+ "id": "2",
+ "vnfd-id": "cirros_vdu_scaling_vnf",
+ "virtual-link-connectivity": [{
+ "virtual-link-profile-id": "cirros_nsd_vld1",
+ "constituent-cpd-id": [{
+ "constituent-base-element-id": "2",
+ "constituent-cpd-id": "eth0-ext"
+ }]
+ }]
+ }
+ ]
+ }],
+ "virtual-link-desc": [{
+ "id": "cirros_nsd_vld1", "mgmt-network": "true"
+ }]
},
"id": "87776f33-b67c-417a-8119-cb08e4098951",
"config-status": "configured",
}
]}]
-nsd_record_mock = {'name': 'cirros_vdu_scaling_ns',
- 'version': '1.0',
- 'short-name': 'cirros_vdu_scaling_ns',
- 'logo': 'osm.png',
- 'id': 'cirros_vdu_scaling_ns',
- 'description': 'Simple NS example with a cirros_vdu_scaling_vnf',
- 'vendor': 'OSM',
- 'vld': [
- {'name': 'cirros_nsd_vld1',
- 'type': 'ELAN',
- 'id': 'cirros_nsd_vld1',
- 'mgmt-network': 'true',
- 'vnfd-connection-point-ref': [
- {'vnfd-id-ref': 'cirros_vdu_scaling_vnf',
- 'vnfd-connection-point-ref': 'eth0',
- 'member-vnf-index-ref': 1},
- {'vnfd-id-ref': 'cirros_vdu_scaling_vnf',
- 'vnfd-connection-point-ref': 'eth0',
- 'member-vnf-index-ref': 2}]}],
- 'constituent-vnfd': [{'vnfd-id-ref': 'cirros_vdu_scaling_vnf',
- 'member-vnf-index': '1'},
- {'vnfd-id-ref': 'cirros_vdu_scaling_vnf',
- 'member-vnf-index': '2'}]}
+nsd_record_mock = {
+ 'id': 'cirros_vdu_scaling_ns',
+ 'name': 'cirros_vdu_scaling_ns',
+ 'description': 'Simple NS example with a cirros_vdu_scaling_vnf',
+ 'designer': 'OSM',
+ 'version': '1.0',
+ 'vnfd-id': ['cirros_vdu_scaling_vnf'],
+ 'df': [{
+ 'id': 'default-df',
+ 'vnf-profile': [
+ {
+ 'id': '1',
+ 'vnfd-id': 'cirros_vdu_scaling_vnf',
+ 'virtual-link-connectivity': [{
+ 'virtual-link-profile-id': 'cirros_nsd_vld1',
+ 'constituent-cpd-id': [{
+ 'constituent-base-element-id': '1',
+ 'constituent-cpd-id': 'eth0-ext'
+ }]
+ }]
+ }, {
+ 'id': '2',
+ 'vnfd-id': 'cirros_vdu_scaling_vnf',
+ 'virtual-link-connectivity': [{
+ 'virtual-link-profile-id': 'cirros_nsd_vld1',
+ 'constituent-cpd-id': [{
+ 'constituent-base-element-id': '2',
+ 'constituent-cpd-id': 'eth0-ext'
+ }]
+ }]
+ }
+ ]
+ }],
+ 'virtual-link-desc': [{
+ 'id': 'cirros_nsd_vld1',
+ 'mgmt-network': 'true'
+ }]
+}
+
vnfd_record_mock = {
+ 'id': 'cirros_vdu_scaling_vnf',
"_id": "63f44c41-45ee-456b-b10d-5f08fb1796e0",
- "name": "cirros_vdu_scaling_vnf",
- "vendor": "OSM",
- "vdu": [
- {
- "name": "cirros_vnfd-VM",
- "monitoring-param": [
- {
- "id": "cirros_vnfd-VM_memory_util",
- "nfvi-metric": "average_memory_utilization"
- }
- ],
- "vm-flavor": {
- "vcpu-count": 1,
- "memory-mb": 256,
- "storage-gb": 2
- },
- "description": "cirros_vnfd-VM",
- "count": 1,
- "id": "cirros_vnfd-VM",
- "interface": [
- {
- "name": "eth0",
- "external-connection-point-ref": "eth0",
- "type": "EXTERNAL",
- "virtual-interface": {
- "bandwidth": "0",
- "type": "VIRTIO",
- "vpci": "0000:00:0a.0"
- }
- }
- ],
- "image": "cirros034"
- }
- ],
- "monitoring-param": [
- {
- "id": "cirros_vnf_memory_util",
- "name": "cirros_vnf_memory_util",
- "aggregation-type": "AVERAGE",
- "vdu-monitoring-param-ref": "cirros_vnfd-VM_memory_util",
- "vdu-ref": "cirros_vnfd-VM"
- }
- ],
- "description": "Simple VNF example with a cirros and a scaling group descriptor",
- "id": "cirros_vdu_scaling_vnf",
- "logo": "cirros-64.png",
- "version": "1.0",
- "connection-point": [
- {
- "name": "eth0",
- "type": "VPORT"
+ 'product-name': 'cirros_vdu_scaling_vnf',
+ 'description': 'Simple VNF example with a cirros and a scaling group descriptor',
+ 'provider': 'OSM',
+ 'version': '1.0',
+ 'mgmt-cp': 'eth0-ext',
+ 'virtual-storage-desc': [{
+ 'id': 'cirros_vnfd-VM-storage',
+ 'size-of-storage': 2
+ }],
+ 'virtual-compute-desc': [{
+ 'id': 'cirros_vnfd-VM-compute',
+ 'virtual-cpu': {
+ 'num-virtual-cpu': 1
+ },
+ 'virtual-memory': {
+ 'size': 0.25
}
- ],
- "mgmt-interface": {
- "cp": "eth0"
- },
- "scaling-group-descriptor": [
- {
- "name": "scale_cirros_vnfd-VM",
- "min-instance-count": 1,
- "vdu": [
- {
- "count": 1,
- "vdu-id-ref": "cirros_vnfd-VM"
- }
- ],
- "max-instance-count": 10,
- "scaling-policy": [
- {
- "name": "auto_memory_util_above_threshold",
- "scaling-type": "automatic",
- "cooldown-time": 60,
- "threshold-time": 10,
- "scaling-criteria": [
- {
- "name": "group1_memory_util_above_threshold",
- "vnf-monitoring-param-ref": "cirros_vnf_memory_util",
- "scale-out-threshold": 80,
- "scale-out-relational-operation": "GT",
- "scale-in-relational-operation": "LT",
- "scale-in-threshold": 20
- }
- ]
- }
- ]
+ }],
+ 'sw-image-desc': [{
+ 'id': 'cirros034',
+ 'name': 'cirros034',
+ 'image': 'cirros034'
+ }],
+ 'vdu': [{
+ 'id': 'cirros_vnfd-VM',
+ 'description': 'cirros_vnfd-VM',
+ 'name': 'cirros_vnfd-VM',
+ 'alarm': [{
+ 'value': 20.0,
+ 'actions': {
+ 'insufficient-data': [{
+ 'url': 'localhost:9090'
+ }],
+ 'ok': [{
+ 'url': 'localhost:9090'
+ }],
+ 'alarm': [{
+ 'url': 'localhost:9090'
+ }]
+ },
+ 'alarm-id': 'alarm-1',
+ 'operation': 'LT',
+ 'vnf-monitoring-param-ref': 'cirros_vnf_memory_util'
+ }],
+ 'sw-image-desc': 'cirros034',
+ 'virtual-compute-desc': 'cirros_vnfd-VM-compute',
+ 'virtual-storage-desc': ['cirros_vnfd-VM-storage'],
+ 'int-cpd': [{
+ 'id': 'eth0-int',
+ 'virtual-network-interface-requirement': [{
+ 'name': 'eth0',
+ 'virtual-interface': {
+ 'bandwidth': '0',
+ 'type': 'VIRTIO',
+ 'vpci': '0000:00:0a.0'}
+ }]
+ }],
+ 'monitoring-parameter': [{
+ 'id': 'cirros_vnf_memory_util',
+ 'name': 'cirros_vnf_memory_util',
+ 'performance-metric': 'average_memory_utilization'
+ }]
+ }],
+ 'df': [{
+ 'id': 'default-df',
+ 'vdu-profile': [{
+ 'id': 'cirros_vnfd-VM',
+ 'min-number-of-instances': 1,
+ 'max-number-of-instances': 10,
+ 'vdu-configuration-id': 'cirros_vnfd-VM-vdu-configuration'
+ }],
+ 'instantiation-level': [{
+ 'id': 'default-instantiation-level',
+ 'vdu-level': [{
+ 'vdu-id': 'cirros_vnfd-VM',
+ 'number-of-instances': 1}]
+ }],
+ 'scaling-aspect': [{
+ 'id': 'scale_cirros_vnfd-VM',
+ 'name': 'scale_cirros_vnfd-VM',
+ 'max-scale-level': 10,
+ 'scaling-policy': [{
+ 'name': 'auto_memory_util_above_threshold',
+ 'scaling-type': 'automatic',
+ 'cooldown-time': 60,
+ 'threshold-time': 10,
+ 'scaling-criteria': [{
+ 'name': 'group1_memory_util_above_threshold',
+ 'vnf-monitoring-param-ref': 'cirros_vnf_memory_util',
+ 'scale-out-threshold': 80,
+ 'scale-out-relational-operation': 'GT',
+ 'scale-in-relational-operation': 'LT',
+ 'scale-in-threshold': 20
+ }]
+ }],
+ 'aspect-delta-details': {
+ 'deltas': [{
+ 'id': 'scale_cirros_vnfd-VM-delta',
+ 'vdu-delta': [{
+ 'number-of-instances': 1,
+ 'id': 'cirros_vnfd-VM'}]
+ }]
+ }
+ }]
+ }],
+ 'ext-cpd': [{
+ 'id': 'eth0-ext',
+ 'int-cpd': {
+ 'vdu-id': 'cirros_vnfd-VM',
+ 'cpd': 'eth0-int'
}
- ],
- "short-name": "cirros_vdu_scaling_vnf",
+ }],
+ 'vdu-configuration': [{
+ 'juju': {
+ 'charm': 'testmetrics',
+ 'proxy': True
+ },
+ 'metrics': [{
+ 'name': 'users'
+ }],
+ 'id': 'cirros_vnfd-VM-vdu-configuration'
+ }],
"_admin": {
"created": 1535392242.6281035,
"modified": 1535392242.6281035,
}
}
-test_db = SqliteDatabase(':memory:')
-
-MODELS = [ScalingGroup, ScalingPolicy, ScalingCriteria, ScalingAlarm]
+MODELS = [ScalingGroup, ScalingPolicy, ScalingCriteria, ScalingAlarm, VnfAlarm, AlarmAction]
class PolicyModuleAgentTest(unittest.TestCase):
def setUp(self):
super()
- database.db = test_db
- test_db.bind(MODELS)
- test_db.connect()
- test_db.drop_tables(MODELS)
- test_db.create_tables(MODELS)
+ database.db.initialize(connect('sqlite:///test_db.sqlite'))
+ database.db.bind(MODELS)
+ database.db.connect()
+ database.db.drop_tables(MODELS)
+ database.db.create_tables(MODELS)
+ database.db.close()
+ self.loop = asyncio.new_event_loop()
def tearDown(self):
super()
+ os.remove('test_db.sqlite')
@patch.object(DbMongo, 'db_connect', Mock())
@patch.object(KafkaProducer, '__init__')
@patch.object(MonClient, 'create_alarm')
- @patch.object(DbClient, 'get_vnfd')
- @patch.object(DbClient, 'get_nsr')
- @patch.object(DbClient, 'get_vnfr')
+ @patch.object(CommonDbClient, 'get_vnfd')
+ @patch.object(CommonDbClient, 'get_nsr')
+ @patch.object(CommonDbClient, 'get_vnfr')
def test_configure_scaling_groups(self, get_vnfr, get_nsr, get_vnfd, create_alarm, kafka_producer_init):
def _test_configure_scaling_groups_get_vnfr(*args, **kwargs):
if '1' in args[1]:
if '2' in args[1]:
return vnfr_record_mocks[1]
- def _test_configure_scaling_groups_create_alarm(*args, **kwargs):
+ def assert_not_called_with(*args, **kwargs):
+ try:
+ create_alarm.assert_called_with(*args, **kwargs)
+ except AssertionError:
+ return
+ raise AssertionError('Expected to not have been called.')
+
+ async def _test_configure_scaling_groups_create_alarm(*args, **kwargs):
return uuid.uuid4()
kafka_producer_init.return_value = None
get_nsr.return_value = nsr_record_mock
get_vnfd.return_value = vnfd_record_mock
create_alarm.side_effect = _test_configure_scaling_groups_create_alarm
- agent = PolicyModuleAgent()
- agent._configure_scaling_groups("test_nsr_id")
+ create_alarm.assert_not_called_with = assert_not_called_with
+ config = Config()
+ agent = PolicyModuleAgent(config, self.loop)
+ self.loop.run_until_complete(agent.autoscaling_service.configure_scaling_groups("test_nsr_id"))
create_alarm.assert_any_call(metric_name='average_memory_utilization',
ns_id='test_nsr_id',
operation='GT',
- statistic='AVERAGE',
threshold=80,
vdu_name='cirros_ns-1-cirros_vnfd-VM-1',
vnf_member_index='1')
- create_alarm.assert_any_call(metric_name='average_memory_utilization',
- ns_id='test_nsr_id',
- operation='LT',
- statistic='AVERAGE',
- threshold=20,
- vdu_name='cirros_ns-1-cirros_vnfd-VM-1',
- vnf_member_index='1')
+ create_alarm.assert_not_called_with(metric_name='average_memory_utilization',
+ ns_id='test_nsr_id',
+ operation='LT',
+ threshold=20,
+ vdu_name='cirros_ns-1-cirros_vnfd-VM-1',
+ vnf_member_index='1')
create_alarm.assert_any_call(metric_name='average_memory_utilization',
ns_id='test_nsr_id',
operation='GT',
- statistic='AVERAGE',
threshold=80,
vdu_name='cirros_ns-2-cirros_vnfd-VM-1',
vnf_member_index='2')
- create_alarm.assert_any_call(metric_name='average_memory_utilization',
- ns_id='test_nsr_id',
- operation='LT',
- statistic='AVERAGE',
- threshold=20,
- vdu_name='cirros_ns-2-cirros_vnfd-VM-1',
- vnf_member_index='2')
+ create_alarm.assert_not_called_with(metric_name='average_memory_utilization',
+ ns_id='test_nsr_id',
+ operation='LT',
+ threshold=20,
+ vdu_name='cirros_ns-2-cirros_vnfd-VM-1',
+ vnf_member_index='2')
scaling_record = ScalingGroup.get()
self.assertEqual(scaling_record.name, 'scale_cirros_vnfd-VM')
self.assertEqual(scaling_record.nsr_id, 'test_nsr_id')
+ @patch.object(DbMongo, 'db_connect', Mock())
+ @patch.object(KafkaProducer, '__init__')
+ @patch.object(MonClient, 'create_alarm')
+ @patch.object(CommonDbClient, 'get_vnfd')
+ @patch.object(CommonDbClient, 'get_nsr')
+ @patch.object(CommonDbClient, 'get_vnfr')
+ def test_configure_vnf_alarms(self, get_vnfr, get_nsr, get_vnfd, create_alarm, kafka_producer_init):
+ def _test_configure_scaling_groups_get_vnfr(*args, **kwargs):
+ if '1' in args[1]:
+ return vnfr_record_mocks[0]
+ if '2' in args[1]:
+ return vnfr_record_mocks[1]
+
+ async def _test_configure_vnf_alarms_create_alarm(*args, **kwargs):
+ return uuid.uuid4()
+
+ kafka_producer_init.return_value = None
+ get_vnfr.side_effect = _test_configure_scaling_groups_get_vnfr
+ get_nsr.return_value = nsr_record_mock
+ get_vnfd.return_value = vnfd_record_mock
+ create_alarm.side_effect = _test_configure_vnf_alarms_create_alarm
+ config = Config()
+ agent = PolicyModuleAgent(config, self.loop)
+ self.loop.run_until_complete(agent.alarming_service.configure_vnf_alarms("test_nsr_id"))
+ create_alarm.assert_any_call(metric_name='average_memory_utilization',
+ ns_id='test_nsr_id',
+ vdu_name='cirros_ns-1-cirros_vnfd-VM-1',
+ vnf_member_index='1',
+ threshold=20.0,
+ operation='LT')
+ create_alarm.assert_any_call(metric_name='average_memory_utilization',
+ ns_id='test_nsr_id',
+ vdu_name='cirros_ns-2-cirros_vnfd-VM-1',
+ vnf_member_index='2',
+ threshold=20.0,
+ operation='LT')
+
if __name__ == '__main__':
unittest.main()