| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 1 | # |
| 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 3 | # not use this file except in compliance with the License. You may obtain |
| 4 | # a copy of the License at |
| 5 | # |
| 6 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 7 | # |
| 8 | # Unless required by applicable law or agreed to in writing, software |
| 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 11 | # License for the specific language governing permissions and limitations |
| 12 | # under the License. |
| 13 | # |
| 14 | # For those usages not covered by the Apache License, Version 2.0 please |
| tierno | c231a87 | 2020-01-21 08:49:05 +0000 | [diff] [blame] | 15 | # contact: alfonso.tiernosepulveda@telefonica.com |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 16 | ## |
| 17 | |
| 18 | |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 19 | import asynctest # pip3 install asynctest --user |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 20 | import asyncio |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 21 | from copy import deepcopy |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 22 | import yaml |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 23 | import copy |
| almagia | cdd20ae | 2024-12-13 09:45:45 +0100 | [diff] [blame] | 24 | from osm_lcm.n2vc.exceptions import N2VCException |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 25 | from os import getenv |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 26 | from osm_lcm import ns |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 27 | from osm_common.msgkafka import MsgKafka |
| Luis Vega | a27dc53 | 2022-11-11 20:10:49 +0000 | [diff] [blame] | 28 | |
| 29 | from osm_lcm.data_utils.lcm_config import LcmCfg |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 30 | from osm_lcm.lcm_utils import TaskRegistry |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 31 | from osm_lcm.ng_ro import NgRoClient |
| 32 | from osm_lcm.data_utils.database.database import Database |
| 33 | from osm_lcm.data_utils.filesystem.filesystem import Filesystem |
| Patricia Reinoso | ceb0386 | 2023-01-12 09:40:53 +0000 | [diff] [blame] | 34 | from osm_lcm.data_utils.vca import Relation, EERelation, DeployedVCA |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 35 | from osm_lcm.data_utils.vnfd import find_software_version |
| 36 | from osm_lcm.lcm_utils import check_juju_bundle_existence, get_charm_artifact_path |
| 37 | from osm_lcm.lcm_utils import LcmException |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 38 | from uuid import uuid4 |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 39 | from unittest.mock import Mock, patch |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 40 | |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 41 | from osm_lcm.tests import test_db_descriptors as descriptors |
| 42 | |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 43 | __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>" |
| 44 | |
| tierno | 7ab529a | 2019-08-30 12:10:17 +0000 | [diff] [blame] | 45 | """ Perform unittests using asynctest of osm_lcm.ns module |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 46 | It allows, if some testing ENV are supplied, testing without mocking some external libraries for debugging: |
| 47 | OSMLCMTEST_NS_PUBKEY: public ssh-key returned by N2VC to inject to VMs |
| tierno | e64f7fb | 2019-09-11 08:55:52 +0000 | [diff] [blame] | 48 | OSMLCMTEST_NS_NAME: change name of NS |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 49 | OSMLCMTEST_PACKAGES_PATH: path where the vnf-packages are stored (de-compressed), each one on a 'vnfd_id' folder |
| 50 | OSMLCMTEST_NS_IPADDRESS: IP address where emulated VMs are reached. Comma separate list |
| tierno | e64f7fb | 2019-09-11 08:55:52 +0000 | [diff] [blame] | 51 | OSMLCMTEST_RO_VIMID: VIM id of RO target vim IP. Obtain it with openmano datcenter-list on RO container |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 52 | OSMLCMTEST_VCA_NOMOCK: Do no mock the VCA, N2VC library, for debugging it |
| 53 | OSMLCMTEST_RO_NOMOCK: Do no mock the ROClient library, for debugging it |
| 54 | OSMLCMTEST_DB_NOMOCK: Do no mock the database library, for debugging it |
| tierno | 7ab529a | 2019-08-30 12:10:17 +0000 | [diff] [blame] | 55 | OSMLCMTEST_FS_NOMOCK: Do no mock the File Storage library, for debugging it |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 56 | OSMLCMTEST_LOGGING_NOMOCK: Do no mock the logging |
| 57 | OSMLCM_VCA_XXX: configuration of N2VC |
| 58 | OSMLCM_RO_XXX: configuration of RO |
| 59 | """ |
| 60 | |
| Luis Vega | a27dc53 | 2022-11-11 20:10:49 +0000 | [diff] [blame] | 61 | lcm_config_dict = { |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 62 | "global": {"loglevel": "DEBUG"}, |
| tierno | 744303e | 2020-01-13 16:46:31 +0000 | [diff] [blame] | 63 | "timeout": {}, |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 64 | "VCA": { # TODO replace with os.get_env to get other configurations |
| tierno | 744303e | 2020-01-13 16:46:31 +0000 | [diff] [blame] | 65 | "host": getenv("OSMLCM_VCA_HOST", "vca"), |
| 66 | "port": getenv("OSMLCM_VCA_PORT", 17070), |
| 67 | "user": getenv("OSMLCM_VCA_USER", "admin"), |
| 68 | "secret": getenv("OSMLCM_VCA_SECRET", "vca"), |
| 69 | "public_key": getenv("OSMLCM_VCA_PUBKEY", None), |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 70 | "ca_cert": getenv("OSMLCM_VCA_CACERT", None), |
| 71 | "apiproxy": getenv("OSMLCM_VCA_APIPROXY", "192.168.1.1"), |
| tierno | 744303e | 2020-01-13 16:46:31 +0000 | [diff] [blame] | 72 | }, |
| Luis Vega | a27dc53 | 2022-11-11 20:10:49 +0000 | [diff] [blame] | 73 | "RO": { |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 74 | "uri": "http://{}:{}/openmano".format( |
| 75 | getenv("OSMLCM_RO_HOST", "ro"), getenv("OSMLCM_RO_PORT", "9090") |
| 76 | ), |
| tierno | 744303e | 2020-01-13 16:46:31 +0000 | [diff] [blame] | 77 | "tenant": getenv("OSMLCM_RO_TENANT", "osm"), |
| 78 | "logger_name": "lcm.ROclient", |
| 79 | "loglevel": "DEBUG", |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 80 | "ng": True, |
| 81 | }, |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 82 | } |
| Luis Vega | a27dc53 | 2022-11-11 20:10:49 +0000 | [diff] [blame] | 83 | |
| 84 | lcm_config = LcmCfg() |
| 85 | lcm_config.set_from_dict(lcm_config_dict) |
| 86 | lcm_config.transform() |
| 87 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 88 | nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 89 | nslcmop_id = descriptors.test_ids["TEST-A"]["update"] |
| 90 | vnfr_id = "6421c7c9-d865-4fb4-9a13-d4275d243e01" |
| 91 | vnfd_id = "7637bcf8-cf14-42dc-ad70-c66fcf1e6e77" |
| 92 | update_fs = Mock(autospec=True) |
| 93 | update_fs.path.__add__ = Mock() |
| 94 | update_fs.path.side_effect = ["/", "/", "/", "/"] |
| 95 | update_fs.sync.side_effect = [None, None] |
| 96 | |
| 97 | |
| 98 | def callable(a): |
| 99 | return a |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 100 | |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 101 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 102 | class TestBaseNS(asynctest.TestCase): |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 103 | async def _n2vc_DeployCharms( |
| 104 | self, |
| 105 | model_name, |
| 106 | application_name, |
| 107 | vnfd, |
| 108 | charm_path, |
| 109 | params={}, |
| 110 | machine_spec={}, |
| 111 | callback=None, |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 112 | *callback_args, |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 113 | ): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 114 | if callback: |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 115 | for status, message in ( |
| 116 | ("maintenance", "installing sofwware"), |
| 117 | ("active", "Ready!"), |
| 118 | ): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 119 | # call callback after some time |
| Gabriel Cuba | e789898 | 2023-05-11 01:57:21 -0500 | [diff] [blame] | 120 | asyncio.sleep(5) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 121 | callback(model_name, application_name, status, message, *callback_args) |
| 122 | |
| 123 | @staticmethod |
| 124 | def _n2vc_FormatApplicationName(*args): |
| 125 | num_calls = 0 |
| 126 | while True: |
| 127 | yield "app_name-{}".format(num_calls) |
| 128 | num_calls += 1 |
| 129 | |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 130 | def _n2vc_CreateExecutionEnvironment( |
| 131 | self, namespace, reuse_ee_id, db_dict, *args, **kwargs |
| 132 | ): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 133 | k_list = namespace.split(".") |
| 134 | ee_id = k_list[1] + "." |
| 135 | if len(k_list) >= 2: |
| 136 | for k in k_list[2:4]: |
| 137 | ee_id += k[:8] |
| 138 | else: |
| 139 | ee_id += "_NS_" |
| tierno | 73d8bd0 | 2019-11-18 17:33:27 +0000 | [diff] [blame] | 140 | return ee_id, {} |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 141 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 142 | def _ro_status(self, *args, **kwargs): |
| 143 | print("Args > {}".format(args)) |
| 144 | print("kwargs > {}".format(kwargs)) |
| elumalai | ca7ece0 | 2022-04-12 12:47:32 +0530 | [diff] [blame] | 145 | if args: |
| 146 | if "update" in args: |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 147 | ro_ns_desc = yaml.safe_load(descriptors.ro_update_action_text) |
| elumalai | ca7ece0 | 2022-04-12 12:47:32 +0530 | [diff] [blame] | 148 | while True: |
| 149 | yield ro_ns_desc |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 150 | if kwargs.get("delete"): |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 151 | ro_ns_desc = yaml.safe_load(descriptors.ro_delete_action_text) |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 152 | while True: |
| 153 | yield ro_ns_desc |
| 154 | |
| garciadeblas | 83132fb | 2022-08-02 17:19:14 +0200 | [diff] [blame] | 155 | ro_ns_desc = yaml.safe_load(descriptors.ro_ns_text) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 156 | |
| 157 | # if ip address provided, replace descriptor |
| 158 | ip_addresses = getenv("OSMLCMTEST_NS_IPADDRESS", "") |
| 159 | if ip_addresses: |
| 160 | ip_addresses_list = ip_addresses.split(",") |
| 161 | for vnf in ro_ns_desc["vnfs"]: |
| 162 | if not ip_addresses_list: |
| 163 | break |
| 164 | vnf["ip_address"] = ip_addresses_list[0] |
| 165 | for vm in vnf["vms"]: |
| 166 | if not ip_addresses_list: |
| 167 | break |
| 168 | vm["ip_address"] = ip_addresses_list.pop(0) |
| 169 | |
| 170 | while True: |
| 171 | yield ro_ns_desc |
| 172 | for net in ro_ns_desc["nets"]: |
| 173 | if net["status"] != "ACTIVE": |
| 174 | net["status"] = "ACTIVE" |
| 175 | break |
| 176 | else: |
| 177 | for vnf in ro_ns_desc["vnfs"]: |
| 178 | for vm in vnf["vms"]: |
| 179 | if vm["status"] != "ACTIVE": |
| 180 | vm["status"] = "ACTIVE" |
| 181 | break |
| 182 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 183 | def _ro_deploy(self, *args, **kwargs): |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 184 | return {"action_id": args[1]["action_id"], "nsr_id": args[0], "status": "ok"} |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 185 | |
| 186 | def _return_uuid(self, *args, **kwargs): |
| 187 | return str(uuid4()) |
| 188 | |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 189 | async def setUp(self): |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 190 | self.mock_db() |
| 191 | self.mock_kafka() |
| 192 | self.mock_filesystem() |
| 193 | self.mock_task_registry() |
| 194 | self.mock_vca_k8s() |
| 195 | self.create_nslcm_class() |
| 196 | self.mock_logging() |
| 197 | self.mock_vca_n2vc() |
| 198 | self.mock_ro() |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 199 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 200 | def mock_db(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 201 | if not getenv("OSMLCMTEST_DB_NOMOCK"): |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 202 | # Cleanup singleton Database instance |
| 203 | Database.instance = None |
| 204 | |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 205 | self.db = Database({"database": {"driver": "memory"}}).instance.db |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 206 | self.db.create_list("vnfds", yaml.safe_load(descriptors.db_vnfds_text)) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 207 | self.db.create_list( |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 208 | "vnfds_revisions", yaml.safe_load(descriptors.db_vnfds_revisions_text) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 209 | ) |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 210 | self.db.create_list("nsds", yaml.safe_load(descriptors.db_nsds_text)) |
| 211 | self.db.create_list("nsrs", yaml.safe_load(descriptors.db_nsrs_text)) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 212 | self.db.create_list( |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 213 | "vim_accounts", yaml.safe_load(descriptors.db_vim_accounts_text) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 214 | ) |
| 215 | self.db.create_list( |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 216 | "k8sclusters", yaml.safe_load(descriptors.db_k8sclusters_text) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 217 | ) |
| 218 | self.db.create_list( |
| garciadeblas | 83132fb | 2022-08-02 17:19:14 +0200 | [diff] [blame] | 219 | "nslcmops", yaml.safe_load(descriptors.db_nslcmops_text) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 220 | ) |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 221 | self.db.create_list("vnfrs", yaml.safe_load(descriptors.db_vnfrs_text)) |
| 222 | self.db_vim_accounts = yaml.safe_load(descriptors.db_vim_accounts_text) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 223 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 224 | def mock_kafka(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 225 | self.msg = asynctest.Mock(MsgKafka()) |
| 226 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 227 | def mock_filesystem(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 228 | if not getenv("OSMLCMTEST_FS_NOMOCK"): |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 229 | self.fs = asynctest.Mock( |
| 230 | Filesystem({"storage": {"driver": "local", "path": "/"}}).instance.fs |
| 231 | ) |
| 232 | self.fs.get_params.return_value = { |
| 233 | "path": getenv("OSMLCMTEST_PACKAGES_PATH", "./test/temp/packages") |
| 234 | } |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 235 | self.fs.file_open = asynctest.mock_open() |
| 236 | # self.fs.file_open.return_value.__enter__.return_value = asynctest.MagicMock() # called on a python "with" |
| 237 | # self.fs.file_open.return_value.__enter__.return_value.read.return_value = "" # empty file |
| 238 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 239 | def mock_task_registry(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 240 | self.lcm_tasks = asynctest.Mock(TaskRegistry()) |
| 241 | self.lcm_tasks.lock_HA.return_value = True |
| 242 | self.lcm_tasks.waitfor_related_HA.return_value = None |
| 243 | self.lcm_tasks.lookfor_related.return_value = ("", []) |
| 244 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 245 | def mock_vca_k8s(self): |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 246 | if not getenv("OSMLCMTEST_VCA_K8s_NOMOCK"): |
| 247 | ns.K8sJujuConnector = asynctest.MagicMock(ns.K8sJujuConnector) |
| Luis Vega | e11384e | 2023-10-10 22:36:33 +0000 | [diff] [blame] | 248 | # ns.K8sHelmConnector = asynctest.MagicMock(ns.K8sHelmConnector) |
| lloretgalleg | 18ebc3a | 2020-10-22 09:54:51 +0000 | [diff] [blame] | 249 | ns.K8sHelm3Connector = asynctest.MagicMock(ns.K8sHelm3Connector) |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 250 | |
| 251 | if not getenv("OSMLCMTEST_VCA_NOMOCK"): |
| 252 | ns.N2VCJujuConnector = asynctest.MagicMock(ns.N2VCJujuConnector) |
| tierno | 588547c | 2020-07-01 15:30:20 +0000 | [diff] [blame] | 253 | ns.LCMHelmConn = asynctest.MagicMock(ns.LCMHelmConn) |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 254 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 255 | def create_nslcm_class(self): |
| Gabriel Cuba | e789898 | 2023-05-11 01:57:21 -0500 | [diff] [blame] | 256 | self.my_ns = ns.NsLcm(self.msg, self.lcm_tasks, lcm_config) |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 257 | self.my_ns.fs = self.fs |
| 258 | self.my_ns.db = self.db |
| tierno | 5ee0205 | 2019-12-05 19:55:02 +0000 | [diff] [blame] | 259 | self.my_ns._wait_dependent_n2vc = asynctest.CoroutineMock() |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 260 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 261 | def mock_logging(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 262 | if not getenv("OSMLCMTEST_LOGGING_NOMOCK"): |
| 263 | self.my_ns.logger = asynctest.Mock(self.my_ns.logger) |
| 264 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 265 | def mock_vca_n2vc(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 266 | if not getenv("OSMLCMTEST_VCA_NOMOCK"): |
| 267 | pub_key = getenv("OSMLCMTEST_NS_PUBKEY", "ssh-rsa test-pub-key t@osm.com") |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 268 | # self.my_ns.n2vc = asynctest.Mock(N2VC()) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 269 | self.my_ns.n2vc.GetPublicKey.return_value = getenv( |
| 270 | "OSMLCM_VCA_PUBKEY", "public_key" |
| 271 | ) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 272 | # allow several versions of n2vc |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 273 | self.my_ns.n2vc.FormatApplicationName = asynctest.Mock( |
| 274 | side_effect=self._n2vc_FormatApplicationName() |
| 275 | ) |
| 276 | self.my_ns.n2vc.DeployCharms = asynctest.CoroutineMock( |
| 277 | side_effect=self._n2vc_DeployCharms |
| 278 | ) |
| tierno | 73d8bd0 | 2019-11-18 17:33:27 +0000 | [diff] [blame] | 279 | self.my_ns.n2vc.create_execution_environment = asynctest.CoroutineMock( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 280 | side_effect=self._n2vc_CreateExecutionEnvironment |
| 281 | ) |
| 282 | self.my_ns.n2vc.install_configuration_sw = asynctest.CoroutineMock( |
| 283 | return_value=pub_key |
| 284 | ) |
| 285 | self.my_ns.n2vc.get_ee_ssh_public__key = asynctest.CoroutineMock( |
| 286 | return_value=pub_key |
| 287 | ) |
| 288 | self.my_ns.n2vc.exec_primitive = asynctest.CoroutineMock( |
| 289 | side_effect=self._return_uuid |
| 290 | ) |
| 291 | self.my_ns.n2vc.exec_primitive = asynctest.CoroutineMock( |
| 292 | side_effect=self._return_uuid |
| 293 | ) |
| 294 | self.my_ns.n2vc.GetPrimitiveStatus = asynctest.CoroutineMock( |
| 295 | return_value="completed" |
| 296 | ) |
| 297 | self.my_ns.n2vc.GetPrimitiveOutput = asynctest.CoroutineMock( |
| 298 | return_value={"result": "ok", "pubkey": pub_key} |
| 299 | ) |
| 300 | self.my_ns.n2vc.delete_execution_environment = asynctest.CoroutineMock( |
| 301 | return_value=None |
| 302 | ) |
| tierno | 73d8bd0 | 2019-11-18 17:33:27 +0000 | [diff] [blame] | 303 | self.my_ns.n2vc.get_public_key = asynctest.CoroutineMock( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 304 | return_value=getenv("OSMLCM_VCA_PUBKEY", "public_key") |
| 305 | ) |
| 306 | self.my_ns.n2vc.delete_namespace = asynctest.CoroutineMock( |
| 307 | return_value=None |
| 308 | ) |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 309 | self.my_ns.n2vc.register_execution_environment = asynctest.CoroutineMock( |
| 310 | return_value="model-name.application-name.k8s" |
| 311 | ) |
| tierno | 3bedc9b | 2019-11-27 15:46:57 +0000 | [diff] [blame] | 312 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 313 | def mock_ro(self): |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 314 | if not getenv("OSMLCMTEST_RO_NOMOCK"): |
| Gabriel Cuba | e789898 | 2023-05-11 01:57:21 -0500 | [diff] [blame] | 315 | self.my_ns.RO = asynctest.Mock(NgRoClient(**lcm_config.RO.to_dict())) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 316 | # TODO first time should be empty list, following should return a dict |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 317 | # self.my_ns.RO.get_list = asynctest.CoroutineMock(self.my_ns.RO.get_list, return_value=[]) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 318 | self.my_ns.RO.deploy = asynctest.CoroutineMock( |
| 319 | self.my_ns.RO.deploy, side_effect=self._ro_deploy |
| 320 | ) |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 321 | # self.my_ns.RO.status = asynctest.CoroutineMock(self.my_ns.RO.status, side_effect=self._ro_status) |
| 322 | # self.my_ns.RO.create_action = asynctest.CoroutineMock(self.my_ns.RO.create_action, |
| 323 | # return_value={"vm-id": {"vim_result": 200, |
| 324 | # "description": "done"}}) |
| 325 | self.my_ns.RO.delete = asynctest.CoroutineMock(self.my_ns.RO.delete) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 326 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 327 | |
| 328 | class TestMyNS(TestBaseNS): |
| k4.rahul | b827de9 | 2022-05-02 16:35:02 +0000 | [diff] [blame] | 329 | @asynctest.fail_on(active_handles=True) |
| 330 | async def test_start_stop_rebuild_pass(self): |
| 331 | nsr_id = descriptors.test_ids["TEST-OP-VNF"]["ns"] |
| 332 | nslcmop_id = descriptors.test_ids["TEST-OP-VNF"]["nslcmops"] |
| 333 | vnf_id = descriptors.test_ids["TEST-OP-VNF"]["vnfrs"] |
| 334 | additional_param = {"count-index": "0"} |
| 335 | operation_type = "start" |
| 336 | await self.my_ns.rebuild_start_stop( |
| 337 | nsr_id, nslcmop_id, vnf_id, additional_param, operation_type |
| 338 | ) |
| 339 | expected_value = "COMPLETED" |
| 340 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 341 | "operationState" |
| 342 | ) |
| 343 | self.assertEqual(return_value, expected_value) |
| 344 | |
| 345 | @asynctest.fail_on(active_handles=True) |
| 346 | async def test_start_stop_rebuild_fail(self): |
| 347 | nsr_id = descriptors.test_ids["TEST-OP-VNF"]["ns"] |
| 348 | nslcmop_id = descriptors.test_ids["TEST-OP-VNF"]["nslcmops1"] |
| 349 | vnf_id = descriptors.test_ids["TEST-OP-VNF"]["vnfrs"] |
| 350 | additional_param = {"count-index": "0"} |
| 351 | operation_type = "stop" |
| 352 | await self.my_ns.rebuild_start_stop( |
| 353 | nsr_id, nslcmop_id, vnf_id, additional_param, operation_type |
| 354 | ) |
| 355 | expected_value = "Error" |
| 356 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 357 | "operationState" |
| 358 | ) |
| 359 | self.assertEqual(return_value, expected_value) |
| 360 | |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 361 | # Test scale() and related methods |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 362 | @asynctest.fail_on(active_handles=True) # all async tasks must be completed |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 363 | async def test_scale(self): |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 364 | # print("Test scale started") |
| 365 | |
| 366 | # TODO: Add more higher-lever tests here, for example: |
| 367 | # scale-out/scale-in operations with success/error result |
| 368 | |
| 369 | # Test scale() with missing 'scaleVnfData', should return operationState = 'FAILED' |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 370 | nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 371 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 372 | await self.my_ns.scale(nsr_id, nslcmop_id) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 373 | expected_value = "FAILED" |
| 374 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 375 | "operationState" |
| 376 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 377 | self.assertEqual(return_value, expected_value) |
| tierno | 3bedc9b | 2019-11-27 15:46:57 +0000 | [diff] [blame] | 378 | # print("scale_result: {}".format(self.db.get_one("nslcmops", {"_id": nslcmop_id}).get("detailed-status"))) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 379 | |
| aktas | 5f75f10 | 2021-03-15 11:26:10 +0300 | [diff] [blame] | 380 | # Test scale() for native kdu |
| 381 | # this also includes testing _scale_kdu() |
| 382 | nsr_id = descriptors.test_ids["TEST-NATIVE-KDU"]["ns"] |
| 383 | nslcmop_id = descriptors.test_ids["TEST-NATIVE-KDU"]["instantiate"] |
| 384 | |
| 385 | self.my_ns.k8sclusterjuju.scale = asynctest.mock.CoroutineMock() |
| 386 | self.my_ns.k8sclusterjuju.exec_primitive = asynctest.mock.CoroutineMock() |
| 387 | self.my_ns.k8sclusterjuju.get_scale_count = asynctest.mock.CoroutineMock( |
| 388 | return_value=1 |
| 389 | ) |
| 390 | await self.my_ns.scale(nsr_id, nslcmop_id) |
| 391 | expected_value = "COMPLETED" |
| 392 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 393 | "operationState" |
| 394 | ) |
| 395 | self.assertEqual(return_value, expected_value) |
| 396 | self.my_ns.k8sclusterjuju.scale.assert_called_once() |
| 397 | |
| 398 | # Test scale() for native kdu with 2 resource |
| 399 | nsr_id = descriptors.test_ids["TEST-NATIVE-KDU-2"]["ns"] |
| 400 | nslcmop_id = descriptors.test_ids["TEST-NATIVE-KDU-2"]["instantiate"] |
| 401 | |
| 402 | self.my_ns.k8sclusterjuju.get_scale_count.return_value = 2 |
| 403 | await self.my_ns.scale(nsr_id, nslcmop_id) |
| 404 | expected_value = "COMPLETED" |
| 405 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 406 | "operationState" |
| 407 | ) |
| 408 | self.assertEqual(return_value, expected_value) |
| 409 | self.my_ns.k8sclusterjuju.scale.assert_called() |
| 410 | |
| ksaikiranr | 4369058 | 2021-03-17 11:41:22 +0530 | [diff] [blame] | 411 | async def test_vca_status_refresh(self): |
| 412 | nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 413 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| 414 | await self.my_ns.vca_status_refresh(nsr_id, nslcmop_id) |
| 415 | expected_value = dict() |
| 416 | return_value = dict() |
| 417 | vnf_descriptors = self.db.get_list("vnfds") |
| 418 | for i, _ in enumerate(vnf_descriptors): |
| 419 | for j, value in enumerate(vnf_descriptors[i]["df"]): |
| 420 | if "lcm-operations-configuration" in vnf_descriptors[i]["df"][j]: |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 421 | if ( |
| 422 | "day1-2" |
| 423 | in value["lcm-operations-configuration"][ |
| 424 | "operate-vnf-op-config" |
| 425 | ] |
| 426 | ): |
| 427 | for k, v in enumerate( |
| 428 | value["lcm-operations-configuration"][ |
| 429 | "operate-vnf-op-config" |
| 430 | ]["day1-2"] |
| 431 | ): |
| aktas | 5f75f10 | 2021-03-15 11:26:10 +0300 | [diff] [blame] | 432 | if ( |
| 433 | v.get("execution-environment-list") |
| Patricia Reinoso | ceb0386 | 2023-01-12 09:40:53 +0000 | [diff] [blame] | 434 | and "juju" in v["execution-environment-list"][0] |
| aktas | 5f75f10 | 2021-03-15 11:26:10 +0300 | [diff] [blame] | 435 | ): |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 436 | expected_value = self.db.get_list("nsrs")[i][ |
| 437 | "vcaStatus" |
| 438 | ] |
| 439 | await self.my_ns._on_update_n2vc_db( |
| Patricia Reinoso | ceb0386 | 2023-01-12 09:40:53 +0000 | [diff] [blame] | 440 | "nsrs", |
| 441 | {"_id": nsr_id}, |
| 442 | "_admin.deployed.VCA.{}".format(k), |
| 443 | {}, |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 444 | ) |
| ksaikiranr | 4369058 | 2021-03-17 11:41:22 +0530 | [diff] [blame] | 445 | return_value = self.db.get_list("nsrs")[i]["vcaStatus"] |
| 446 | self.assertEqual(return_value, expected_value) |
| 447 | |
| tierno | 5118395 | 2020-04-03 15:48:18 +0000 | [diff] [blame] | 448 | # Test _retry_or_skip_suboperation() |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 449 | # Expected result: |
| 450 | # - if a suboperation's 'operationState' is marked as 'COMPLETED', SUBOPERATION_STATUS_SKIP is expected |
| 451 | # - if marked as anything but 'COMPLETED', the suboperation index is expected |
| tierno | 5118395 | 2020-04-03 15:48:18 +0000 | [diff] [blame] | 452 | def test_scale_retry_or_skip_suboperation(self): |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 453 | # Load an alternative 'nslcmops' YAML for this test |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 454 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 455 | db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 456 | op_index = 2 |
| 457 | # Test when 'operationState' is 'COMPLETED' |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 458 | db_nslcmop["_admin"]["operations"][op_index]["operationState"] = "COMPLETED" |
| tierno | 5118395 | 2020-04-03 15:48:18 +0000 | [diff] [blame] | 459 | return_value = self.my_ns._retry_or_skip_suboperation(db_nslcmop, op_index) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 460 | expected_value = self.my_ns.SUBOPERATION_STATUS_SKIP |
| 461 | self.assertEqual(return_value, expected_value) |
| 462 | # Test when 'operationState' is not 'COMPLETED' |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 463 | db_nslcmop["_admin"]["operations"][op_index]["operationState"] = None |
| tierno | 5118395 | 2020-04-03 15:48:18 +0000 | [diff] [blame] | 464 | return_value = self.my_ns._retry_or_skip_suboperation(db_nslcmop, op_index) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 465 | expected_value = op_index |
| 466 | self.assertEqual(return_value, expected_value) |
| 467 | |
| 468 | # Test _find_suboperation() |
| 469 | # Expected result: index of the found sub-operation, or SUBOPERATION_STATUS_NOT_FOUND if not found |
| 470 | def test_scale_find_suboperation(self): |
| 471 | # Load an alternative 'nslcmops' YAML for this test |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 472 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 473 | db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 474 | # Find this sub-operation |
| 475 | op_index = 2 |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 476 | vnf_index = db_nslcmop["_admin"]["operations"][op_index]["member_vnf_index"] |
| 477 | primitive = db_nslcmop["_admin"]["operations"][op_index]["primitive"] |
| 478 | primitive_params = db_nslcmop["_admin"]["operations"][op_index][ |
| 479 | "primitive_params" |
| 480 | ] |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 481 | match = { |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 482 | "member_vnf_index": vnf_index, |
| 483 | "primitive": primitive, |
| 484 | "primitive_params": primitive_params, |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 485 | } |
| 486 | found_op_index = self.my_ns._find_suboperation(db_nslcmop, match) |
| 487 | self.assertEqual(found_op_index, op_index) |
| 488 | # Test with not-matching params |
| 489 | match = { |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 490 | "member_vnf_index": vnf_index, |
| 491 | "primitive": "", |
| 492 | "primitive_params": primitive_params, |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 493 | } |
| 494 | found_op_index = self.my_ns._find_suboperation(db_nslcmop, match) |
| 495 | self.assertEqual(found_op_index, self.my_ns.SUBOPERATION_STATUS_NOT_FOUND) |
| 496 | # Test with None |
| 497 | match = None |
| 498 | found_op_index = self.my_ns._find_suboperation(db_nslcmop, match) |
| 499 | self.assertEqual(found_op_index, self.my_ns.SUBOPERATION_STATUS_NOT_FOUND) |
| 500 | |
| 501 | # Test _update_suboperation_status() |
| 502 | def test_scale_update_suboperation_status(self): |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 503 | self.db.set_one = asynctest.Mock() |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 504 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 505 | db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 506 | op_index = 0 |
| 507 | # Force the initial values to be distinct from the updated ones |
| tierno | 3bedc9b | 2019-11-27 15:46:57 +0000 | [diff] [blame] | 508 | q_filter = {"_id": db_nslcmop["_id"]} |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 509 | # Test to change 'operationState' and 'detailed-status' |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 510 | operationState = "COMPLETED" |
| 511 | detailed_status = "Done" |
| 512 | expected_update_dict = { |
| 513 | "_admin.operations.0.operationState": operationState, |
| 514 | "_admin.operations.0.detailed-status": detailed_status, |
| 515 | } |
| 516 | self.my_ns._update_suboperation_status( |
| 517 | db_nslcmop, op_index, operationState, detailed_status |
| 518 | ) |
| 519 | self.db.set_one.assert_called_once_with( |
| 520 | "nslcmops", |
| 521 | q_filter=q_filter, |
| 522 | update_dict=expected_update_dict, |
| 523 | fail_on_empty=False, |
| 524 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 525 | |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 526 | def test_scale_add_suboperation(self): |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 527 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 528 | db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| 529 | vnf_index = "1" |
| 530 | num_ops_before = len(db_nslcmop.get("_admin", {}).get("operations", [])) - 1 |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 531 | vdu_id = None |
| 532 | vdu_count_index = None |
| 533 | vdu_name = None |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 534 | primitive = "touch" |
| 535 | mapped_primitive_params = { |
| 536 | "parameter": [ |
| 537 | { |
| 538 | "data-type": "STRING", |
| 539 | "name": "filename", |
| 540 | "default-value": "<touch_filename2>", |
| 541 | } |
| 542 | ], |
| 543 | "name": "touch", |
| 544 | } |
| 545 | operationState = "PROCESSING" |
| 546 | detailed_status = "In progress" |
| 547 | operationType = "PRE-SCALE" |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 548 | # Add a 'pre-scale' suboperation |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 549 | op_index_after = self.my_ns._add_suboperation( |
| 550 | db_nslcmop, |
| 551 | vnf_index, |
| 552 | vdu_id, |
| 553 | vdu_count_index, |
| 554 | vdu_name, |
| 555 | primitive, |
| 556 | mapped_primitive_params, |
| 557 | operationState, |
| 558 | detailed_status, |
| 559 | operationType, |
| 560 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 561 | self.assertEqual(op_index_after, num_ops_before + 1) |
| 562 | |
| 563 | # Delete all suboperations and add the same operation again |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 564 | del db_nslcmop["_admin"]["operations"] |
| 565 | op_index_zero = self.my_ns._add_suboperation( |
| 566 | db_nslcmop, |
| 567 | vnf_index, |
| 568 | vdu_id, |
| 569 | vdu_count_index, |
| 570 | vdu_name, |
| 571 | primitive, |
| 572 | mapped_primitive_params, |
| 573 | operationState, |
| 574 | detailed_status, |
| 575 | operationType, |
| 576 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 577 | self.assertEqual(op_index_zero, 0) |
| 578 | |
| 579 | # Add a 'RO' suboperation |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 580 | RO_nsr_id = "1234567890" |
| 581 | RO_scaling_info = [ |
| 582 | { |
| 583 | "type": "create", |
| 584 | "count": 1, |
| 585 | "member-vnf-index": "1", |
| 586 | "osm_vdu_id": "dataVM", |
| 587 | } |
| 588 | ] |
| 589 | op_index = self.my_ns._add_suboperation( |
| 590 | db_nslcmop, |
| 591 | vnf_index, |
| 592 | vdu_id, |
| 593 | vdu_count_index, |
| 594 | vdu_name, |
| 595 | primitive, |
| 596 | mapped_primitive_params, |
| 597 | operationState, |
| 598 | detailed_status, |
| 599 | operationType, |
| 600 | RO_nsr_id, |
| 601 | RO_scaling_info, |
| 602 | ) |
| 603 | db_RO_nsr_id = db_nslcmop["_admin"]["operations"][op_index]["RO_nsr_id"] |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 604 | self.assertEqual(op_index, 1) |
| 605 | self.assertEqual(RO_nsr_id, db_RO_nsr_id) |
| 606 | |
| 607 | # Try to add an invalid suboperation, should return SUBOPERATION_STATUS_NOT_FOUND |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 608 | op_index_invalid = self.my_ns._add_suboperation( |
| 609 | None, None, None, None, None, None, None, None, None, None, None |
| 610 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 611 | self.assertEqual(op_index_invalid, self.my_ns.SUBOPERATION_STATUS_NOT_FOUND) |
| 612 | |
| 613 | # Test _check_or_add_scale_suboperation() and _check_or_add_scale_suboperation_RO() |
| 614 | # check the possible return values: |
| 615 | # - SUBOPERATION_STATUS_NEW: This is a new sub-operation |
| 616 | # - op_index (non-negative number): This is an existing sub-operation, operationState != 'COMPLETED' |
| 617 | # - SUBOPERATION_STATUS_SKIP: This is an existing sub-operation, operationState == 'COMPLETED' |
| 618 | def test_scale_check_or_add_scale_suboperation(self): |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 619 | nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 620 | db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| 621 | operationType = "PRE-SCALE" |
| 622 | vnf_index = "1" |
| 623 | primitive = "touch" |
| 624 | primitive_params = { |
| 625 | "parameter": [ |
| 626 | { |
| 627 | "data-type": "STRING", |
| 628 | "name": "filename", |
| 629 | "default-value": "<touch_filename2>", |
| 630 | } |
| 631 | ], |
| 632 | "name": "touch", |
| 633 | } |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 634 | |
| 635 | # Delete all sub-operations to be sure this is a new sub-operation |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 636 | del db_nslcmop["_admin"]["operations"] |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 637 | |
| 638 | # Add a new sub-operation |
| 639 | # For new sub-operations, operationState is set to 'PROCESSING' by default |
| 640 | op_index_new = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 641 | db_nslcmop, vnf_index, primitive, primitive_params, operationType |
| 642 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 643 | self.assertEqual(op_index_new, self.my_ns.SUBOPERATION_STATUS_NEW) |
| 644 | |
| 645 | # Use the same parameters again to match the already added sub-operation |
| 646 | # which has status 'PROCESSING' (!= 'COMPLETED') by default |
| 647 | # The expected return value is a non-negative number |
| 648 | op_index_existing = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 649 | db_nslcmop, vnf_index, primitive, primitive_params, operationType |
| 650 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 651 | self.assertTrue(op_index_existing >= 0) |
| 652 | |
| 653 | # Change operationState 'manually' for this sub-operation |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 654 | db_nslcmop["_admin"]["operations"][op_index_existing][ |
| 655 | "operationState" |
| 656 | ] = "COMPLETED" |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 657 | # Then use the same parameters again to match the already added sub-operation, |
| 658 | # which now has status 'COMPLETED' |
| 659 | # The expected return value is SUBOPERATION_STATUS_SKIP |
| 660 | op_index_skip = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 661 | db_nslcmop, vnf_index, primitive, primitive_params, operationType |
| 662 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 663 | self.assertEqual(op_index_skip, self.my_ns.SUBOPERATION_STATUS_SKIP) |
| 664 | |
| 665 | # RO sub-operation test: |
| 666 | # Repeat tests for the very similar _check_or_add_scale_suboperation_RO(), |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 667 | RO_nsr_id = "1234567890" |
| 668 | RO_scaling_info = [ |
| 669 | { |
| 670 | "type": "create", |
| 671 | "count": 1, |
| 672 | "member-vnf-index": "1", |
| 673 | "osm_vdu_id": "dataVM", |
| 674 | } |
| 675 | ] |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 676 | op_index_new_RO = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 677 | db_nslcmop, vnf_index, None, None, "SCALE-RO", RO_nsr_id, RO_scaling_info |
| 678 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 679 | self.assertEqual(op_index_new_RO, self.my_ns.SUBOPERATION_STATUS_NEW) |
| 680 | |
| 681 | # Use the same parameters again to match the already added RO sub-operation |
| 682 | op_index_existing_RO = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 683 | db_nslcmop, vnf_index, None, None, "SCALE-RO", RO_nsr_id, RO_scaling_info |
| 684 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 685 | self.assertTrue(op_index_existing_RO >= 0) |
| 686 | |
| 687 | # Change operationState 'manually' for this RO sub-operation |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 688 | db_nslcmop["_admin"]["operations"][op_index_existing_RO][ |
| 689 | "operationState" |
| 690 | ] = "COMPLETED" |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 691 | # Then use the same parameters again to match the already added sub-operation, |
| 692 | # which now has status 'COMPLETED' |
| 693 | # The expected return value is SUBOPERATION_STATUS_SKIP |
| 694 | op_index_skip_RO = self.my_ns._check_or_add_scale_suboperation( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 695 | db_nslcmop, vnf_index, None, None, "SCALE-RO", RO_nsr_id, RO_scaling_info |
| 696 | ) |
| kuuse | 951169e | 2019-10-03 15:27:51 +0200 | [diff] [blame] | 697 | self.assertEqual(op_index_skip_RO, self.my_ns.SUBOPERATION_STATUS_SKIP) |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 698 | |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 699 | async def test_deploy_kdus(self): |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 700 | nsr_id = descriptors.test_ids["TEST-KDU"]["ns"] |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 701 | nslcmop_id = descriptors.test_ids["TEST-KDU"]["instantiate"] |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 702 | db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 703 | db_vnfr = self.db.get_one( |
| 704 | "vnfrs", {"nsr-id-ref": nsr_id, "member-vnf-index-ref": "multikdu"} |
| 705 | ) |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 706 | db_vnfrs = {"multikdu": db_vnfr} |
| tierno | 5ee730c | 2020-02-13 10:53:43 +0000 | [diff] [blame] | 707 | db_vnfd = self.db.get_one("vnfds", {"_id": db_vnfr["vnfd-id"]}) |
| David Garcia | d41dbd6 | 2020-12-10 12:52:52 +0100 | [diff] [blame] | 708 | db_vnfds = [db_vnfd] |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 709 | task_register = {} |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 710 | logging_text = "KDU" |
| David Garcia | d64e274 | 2021-02-25 20:19:18 +0100 | [diff] [blame] | 711 | self.my_ns.k8sclusterhelm3.generate_kdu_instance_name = asynctest.mock.Mock() |
| 712 | self.my_ns.k8sclusterhelm3.generate_kdu_instance_name.return_value = "k8s_id" |
| 713 | self.my_ns.k8sclusterhelm3.install = asynctest.CoroutineMock() |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 714 | self.my_ns.k8sclusterhelm3.synchronize_repos = asynctest.CoroutineMock( |
| 715 | return_value=("", "") |
| 716 | ) |
| 717 | self.my_ns.k8sclusterhelm3.get_services = asynctest.CoroutineMock( |
| 718 | return_value=([]) |
| 719 | ) |
| 720 | await self.my_ns.deploy_kdus( |
| 721 | logging_text, nsr_id, nslcmop_id, db_vnfrs, db_vnfds, task_register |
| 722 | ) |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 723 | await asyncio.wait(list(task_register.keys()), timeout=100) |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 724 | db_nsr = self.db.get_list("nsrs")[1] |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 725 | self.assertIn( |
| 726 | "K8s", |
| 727 | db_nsr["_admin"]["deployed"], |
| 728 | "K8s entry not created at '_admin.deployed'", |
| 729 | ) |
| 730 | self.assertIsInstance( |
| 731 | db_nsr["_admin"]["deployed"]["K8s"], list, "K8s entry is not of type list" |
| 732 | ) |
| 733 | self.assertEqual( |
| 734 | len(db_nsr["_admin"]["deployed"]["K8s"]), 2, "K8s entry is not of type list" |
| 735 | ) |
| 736 | k8s_instace_info = { |
| 737 | "kdu-instance": "k8s_id", |
| 738 | "k8scluster-uuid": "73d96432-d692-40d2-8440-e0c73aee209c", |
| 739 | "k8scluster-type": "helm-chart-v3", |
| 740 | "kdu-name": "ldap", |
| 741 | "member-vnf-index": "multikdu", |
| 742 | "namespace": None, |
| romeromonser | 4554a70 | 2021-05-28 12:00:08 +0200 | [diff] [blame] | 743 | "kdu-deployment-name": None, |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 744 | } |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 745 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 746 | nsr_result = copy.deepcopy(db_nsr["_admin"]["deployed"]["K8s"][0]) |
| 747 | nsr_kdu_model_result = nsr_result.pop("kdu-model") |
| 748 | expected_kdu_model = "stable/openldap:1.2.1" |
| 749 | self.assertEqual(nsr_result, k8s_instace_info) |
| 750 | self.assertTrue( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 751 | nsr_kdu_model_result in expected_kdu_model |
| 752 | or expected_kdu_model in nsr_kdu_model_result |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 753 | ) |
| 754 | nsr_result = copy.deepcopy(db_nsr["_admin"]["deployed"]["K8s"][1]) |
| 755 | nsr_kdu_model_result = nsr_result.pop("kdu-model") |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 756 | k8s_instace_info["kdu-name"] = "mongo" |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 757 | expected_kdu_model = "stable/mongodb" |
| 758 | self.assertEqual(nsr_result, k8s_instace_info) |
| 759 | self.assertTrue( |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 760 | nsr_kdu_model_result in expected_kdu_model |
| 761 | or expected_kdu_model in nsr_kdu_model_result |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 762 | ) |
| tierno | 626e015 | 2019-11-29 14:16:16 +0000 | [diff] [blame] | 763 | |
| elumalai | ca7ece0 | 2022-04-12 12:47:32 +0530 | [diff] [blame] | 764 | # Test remove_vnf() and related methods |
| 765 | @asynctest.fail_on(active_handles=True) # all async tasks must be completed |
| 766 | async def test_remove_vnf(self): |
| 767 | # Test REMOVE_VNF |
| 768 | nsr_id = descriptors.test_ids["TEST-UPDATE"]["ns"] |
| 769 | nslcmop_id = descriptors.test_ids["TEST-UPDATE"]["removeVnf"] |
| 770 | vnf_instance_id = descriptors.test_ids["TEST-UPDATE"]["vnf"] |
| elumalai | 1b78276 | 2022-06-10 15:28:49 +0530 | [diff] [blame] | 771 | mock_wait_ng_ro = asynctest.CoroutineMock() |
| 772 | with patch("osm_lcm.ns.NsLcm._wait_ng_ro", mock_wait_ng_ro): |
| 773 | await self.my_ns.update(nsr_id, nslcmop_id) |
| 774 | expected_value = "COMPLETED" |
| 775 | return_value = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 776 | "operationState" |
| 777 | ) |
| 778 | self.assertEqual(return_value, expected_value) |
| 779 | with self.assertRaises(Exception) as context: |
| 780 | self.db.get_one("vnfrs", {"_id": vnf_instance_id}) |
| preethika.p | 28b0bf8 | 2022-09-23 07:36:28 +0000 | [diff] [blame] | 781 | self.assertTrue( |
| 782 | "database exception Not found entry with filter" |
| 783 | in str(context.exception) |
| 784 | ) |
| elumalai | ca7ece0 | 2022-04-12 12:47:32 +0530 | [diff] [blame] | 785 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 786 | # async def test_instantiate_pdu(self): |
| 787 | # nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 788 | # nslcmop_id = descriptors.test_ids["TEST-A"]["instantiate"] |
| 789 | # # Modify vnfd/vnfr to change KDU for PDU. Adding keys that NBI will already set |
| 790 | # self.db.set_one("vnfrs", {"nsr-id-ref": nsr_id, "member-vnf-index-ref": "1"}, |
| 791 | # update_dict={"ip-address": "10.205.1.46", |
| 792 | # "vdur.0.pdu-id": "53e1ec21-2464-451e-a8dc-6e311d45b2c8", |
| 793 | # "vdur.0.pdu-type": "PDU-TYPE-1", |
| 794 | # "vdur.0.ip-address": "10.205.1.46", |
| 795 | # }, |
| 796 | # unset={"vdur.status": None}) |
| 797 | # self.db.set_one("vnfrs", {"nsr-id-ref": nsr_id, "member-vnf-index-ref": "2"}, |
| 798 | # update_dict={"ip-address": "10.205.1.47", |
| 799 | # "vdur.0.pdu-id": "53e1ec21-2464-451e-a8dc-6e311d45b2c8", |
| 800 | # "vdur.0.pdu-type": "PDU-TYPE-1", |
| 801 | # "vdur.0.ip-address": "10.205.1.47", |
| 802 | # }, |
| 803 | # unset={"vdur.status": None}) |
| tierno | 0e8c3f0 | 2020-03-12 17:18:21 +0000 | [diff] [blame] | 804 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 805 | # await self.my_ns.instantiate(nsr_id, nslcmop_id) |
| 806 | # db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) |
| 807 | # self.assertEqual(db_nsr.get("nsState"), "READY", str(db_nsr.get("errorDescription "))) |
| 808 | # self.assertEqual(db_nsr.get("currentOperation"), "IDLE", "currentOperation different than 'IDLE'") |
| 809 | # self.assertEqual(db_nsr.get("currentOperationID"), None, "currentOperationID different than None") |
| 810 | # self.assertEqual(db_nsr.get("errorDescription "), None, "errorDescription different than None") |
| 811 | # self.assertEqual(db_nsr.get("errorDetail"), None, "errorDetail different than None") |
| tierno | 0e8c3f0 | 2020-03-12 17:18:21 +0000 | [diff] [blame] | 812 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 813 | # @asynctest.fail_on(active_handles=True) # all async tasks must be completed |
| 814 | # async def test_terminate_without_configuration(self): |
| 815 | # nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 816 | # nslcmop_id = descriptors.test_ids["TEST-A"]["terminate"] |
| 817 | # # set instantiation task as completed |
| 818 | # self.db.set_list("nslcmops", {"nsInstanceId": nsr_id, "_id.ne": nslcmop_id}, |
| 819 | # update_dict={"operationState": "COMPLETED"}) |
| 820 | # self.db.set_one("nsrs", {"_id": nsr_id}, |
| 821 | # update_dict={"_admin.deployed.VCA.0": None, "_admin.deployed.VCA.1": None}) |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 822 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 823 | # await self.my_ns.terminate(nsr_id, nslcmop_id) |
| 824 | # db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| 825 | # self.assertEqual(db_nslcmop.get("operationState"), 'COMPLETED', db_nslcmop.get("detailed-status")) |
| 826 | # db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) |
| 827 | # self.assertEqual(db_nsr.get("nsState"), "NOT_INSTANTIATED", str(db_nsr.get("errorDescription "))) |
| 828 | # self.assertEqual(db_nsr["_admin"].get("nsState"), "NOT_INSTANTIATED", str(db_nsr.get("errorDescription "))) |
| 829 | # self.assertEqual(db_nsr.get("currentOperation"), "IDLE", "currentOperation different than 'IDLE'") |
| 830 | # self.assertEqual(db_nsr.get("currentOperationID"), None, "currentOperationID different than None") |
| 831 | # self.assertEqual(db_nsr.get("errorDescription "), None, "errorDescription different than None") |
| 832 | # self.assertEqual(db_nsr.get("errorDetail"), None, "errorDetail different than None") |
| 833 | # db_vnfrs_list = self.db.get_list("vnfrs", {"nsr-id-ref": nsr_id}) |
| 834 | # for vnfr in db_vnfrs_list: |
| 835 | # self.assertEqual(vnfr["_admin"].get("nsState"), "NOT_INSTANTIATED", "Not instantiated") |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 836 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 837 | # @asynctest.fail_on(active_handles=True) # all async tasks must be completed |
| 838 | # async def test_terminate_primitive(self): |
| 839 | # nsr_id = descriptors.test_ids["TEST-A"]["ns"] |
| 840 | # nslcmop_id = descriptors.test_ids["TEST-A"]["terminate"] |
| 841 | # # set instantiation task as completed |
| 842 | # self.db.set_list("nslcmops", {"nsInstanceId": nsr_id, "_id.ne": nslcmop_id}, |
| 843 | # update_dict={"operationState": "COMPLETED"}) |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 844 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 845 | # # modify vnfd descriptor to include terminate_primitive |
| 846 | # terminate_primitive = [{ |
| 847 | # "name": "touch", |
| 848 | # "parameter": [{"name": "filename", "value": "terminate_filename"}], |
| 849 | # "seq": '1' |
| 850 | # }] |
| 851 | # db_vnfr = self.db.get_one("vnfrs", {"nsr-id-ref": nsr_id, "member-vnf-index-ref": "1"}) |
| 852 | # self.db.set_one("vnfds", {"_id": db_vnfr["vnfd-id"]}, |
| 853 | # {"vnf-configuration.0.terminate-config-primitive": terminate_primitive}) |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 854 | |
| bravof | 922c417 | 2020-11-24 21:21:43 -0300 | [diff] [blame] | 855 | # await self.my_ns.terminate(nsr_id, nslcmop_id) |
| 856 | # db_nslcmop = self.db.get_one("nslcmops", {"_id": nslcmop_id}) |
| 857 | # self.assertEqual(db_nslcmop.get("operationState"), 'COMPLETED', db_nslcmop.get("detailed-status")) |
| 858 | # db_nsr = self.db.get_one("nsrs", {"_id": nsr_id}) |
| 859 | # self.assertEqual(db_nsr.get("nsState"), "NOT_INSTANTIATED", str(db_nsr.get("errorDescription "))) |
| 860 | # self.assertEqual(db_nsr["_admin"].get("nsState"), "NOT_INSTANTIATED", str(db_nsr.get("errorDescription "))) |
| 861 | # self.assertEqual(db_nsr.get("currentOperation"), "IDLE", "currentOperation different than 'IDLE'") |
| 862 | # self.assertEqual(db_nsr.get("currentOperationID"), None, "currentOperationID different than None") |
| 863 | # self.assertEqual(db_nsr.get("errorDescription "), None, "errorDescription different than None") |
| 864 | # self.assertEqual(db_nsr.get("errorDetail"), None, "errorDetail different than None") |
| tierno | e876f67 | 2020-02-13 14:34:48 +0000 | [diff] [blame] | 865 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 866 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 867 | @patch( |
| 868 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 869 | ) |
| 870 | @patch("osm_lcm.data_utils.vnfd.find_software_version") |
| 871 | @patch("osm_lcm.lcm_utils.check_juju_bundle_existence") |
| 872 | async def test_update_change_vnfpkg_sw_version_not_changed( |
| 873 | self, |
| 874 | mock_juju_bundle, |
| 875 | mock_software_version, |
| 876 | mock_charm_upgrade, |
| 877 | mock_charm_hash, |
| 878 | ): |
| 879 | """Update type: CHANGE_VNFPKG, latest_vnfd revision changed, |
| 880 | Charm package changed, sw-version is not changed""" |
| 881 | self.db.set_one( |
| 882 | "vnfds", |
| 883 | q_filter={"_id": vnfd_id}, |
| 884 | update_dict={"_admin.revision": 3, "kdu": []}, |
| 885 | ) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 886 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 887 | self.db.set_one( |
| 888 | "vnfds_revisions", |
| 889 | q_filter={"_id": vnfd_id + ":1"}, |
| 890 | update_dict={"_admin.revision": 1, "kdu": []}, |
| 891 | ) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 892 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 893 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 894 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 895 | mock_charm_hash.return_value = True |
| 896 | mock_software_version.side_effect = ["1.0", "1.0"] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 897 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 898 | task = asyncio.Future() |
| 899 | task.set_result(("COMPLETED", "some_output")) |
| 900 | mock_charm_upgrade.return_value = task |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 901 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 902 | instance = self.my_ns |
| 903 | fs = deepcopy(update_fs) |
| 904 | instance.fs = fs |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 905 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 906 | expected_operation_state = "COMPLETED" |
| 907 | expected_operation_error = "" |
| 908 | expected_vnfr_revision = 3 |
| 909 | expected_ns_state = "INSTANTIATED" |
| 910 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 911 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 912 | await instance.update(nsr_id, nslcmop_id) |
| 913 | return_operation_state = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 914 | "operationState" |
| 915 | ) |
| 916 | return_operation_error = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 917 | "errorMessage" |
| 918 | ) |
| 919 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 920 | "operational-status" |
| 921 | ) |
| 922 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 923 | "revision" |
| 924 | ) |
| 925 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 926 | mock_charm_hash.assert_called_with( |
| 927 | f"{vnfd_id}:1/hackfest_3charmed_vnfd/charms/simple", |
| 928 | f"{vnfd_id}:3/hackfest_3charmed_vnfd/charms/simple", |
| 929 | ) |
| 930 | self.assertEqual(fs.sync.call_count, 2) |
| 931 | self.assertEqual(return_ns_state, expected_ns_state) |
| 932 | self.assertEqual(return_operation_state, expected_operation_state) |
| 933 | self.assertEqual(return_operation_error, expected_operation_error) |
| 934 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 935 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 936 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 937 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 938 | @patch( |
| 939 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 940 | ) |
| 941 | @patch("osm_lcm.data_utils.vnfd.find_software_version") |
| 942 | @patch("osm_lcm.lcm_utils.check_juju_bundle_existence") |
| 943 | async def test_update_change_vnfpkg_vnfd_revision_not_changed( |
| 944 | self, |
| 945 | mock_juju_bundle, |
| 946 | mock_software_version, |
| 947 | mock_charm_upgrade, |
| 948 | mock_charm_hash, |
| 949 | ): |
| 950 | """Update type: CHANGE_VNFPKG, latest_vnfd revision not changed""" |
| 951 | self.db.set_one( |
| 952 | "vnfds", q_filter={"_id": vnfd_id}, update_dict={"_admin.revision": 1} |
| 953 | ) |
| 954 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 955 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 956 | mock_charm_hash.return_value = True |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 957 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 958 | task = asyncio.Future() |
| 959 | task.set_result(("COMPLETED", "some_output")) |
| 960 | mock_charm_upgrade.return_value = task |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 961 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 962 | instance = self.my_ns |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 963 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 964 | expected_operation_state = "COMPLETED" |
| 965 | expected_operation_error = "" |
| 966 | expected_vnfr_revision = 1 |
| 967 | expected_ns_state = "INSTANTIATED" |
| 968 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 969 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 970 | await instance.update(nsr_id, nslcmop_id) |
| 971 | return_operation_state = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 972 | "operationState" |
| 973 | ) |
| 974 | return_operation_error = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 975 | "errorMessage" |
| 976 | ) |
| 977 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 978 | "operational-status" |
| 979 | ) |
| 980 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 981 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 982 | "revision" |
| 983 | ) |
| 984 | mock_charm_hash.assert_not_called() |
| 985 | mock_software_version.assert_not_called() |
| 986 | mock_juju_bundle.assert_not_called() |
| 987 | mock_charm_upgrade.assert_not_called() |
| 988 | update_fs.sync.assert_not_called() |
| 989 | self.assertEqual(return_ns_state, expected_ns_state) |
| 990 | self.assertEqual(return_operation_state, expected_operation_state) |
| 991 | self.assertEqual(return_operation_error, expected_operation_error) |
| 992 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 993 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 994 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 995 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 996 | @patch( |
| 997 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 998 | ) |
| 999 | @patch("osm_lcm.data_utils.vnfd.find_software_version") |
| 1000 | @patch("osm_lcm.lcm_utils.check_juju_bundle_existence") |
| 1001 | async def test_update_change_vnfpkg_charm_is_not_changed( |
| 1002 | self, |
| 1003 | mock_juju_bundle, |
| 1004 | mock_software_version, |
| 1005 | mock_charm_upgrade, |
| 1006 | mock_charm_hash, |
| 1007 | ): |
| 1008 | """Update type: CHANGE_VNFPKG, latest_vnfd revision changed |
| 1009 | Charm package is not changed, sw-version is not changed""" |
| 1010 | self.db.set_one( |
| 1011 | "vnfds", |
| 1012 | q_filter={"_id": vnfd_id}, |
| 1013 | update_dict={"_admin.revision": 3, "kdu": []}, |
| 1014 | ) |
| 1015 | self.db.set_one( |
| 1016 | "vnfds_revisions", |
| 1017 | q_filter={"_id": vnfd_id + ":1"}, |
| 1018 | update_dict={"_admin.revision": 1, "kdu": []}, |
| 1019 | ) |
| 1020 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1021 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1022 | mock_charm_hash.return_value = False |
| 1023 | mock_software_version.side_effect = ["1.0", "1.0"] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1024 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1025 | instance = self.my_ns |
| 1026 | fs = deepcopy(update_fs) |
| 1027 | instance.fs = fs |
| 1028 | expected_operation_state = "COMPLETED" |
| 1029 | expected_operation_error = "" |
| 1030 | expected_vnfr_revision = 3 |
| 1031 | expected_ns_state = "INSTANTIATED" |
| 1032 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1033 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1034 | await instance.update(nsr_id, nslcmop_id) |
| 1035 | return_operation_state = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1036 | "operationState" |
| 1037 | ) |
| 1038 | return_operation_error = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1039 | "errorMessage" |
| 1040 | ) |
| 1041 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 1042 | "operational-status" |
| 1043 | ) |
| 1044 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 1045 | "revision" |
| 1046 | ) |
| 1047 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 1048 | mock_charm_hash.assert_called_with( |
| 1049 | f"{vnfd_id}:1/hackfest_3charmed_vnfd/charms/simple", |
| 1050 | f"{vnfd_id}:3/hackfest_3charmed_vnfd/charms/simple", |
| 1051 | ) |
| 1052 | self.assertEqual(fs.sync.call_count, 2) |
| 1053 | self.assertEqual(mock_charm_hash.call_count, 1) |
| 1054 | mock_juju_bundle.assert_not_called() |
| 1055 | mock_charm_upgrade.assert_not_called() |
| 1056 | self.assertEqual(return_ns_state, expected_ns_state) |
| 1057 | self.assertEqual(return_operation_state, expected_operation_state) |
| 1058 | self.assertEqual(return_operation_error, expected_operation_error) |
| 1059 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 1060 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1061 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1062 | @patch("osm_lcm.lcm_utils.check_juju_bundle_existence") |
| 1063 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 1064 | @patch( |
| 1065 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 1066 | ) |
| 1067 | @patch("osm_lcm.lcm_utils.get_charm_artifact_path") |
| 1068 | async def test_update_change_vnfpkg_sw_version_changed( |
| 1069 | self, mock_charm_artifact, mock_charm_upgrade, mock_charm_hash, mock_juju_bundle |
| 1070 | ): |
| 1071 | """Update type: CHANGE_VNFPKG, latest_vnfd revision changed |
| 1072 | Charm package exists, sw-version changed.""" |
| 1073 | self.db.set_one( |
| 1074 | "vnfds", |
| 1075 | q_filter={"_id": vnfd_id}, |
| 1076 | update_dict={"_admin.revision": 3, "software-version": "3.0", "kdu": []}, |
| 1077 | ) |
| 1078 | self.db.set_one( |
| 1079 | "vnfds_revisions", |
| 1080 | q_filter={"_id": vnfd_id + ":1"}, |
| 1081 | update_dict={"_admin.revision": 1, "kdu": []}, |
| 1082 | ) |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1083 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1084 | mock_charm_hash.return_value = False |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1085 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1086 | mock_charm_artifact.side_effect = [ |
| 1087 | f"{vnfd_id}:1/hackfest_3charmed_vnfd/charms/simple", |
| 1088 | f"{vnfd_id}:3/hackfest_3charmed_vnfd/charms/simple", |
| 1089 | ] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1090 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1091 | instance = self.my_ns |
| 1092 | fs = deepcopy(update_fs) |
| 1093 | instance.fs = fs |
| 1094 | expected_operation_state = "FAILED" |
| 1095 | expected_operation_error = "FAILED Checking if existing VNF has charm: Software version change is not supported as VNF instance 6421c7c9-d865-4fb4-9a13-d4275d243e01 has charm." |
| 1096 | expected_vnfr_revision = 1 |
| 1097 | expected_ns_state = "INSTANTIATED" |
| 1098 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1099 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1100 | await instance.update(nsr_id, nslcmop_id) |
| 1101 | return_operation_state = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1102 | "operationState" |
| 1103 | ) |
| 1104 | return_operation_error = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1105 | "errorMessage" |
| 1106 | ) |
| 1107 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 1108 | "operational-status" |
| 1109 | ) |
| 1110 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 1111 | "revision" |
| 1112 | ) |
| 1113 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 1114 | self.assertEqual(fs.sync.call_count, 2) |
| 1115 | mock_charm_hash.assert_not_called() |
| 1116 | mock_juju_bundle.assert_not_called() |
| 1117 | mock_charm_upgrade.assert_not_called() |
| 1118 | self.assertEqual(return_ns_state, expected_ns_state) |
| 1119 | self.assertEqual(return_operation_state, expected_operation_state) |
| 1120 | self.assertEqual(return_operation_error, expected_operation_error) |
| 1121 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 1122 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1123 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1124 | @patch("osm_lcm.lcm_utils.check_juju_bundle_existence") |
| 1125 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 1126 | @patch( |
| 1127 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 1128 | ) |
| 1129 | @patch("osm_lcm.data_utils.vnfd.find_software_version") |
| 1130 | async def test_update_change_vnfpkg_juju_bundle_exists( |
| 1131 | self, |
| 1132 | mock_software_version, |
| 1133 | mock_charm_upgrade, |
| 1134 | mock_charm_hash, |
| 1135 | mock_juju_bundle, |
| 1136 | ): |
| 1137 | """Update type: CHANGE_VNFPKG, latest_vnfd revision changed |
| 1138 | Charm package exists, sw-version not changed, juju-bundle exists""" |
| 1139 | # Upgrade is not allowed with juju bundles, this will cause TypeError |
| 1140 | self.db.set_one( |
| 1141 | "vnfds", |
| 1142 | q_filter={"_id": vnfd_id}, |
| 1143 | update_dict={ |
| 1144 | "_admin.revision": 5, |
| 1145 | "software-version": "1.0", |
| 1146 | "kdu": [{"kdu_name": "native-kdu", "juju-bundle": "stable/native-kdu"}], |
| 1147 | }, |
| 1148 | ) |
| 1149 | self.db.set_one( |
| 1150 | "vnfds_revisions", |
| 1151 | q_filter={"_id": vnfd_id + ":1"}, |
| 1152 | update_dict={ |
| 1153 | "_admin.revision": 1, |
| 1154 | "software-version": "1.0", |
| 1155 | "kdu": [{"kdu_name": "native-kdu", "juju-bundle": "stable/native-kdu"}], |
| 1156 | }, |
| 1157 | ) |
| 1158 | self.db.set_one( |
| 1159 | "nsrs", |
| 1160 | q_filter={"_id": nsr_id}, |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1161 | update_dict={"_admin.deployed.VCA.0.kdu_name": "native-kdu"}, |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1162 | ) |
| 1163 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1164 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1165 | mock_charm_hash.side_effect = [True] |
| 1166 | mock_software_version.side_effect = ["1.0", "1.0"] |
| 1167 | mock_juju_bundle.return_value = True |
| 1168 | instance = self.my_ns |
| 1169 | fs = deepcopy(update_fs) |
| 1170 | instance.fs = fs |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1171 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1172 | expected_vnfr_revision = 1 |
| 1173 | expected_ns_state = "INSTANTIATED" |
| 1174 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1175 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1176 | await instance.update(nsr_id, nslcmop_id) |
| 1177 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 1178 | "operational-status" |
| 1179 | ) |
| 1180 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 1181 | "revision" |
| 1182 | ) |
| 1183 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 1184 | self.assertEqual(fs.sync.call_count, 2) |
| 1185 | mock_charm_upgrade.assert_not_called() |
| 1186 | mock_charm_hash.assert_not_called() |
| 1187 | self.assertEqual(return_ns_state, expected_ns_state) |
| 1188 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 1189 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1190 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1191 | @patch("osm_lcm.lcm_utils.LcmBase.check_charm_hash_changed") |
| 1192 | @patch( |
| 1193 | "osm_lcm.ns.NsLcm._ns_charm_upgrade", new_callable=asynctest.Mock(autospec=True) |
| 1194 | ) |
| 1195 | async def test_update_change_vnfpkg_charm_upgrade_failed( |
| 1196 | self, mock_charm_upgrade, mock_charm_hash |
| 1197 | ): |
| 1198 | """ "Update type: CHANGE_VNFPKG, latest_vnfd revision changed" |
| 1199 | Charm package exists, sw-version not changed, charm-upgrade failed""" |
| 1200 | self.db.set_one( |
| 1201 | "vnfds", |
| 1202 | q_filter={"_id": vnfd_id}, |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1203 | update_dict={"_admin.revision": 3, "software-version": "1.0", "kdu": []}, |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1204 | ) |
| 1205 | self.db.set_one( |
| 1206 | "vnfds_revisions", |
| 1207 | q_filter={"_id": vnfd_id + ":1"}, |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1208 | update_dict={"_admin.revision": 1, "software-version": "1.0", "kdu": []}, |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1209 | ) |
| 1210 | self.db.set_one("vnfrs", q_filter={"_id": vnfr_id}, update_dict={"revision": 1}) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1211 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1212 | mock_charm_hash.return_value = True |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1213 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1214 | task = asyncio.Future() |
| 1215 | task.set_result(("FAILED", "some_error")) |
| 1216 | mock_charm_upgrade.return_value = task |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1217 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1218 | instance = self.my_ns |
| 1219 | fs = deepcopy(update_fs) |
| 1220 | instance.fs = fs |
| 1221 | expected_operation_state = "FAILED" |
| 1222 | expected_operation_error = "some_error" |
| 1223 | expected_vnfr_revision = 1 |
| 1224 | expected_ns_state = "INSTANTIATED" |
| 1225 | expected_ns_operational_state = "running" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1226 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1227 | await instance.update(nsr_id, nslcmop_id) |
| 1228 | return_operation_state = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1229 | "operationState" |
| 1230 | ) |
| 1231 | return_operation_error = self.db.get_one("nslcmops", {"_id": nslcmop_id}).get( |
| 1232 | "errorMessage" |
| 1233 | ) |
| 1234 | return_ns_operational_state = self.db.get_one("nsrs", {"_id": nsr_id}).get( |
| 1235 | "operational-status" |
| 1236 | ) |
| 1237 | return_vnfr_revision = self.db.get_one("vnfrs", {"_id": vnfr_id}).get( |
| 1238 | "revision" |
| 1239 | ) |
| 1240 | return_ns_state = self.db.get_one("nsrs", {"_id": nsr_id}).get("nsState") |
| 1241 | self.assertEqual(fs.sync.call_count, 2) |
| 1242 | self.assertEqual(mock_charm_hash.call_count, 1) |
| 1243 | self.assertEqual(mock_charm_upgrade.call_count, 1) |
| 1244 | self.assertEqual(return_ns_state, expected_ns_state) |
| 1245 | self.assertEqual(return_operation_state, expected_operation_state) |
| 1246 | self.assertEqual(return_operation_error, expected_operation_error) |
| 1247 | self.assertEqual(return_ns_operational_state, expected_ns_operational_state) |
| 1248 | self.assertEqual(return_vnfr_revision, expected_vnfr_revision) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1249 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1250 | def test_ns_update_find_sw_version_vnfd_not_includes(self): |
| 1251 | """Find software version, VNFD does not have software version""" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1252 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1253 | db_vnfd = self.db.get_one("vnfds", {"_id": vnfd_id}) |
| 1254 | expected_result = "1.0" |
| 1255 | result = find_software_version(db_vnfd) |
| 1256 | self.assertEqual(result, expected_result, "Default sw version should be 1.0") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1257 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1258 | def test_ns_update_find_sw_version_vnfd_includes(self): |
| 1259 | """Find software version, VNFD includes software version""" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1260 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1261 | db_vnfd = self.db.get_one("vnfds", {"_id": vnfd_id}) |
| 1262 | db_vnfd["software-version"] = "3.1" |
| 1263 | expected_result = "3.1" |
| 1264 | result = find_software_version(db_vnfd) |
| 1265 | self.assertEqual(result, expected_result, "VNFD software version is wrong") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1266 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1267 | @patch("os.path.exists") |
| 1268 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charmdir_hash") |
| 1269 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charm_hash") |
| 1270 | def test_ns_update_check_charm_hash_not_changed( |
| 1271 | self, mock_compare_charm_hash, mock_compare_charmdir_hash, mock_path_exists |
| 1272 | ): |
| 1273 | """Check charm hash, Hash did not change""" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1274 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1275 | current_path, target_path = "/tmp/charm1", "/tmp/charm1" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1276 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1277 | fs = Mock() |
| 1278 | fs.path.__add__ = Mock() |
| 1279 | fs.path.side_effect = [current_path, target_path] |
| 1280 | fs.path.__add__.side_effect = [current_path, target_path] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1281 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1282 | mock_path_exists.side_effect = [True, True] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1283 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1284 | mock_compare_charmdir_hash.return_value = callable(False) |
| 1285 | mock_compare_charm_hash.return_value = callable(False) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1286 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1287 | instance = self.my_ns |
| 1288 | instance.fs = fs |
| 1289 | expected_result = False |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1290 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1291 | result = instance.check_charm_hash_changed(current_path, target_path) |
| 1292 | self.assertEqual(result, expected_result, "Wrong charm hash control value") |
| 1293 | self.assertEqual(mock_path_exists.call_count, 2) |
| 1294 | self.assertEqual(mock_compare_charmdir_hash.call_count, 1) |
| 1295 | self.assertEqual(mock_compare_charm_hash.call_count, 0) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1296 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1297 | @patch("os.path.exists") |
| 1298 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charmdir_hash") |
| 1299 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charm_hash") |
| 1300 | def test_ns_update_check_charm_hash_changed( |
| 1301 | self, mock_compare_charm_hash, mock_compare_charmdir_hash, mock_path_exists |
| 1302 | ): |
| 1303 | """Check charm hash, Hash has changed""" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1304 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1305 | current_path, target_path = "/tmp/charm1", "/tmp/charm2" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1306 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1307 | fs = Mock() |
| 1308 | fs.path.__add__ = Mock() |
| 1309 | fs.path.side_effect = [current_path, target_path, current_path, target_path] |
| 1310 | fs.path.__add__.side_effect = [ |
| 1311 | current_path, |
| 1312 | target_path, |
| 1313 | current_path, |
| 1314 | target_path, |
| 1315 | ] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1316 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1317 | mock_path_exists.side_effect = [True, True] |
| 1318 | mock_compare_charmdir_hash.return_value = callable(True) |
| 1319 | mock_compare_charm_hash.return_value = callable(True) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1320 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1321 | instance = self.my_ns |
| 1322 | instance.fs = fs |
| 1323 | expected_result = True |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1324 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1325 | result = instance.check_charm_hash_changed(current_path, target_path) |
| 1326 | self.assertEqual(result, expected_result, "Wrong charm hash control value") |
| 1327 | self.assertEqual(mock_path_exists.call_count, 2) |
| 1328 | self.assertEqual(mock_compare_charmdir_hash.call_count, 1) |
| 1329 | self.assertEqual(mock_compare_charm_hash.call_count, 0) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1330 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1331 | @patch("os.path.exists") |
| 1332 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charmdir_hash") |
| 1333 | @patch("osm_lcm.lcm_utils.LcmBase.compare_charm_hash") |
| 1334 | def test_ns_update_check_no_charm_path( |
| 1335 | self, mock_compare_charm_hash, mock_compare_charmdir_hash, mock_path_exists |
| 1336 | ): |
| 1337 | """Check charm hash, Charm path does not exist""" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1338 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1339 | current_path, target_path = "/tmp/charm1", "/tmp/charm2" |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1340 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1341 | fs = Mock() |
| 1342 | fs.path.__add__ = Mock() |
| 1343 | fs.path.side_effect = [current_path, target_path, current_path, target_path] |
| 1344 | fs.path.__add__.side_effect = [ |
| 1345 | current_path, |
| 1346 | target_path, |
| 1347 | current_path, |
| 1348 | target_path, |
| 1349 | ] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1350 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1351 | mock_path_exists.side_effect = [True, False] |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1352 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1353 | mock_compare_charmdir_hash.return_value = callable(False) |
| 1354 | mock_compare_charm_hash.return_value = callable(False) |
| 1355 | instance = self.my_ns |
| 1356 | instance.fs = fs |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1357 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1358 | with self.assertRaises(LcmException): |
| 1359 | instance.check_charm_hash_changed(current_path, target_path) |
| 1360 | self.assertEqual(mock_path_exists.call_count, 2) |
| 1361 | self.assertEqual(mock_compare_charmdir_hash.call_count, 0) |
| 1362 | self.assertEqual(mock_compare_charm_hash.call_count, 0) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1363 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1364 | def test_ns_update_check_juju_bundle_existence_bundle_exists(self): |
| 1365 | """Check juju bundle existence""" |
| 1366 | test_vnfd2 = self.db.get_one( |
| 1367 | "vnfds", {"_id": "d96b1cdf-5ad6-49f7-bf65-907ada989293"} |
| 1368 | ) |
| 1369 | expected_result = "stable/native-kdu" |
| 1370 | result = check_juju_bundle_existence(test_vnfd2) |
| 1371 | self.assertEqual(result, expected_result, "Wrong juju bundle name") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1372 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1373 | def test_ns_update_check_juju_bundle_existence_bundle_does_not_exist(self): |
| 1374 | """Check juju bundle existence""" |
| 1375 | test_vnfd1 = self.db.get_one("vnfds", {"_id": vnfd_id}) |
| 1376 | expected_result = None |
| 1377 | result = check_juju_bundle_existence(test_vnfd1) |
| 1378 | self.assertEqual(result, expected_result, "Wrong juju bundle name") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1379 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1380 | def test_ns_update_check_juju_bundle_existence_empty_vnfd(self): |
| 1381 | """Check juju bundle existence""" |
| 1382 | test_vnfd1 = {} |
| 1383 | expected_result = None |
| 1384 | result = check_juju_bundle_existence(test_vnfd1) |
| 1385 | self.assertEqual(result, expected_result, "Wrong juju bundle name") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1386 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1387 | def test_ns_update_check_juju_bundle_existence_invalid_vnfd(self): |
| 1388 | """Check juju bundle existence""" |
| 1389 | test_vnfd1 = [{"_id": vnfd_id}] |
| 1390 | with self.assertRaises(AttributeError): |
| 1391 | check_juju_bundle_existence(test_vnfd1) |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1392 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1393 | def test_ns_update_check_juju_charm_artifacts_base_folder_wth_pkgdir(self): |
| 1394 | """Check charm artifacts""" |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1395 | base_folder = {"folder": vnfd_id, "pkg-dir": "hackfest_3charmed_vnfd"} |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1396 | charm_name = "simple" |
| 1397 | charm_type = "lxc_proxy_charm" |
| 1398 | revision = 3 |
| 1399 | expected_result = f"{vnfd_id}:3/hackfest_3charmed_vnfd/charms/simple" |
| 1400 | result = get_charm_artifact_path(base_folder, charm_name, charm_type, revision) |
| 1401 | self.assertEqual(result, expected_result, "Wrong charm artifact path") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1402 | |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1403 | def test_ns_update_check_juju_charm_artifacts_base_folder_wthout_pkgdir(self): |
| 1404 | """Check charm artifacts, SOL004 packages""" |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1405 | base_folder = {"folder": vnfd_id} |
| aticig | 1dda84c | 2022-09-10 01:56:58 +0300 | [diff] [blame] | 1406 | charm_name = "basic" |
| 1407 | charm_type, revision = "", "" |
| 1408 | expected_result = f"{vnfd_id}/Scripts/helm-charts/basic" |
| 1409 | result = get_charm_artifact_path(base_folder, charm_name, charm_type, revision) |
| 1410 | self.assertEqual(result, expected_result, "Wrong charm artifact path") |
| aticig | dffa621 | 2022-04-12 15:27:53 +0300 | [diff] [blame] | 1411 | |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 1412 | |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1413 | class TestInstantiateN2VC(TestBaseNS): |
| 1414 | async def setUp(self): |
| 1415 | await super().setUp() |
| 1416 | self.db_nsr = yaml.safe_load(descriptors.db_nsrs_text)[0] |
| 1417 | self.db_vnfr = yaml.safe_load(descriptors.db_vnfrs_text)[0] |
| 1418 | self.vca_index = 1 |
| 1419 | self.my_ns._write_configuration_status = Mock() |
| 1420 | |
| 1421 | async def call_instantiate_N2VC(self): |
| 1422 | logging_text = "N2VC Instantiation" |
| 1423 | config_descriptor = {"config-access": {"ssh-access": {"default-user": "admin"}}} |
| 1424 | base_folder = {"pkg-dir": "", "folder": "~"} |
| 1425 | stage = ["Stage", "Message"] |
| 1426 | |
| 1427 | await self.my_ns.instantiate_N2VC( |
| 1428 | logging_text=logging_text, |
| 1429 | vca_index=self.vca_index, |
| 1430 | nsi_id="nsi_id", |
| 1431 | db_nsr=self.db_nsr, |
| 1432 | db_vnfr=self.db_vnfr, |
| 1433 | vdu_id=None, |
| 1434 | kdu_name=None, |
| 1435 | vdu_index=None, |
| Pedro Escaleira | 120695e | 2022-06-11 21:17:26 +0100 | [diff] [blame] | 1436 | kdu_index=None, |
| Patricia Reinoso | b4312c0 | 2023-01-06 22:28:44 +0000 | [diff] [blame] | 1437 | config_descriptor=config_descriptor, |
| 1438 | deploy_params={}, |
| 1439 | base_folder=base_folder, |
| 1440 | nslcmop_id="nslcmop_id", |
| 1441 | stage=stage, |
| 1442 | vca_type="native_charm", |
| 1443 | vca_name="vca_name", |
| 1444 | ee_config_descriptor={}, |
| 1445 | ) |
| 1446 | |
| 1447 | def check_config_status(self, expected_status): |
| 1448 | self.my_ns._write_configuration_status.assert_called_with( |
| 1449 | nsr_id=self.db_nsr["_id"], vca_index=self.vca_index, status=expected_status |
| 1450 | ) |
| 1451 | |
| 1452 | async def call_ns_add_relation(self): |
| 1453 | ee_relation = EERelation( |
| 1454 | { |
| 1455 | "nsr-id": self.db_nsr["_id"], |
| 1456 | "vdu-profile-id": None, |
| 1457 | "kdu-resource-profile-id": None, |
| 1458 | "vnf-profile-id": "hackfest_vnf1", |
| 1459 | "execution-environment-ref": "f48163a6-c807-47bc-9682-f72caef5af85.alf-c-ab", |
| 1460 | "endpoint": "127.0.0.1", |
| 1461 | } |
| 1462 | ) |
| 1463 | |
| 1464 | relation = Relation("relation-name", ee_relation, ee_relation) |
| 1465 | cached_vnfrs = {"hackfest_vnf1": self.db_vnfr} |
| 1466 | |
| 1467 | return await self.my_ns._add_relation( |
| 1468 | relation=relation, |
| 1469 | vca_type="native_charm", |
| 1470 | db_nsr=self.db_nsr, |
| 1471 | cached_vnfds={}, |
| 1472 | cached_vnfrs=cached_vnfrs, |
| 1473 | ) |
| 1474 | |
| 1475 | async def test_add_relation_ok(self): |
| 1476 | await self.call_instantiate_N2VC() |
| 1477 | self.check_config_status(expected_status="READY") |
| 1478 | |
| 1479 | async def test_add_relation_returns_false_raises_exception(self): |
| 1480 | self.my_ns._add_vca_relations = asynctest.CoroutineMock(return_value=False) |
| 1481 | |
| 1482 | with self.assertRaises(LcmException) as exception: |
| 1483 | await self.call_instantiate_N2VC() |
| 1484 | |
| 1485 | exception_msg = "Relations could not be added to VCA." |
| 1486 | self.assertTrue(exception_msg in str(exception.exception)) |
| 1487 | self.check_config_status(expected_status="BROKEN") |
| 1488 | |
| 1489 | async def test_add_relation_raises_lcm_exception(self): |
| 1490 | exception_msg = "Relations FAILED" |
| 1491 | self.my_ns._add_vca_relations = asynctest.CoroutineMock( |
| 1492 | side_effect=LcmException(exception_msg) |
| 1493 | ) |
| 1494 | |
| 1495 | with self.assertRaises(LcmException) as exception: |
| 1496 | await self.call_instantiate_N2VC() |
| 1497 | |
| 1498 | self.assertTrue(exception_msg in str(exception.exception)) |
| 1499 | self.check_config_status(expected_status="BROKEN") |
| 1500 | |
| 1501 | async def test_n2vc_add_relation_fails_raises_exception(self): |
| 1502 | exception_msg = "N2VC failed to add relations" |
| 1503 | self.my_ns.n2vc.add_relation = asynctest.CoroutineMock( |
| 1504 | side_effect=N2VCException(exception_msg) |
| 1505 | ) |
| 1506 | with self.assertRaises(LcmException) as exception: |
| 1507 | await self.call_ns_add_relation() |
| 1508 | self.assertTrue(exception_msg in str(exception.exception)) |
| 1509 | |
| 1510 | async def test_n2vc_add_relation_ok_returns_true(self): |
| 1511 | self.my_ns.n2vc.add_relation = asynctest.CoroutineMock(return_value=None) |
| 1512 | self.assertTrue(await self.call_ns_add_relation()) |
| 1513 | |
| 1514 | |
| Patricia Reinoso | ceb0386 | 2023-01-12 09:40:53 +0000 | [diff] [blame] | 1515 | class TestGetVNFRelations(TestBaseNS): |
| 1516 | async def setUp(self): |
| 1517 | await super().setUp() |
| 1518 | self.db_nsd = yaml.safe_load(descriptors.db_nsds_text)[0] |
| 1519 | |
| 1520 | def test_ns_charm_vca_returns_empty_relations(self): |
| 1521 | ns_charm_vca = {"member-vnf-index": None, "target_element": "ns"} |
| 1522 | nsr_id = self.db_nsd["id"] |
| 1523 | deployed_vca = DeployedVCA(nsr_id, ns_charm_vca) |
| 1524 | |
| 1525 | expected_relations = [] |
| 1526 | self.assertEqual( |
| 1527 | expected_relations, |
| 1528 | self.my_ns._get_vnf_relations( |
| 1529 | nsr_id=nsr_id, nsd=self.db_nsd, vca=deployed_vca, cached_vnfds={} |
| 1530 | ), |
| 1531 | ) |
| 1532 | |
| 1533 | def test_vnf_returns_relation(self): |
| 1534 | vnf_vca = { |
| 1535 | "member-vnf-index": "1", |
| 1536 | "target_element": "vnf/0", |
| 1537 | "ee_descriptor_id": "simple-ee", |
| 1538 | "vdu_id": "mgmtVM", |
| 1539 | } |
| 1540 | nsr_id = self.db_nsd["id"] |
| 1541 | deployed_vca = DeployedVCA(nsr_id, vnf_vca) |
| 1542 | |
| 1543 | provider_dict = { |
| 1544 | "nsr-id": nsr_id, |
| 1545 | "vnf-profile-id": "1", |
| 1546 | "vdu-profile-id": "mgmtVM", |
| 1547 | "kdu-resource-profile-id": None, |
| 1548 | "execution-environment-ref": "simple-ee", |
| 1549 | "endpoint": "interface", |
| 1550 | } |
| 1551 | |
| 1552 | requirer_dict = { |
| 1553 | "nsr-id": nsr_id, |
| 1554 | "vnf-profile-id": "1", |
| 1555 | "vdu-profile-id": "dataVM", |
| 1556 | "kdu-resource-profile-id": None, |
| 1557 | "execution-environment-ref": "simple-ee", |
| 1558 | "endpoint": "interface", |
| 1559 | } |
| 1560 | |
| 1561 | provider = EERelation(provider_dict) |
| 1562 | requirer = EERelation(requirer_dict) |
| 1563 | relation = Relation("relation", provider, requirer) |
| 1564 | |
| 1565 | relations_found = self.my_ns._get_vnf_relations( |
| 1566 | nsr_id=nsr_id, nsd=self.db_nsd, vca=deployed_vca, cached_vnfds={} |
| 1567 | ) |
| 1568 | |
| 1569 | self.assertEqual(1, len(relations_found)) |
| 1570 | self.assertEqual(relation, relations_found[0]) |
| 1571 | |
| 1572 | |
| garciadeblas | 5697b8b | 2021-03-24 09:17:02 +0100 | [diff] [blame] | 1573 | if __name__ == "__main__": |
| tierno | 51d065c | 2019-08-26 16:48:23 +0000 | [diff] [blame] | 1574 | asynctest.main() |