X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Ftests%2Ftest_instance_topics.py;h=2ad596d87b73f53c98b917b28376db356ed72715;hp=8efb1f9dc17dbcd28ced7ce76be6b1ab57b62953;hb=c9c0339dee11c893b35e9eb05098554dbda751a3;hpb=5758955b7b394517ff5caf5506a4400cdc5aa372 diff --git a/osm_nbi/tests/test_instance_topics.py b/osm_nbi/tests/test_instance_topics.py index 8efb1f9..2ad596d 100644 --- a/osm_nbi/tests/test_instance_topics.py +++ b/osm_nbi/tests/test_instance_topics.py @@ -15,6 +15,7 @@ # contact: esousa@whitestack.com or alfonso.tiernosepulveda@telefonica.com ## +from contextlib import contextmanager import unittest from time import time from unittest.mock import Mock, mock_open # patch, MagicMock @@ -23,6 +24,7 @@ from osm_nbi.engine import EngineException from osm_common.dbmemory import DbMemory from osm_common.fsbase import FsBase from osm_common.msgbase import MsgBase +from osm_common import dbbase from http import HTTPStatus from osm_nbi.instance_topics import NsLcmOpTopic, NsrTopic from osm_nbi.tests.test_db_descriptors import ( @@ -55,7 +57,6 @@ class TestNsLcmOpTopic(unittest.TestCase): self.db.create_list("vnfrs", yaml.load(db_vnfrs_text, Loader=yaml.Loader)) self.db.create_list("nsrs", yaml.load(db_nsrs_text, Loader=yaml.Loader)) self.db.create = Mock(return_value="created_id") - self.db.set_one = Mock(return_value={"updated": 1}) self.nsd = self.db.get_list("nsds")[0] self.nsd_id = self.nsd["_id"] self.nsr = self.db.get_list("nsrs")[0] @@ -66,6 +67,7 @@ class TestNsLcmOpTopic(unittest.TestCase): self.vim_id = self.vim["_id"] def test_create_instantiate(self): + self.db.set_one = Mock(return_value={"updated": 1}) session = { "force": False, "admin": False, @@ -226,6 +228,201 @@ class TestNsLcmOpTopic(unittest.TestCase): "Engine exception bad http_code with {}".format(indata_copy), ) + def test_update_remove_vnf(self): + vnfr_id = self.db.get_list("vnfrs")[0]["_id"] + session = {} + self.db.set_one( + "nsrs", + {"_id": self.nsr_id}, + {"_admin.nsState": "INSTANTIATED"}, + ) + indata = { + "lcmOperationType": "update", + "updateType": "REMOVE_VNF", + "nsInstanceId": self.nsr_id, + "removeVnfInstanceId": vnfr_id + } + + session = { + "force": False, + "admin": False, + "public": False, + "project_id": [self.nsr_project], + "method": "write", + } + rollback = [] + headers = {} + + nslcmop_id, _ = self.nslcmop_topic.new( + rollback, session, indata, kwargs=None, headers=headers + ) + + self.assertEqual( + self.db.create.call_count, + 1, + "database create not called, or called more than once", + ) + _call = self.db.create.call_args_list[0] + self.assertEqual( + _call[0][0], "nslcmops", "nslcmops entry must be created at database" + ) + created_nslcmop = _call[0][1] + self.assertEqual( + self.nsr_id, + created_nslcmop["nsInstanceId"], + "mismatch between nsId '_id' in created nslcmop and database nsr", + ) + self.assertTrue( + created_nslcmop["lcmOperationType"] == "update", + "Database record must contain 'lcmOperationType=update'", + ) + self.assertTrue( + created_nslcmop["operationParams"]["updateType"] == "REMOVE_VNF", + "Database record must contain 'updateType=REMOVE_VNF'", + ) + + +class TestNsLcmOpTopicWithMock(unittest.TestCase): + def setUp(self): + self.db = Mock(dbbase.DbBase()) + self.fs = Mock(FsBase()) + self.fs.get_params.return_value = {"./fake/folder"} + self.fs.file_open = mock_open() + self.msg = Mock(MsgBase()) + # create class + self.nslcmop_topic = NsLcmOpTopic(self.db, self.fs, self.msg, None) + + def test_get_vnfd_from_vnf_member_revision(self): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader)[0] + test_vnfd = yaml.load(db_vnfds_text, Loader=yaml.Loader) + self.db.get_one.side_effect = [test_vnfr, test_vnfd] + vnfr = self.nslcmop_topic._get_vnfd_from_vnf_member_index("1", test_vnfr['_id']) + self.assertEqual(self.db.get_one.call_args_list[0][0][0], 'vnfrs', "Incorrect first DB lookup") + self.assertEqual(self.db.get_one.call_args_list[1][0][0], 'vnfds', "Incorrect second DB lookup") + + def test_get_vnfd_from_vnf_member_no_revision(self): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader)[0] + test_vnfr['revision'] = 3 + test_vnfd = yaml.load(db_vnfds_text, Loader=yaml.Loader) + self.db.get_one.side_effect = [test_vnfr, test_vnfd] + vnfr = self.nslcmop_topic._get_vnfd_from_vnf_member_index("1", test_vnfr['_id']) + self.assertEqual(self.db.get_one.call_args_list[0][0][0], 'vnfrs', "Incorrect first DB lookup") + self.assertEqual(self.db.get_one.call_args_list[1][0][0], 'vnfds_revisions', "Incorrect second DB lookup") + + @contextmanager + def assertNotRaises(self, exception_type): + try: + yield None + except exception_type: + raise self.failureException("{} raised".format(exception_type.__name__)) + + def test_check_ns_update_operation(self): + self.db = DbMemory() + self.nslcmop_topic = NsLcmOpTopic(self.db, self.fs, self.msg, None) + session = {} + + with self.subTest(i=1, t="VNF instance does not belong to NS"): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader) + test_vnfr[0]["revision"] = 2 + test_nsr = yaml.load(db_nsrs_text, Loader=yaml.Loader) + test_nsr[0]["constituent-vnfr-ref"][ + 0 + ] = "99d90b0c-faff-4b9f-bccd-017f33985984" + self.db.create_list("vnfrs", test_vnfr) + self.db.create_list("nsrs", test_nsr) + nsrs = self.db.get_list("nsrs")[0] + indata = { + "updateType": "CHANGE_VNFPKG", + "changeVnfPackageData": { + "vnfInstanceId": "88d90b0c-faff-4b9f-bccd-017f33985984", + "vnfdId": "7637bcf8-cf14-42dc-ad70-c66fcf1e6e77", + }, + "nsInstanceId": "f48163a6-c807-47bc-9682-f72caef5af85", + } + with self.assertRaises(EngineException) as expected_exception: + self.nslcmop_topic._check_ns_operation(session, nsrs, "update", indata) + self.assertEqual( + str(expected_exception.exception), + "Error in validating ns-update request: vnf 88d90b0c-faff-4b9f-bccd-017f33985984" + " does not belong to NS f48163a6-c807-47bc-9682-f72caef5af85", + ) + + with self.subTest(i=2, t="Ns update request validated with no exception"): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader) + test_vnfr[0]["revision"] = 2 + test_nsr = yaml.load(db_nsrs_text, Loader=yaml.Loader) + self.db.create_list("vnfrs", test_vnfr) + self.db.create_list("nsrs", test_nsr) + nsrs = self.db.get_list("nsrs")[1] + indata = { + "updateType": "CHANGE_VNFPKG", + "changeVnfPackageData": { + "vnfInstanceId": "88d90b0c-faff-4b9f-bccd-017f33985984", + "vnfdId": "7637bcf8-cf14-42dc-ad70-c66fcf1e6e77", + }, + "nsInstanceId": "f48163a6-c807-47bc-9682-f72caef5af85", + } + with self.assertNotRaises(EngineException): + self.nslcmop_topic._check_ns_operation(session, nsrs, "update", indata) + + with self.subTest( + i=3, t="Ns update request rejected because of too small timeout" + ): + indata = { + "updateType": "CHANGE_VNFPKG", + "changeVnfPackageData": { + "vnfInstanceId": "88d90b0c-faff-4b9f-bccd-017f33985984", + "vnfdId": "7637bcf8-cf14-42dc-ad70-c66fcf1e6e77", + }, + "nsInstanceId": "f48163a6-c807-47bc-9682-f72caef5af85", + "timeout_ns_update": 50, + } + with self.assertRaises(EngineException) as expected_exception: + self.nslcmop_topic._check_ns_operation(session, nsrs, "update", indata) + self.assertEqual( + str(expected_exception.exception), + "Error in validating ns-update request: 50 second is not enough " + "to upgrade the VNF instance: 88d90b0c-faff-4b9f-bccd-017f33985984", + ) + + with self.subTest(i=4, t="wrong vnfdid is given as an update parameter"): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader) + test_vnfr[0]["revision"] = 2 + test_nsr = yaml.load(db_nsrs_text, Loader=yaml.Loader) + self.db.create_list("vnfrs", test_vnfr) + self.db.create_list("nsrs", test_nsr) + nsrs = self.db.get_list("nsrs")[2] + indata = { + "updateType": "CHANGE_VNFPKG", + "changeVnfPackageData": { + "vnfInstanceId": "88d90b0c-faff-4b9f-bccd-017f33985984", + "vnfdId": "9637bcf8-cf14-42dc-ad70-c66fcf1e6e77", + }, + "nsInstanceId": "f48163a6-c807-47bc-9682-f72caef5af85", + } + with self.assertRaises(EngineException) as expected_exception: + self.nslcmop_topic._check_ns_operation(session, nsrs, "update", indata) + self.assertEqual( + str(expected_exception.exception), + "Error in validating ns-update request: vnfd-id 9637bcf8-cf14-42dc-ad70-c66fcf1e6e77 does not " + "match with the vnfd-id: 7637bcf8-cf14-42dc-ad70-c66fcf1e6e77 of " + "VNF instance: 88d90b0c-faff-4b9f-bccd-017f33985984", + ) + + with self.subTest(i=5, t="Ns update REMOVE_VNF request validated with no exception"): + test_vnfr = yaml.load(db_vnfrs_text, Loader=yaml.Loader) + test_vnfr[0]["revision"] = 2 + test_nsr = yaml.load(db_nsrs_text, Loader=yaml.Loader) + self.db.create_list("vnfrs", test_vnfr) + self.db.create_list("nsrs", test_nsr) + nsrs = self.db.get_list("nsrs")[1] + indata = { + "updateType": "REMOVE_VNF", + "removeVnfInstanceId": "88d90b0c-faff-4b9f-bccd-017f33985984", + "nsInstanceId": "f48163a6-c807-47bc-9682-f72caef5af85", + } + with self.assertNotRaises(EngineException): + self.nslcmop_topic._check_ns_operation(session, nsrs, "update", indata) class TestNsrTopic(unittest.TestCase): def setUp(self): @@ -334,6 +531,19 @@ class TestNsrTopic(unittest.TestCase): self.assertEqual( len(created_vnfrs), 2, "created a mismatch number of vnfr at database" ) + + self.assertEqual( + created_vnfrs[0]["vdur"][0]["interfaces"][0]["position"], + 1, + "vdur first interface position does not match", + ) + + self.assertEqual( + created_vnfrs[0]["vdur"][0]["interfaces"][1]["position"], + 2, + "vdur second interface position does not match", + ) + self.assertEqual( len(created_nsrs), 1, "Only one nsrs must be created at database" )