X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_policy_module%2Ftests%2Fintegration%2Ftest_policy_agent.py;h=9fe5e2ad62758359329feb29c0891c1fd0f0580d;hb=7ce998f3da2c7f10d95508ff2f410075ae2a8757;hp=4de0dbbdd5ff498cebdf807edc11967dff43a9a5;hpb=7f11ecff803667fb5cd0e79389eece83ddc96c86;p=osm%2FPOL.git diff --git a/osm_policy_module/tests/integration/test_policy_agent.py b/osm_policy_module/tests/integration/test_policy_agent.py index 4de0dbb..9fe5e2a 100644 --- a/osm_policy_module/tests/integration/test_policy_agent.py +++ b/osm_policy_module/tests/integration/test_policy_agent.py @@ -21,7 +21,9 @@ # 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 @@ -29,12 +31,15 @@ from unittest.mock import patch, Mock from kafka import KafkaProducer from osm_common.dbmongo import DbMongo -from osm_policy_module.core import database -from peewee import SqliteDatabase +from playhouse.db_url import connect +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 ScalingRecord, ScalingAlarm, BaseModel +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 @@ -48,43 +53,7 @@ nsr_record_mock = { "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": { @@ -109,7 +78,40 @@ nsr_record_mock = { "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", @@ -259,120 +261,171 @@ vnfr_record_mocks = [ } ]}] -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, @@ -399,29 +452,30 @@ vnfd_record_mock = { } } -test_db = SqliteDatabase(':memory:') - -MODELS = [ScalingRecord, 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(PolicyModuleAgent, '_get_vnfd') - @patch.object(PolicyModuleAgent, '_get_nsr') - @patch.object(PolicyModuleAgent, '_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]: @@ -429,7 +483,14 @@ class PolicyModuleAgentTest(unittest.TestCase): 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 @@ -437,19 +498,74 @@ class PolicyModuleAgentTest(unittest.TestCase): 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_vnfd-VM', + vdu_name='cirros_ns-1-cirros_vnfd-VM-1', vnf_member_index='1') - scaling_record = ScalingRecord.get() + 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', + threshold=80, + 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') - self.assertIsNotNone(scaling_record) + + @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__':