tacker/tacker/tests/unit/sol_refactored/infra_drivers/openstack/test_openstack.py

4761 lines
170 KiB
Python

# Copyright (C) 2021 Nippon Telegraph and Telephone Corporation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
import json
import os
from oslo_utils import uuidutils
from unittest import mock
from tacker import context
from tacker.sol_refactored.common import config
from tacker.sol_refactored.common import exceptions as sol_ex
from tacker.sol_refactored.common import vnfd_utils
from tacker.sol_refactored.infra_drivers.openstack import openstack
from tacker.sol_refactored import objects
from tacker.sol_refactored.objects.v2 import fields
from tacker.tests import base
SAMPLE_VNFD_ID = "b1bb0ce7-ebca-4fa7-95ed-4840d7000000"
SAMPLE_FLAVOUR_ID = "simple"
STACK_ID = "d7aeba20-1b00-4bff-b050-6b42a262c84d"
# instantiateVnfRequest example
_vim_connection_info_example = {
"vimId": "vim_id_1",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3",
"interfaceInfo": {"endpoint": "http://127.0.0.1/identity"},
"accessInfo": {
"username": "nfv_user",
"region": "RegionOne",
"password": "devstack",
"project": "nfv",
"projectDomain": "Default",
"userDomain": "Default"
}
}
_instantiate_req_example = {
"flavourId": SAMPLE_FLAVOUR_ID,
"extVirtualLinks": [
{
"id": "id_ext_vl_1",
"resourceId": "res_id_ext_vl_1",
"extCps": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"fixedAddresses": [
"10.10.0.102"
]
}
]
}
}
]
}
}
}
]
},
{
"id": "id_ext_vl_2",
"resourceId": "res_id_id_ext_vl_2",
"extCps": [
{
"cpdId": "VDU1_CP2",
"cpConfig": {
"VDU1_CP2_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet_1"
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP2",
"cpConfig": {
"VDU2_CP2_1": {
"linkPortId": "link_port_id_VDU2_CP2"
}
}
}
],
"extLinkPorts": [
{
"id": "link_port_id_VDU2_CP2",
"resourceHandle": {
"resourceId": "res_id_VDU2_CP2"
}
}
]
}
],
"extManagedVirtualLinks": [
{
"id": "id_ext_mgd_1",
"vnfVirtualLinkDescId": "internalVL1",
"resourceId": "res_id_internalVL1"
}
],
"vimConnectionInfo": {
"vim1": _vim_connection_info_example
}
}
# example for test of StandardUserData
_instantiate_req_example_S = {
"flavourId": SAMPLE_FLAVOUR_ID,
"extVirtualLinks": [
{
"id": "id_ext_vl_1",
"resourceId": "res_id_ext_vl_1",
"extCps": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet"
}
]
}
}
]
}
}
}
]
}
],
"extManagedVirtualLinks": [
{
"id": "id_ext_mgd_1",
"vnfVirtualLinkDescId": "internalVL1",
"resourceId": "res_id_internalVL1"
}
],
"vimConnectionInfo": {
"vim1": _vim_connection_info_example
}
}
# ChangeExtVnfConnectivityRequest example
_change_ext_conn_req_example = {
"extVirtualLinks": [
{
"id": "id_ext_vl_3",
"resourceId": "res_id_ext_vl_3",
"extCps": [
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"fixedAddresses": [
"20.10.0.102"
]
}
]
}
}
]
}
}
}
]
},
{
"id": "id_ext_vl_4",
"resourceId": "res_id_id_ext_vl_4",
"extCps": [
{
"cpdId": "VDU1_CP2",
"cpConfig": {
"VDU1_CP2_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet_4"
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP2",
"cpConfig": {
"VDU2_CP2_1": {
"linkPortId": "link_port_id_VDU2_CP2_modified"
}
}
}
],
"extLinkPorts": [
{
"id": "link_port_id_VDU2_CP2_modified",
"resourceHandle": {
"resourceId": "res_id_VDU2_CP2_modified"
}
}
]
}
]
}
# heat resources examples
# NOTE:
# - following attributes which are not related to tests are omitted.
# updated_time, logical_resource_id, resource_status, resource_status_reason
# and "rel: self" in links.
# - some identifiers are modified to make check easy.
# - stack_id is based on real example.
_url = "http://127.0.0.1/heat-api/v1/57bcfdcbccbc4b85a9a4c94690a1164f/stacks/"
_stack_id = ("vnf-768c24d2-2ea6-4225-b1c7-79e42abfbde6/"
"1fa212ca-e904-4109-9a96-1900d35d2a5b")
_href = "".join((_url, _stack_id))
_stack_id_VDU1_scale = (
"vnf-768c24d2-2ea6-4225-b1c7-79e42abfbde6-VDU1_scale_group-dv4kv7qtcwhw/"
"53ee92b6-8193-4df5-90f7-2738e61fba2c")
_href_VDU1_scale = "".join((_url, _stack_id_VDU1_scale))
_stack_id_VDU1_1 = (
"vnf-768c24d2-2ea6-4225-b1c7-79e42abfbde6-VDU1_scale_group-dv4kv7qtcwhw-"
"bemybz4ugeso-mrajuhqw7ath/ea59d312-bab3-4ef2-897c-88b5cee117de")
_href_VDU1_1 = "".join((_url, _stack_id_VDU1_1))
_stack_id_VDU1_2 = (
"vnf-768c24d2-2ea6-4225-b1c7-79e42abfbde6-VDU1_scale_group-dv4kv7qtcwhw-"
"myet4efobvvp-aptv6apap2h5/dd94d2ae-a02b-4fab-a492-514c422299ec")
_href_VDU1_2 = "".join((_url, _stack_id_VDU1_2))
_heat_reses_example_base = [
{
"creation_time": "2021-12-10T00:40:46Z",
"resource_name": "VDU2",
"physical_resource_id": "res_id_VDU2",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2021-12-10T00:40:47Z",
"resource_name": "VDU2_CP5",
"physical_resource_id": "res_id_VDU2_CP5",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2"
]
},
{
"creation_time": "2021-12-10T00:40:49Z",
"resource_name": "internalVL3_subnet",
"physical_resource_id": "06f68f37-d37c-4310-8756-3884d9b8cb4b",
"resource_type": "OS::Neutron::Subnet",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2",
"VDU2_CP5"
]
},
{
"creation_time": "2021-12-10T00:40:51Z",
"resource_name": "VDU2_CP3",
"physical_resource_id": "res_id_VDU2_CP3",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2"
]
},
{
"creation_time": "2021-12-10T00:40:53Z",
"resource_name": "VDU2_CP4",
"physical_resource_id": "res_id_VDU2_CP4",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2"
]
},
{
"creation_time": "2021-12-10T00:40:53Z",
"resource_name": "VDU1_scale_out",
"physical_resource_id": "234c78aefbaa4770ba5bbd8c7f624584",
"resource_type": "OS::Heat::ScalingPolicy",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2021-12-10T00:40:53Z",
"resource_name": "VDU1_scale_in",
"physical_resource_id": "7cb738b392a64936a14f92bb79123a42",
"resource_type": "OS::Heat::ScalingPolicy",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2021-12-10T00:40:53Z",
"resource_name": "VDU1_scale_group",
"physical_resource_id": "53ee92b6-8193-4df5-90f7-2738e61fba2c",
"resource_type": "OS::Heat::AutoScalingGroup",
"links": [
{
"href": _href,
"rel": "stack"
},
{
"href": _href_VDU1_scale,
"rel": "nested"
}
],
"required_by": [
"VDU1_scale_out",
"VDU1_scale_in"
]
},
{
"creation_time": "2021-12-10T00:40:55Z",
"resource_name": "internalVL3",
"physical_resource_id": "res_id_internalVL3",
"resource_type": "OS::Neutron::Net",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"internalVL3_subnet",
"VDU2_CP5",
"VDU1_scale_group"
]
},
{
"creation_time": "2021-12-10T00:40:56Z",
"resource_name": "internalVL2_subnet",
"physical_resource_id": "848bc969-cc5c-47b2-94de-469556b993fb",
"resource_type": "OS::Neutron::Subnet",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2",
"VDU2_CP4"
]
},
{
"creation_time": "2021-12-10T00:40:58Z",
"resource_name": "internalVL2",
"physical_resource_id": "res_id_internalVL2",
"resource_type": "OS::Neutron::Net",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2_CP4",
"internalVL2_subnet",
"VDU1_scale_group"
]
},
{
"creation_time": "2021-12-10T00:41:35Z",
"resource_name": "bemybz4ugeso",
"physical_resource_id": "ea59d312-bab3-4ef2-897c-88b5cee117de",
"resource_type": "VDU1.yaml",
"links": [
{
"href": _href_VDU1_scale,
"rel": "stack"
},
{
"href": _href_VDU1_1,
"rel": "nested"
}
],
"required_by": [],
"parent_resource": "VDU1_scale_group"
},
{
"creation_time": "2021-12-10T01:03:37Z",
"resource_name": "myet4efobvvp",
"physical_resource_id": "dd94d2ae-a02b-4fab-a492-514c422299ec",
"resource_type": "VDU1.yaml",
"links": [
{
"href": _href_VDU1_scale,
"rel": "stack"
},
{
"href": _href_VDU1_2,
"rel": "nested"
}
],
"required_by": [],
"parent_resource": "VDU1_scale_group"
},
{
"creation_time": "2021-12-10T00:41:43Z",
"resource_name": "VDU1",
"physical_resource_id": "res_id_VDU1_1",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VirtualStorage",
"physical_resource_id": "res_id_VirtualStorage_1",
"resource_type": "OS::Cinder::Volume",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "multi",
"physical_resource_id": "0690bb1b-36d0-4684-851b-9c1b13a9a5de",
"resource_type": "OS::Cinder::VolumeType",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VirtualStorage"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VDU1_CP1",
"physical_resource_id": "res_id_VDU1_CP1_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"multi",
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VDU1_CP4",
"physical_resource_id": "res_id_VDU1_CP4_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VDU1_CP5",
"physical_resource_id": "res_id_VDU1_CP5_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T00:41:46Z",
"resource_name": "VDU1_CP3",
"physical_resource_id": "res_id_VDU1_CP3_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T01:03:49Z",
"resource_name": "VDU1",
"physical_resource_id": "res_id_VDU1_2",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:51Z",
"resource_name": "VirtualStorage",
"physical_resource_id": "res_id_VirtualStorage_2",
"resource_type": "OS::Cinder::Volume",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:53Z",
"resource_name": "multi",
"physical_resource_id": "03433e3a-a8c4-40b3-8802-6b114922feff",
"resource_type": "OS::Cinder::VolumeType",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VirtualStorage"
],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:53Z",
"resource_name": "VDU1_CP1",
"physical_resource_id": "res_id_VDU1_CP1_2",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"multi",
"VDU1"
],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:53Z",
"resource_name": "VDU1_CP4",
"physical_resource_id": "res_id_VDU1_CP4_2",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:55Z",
"resource_name": "VDU1_CP5",
"physical_resource_id": "res_id_VDU1_CP5_2",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
},
{
"creation_time": "2021-12-10T01:03:57Z",
"resource_name": "VDU1_CP3",
"physical_resource_id": "res_id_VDU1_CP3_2",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
}
]
_heat_reses_example_cps_before = [
{
"creation_time": "2021-12-10T00:40:46Z",
"resource_name": "VDU2_CP1",
"physical_resource_id": "res_id_VDU2_CP1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2"
]
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T01:03:53Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_2",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
}
]
_heat_reses_example_cps_after = [
{
"creation_time": "2021-12-10T00:40:46Z",
"resource_name": "VDU2_CP1",
"physical_resource_id": "res_id_VDU2_CP1_modified",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2"
]
},
{
"creation_time": "2021-12-10T00:41:45Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_1_modified",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "bemybz4ugeso"
},
{
"creation_time": "2021-12-10T01:03:53Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_2_modified",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_2,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "myet4efobvvp"
}
]
# heat resources example for other than change_ext_conn
_heat_reses_example = (
_heat_reses_example_base + _heat_reses_example_cps_before)
# heat resources example after executing change_ext_conn
_heat_reses_example_change_ext_conn = (
_heat_reses_example_base + _heat_reses_example_cps_after)
# heat resources example for test of StandardUserData
_stack_id_VDU1_0_S = (
"vnf-881718c6-830b-4232-9e83-4b0cd7678713-VDU1-0-ntteaet43n2s/"
"46c6328e-db32-4da0-8dee-c69079644982")
_href_VDU1_0_S = "".join((_url, _stack_id_VDU1_0_S))
_stack_id_VDU1_1_S = (
"vnf-881718c6-830b-4232-9e83-4b0cd7678713-VDU1-1-vswbicn4ezjc/"
"64e143e1-49dc-4114-ad7c-5bb74cbd1efe")
_href_VDU1_1_S = "".join((_url, _stack_id_VDU1_1_S))
_stack_id_VDU2_0_S = (
"vnf-881718c6-830b-4232-9e83-4b0cd7678713-VDU2-0-hht2ozgyxu7q/"
"f1398e13-26ca-4d87-93ef-883bac1f82f6")
_href_VDU2_0_S = "".join((_url, _stack_id_VDU2_0_S))
_heat_reses_example_S = [
{
"creation_time": "2022-11-24T23:31:01Z",
"resource_name": "VDU1-0",
"physical_resource_id": "46c6328e-db32-4da0-8dee-c69079644982",
"resource_type": "VDU1.yaml",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2022-11-24T23:31:01Z",
"resource_name": "VDU1-1",
"physical_resource_id": "64e143e1-49dc-4114-ad7c-5bb74cbd1efe",
"resource_type": "VDU1.yaml",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2022-11-24T23:31:02Z",
"resource_name": "internalVL2_subnet",
"physical_resource_id": "acbd442b-00cc-4dfa-9243-8943673ff8cb",
"resource_type": "OS::Neutron::Subnet",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2022-11-24T23:31:02Z",
"resource_name": "VDU2-0",
"physical_resource_id": "f1398e13-26ca-4d87-93ef-883bac1f82f6",
"resource_type": "VDU2.yaml",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": []
},
{
"creation_time": "2022-11-24T23:31:02Z",
"resource_name": "internalVL2",
"physical_resource_id": "res_id_internalVL2",
"resource_type": "OS::Neutron::Net",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU1-0",
"internalVL2_subnet",
"VDU2-0",
"VDU1-1"
]
},
{
"creation_time": "2022-11-24T23:31:02Z",
"resource_name": "nfvi_node_affinity",
"physical_resource_id": "a91fc295-72fd-456e-a607-67bbfceabece",
"resource_type": "OS::Nova::ServerGroup",
"links": [
{
"href": _href,
"rel": "stack"
}
],
"required_by": [
"VDU2-0"
]
},
{
"creation_time": "2022-11-24T23:31:17Z",
"resource_name": "VDU1",
"physical_resource_id": "res_id_VDU1_0",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"required_by": [],
"parent_resource": "VDU1-0"
},
{
"creation_time": "2022-11-24T23:31:17Z",
"resource_name": "VDU1_CP3",
"physical_resource_id": "res_id_VDU1_CP3_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU1_CP1",
"physical_resource_id": "res_id_VDU1_CP1_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"parent_resource": "VDU1-0",
"physical_resource_id": "res_id_VDU1-VirtualStorage_0",
"required_by": [
"volume_attachment"
],
"resource_name": "VDU1-VirtualStorage",
"resource_type": "OS::Cinder::Volume",
},
{
"creation_time": "2022-11-24T23:31:18Z",
"links": [
{
"href": _href_VDU1_0_S,
"rel": "stack"
}
],
"parent_resource": "VDU1-0",
"physical_resource_id": "res_id_VDU1-VirtualStorage_0",
"required_by": [],
"resource_name": "volume_attachment",
"resource_type": "OS::Cinder::VolumeAttachment",
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU1",
"physical_resource_id": "res_id_VDU1_1",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"required_by": [],
"parent_resource": "VDU1-1"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU1_CP3",
"physical_resource_id": "res_id_VDU1_CP3_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-1"
},
{
"creation_time": "2022-11-24T23:31:19Z",
"resource_name": "VDU1_CP1",
"physical_resource_id": "res_id_VDU1_CP1_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-1"
},
{
"creation_time": "2022-11-24T23:31:20Z",
"resource_name": "VDU1_CP2",
"physical_resource_id": "res_id_VDU1_CP2_1",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"required_by": [
"VDU1"
],
"parent_resource": "VDU1-1"
},
{
"creation_time": "2022-11-24T23:31:20Z",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"parent_resource": "VDU1-1",
"physical_resource_id": "res_id_VDU1-VirtualStorage_1",
"required_by": [
"volume_attachment"
],
"resource_name": "VDU1-VirtualStorage",
"resource_type": "OS::Cinder::Volume",
},
{
"creation_time": "2022-11-24T23:31:20Z",
"links": [
{
"href": _href_VDU1_1_S,
"rel": "stack"
}
],
"parent_resource": "VDU1-1",
"physical_resource_id": "res_id_VDU1-VirtualStorage_1",
"required_by": [],
"resource_name": "volume_attachment",
"resource_type": "OS::Cinder::VolumeAttachment",
},
{
"creation_time": "2022-11-24T23:31:17Z",
"resource_name": "VDU2",
"physical_resource_id": "res_id_VDU2_0",
"resource_type": "OS::Nova::Server",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [],
"parent_resource": "VDU2-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU2_CP3",
"physical_resource_id": "res_id_VDU2_CP3_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU2"
],
"parent_resource": "VDU2-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "VDU2-VirtualStorage",
"physical_resource_id": "res_id_VDU2-VirtualStorage_0",
"resource_type": "OS::Cinder::Volume",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU2"
],
"parent_resource": "VDU2-0"
},
{
"creation_time": "2022-11-24T23:31:18Z",
"resource_name": "multi",
"physical_resource_id": "3374895e-2f83-4061-bad7-1085215efa68",
"resource_type": "OS::Cinder::VolumeType",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU2-VirtualStorage"
],
"parent_resource": "VDU2-0"
},
{
"creation_time": "2022-11-24T23:31:19Z",
"resource_name": "VDU2_CP2",
"physical_resource_id": "res_id_VDU2_CP2_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU2"
],
"parent_resource": "VDU2-0"
},
{
"creation_time": "2022-11-24T23:31:20Z",
"resource_name": "VDU2_CP1",
"physical_resource_id": "res_id_VDU2_CP1_0",
"resource_type": "OS::Neutron::Port",
"links": [
{
"href": _href_VDU2_0_S,
"rel": "stack"
}
],
"required_by": [
"VDU2"
],
"parent_resource": "VDU2-0"
}
]
# heat get_parameters example
_nfv_dict = {
"VDU": {
"VDU1": {"computeFlavourId": "m1.tiny"},
"VDU1-VirtualStorage": {"vcImageId": "image-VDU1"},
"VDU2": {"vcImageId": "image-VDU2", "computeFlavourId": "m1.small"}
}
}
_heat_get_parameters_example = {
'nfv': json.dumps(_nfv_dict)
}
# heat get_parameters example for test of StandardUserData
_nfv_dict_S = {
"VDU": {
"VDU1-0": {"vcImageId": "image-VDU1", "computeFlavourId": "m1.tiny",
"locationConstraints": "zone1"},
"VDU1-1": {"vcImageId": "image-VDU1", "computeFlavourId": "m1.tiny",
"locationConstraints": "zone1"},
"VDU2-0": {"computeFlavourId": "m1.small"},
"VDU2-VirtualStorage-0": {"vcImageId": "image-VDU2"}
}
}
_heat_get_parameters_example_S = {
'nfv': json.dumps(_nfv_dict_S)
}
# heat get_template example
_heat_get_template_example = {
"resources": {
"myet4efobvvp": {
"properties": {
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
},
"bemybz4ugeso": {
"properties": {
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
}
}
}
# change vnfpkg before inst info
_inst_info_example = {
"flavourId": "simple",
"vnfState": "STARTED",
"extCpInfo": [
{
"id": "90561570-264c-4472-b84f-1fff98513475",
"cpdId": "VDU2_CP1",
"cpConfigId": "VDU2_CP1_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "ac27c99b-73c8-4e91-b730-90deade72af4",
"associatedVnfcCpId": "be955786-a0c7-4b61-8cd8-9bb8bcb1c6e3"
},
{
"id": "f9f4b4b2-50e2-4c73-b89b-e0665e65ffbe",
"cpdId": "VDU2_CP2",
"cpConfigId": "VDU2_CP2_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "12567a13-9fbd-4803-ad9f-d94ced266cd8",
"associatedVnfcCpId": "c54fa2fc-185a-49a7-bb89-f30f7c3be6a4"
},
{
"id": "05474d0b-a1f7-4be5-b57e-ef6873e1f3b6",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "aa6646da-2e59-4de9-9b72-c62e7c4d9142",
"associatedVnfcCpId": "fdbb289f-87c8-40d0-bf06-da07b41ba124"
},
{
"id": "42ede9a6-c2b8-4c0d-a337-26342ffb236c",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "efd0eb4e-4e55-4ac8-8b9b-403ec79faf2d",
"associatedVnfcCpId": "235f920c-8b49-4894-9c36-73f5a3b9f74d"
},
{
"id": "4f0ab1ad-b7de-482f-a69b-1093c71d2ceb",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "a6c4c043-e082-4873-a871-02467af66224",
"associatedVnfcCpId": "e23d970d-9ea9-4c26-9d67-8f244383ea3c"
},
{
"id": "7a7fa30f-a303-4856-bc8b-b836cb682892",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
# "cpProtocolInfo": omitted
"extLinkPortId": "f58df4d9-08ff-41b7-ab73-95ebfb8103c4",
"associatedVnfcCpId": "259c5895-7be6-4bed-8a94-221c41b3d08f"
}
],
"extVirtualLinkInfo": [
{
"id": "137bdf0b-835c-43f0-b0d2-5c002599118a",
"resourceHandle": {
"resourceId": "6f97f400-2861-482a-ba78-65b652aaf8fc"
},
"extLinkPorts": [
{
"id": "ac27c99b-73c8-4e91-b730-90deade72af4",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU2_CP1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "90561570-264c-4472-b84f-1fff98513475"
},
{
"id": "efd0eb4e-4e55-4ac8-8b9b-403ec79faf2d",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_1_CP1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "42ede9a6-c2b8-4c0d-a337-26342ffb236c"
},
{
"id": "f58df4d9-08ff-41b7-ab73-95ebfb8103c4",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_2_CP1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "7a7fa30f-a303-4856-bc8b-b836cb682892"
}
],
# "currentVnfExtCpData": omitted
},
{
"id": "d8141a5a-6b6e-4dab-9bf5-158f23a617d7",
"resourceHandle": {
"resourceId": "02bc95e0-3d43-4d11-83b8-f7b15d8661a9"
},
"extLinkPorts": [
{
"id": "12567a13-9fbd-4803-ad9f-d94ced266cd8",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU2_CP2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "f9f4b4b2-50e2-4c73-b89b-e0665e65ffbe"
},
{
"id": "aa6646da-2e59-4de9-9b72-c62e7c4d9142",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_1_CP2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "05474d0b-a1f7-4be5-b57e-ef6873e1f3b6"
},
{
"id": "a6c4c043-e082-4873-a871-02467af66224",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_2_CP2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "4f0ab1ad-b7de-482f-a69b-1093c71d2ceb"
}
],
# "currentVnfExtCpData": omitted
}
],
"extManagedVirtualLinkInfo": [
{
"id": "bad53df7-f1fa-482d-91b1-caec382aeec2",
"vnfVirtualLinkDescId": "internalVL1",
"networkResource": {
"resourceId": "56730009-169c-4f96-8141-828acf1ee067"
},
"vnfLinkPorts": [
{
"id": "74f387fe-6355-4af3-adc7-cdb507d5fa5f",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU2_CP3",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "5b0b336b-c207-4fa8-8b41-a5ad87d85cd0",
"cpInstanceType": "VNFC_CP"
},
{
"id": "4064ec55-b862-4527-a911-8752d3aa765a",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_1_CP3",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "b0732fb7-a42a-4077-aebc-d22b67b64f13",
"cpInstanceType": "VNFC_CP"
},
{
"id": "f3c9e62d-0f31-4a36-bd99-eecd8def0871",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_2_CP3",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "9c65f67e-feb2-447c-b0e7-a4f896185b4f",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"vnfcResourceInfo": [
{
"id": "res_id_VDU1_2",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_2",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_2"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_2",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_2"
},
{
"id": "VDU1_CP2-res_id_VDU1_2",
"cpdId": "VDU1_CP2",
"vnfExtCpId": "cp-res_id_VDU1_CP2_2"
},
{
"id": "VDU1_CP3-res_id_VDU1_2",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_2"
},
{
"id": "VDU1_CP4-res_id_VDU1_2",
"cpdId": "VDU1_CP4",
"vnfLinkPortId": "res_id_VDU1_CP4_2"
},
{
"id": "VDU1_CP5-res_id_VDU1_2",
"cpdId": "VDU1_CP5",
"vnfLinkPortId": "res_id_VDU1_CP5_2"
}
],
"metadata": {
"creation_time": "2021-12-10T01:03:49Z",
"stack_id": "vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7-"
"VDU1_scale_group-2zmsxtwtsj7n-"
"fkwryhyv6qbr-qoemdwxw7o5c/"
"d7aeba20-1b00-4bff-b050-6b42a262c84d",
"parent_resource_name": "fkwryhyv6qbr"
}
},
{
"id": "res_id_VDU2_1",
"vduId": "VDU2",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_1",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_2"
],
"vnfcCpInfo": [
{
"id": "VDU2_CP1-res_id_VDU2_1",
"cpdId": "VDU2_CP1",
"vnfExtCpId": "cp-res_id_VDU2_CP1_1"
},
{
"id": "VDU2_CP2-res_id_VDU2_1",
"cpdId": "VDU2_CP2",
"vnfExtCpId": "cp-res_id_VDU2_CP2_1"
},
{
"id": "VDU2_CP3-res_id_VDU2_1",
"cpdId": "VDU2_CP3",
"vnfLinkPortId": "res_id_VDU2_CP3_1"
},
{
"id": "VDU2_CP4-res_id_VDU2_1",
"cpdId": "VDU2_CP4",
"vnfLinkPortId": "res_id_VDU2_CP4_1"
},
{
"id": "VDU2_CP5-res_id_VDU2_1",
"cpdId": "VDU2_CP5",
"vnfLinkPortId": "res_id_VDU2_CP5_1"
}
],
"metadata": {
"creation_time": "2021-12-10T00:41:43Z",
"stack_id": 'vnf-d7aeba20-1b00-4bff-b050-6b42a262c84d/'
'd7aeba20-1b00-4bff-b050-6b42a262c84d'
}
},
],
"vnfVirtualLinkResourceInfo": [
{
"id": "18bd0111-d5e1-4aa3-b2d8-5b89833c6351",
"vnfVirtualLinkDescId": "internalVL3",
"networkResource": {
# "vimConnectionId": omitted
"resourceId": "res_id_internalVL3",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "4dd7cadd-b9a1-484f-b2f2-1ff50ef0d90f",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU2_CP5",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "39a7d895-3b19-4330-b6ec-ae3557ea9c01",
"cpInstanceType": "VNFC_CP"
},
{
"id": "ace663cd-431b-402a-b2ae-d0824c996edb",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_1_CP5",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "33194d65-ecd6-48d9-8ef7-c15ce9fef46c",
"cpInstanceType": "VNFC_CP"
},
{
"id": "e0f98917-70ff-4f79-8747-9d7fc22827a4",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_2_CP5",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "c9112298-61eb-4bba-b285-ed3419593b1b",
"cpInstanceType": "VNFC_CP"
}
]
},
{
"id": "047aa313-b591-4529-aa98-cb8ce2b82e28",
"vnfVirtualLinkDescId": "internalVL2",
"networkResource": {
# "vimConnectionId": omitted
"resourceId": "res_id_internalVL2",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "8e01813f-35fc-4a35-8f64-0da08a45ea21",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU2_CP4",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "2cb2b3a8-a7a0-41da-b3b8-4b82f576b090",
"cpInstanceType": "VNFC_CP"
},
{
"id": "1666a0f7-6a34-474e-87a2-07fb0c30ecdb",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_1_CP4",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "a49f8fb8-6fd9-4e9f-a6dd-0d268e51c83c",
"cpInstanceType": "VNFC_CP"
},
{
"id": "bce3159b-caca-45b7-8bb7-88015e951e56",
"resourceHandle": {
# "vimConnectionId": omitted
"resourceId": "res_id_VDU1_2_CP4",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "0716ac20-612a-4ac2-8c87-d83be31dd4b5",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"virtualStorageResourceInfo": [
{
"id": "2135b13c-e630-4700-8f8d-85b6e48f7871",
"virtualStorageDescId": "VirtualStorage",
"storageResource": {
# "vimConnectionId": omitted
"resourceId": "res_id_VirtualStorage_1",
"vimLevelResourceType": "OS::Cinder::Volume"
}
},
{
"id": "739f7012-7973-485b-b34f-b006bc336150",
"virtualStorageDescId": "VirtualStorage",
"storageResource": {
# "vimConnectionId": omitted
"resourceId": "res_id_VirtualStorage_2",
"vimLevelResourceType": "OS::Cinder::Volume"
}
}
],
"metadata": {
"stack_id": STACK_ID,
"tenant": "nfv"
}
# "vnfcInfo": omitted
}
# expected results (other than change_ext_conn)
_expected_inst_info = {
"flavourId": "simple",
"vnfState": "STARTED",
"extCpInfo": [
{
'id': 'cp-link_port_id_VDU2_CP2',
'cpdId': 'VDU2_CP2',
'cpConfigId': 'VDU2_CP2_1',
'extLinkPortId': 'link_port_id_VDU2_CP2',
},
{
"id": "cp-res_id_VDU1_CP1_1",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_1",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_1"
},
{
"id": "cp-res_id_VDU1_CP1_2",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_2",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_2"
},
{
"id": "cp-res_id_VDU1_CP2_1",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True,
"subnetId": "res_id_subnet_1"
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP2_1",
"associatedVnfcCpId": "VDU1_CP2-res_id_VDU1_1"
},
{
"id": "cp-res_id_VDU1_CP2_2",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True,
"subnetId": "res_id_subnet_1"
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP2_2",
"associatedVnfcCpId": "VDU1_CP2-res_id_VDU1_2"
},
{
"id": "cp-res_id_VDU2_CP1",
"cpdId": "VDU2_CP1",
"cpConfigId": "VDU2_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"addresses": [
"10.10.0.102"
]
}
]
}
}
],
"extLinkPortId": "res_id_VDU2_CP1",
"associatedVnfcCpId": "VDU2_CP1-res_id_VDU2"
}
],
"extVirtualLinkInfo": [
{
"id": "id_ext_vl_1",
"resourceHandle": {
"resourceId": "res_id_ext_vl_1"
},
"extLinkPorts": [
{
"id": "res_id_VDU1_CP1_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "res_id_VDU1_CP1_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_2"
},
{
"id": "res_id_VDU2_CP1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU2_CP1"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"fixedAddresses": [
"10.10.0.102"
]
}
]
}
}
]
}
}
}
]
},
{
"id": "id_ext_vl_2",
"resourceHandle": {
"resourceId": "res_id_id_ext_vl_2"
},
"extLinkPorts": [
{
"id": "link_port_id_VDU2_CP2",
"resourceHandle": {
"resourceId": "res_id_VDU2_CP2",
},
"cpInstanceId": "cp-link_port_id_VDU2_CP2"
},
{
"id": "res_id_VDU1_CP2_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP2_1"
},
{
"id": "res_id_VDU1_CP2_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP2_2"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU1_CP2",
"cpConfig": {
"VDU1_CP2_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet_1"
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP2",
"cpConfig": {
"VDU2_CP2_1": {
"linkPortId": "link_port_id_VDU2_CP2"
}
}
}
]
}
],
"extManagedVirtualLinkInfo": [
{
"id": "id_ext_mgd_1",
"vnfVirtualLinkDescId": "internalVL1",
"networkResource": {
"resourceId": "res_id_internalVL1"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP3_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP3_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP3-res_id_VDU1_1",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU1_CP3_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP3_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP3-res_id_VDU1_2",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU2_CP3",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP3",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU2_CP3-res_id_VDU2",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"vnfcResourceInfo": [
{
"id": "res_id_VDU1_2",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_2",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_2"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_2",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_2"
},
{
"id": "VDU1_CP2-res_id_VDU1_2",
"cpdId": "VDU1_CP2",
"vnfExtCpId": "cp-res_id_VDU1_CP2_2"
},
{
"id": "VDU1_CP3-res_id_VDU1_2",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_2"
},
{
"id": "VDU1_CP4-res_id_VDU1_2",
"cpdId": "VDU1_CP4",
"vnfLinkPortId": "res_id_VDU1_CP4_2"
},
{
"id": "VDU1_CP5-res_id_VDU1_2",
"cpdId": "VDU1_CP5",
"vnfLinkPortId": "res_id_VDU1_CP5_2"
}
],
"metadata": {
"creation_time": "2021-12-10T01:03:49Z",
"parent_stack_id": _stack_id_VDU1_scale,
"parent_resource_name": "myet4efobvvp",
"stack_id": _stack_id_VDU1_2,
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
},
{
"id": "res_id_VDU1_1",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_1",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_1"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_1",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "VDU1_CP2-res_id_VDU1_1",
"cpdId": "VDU1_CP2",
"vnfExtCpId": "cp-res_id_VDU1_CP2_1"
},
{
"id": "VDU1_CP3-res_id_VDU1_1",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_1"
},
{
"id": "VDU1_CP4-res_id_VDU1_1",
"cpdId": "VDU1_CP4",
"vnfLinkPortId": "res_id_VDU1_CP4_1"
},
{
"id": "VDU1_CP5-res_id_VDU1_1",
"cpdId": "VDU1_CP5",
"vnfLinkPortId": "res_id_VDU1_CP5_1"
}
],
"metadata": {
"creation_time": "2021-12-10T00:41:43Z",
"parent_stack_id": _stack_id_VDU1_scale,
"parent_resource_name": "bemybz4ugeso",
"stack_id": _stack_id_VDU1_1,
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
},
{
"id": "res_id_VDU2",
"vduId": "VDU2",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2",
"vimLevelResourceType": "OS::Nova::Server"
},
"vnfcCpInfo": [
{
"id": "VDU2_CP1-res_id_VDU2",
"cpdId": "VDU2_CP1",
"vnfExtCpId": "cp-res_id_VDU2_CP1"
},
{
"id": "VDU2_CP2-res_id_VDU2",
"cpdId": "VDU2_CP2",
# "vnfExtCpId" does not exist since it is specified by
# linkPortIds.
},
{
"id": "VDU2_CP3-res_id_VDU2",
"cpdId": "VDU2_CP3",
"vnfLinkPortId": "res_id_VDU2_CP3"
},
{
"id": "VDU2_CP4-res_id_VDU2",
"cpdId": "VDU2_CP4",
"vnfLinkPortId": "res_id_VDU2_CP4"
},
{
"id": "VDU2_CP5-res_id_VDU2",
"cpdId": "VDU2_CP5",
"vnfLinkPortId": "res_id_VDU2_CP5"
}
],
"metadata": {
"creation_time": "2021-12-10T00:40:46Z",
"stack_id": _stack_id,
"flavor": "m1.small",
"image-VDU2": "image-VDU2"
}
}
],
"vnfVirtualLinkResourceInfo": [
{
"id": "res_id_internalVL2",
"vnfVirtualLinkDescId": "internalVL2",
"networkResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_internalVL2",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP4_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP4_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP4-res_id_VDU1_1",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU1_CP4_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP4_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP4-res_id_VDU1_2",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU2_CP4",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP4",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU2_CP4-res_id_VDU2",
"cpInstanceType": "VNFC_CP"
}
]
},
{
"id": "res_id_internalVL3",
"vnfVirtualLinkDescId": "internalVL3",
"networkResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_internalVL3",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP5_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP5_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP5-res_id_VDU1_1",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU1_CP5_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP5_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP5-res_id_VDU1_2",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU2_CP5",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP5",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU2_CP5-res_id_VDU2",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"virtualStorageResourceInfo": [
{
"id": "res_id_VirtualStorage_1",
"virtualStorageDescId": "VirtualStorage",
"storageResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VirtualStorage_1",
"vimLevelResourceType": "OS::Cinder::Volume"
},
"metadata": {"stack_id": _stack_id_VDU1_1}
},
{
"id": "res_id_VirtualStorage_2",
"virtualStorageDescId": "VirtualStorage",
"storageResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VirtualStorage_2",
"vimLevelResourceType": "OS::Cinder::Volume"
},
"metadata": {"stack_id": _stack_id_VDU1_2}
}
],
"vnfcInfo": [
{
"id": "VDU1-res_id_VDU1_2",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_2",
"vnfcState": "STARTED"
},
{
"id": "VDU1-res_id_VDU1_1",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_1",
"vnfcState": "STARTED"
},
{
"id": "VDU2-res_id_VDU2",
"vduId": "VDU2",
"vnfcResourceInfoId": "res_id_VDU2",
"vnfcState": "STARTED"
}
],
"metadata": {
"stack_id": STACK_ID,
"nfv": {
"VDU": {
"VDU1": {"computeFlavourId": "m1.tiny"},
"VDU1-VirtualStorage": {"vcImageId": "image-VDU1"},
"VDU2": {"computeFlavourId": "m1.small",
"vcImageId": "image-VDU2"}
}
},
"tenant": "nfv"
}
}
_expected_inst_info_vnfc_updated = copy.copy(_expected_inst_info)
_expected_inst_info_vnfc_updated["vnfcInfo"] = [
{
"id": "VDU1-res_id_VDU1_2",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_2",
"vnfcState": "STARTED"
},
{
"id": "VDU1-res_id_VDU1_1",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_1",
"vnfcState": "STARTED",
"vnfcConfigurableProperties": {"prop1": "value1"}
},
{
"id": "VDU2-res_id_VDU2",
"vduId": "VDU2",
"vnfcResourceInfoId": "res_id_VDU2",
"vnfcState": "STARTED"
}
]
_expected_inst_info_vnfc_updated["metadata"] = {
"stack_id": STACK_ID,
"nfv": {
"VDU": {
"VDU1": {
"desired_capacity": 1,
"computeFlavourId": "m1.tiny",
"locationConstraints": None
},
"VirtualStorage": {
"vcImageId": "image-1.0.0-x86_64-disk"
},
"VDU2": {
"computeFlavourId": "m1.small",
"vcImageId": "image-VDU2"
}
},
"CP": {
"VDU1_CP1": {
"network": "res_id_ext_vl_1"
},
"VDU1_CP2": {
"network": "res_id_id_ext_vl_2",
"fixed_ips": [{
"subnet": "res_id_subnet_1"
}]
},
"VDU2_CP1": {
"network": "res_id_ext_vl_1",
"fixed_ips": [{
"ip_address": "10.10.0.102"
}]
},
"VDU2_CP2": {
"network": "res_id_id_ext_vl_2",
"fixed_ips": []
}
}
},
"tenant": "nfv"
}
# expected results for change_ext_conn
_expected_inst_info_change_ext_conn = {
"flavourId": "simple",
"vnfState": "STARTED",
"extCpInfo": [
{
'id': 'cp-link_port_id_VDU2_CP2_modified',
'cpdId': 'VDU2_CP2',
'cpConfigId': 'VDU2_CP2_1',
'extLinkPortId': 'link_port_id_VDU2_CP2_modified',
},
{
"id": "cp-res_id_VDU1_CP1_1",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_1",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_1"
},
{
"id": "cp-res_id_VDU1_CP1_2",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_2",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_2"
},
{
"id": "cp-res_id_VDU1_CP2_1_modified",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True,
"subnetId": "res_id_subnet_4"
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP2_1_modified",
"associatedVnfcCpId": "VDU1_CP2-res_id_VDU1_1"
},
{
"id": "cp-res_id_VDU1_CP2_2_modified",
"cpdId": "VDU1_CP2",
"cpConfigId": "VDU1_CP2_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True,
"subnetId": "res_id_subnet_4"
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP2_2_modified",
"associatedVnfcCpId": "VDU1_CP2-res_id_VDU1_2"
},
{
"id": "cp-res_id_VDU2_CP1_modified",
"cpdId": "VDU2_CP1",
"cpConfigId": "VDU2_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"addresses": [
"20.10.0.102"
]
}
]
}
}
],
"extLinkPortId": "res_id_VDU2_CP1_modified",
"associatedVnfcCpId": "VDU2_CP1-res_id_VDU2"
}
],
"extVirtualLinkInfo": [
{
"id": "id_ext_vl_1",
"resourceHandle": {
"resourceId": "res_id_ext_vl_1"
},
"extLinkPorts": [
{
"id": "res_id_VDU1_CP1_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "res_id_VDU1_CP1_2",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_2"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1
}
]
}
}
]
}
}
}
]
},
{
"id": "id_ext_vl_3",
"resourceHandle": {
"resourceId": "res_id_ext_vl_3"
},
"extLinkPorts": [
{
"id": "res_id_VDU2_CP1_modified",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP1_modified",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU2_CP1_modified"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"fixedAddresses": [
"20.10.0.102"
]
}
]
}
}
]
}
}
}
]
},
{
"id": "id_ext_vl_4",
"resourceHandle": {
"resourceId": "res_id_id_ext_vl_4"
},
"extLinkPorts": [
{
"id": "link_port_id_VDU2_CP2_modified",
"resourceHandle": {
"resourceId": "res_id_VDU2_CP2_modified",
},
"cpInstanceId": "cp-link_port_id_VDU2_CP2_modified"
},
{
"id": "res_id_VDU1_CP2_1_modified",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_1_modified",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP2_1_modified"
},
{
"id": "res_id_VDU1_CP2_2_modified",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_2_modified",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP2_2_modified"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU1_CP2",
"cpConfig": {
"VDU1_CP2_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet_4"
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP2",
"cpConfig": {
"VDU2_CP2_1": {
"linkPortId": "link_port_id_VDU2_CP2_modified"
}
}
}
]
}
],
"vnfcResourceInfo": [
{
"id": "res_id_VDU1_2",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_2",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_2"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_2",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_2"
},
{
"id": "VDU1_CP2-res_id_VDU1_2",
"cpdId": "VDU1_CP2",
"vnfExtCpId": "cp-res_id_VDU1_CP2_2_modified"
},
{
"id": "VDU1_CP3-res_id_VDU1_2",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_2"
},
{
"id": "VDU1_CP4-res_id_VDU1_2",
"cpdId": "VDU1_CP4",
"vnfLinkPortId": "res_id_VDU1_CP4_2"
},
{
"id": "VDU1_CP5-res_id_VDU1_2",
"cpdId": "VDU1_CP5",
"vnfLinkPortId": "res_id_VDU1_CP5_2"
}
],
"metadata": {
"creation_time": "2021-12-10T01:03:49Z",
"parent_stack_id": _stack_id_VDU1_scale,
"parent_resource_name": "myet4efobvvp",
"stack_id": _stack_id_VDU1_2,
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
},
{
"id": "res_id_VDU1_1",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_1",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VirtualStorage_1"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_1",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "VDU1_CP2-res_id_VDU1_1",
"cpdId": "VDU1_CP2",
"vnfExtCpId": "cp-res_id_VDU1_CP2_1_modified"
},
{
"id": "VDU1_CP3-res_id_VDU1_1",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_1"
},
{
"id": "VDU1_CP4-res_id_VDU1_1",
"cpdId": "VDU1_CP4",
"vnfLinkPortId": "res_id_VDU1_CP4_1"
},
{
"id": "VDU1_CP5-res_id_VDU1_1",
"cpdId": "VDU1_CP5",
"vnfLinkPortId": "res_id_VDU1_CP5_1"
}
],
"metadata": {
"creation_time": "2021-12-10T00:41:43Z",
"parent_stack_id": _stack_id_VDU1_scale,
"parent_resource_name": "bemybz4ugeso",
"stack_id": _stack_id_VDU1_1,
"flavor": "m1.tiny",
"image-VDU1-VirtualStorage": "image-VDU1"
}
},
{
"id": "res_id_VDU2",
"vduId": "VDU2",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2",
"vimLevelResourceType": "OS::Nova::Server"
},
"vnfcCpInfo": [
{
"id": "VDU2_CP1-res_id_VDU2",
"cpdId": "VDU2_CP1",
"vnfExtCpId": "cp-res_id_VDU2_CP1_modified"
},
{
"id": "VDU2_CP2-res_id_VDU2",
"cpdId": "VDU2_CP2",
# "vnfExtCpId" does not exist since it is specified by
# linkPortIds.
},
{
"id": "VDU2_CP3-res_id_VDU2",
"cpdId": "VDU2_CP3",
"vnfLinkPortId": "res_id_VDU2_CP3"
},
{
"id": "VDU2_CP4-res_id_VDU2",
"cpdId": "VDU2_CP4",
"vnfLinkPortId": "res_id_VDU2_CP4"
},
{
"id": "VDU2_CP5-res_id_VDU2",
"cpdId": "VDU2_CP5",
"vnfLinkPortId": "res_id_VDU2_CP5"
}
],
"metadata": {
"creation_time": "2021-12-10T00:40:46Z",
"stack_id": _stack_id,
"flavor": "m1.small",
"image-VDU2": "image-VDU2"
}
}
],
# other members are not changed from _expected_inst_info
"extManagedVirtualLinkInfo":
_expected_inst_info["extManagedVirtualLinkInfo"],
"vnfVirtualLinkResourceInfo":
_expected_inst_info["vnfVirtualLinkResourceInfo"],
"virtualStorageResourceInfo":
_expected_inst_info["virtualStorageResourceInfo"],
"vnfcInfo": _expected_inst_info["vnfcInfo"],
"metadata": {
"stack_id": STACK_ID,
"nfv": {
"VDU": {
"VDU1": {
"desired_capacity": 1,
"computeFlavourId": "m1.tiny",
"locationConstraints": None
},
"VirtualStorage": {
"vcImageId": "image-1.0.0-x86_64-disk"
},
"VDU2": {
"computeFlavourId": "m1.small",
"vcImageId": "image-VDU2"
}
},
"CP": {
"VDU1_CP1": {
"network": "res_id_ext_vl_1"
},
"VDU1_CP2": {
"network": "res_id_id_ext_vl_2",
"fixed_ips": [{
"subnet": "res_id_subnet_1"
}]
},
"VDU2_CP1": {
"network": "res_id_ext_vl_1",
"fixed_ips": [{
"ip_address": "10.10.0.102"
}]
},
"VDU2_CP2": {
"network": "res_id_id_ext_vl_2",
"fixed_ips": []
}
}
},
"tenant": "nfv"
}
}
# expected results for test of StandardUserData
_expected_inst_info_S = {
"flavourId": "simple",
"vnfState": "STARTED",
"extCpInfo": [
{
"id": "cp-res_id_VDU1_CP1_0",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_0",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_0"
},
{
"id": "cp-res_id_VDU1_CP1_1",
"cpdId": "VDU1_CP1",
"cpConfigId": "VDU1_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True
}
]
}
}
],
"extLinkPortId": "res_id_VDU1_CP1_1",
"associatedVnfcCpId": "VDU1_CP1-res_id_VDU1_1"
},
{
"id": "cp-res_id_VDU2_CP1_0",
"cpdId": "VDU2_CP1",
"cpConfigId": "VDU2_CP1_1",
"cpProtocolInfo": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"isDynamic": True,
"subnetId": "res_id_subnet"
}
]
}
}
],
"extLinkPortId": "res_id_VDU2_CP1_0",
"associatedVnfcCpId": "VDU2_CP1-res_id_VDU2_0"
}
],
"extVirtualLinkInfo": [
{
"id": "id_ext_vl_1",
"resourceHandle": {
"resourceId": "res_id_ext_vl_1"
},
"extLinkPorts": [
{
"id": "res_id_VDU1_CP1_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_0"
},
{
"id": "res_id_VDU1_CP1_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP1_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "res_id_VDU2_CP1_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP1_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU2_CP1_0"
}
],
"currentVnfExtCpData": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1
}
]
}
}
]
}
}
},
{
"cpdId": "VDU2_CP1",
"cpConfig": {
"VDU2_CP1_1": {
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "res_id_subnet"
}
]
}
}
]
}
}
}
]
}
],
"extManagedVirtualLinkInfo": [
{
"id": "id_ext_mgd_1",
"vnfVirtualLinkDescId": "internalVL1",
"networkResource": {
"resourceId": "res_id_internalVL1"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP2_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP2-res_id_VDU1_0",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU1_CP2_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP2_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP2-res_id_VDU1_1",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU2_CP2_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP2_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU2_CP2-res_id_VDU2_0",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"vnfcResourceInfo": [
{
"id": "res_id_VDU1_1",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_1",
"vimLevelResourceType": "OS::Nova::Server"
},
"zoneId": "zone1",
"storageResourceIds": [
"res_id_VDU1-VirtualStorage_1"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_1",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_1"
},
{
"id": "VDU1_CP2-res_id_VDU1_1",
"cpdId": "VDU1_CP2",
"vnfLinkPortId": "res_id_VDU1_CP2_1"
},
{
"id": "VDU1_CP3-res_id_VDU1_1",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_1"
}
],
"metadata": {
"creation_time": "2022-11-24T23:31:18Z",
"stack_id": _stack_id_VDU1_1_S,
"vdu_idx": 1,
"flavor": "m1.tiny",
"image-VDU1-1": "image-VDU1",
"zone": "zone1"
}
},
{
"id": "res_id_VDU1_0",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_0",
"vimLevelResourceType": "OS::Nova::Server"
},
"zoneId": "zone1",
"storageResourceIds": [
"res_id_VDU1-VirtualStorage_0"
],
"vnfcCpInfo": [
{
"id": "VDU1_CP1-res_id_VDU1_0",
"cpdId": "VDU1_CP1",
"vnfExtCpId": "cp-res_id_VDU1_CP1_0"
},
{
"id": "VDU1_CP2-res_id_VDU1_0",
"cpdId": "VDU1_CP2",
"vnfLinkPortId": "res_id_VDU1_CP2_0"
},
{
"id": "VDU1_CP3-res_id_VDU1_0",
"cpdId": "VDU1_CP3",
"vnfLinkPortId": "res_id_VDU1_CP3_0"
}
],
"metadata": {
"creation_time": "2022-11-24T23:31:17Z",
"stack_id": _stack_id_VDU1_0_S,
"vdu_idx": 0,
"flavor": "m1.tiny",
"image-VDU1-0": "image-VDU1",
"zone": "zone1"
}
},
{
"id": "res_id_VDU2_0",
"vduId": "VDU2",
"computeResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_0",
"vimLevelResourceType": "OS::Nova::Server"
},
"storageResourceIds": [
"res_id_VDU2-VirtualStorage_0"
],
"vnfcCpInfo": [
{
"id": "VDU2_CP1-res_id_VDU2_0",
"cpdId": "VDU2_CP1",
"vnfExtCpId": "cp-res_id_VDU2_CP1_0"
},
{
"id": "VDU2_CP2-res_id_VDU2_0",
"cpdId": "VDU2_CP2",
"vnfLinkPortId": "res_id_VDU2_CP2_0"
},
{
"id": "VDU2_CP3-res_id_VDU2_0",
"cpdId": "VDU2_CP3",
"vnfLinkPortId": "res_id_VDU2_CP3_0"
}
],
"metadata": {
"creation_time": "2022-11-24T23:31:17Z",
"stack_id": _stack_id_VDU2_0_S,
"vdu_idx": 0,
"flavor": "m1.small",
"image-VDU2-VirtualStorage-0": "image-VDU2"
}
}
],
"vnfVirtualLinkResourceInfo": [
{
"id": "res_id_internalVL2",
"vnfVirtualLinkDescId": "internalVL2",
"networkResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_internalVL2",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP3_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP3_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP3-res_id_VDU1_0",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU1_CP3_1",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1_CP3_1",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU1_CP3-res_id_VDU1_1",
"cpInstanceType": "VNFC_CP"
},
{
"id": "res_id_VDU2_CP3_0",
"resourceHandle": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2_CP3_0",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "VDU2_CP3-res_id_VDU2_0",
"cpInstanceType": "VNFC_CP"
}
]
}
],
"virtualStorageResourceInfo": [
{
"id": "res_id_VDU1-VirtualStorage_0",
"virtualStorageDescId": "VDU1-VirtualStorage",
"storageResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1-VirtualStorage_0",
"vimLevelResourceType": "OS::Cinder::Volume"
},
"metadata": {
"stack_id": _stack_id_VDU1_0_S
}
},
{
"id": "res_id_VDU1-VirtualStorage_1",
"virtualStorageDescId": "VDU1-VirtualStorage",
"storageResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU1-VirtualStorage_1",
"vimLevelResourceType": "OS::Cinder::Volume"
},
"metadata": {
"stack_id": _stack_id_VDU1_1_S
}
},
{
"id": "res_id_VDU2-VirtualStorage_0",
"virtualStorageDescId": "VDU2-VirtualStorage",
"storageResource": {
"vimConnectionId": "vim1",
"resourceId": "res_id_VDU2-VirtualStorage_0",
"vimLevelResourceType": "OS::Cinder::Volume"
},
"metadata": {
"stack_id": _stack_id_VDU2_0_S
}
}
],
"vnfcInfo": [
{
"id": "a-010",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_1",
"vnfcState": "STARTED"
},
{
"id": "a-001",
"vduId": "VDU1",
"vnfcResourceInfoId": "res_id_VDU1_0",
"vnfcState": "STARTED"
},
{
"id": "b-0",
"vduId": "VDU2",
"vnfcResourceInfoId": "res_id_VDU2_0",
"vnfcState": "STARTED"
}
],
"metadata": {
"stack_id": STACK_ID,
"nfv": {
"VDU": {
"VDU1-0": {"vcImageId": "image-VDU1",
"computeFlavourId": "m1.tiny",
"locationConstraints": "zone1"},
"VDU1-1": {"vcImageId": "image-VDU1",
"computeFlavourId": "m1.tiny",
"locationConstraints": "zone1"},
"VDU2-0": {"computeFlavourId": "m1.small"},
"VDU2-VirtualStorage-0": {"vcImageId": "image-VDU2"}
}
},
"tenant": "nfv"
}
}
mock_resource = {
'resources': [{
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1',
'resource_name': 'VDU1',
'physical_resource_id': 'e79ebeaf-1b26-4ff9-9895-f4c78a8a39a6',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Nova::Server',
'required_by': [],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T03:16:02Z',
'creation_time': '2021-12-27T02:53:27Z',
'logical_resource_id': 'fkwryhyv6qbr',
'resource_name': 'fkwryhyv6qbr',
'physical_resource_id': 'd7aeba20-1b00-4bff-b050-6b42a262c84d',
'resource_status': 'UPDATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'VDU1.yaml',
'required_by': [],
'parent_resource': 'VDU1_scale_group'
}, {
'updated_time': '2021-12-27T03:16:01Z',
'creation_time': '2021-12-27T02:53:20Z',
'logical_resource_id': 'VDU1_scale_group',
'resource_name': 'VDU1_scale_group',
'physical_resource_id': '53ba8388-287d-411e-93c9-bd27cec8d0ec',
'resource_status': 'UPDATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Heat::AutoScalingGroup',
'required_by': ['VDU1_scale_in', 'VDU1_scale_out']
}]
}
mock_resource_template = {
'heat_template_version': '2015-04-30', 'resources': {
'fkwryhyv6qbr': {'type': 'VDU1.yaml', 'properties': {
'flavor': 'm1.tiny',
'image': 'cirros-0.5.2-x86_64-disk',
'net1': '9b243768-1193-414b-b7c5-b56dfa765da4',
'net2': '094e43b4-056c-49ce-8203-c7cd955003a6',
'net3': '31451e60-ef7b-42f2-a4c7-2ca67d6c5caf',
'net4': 'dfc1c440-50b0-442f-bcd4-bd090b3272a5',
'net5': '2b2ecd2d-1f53-4b29-9c9d-7855c2fee7e3',
'subnet': '1368ba79-5710-4ef6-b481-829fa22711c7'}}},
'outputs': {'refs_map': {'value': {'fkwryhyv6qbr': {
'get_resource': 'fkwryhyv6qbr'}}}}}
mock_resource_template_2 = {
'heat_template_version': '2015-04-30',
'description': 'Simple Base HOT for Sample VNF',
'parameters': {'nfv': {'type': 'json'}},
'resources': {'VDU2': {
'type': 'OS::Nova::Server',
'properties': {
'flavor': {'get_param': [
'nfv', 'VDU', 'VDU2', 'computeFlavourId']},
'image': {'get_param': [
'nfv', 'VDU', 'VDU2', 'vcImageId']},
'networks': [
{'port': {'get_resource': 'VDU2_CP1'}},
{'port': {'get_resource': 'VDU2_CP2'}},
{'port': {'get_resource': 'VDU2_CP3'}},
{'port': {'get_resource': 'VDU2_CP4'}},
{'port': {'get_resource': 'VDU2_CP5'}}],
'scheduler_hints': {
'group': {
'get_resource': 'nfvi_node_affinity'}}}}
}
}
mock_resource_template_3 = {
'heat_template_version': '2015-04-30', 'resources': {'VDU2': {
'type': 'VDU2.yaml',
'properties': {'flavor': 'm1.tiny',
'image': 'cirros-0.5.2-x86_64-disk',
'net1': '9b243768-1193-414b-b7c5-b56dfa765da4',
'net2': '094e43b4-056c-49ce-8203-c7cd955003a6',
'net3': '31451e60-ef7b-42f2-a4c7-2ca67d6c5caf',
'net4': 'dfc1c440-50b0-442f-bcd4-bd090b3272a5',
'net5': '2b2ecd2d-1f53-4b29-9c9d-7855c2fee7e3',
'subnet': '1368ba79-5710-4ef6-b481-829fa22711c7',
'block_device_mapping_v2': ''}}},
'outputs': {'refs_map': {'value': {'VDU2': {'get_resource': 'VDU2'}}}}}
mock_resource_list = {
'resources': [{
'updated_time': '2021-12-27T03:16:02Z',
'creation_time': '2021-12-27T02:53:27Z',
'logical_resource_id': 'fkwryhyv6qbr',
'resource_name': 'fkwryhyv6qbr',
'physical_resource_id': 'd7aeba20-1b00-4bff-b050-6b42a262c84d',
'resource_status': 'UPDATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'VDU1.yaml',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d7aeba20-1b00-4bff-b050-6b42a262c84d/'
'd7aeba20-1b00-4bff-b050-6b42a262c84d/resources/'
'fkwryhyv6qbr',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d7aeba20-1b00-4bff-b050-6b42a262c84d/'
'd7aeba20-1b00-4bff-b050-6b42a262c84d',
'rel': 'stack'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7-'
'VDU1_scale_group-2zmsxtwtsj7n-fkwryhyv6qbr-qoemdwxw7o5c/'
'd7aeba20-1b00-4bff-b050-6b42a262c84d',
'rel': 'nested'
}],
'required_by': [],
'parent_resource': 'VDU1_scale_group'
}
]
}
mock_resource_list_2 = {
'resources': [
{
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1',
'resource_name': 'VDU1',
'physical_resource_id': 'e79ebeaf-1b26-4ff9-9895-f4c78a8a39a6',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Nova::Server',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7-'
'VDU1_scale_group-2zmsxtwtsj7n-fkwryhyv6qbr-'
'qoemdwxw7o5c/d7aeba20-1b00-4bff-b050-6b42a262c84d'
'/resources/VDU1',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7-'
'VDU1_scale_group-2zmsxtwtsj7n-fkwryhyv6qbr-'
'qoemdwxw7o5c/d7aeba20-1b00-4bff-b050-6b42a262c84d',
'rel': 'stack'
}],
'required_by': [],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1_CP4',
'resource_name': 'VDU1_CP4',
'physical_resource_id': 'c625b32c-5b2e-4366-824e-0921f4efd954',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1_CP1',
'resource_name': 'VDU1_CP1',
'physical_resource_id': 'd13bab44-a728-4a3d-9c85-b70d77b5c7f4',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1_CP3',
'resource_name': 'VDU1_CP3',
'physical_resource_id': 'a231fd59-42e3-4636-a93d-695976ce03ef',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1_CP5',
'resource_name': 'VDU1_CP5',
'physical_resource_id': '8703f963-2e00-4931-8bce-ddbcaf1205e4',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VirtualStorage',
'resource_name': 'VirtualStorage',
'physical_resource_id': '29809bc8-4a3d-412e-b6e2-5122995faccc',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Cinder::Volume',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU1_CP2',
'resource_name': 'VDU1_CP2',
'physical_resource_id': '963ba654-e3f1-4b78-8187-756dbd043916',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'required_by': ['VDU1'],
'parent_resource': 'fkwryhyv6qbr'
}
]
}
mock_resource_list_3 = {
'resources': [
{
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2',
'resource_name': 'VDU2',
'physical_resource_id': 'res_id_VDU2_1',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Nova::Server',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/VDU2',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': []
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2_CP4',
'resource_name': 'VDU2_CP4',
'physical_resource_id': 'c625b32c-5b2e-4366-824e-0921f4efd954',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/'
'VDU2_CP4',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': ['VDU2']
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2_CP1',
'resource_name': 'VDU2_CP1',
'physical_resource_id': 'd13bab44-a728-4a3d-9c85-b70d77b5c7f4',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/'
'VDU2_CP1',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': ['VDU2']
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2_CP3',
'resource_name': 'VDU2_CP3',
'physical_resource_id': 'a231fd59-42e3-4636-a93d-695976ce03ef',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/'
'VDU2_CP3',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': ['VDU2']
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2_CP5',
'resource_name': 'VDU2_CP5',
'physical_resource_id': '8703f963-2e00-4931-8bce-ddbcaf1205e4',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/'
'VDU2_CP5',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': ['VDU2']
}, {
'updated_time': '2021-12-27T02:53:29Z',
'creation_time': '2021-12-27T02:53:29Z',
'logical_resource_id': 'VDU2_CP2',
'resource_name': 'VDU2_CP2',
'physical_resource_id': '963ba654-e3f1-4b78-8187-756dbd043916',
'resource_status': 'CREATE_COMPLETE',
'resource_status_reason': 'state changed',
'resource_type': 'OS::Neutron::Port',
'links': [{
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72/resources/'
'VDU2_CP2',
'rel': 'self'
}, {
'href': 'http://192.168.10.115/heat-api/v1/'
'11ee4693b37c4b7995ab2ae331e9adf3/stacks/'
'vnf-d8962b72-6dac-4eb5-a8c4-8c7a2abaefb7/'
'ddea2e52-532a-491c-b8fc-9c759e35fd72',
'rel': 'stack'
}],
'required_by': ['VDU2']
}
]
}
_heat_parameters = {
'VDU': {
'VDU1': {
'desired_capacity': 1,
'computeFlavourId': 'm1.tiny',
'locationConstraints': None
},
'VirtualStorage': {
'vcImageId': 'image-1.0.0-x86_64-disk'
},
'VDU2': {
'computeFlavourId': 'm1.small',
'vcImageId': 'image-VDU2'
}
},
'CP': {
'VDU1_CP1': {
'network': 'res_id_ext_vl_1'
},
'VDU1_CP2': {
'network': 'res_id_id_ext_vl_2',
'fixed_ips': [{
'subnet': 'res_id_subnet_1'
}]
},
'VDU2_CP1': {
'network': 'res_id_ext_vl_1',
'fixed_ips': [{
'ip_address': '10.10.0.102'
}]
},
'VDU2_CP2': {
'network': 'res_id_id_ext_vl_2',
'fixed_ips': []
}
}
}
_grant_req_example = {
'operation': 'SCALE',
'removeResources': [{
'id': 'ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'COMPUTE',
'resourceTemplateId': 'VDU1',
'resource': {
'resourceId': 'res_id_VDU1_1',
'vimLevelResourceType': 'OS::Nova::Server'
}
}, {
'id': 'VDU1_CP1-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'LINKPORT',
'resourceTemplateId': 'VDU1_CP1',
'resource': {
'resourceId': 'res_id_VDU1_1_CP1',
'vimLevelResourceType': 'OS::Neutron::Port'
}
}, {
'id': 'VDU1_CP2-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'LINKPORT',
'resourceTemplateId': 'VDU1_CP2',
'resource': {
'resourceId': 'res_id_VDU1_1_CP2',
'vimLevelResourceType': 'OS::Neutron::Port'
}
}, {
'id': 'VDU1_CP3-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'LINKPORT',
'resourceTemplateId': 'VDU1_CP3',
'resource': {
'resourceId': 'res_id_VDU1_1_CP3',
'vimLevelResourceType': 'OS::Neutron::Port'
}
}, {
'id': 'VDU1_CP4-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'LINKPORT',
'resourceTemplateId': 'VDU1_CP4',
'resource': {
'resourceId': 'res_id_VDU1_1_CP4',
'vimLevelResourceType': 'OS::Neutron::Port'
}
}, {
'id': 'VDU1_CP5-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'LINKPORT',
'resourceTemplateId': 'VDU1_CP5',
'resource': {
'resourceId': 'res_id_VDU1_1_CP5',
'vimLevelResourceType': 'OS::Neutron::Port'
}
}, {
'id': 'VirtualStorage-ed52e40b-922f-4e01-bc30-d4bf80029280',
'type': 'STORAGE',
'resourceTemplateId': 'VirtualStorage',
'resource': {
'resourceId': 'res_id_VirtualStorage_1',
'vimLevelResourceType': 'OS::Cinder::Volume'
}
}],
'additionalParams': {
'key': 'value'
}
}
# example for _update_stack_retry
_fields_example_instantiate = {
'parameters': {
'nfv': {
'VDU': {
'VDU1-0': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-1'
},
'VDU2-0': {
'computeFlavourId': 'm1.tiny'
},
'VDU2-VirtualStorage-0': {
'vcImageId': '0fea3414-93c0-46f5-b042-857be40e9fc7'
}
}
}
}
}
_fields_example_scale = {
'parameters': {
'nfv': {
'VDU': {
'VDU1-0': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-1'
},
'VDU2-0': {
'computeFlavourId': 'm1.tiny',
'locationConstraints': 'az-2'
},
'VDU2-VirtualStorage-0': {
'vcImageId': '0fea3414-93c0-46f5-b042-857be40e9fc7'
},
'VDU1-1': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-1'
},
'VDU1-2': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-1'
}
}
}
}
}
_vdu_dict_example_get_exclude_zone = {
'VDU1-0': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-1'
},
'VDU2-0': {
'computeFlavourId': 'm1.tiny',
'locationConstraints': 'az-2'
},
'VDU2-VirtualStorage-0': {
'vcImageId': '0fea3414-93c0-46f5-b042-857be40e9fc7'
},
'VDU1-1': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-3'
},
'VDU1-2': {
'computeFlavourId': 'm1.tiny',
'vcImageId': 'cirros-0.5.2-x86_64-disk',
'locationConstraints': 'az-4'
}
}
_update_retry_instantiated_vnfinfo = {
"vnfcResourceInfo": [
{
"vduId": "VDU1",
"metadata": {
"zone": "az-1"
}
},
{
"vduId": "VDU2",
"metadata": {
"zone": "az-2"
}
}
]
}
CONF = config.CONF
class TestOpenstack(base.BaseTestCase):
def setUp(self):
super(TestOpenstack, self).setUp()
objects.register_all()
self.driver = openstack.Openstack()
self.context = context.get_admin_context()
CONF.v2_vnfm.default_graceful_termination_timeout = 0
CONF.v2_vnfm.use_oauth2_mtls_for_heat = False
cur_dir = os.path.dirname(__file__)
sample_dir = os.path.join(cur_dir, "../..", "samples")
self.vnfd_1 = vnfd_utils.Vnfd(SAMPLE_VNFD_ID)
self.vnfd_1.init_from_csar_dir(os.path.join(sample_dir, "sample1"))
self.vnfd_S = vnfd_utils.Vnfd(SAMPLE_VNFD_ID)
self.vnfd_S.init_from_csar_dir(os.path.join(sample_dir,
"standard_sample"))
def _check_inst_info(self, expected, result):
# sort lists before compare with an expected result since
# order of list items is unpredictable.
# note that an expected_result is already sorted.
def _get_key(obj):
return obj['id']
if "extCpInfo" in expected:
self.assertIn("extCpInfo", result)
result["extCpInfo"].sort(key=_get_key)
# assume len(cpProtocolInfo) == 1
self.assertEqual(expected["extCpInfo"], result["extCpInfo"])
if "extVirtualLinkInfo" in expected:
self.assertIn("extVirtualLinkInfo", result)
result["extVirtualLinkInfo"].sort(key=_get_key)
for ext_vl in result["extVirtualLinkInfo"]:
if "extLinkPorts" in ext_vl:
ext_vl["extLinkPorts"].sort(key=_get_key)
# order of currentVnfExtCpData is same as order of
# instantiateVnfRequest
self.assertEqual(expected["extVirtualLinkInfo"],
result["extVirtualLinkInfo"])
if "extManagedVirtualLinkInfo" in expected:
self.assertIn("extManagedVirtualLinkInfo", result)
for ext_mgd in result["extManagedVirtualLinkInfo"]:
if "vnfLinkPorts" in ext_mgd:
ext_mgd["vnfLinkPorts"].sort(key=_get_key)
self.assertEqual(expected["extManagedVirtualLinkInfo"],
result["extManagedVirtualLinkInfo"])
# vnfcResourceInfo is sorted by creation_time (reverse)
if "vnfcResourceInfo" in expected:
self.assertIn("vnfcResourceInfo", result)
for vnfc in result["vnfcResourceInfo"]:
if "storageResourceIds" in vnfc:
vnfc["storageResourceIds"].sort()
if "vnfcCpInfo" in vnfc:
vnfc["vnfcCpInfo"].sort(key=_get_key)
self.assertEqual(expected["vnfcResourceInfo"],
result["vnfcResourceInfo"])
if "vnfVirtualLinkResourceInfo" in expected:
self.assertIn("vnfVirtualLinkResourceInfo", result)
result["vnfVirtualLinkResourceInfo"].sort(key=_get_key)
for vl_info in result["vnfVirtualLinkResourceInfo"]:
if "vnfLinkPorts" in vl_info:
vl_info["vnfLinkPorts"].sort(key=_get_key)
self.assertEqual(expected["vnfVirtualLinkResourceInfo"],
result["vnfVirtualLinkResourceInfo"])
if "virtualStorageResourceInfo" in expected:
self.assertIn("virtualStorageResourceInfo", result)
result["virtualStorageResourceInfo"].sort(key=_get_key)
self.assertEqual(expected["virtualStorageResourceInfo"],
result["virtualStorageResourceInfo"])
if "metadata" in expected:
self.assertIn("metadata", result)
self.assertEqual(expected["metadata"], result["metadata"])
# order of vnfcInfo is same as vnfcResourceInfo
if "vnfcInfo" in expected:
self.assertIn("vnfcInfo", result)
self.assertEqual(expected["vnfcInfo"], result["vnfcInfo"])
def test_make_instantiated_vnf_info_new(self):
# prepare
req = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
vimConnectionInfo=req.vimConnectionInfo
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
# prepare heat responses
heat_client = mock.Mock()
heat_client.get_resources.return_value = _heat_reses_example
heat_client.get_parameters.return_value = _heat_get_parameters_example
heat_client.get_template.return_value = _heat_get_template_example
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(req, inst, grant_req, grant,
self.vnfd_1, heat_client, stack_id=STACK_ID)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info, result)
def test_make_instantiated_vnf_info_update(self):
# prepare
req = None # not used
inst_info = objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_vnfc_updated)
vim_info = {
"vim1": objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
}
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=inst_info,
vimConnectionInfo=vim_info
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.SCALE
)
grant = objects.GrantV1()
# prepare heat responses
heat_client = mock.Mock()
heat_client.get_resources.return_value = _heat_reses_example
heat_client.get_parameters.return_value = {
'nfv': json.dumps(_heat_parameters)}
heat_client.get_template.return_value = _heat_get_template_example
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(
req, inst, grant_req, grant,
self.vnfd_1, heat_client)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
def test_make_instantiated_vnf_info_change_ext_conn(self):
# prepare
req = objects.ChangeExtVnfConnectivityRequest.from_dict(
_change_ext_conn_req_example)
inst_info = objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info)
vim_info = {
"vim1": objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
}
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=inst_info,
vimConnectionInfo=vim_info
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.CHANGE_EXT_CONN
)
grant = objects.GrantV1()
# prepare heat responses
heat_client = mock.Mock()
heat_client.get_resources.return_value = (
_heat_reses_example_change_ext_conn)
heat_client.get_parameters.return_value = {
'nfv': json.dumps(_heat_parameters)}
heat_client.get_template.return_value = _heat_get_template_example
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(
req, inst, grant_req, grant,
self.vnfd_1, heat_client)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_change_ext_conn, result)
def test_make_instantiated_vnf_info_standard(self):
# test of _make_instantiated_vnf_info when StandardUserData is used.
# NOTE: main difference between DefaultUserData is making metadata
# of VnfcResourceInfo.
# prepare
req = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example_S)
metadata = {
'VDU_VNFc_mapping': {
'VDU1': ['a-001', 'a-010', 'a-011'],
'VDU2': ['b-0']
}
}
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
vimConnectionInfo=req.vimConnectionInfo,
metadata=metadata
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
# prepare heat responses
heat_client = mock.Mock()
heat_client.get_resources.return_value = _heat_reses_example_S
heat_client.get_parameters.return_value = (
_heat_get_parameters_example_S)
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(req, inst, grant_req, grant,
self.vnfd_S, heat_client, stack_id=STACK_ID)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_S, result)
@mock.patch.object(openstack.Openstack, '_get_additional_vdu_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_stack_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'create_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_instantiate(self, mock_template, mock_parameters, mock_resources,
mock_update_stack, mock_create_stack, mock_status,
mock_stack_id, mock_get_vdu_ids):
# prepare
req = objects.InstantiateVnfRequest.from_dict(_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req.vimConnectionInfo
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
mock_resources.return_value = _heat_reses_example
mock_parameters.return_value = _heat_get_parameters_example
mock_template.return_value = _heat_get_template_example
mock_stack_id.return_value = None
# execute
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_create_stack.assert_called_once()
mock_stack_id.return_value = STACK_ID
# execute
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_update_stack.assert_called_once()
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_stack_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'delete_stack')
def test_instantiate_rollback(self, mock_delete_stack, mock_status,
mock_stack_id):
# prepare
req = objects.InstantiateVnfRequest.from_dict(_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req.vimConnectionInfo
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
mock_stack_id.return_value = None
# execute
self.driver.instantiate_rollback(
req, inst, grant_req, grant, self.vnfd_1)
mock_delete_stack.assert_not_called()
mock_stack_id.return_value = STACK_ID
# execute
self.driver.instantiate_rollback(
req, inst, grant_req, grant, self.vnfd_1)
mock_delete_stack.assert_called_once()
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'delete_stack')
def test_terminate(self, mock_delete_stack, mock_get_status):
# prepare
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
req = objects.TerminateVnfRequest(
terminationType='GRACEFUL', gracefulTerminationTimeout=0)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_inst_info_example))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.TERMINATE
)
grant = objects.GrantV1()
mock_get_status.return_value = ["DELETE_COMPLETE", None]
# graceful
self.driver.terminate(req, inst, grant_req, grant, self.vnfd_1)
self.assertEqual(1, mock_delete_stack.call_count)
# graceful with no time
req = objects.TerminateVnfRequest(terminationType='GRACEFUL')
self.driver.terminate(req, inst, grant_req, grant, self.vnfd_1)
self.assertEqual(2, mock_delete_stack.call_count)
# forceful
req = objects.TerminateVnfRequest(terminationType='FORCEFUL')
self.driver.terminate(req, inst, grant_req, grant, self.vnfd_1)
self.assertEqual(3, mock_delete_stack.call_count)
@mock.patch.object(openstack.Openstack, '_get_additional_vdu_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'mark_unhealthy')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_scale(self, mock_template, mock_unhealthy, mock_parameters,
mock_reses, mock_stack, mock_get_vdu_ids):
# prepare
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_vnfc_updated))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.SCALE
)
grant = objects.GrantV1()
mock_parameters.return_value = {'nfv': json.dumps(_heat_parameters)}
mock_template.return_value = _heat_get_template_example
# scale-out
req = objects.ScaleVnfRequest(
type='SCALE_OUT', aspectId='VDU1_scale', numberOfSteps=1)
mock_reses.return_value = _heat_reses_example
self.driver.scale(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
# scale-in
req = objects.ScaleVnfRequest(
type='SCALE_IN', aspectId='VDU1_scale', numberOfSteps=1)
grant_req = objects.GrantRequestV1.from_dict(_grant_req_example)
mock_reses.return_value = _heat_reses_example
self.driver.scale(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
# error
req = objects.ScaleVnfRequest(
type='SCALE_IN', aspectId='VDU1_scale', numberOfSteps=1)
grant_req = objects.GrantRequestV1.from_dict(_grant_req_example)
del inst.instantiatedVnfInfo.vnfcResourceInfo[1]['metadata'][
'parent_stack_id']
self.assertRaises(
sol_ex.UnexpectedParentResourceDefinition, self.driver.scale,
req, inst, grant_req, grant, self.vnfd_1)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'mark_unhealthy')
def test_scale_rollback(
self, mock_unhealthy, mock_parameters,
mock_reses, mock_stack):
# prepare
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_vnfc_updated))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.SCALE
)
grant = objects.GrantV1()
mock_parameters.return_value = {'nfv': json.dumps(_heat_parameters)}
# scale-out
req = objects.ScaleVnfRequest(
type='SCALE_OUT', aspectId='VDU1_scale', numberOfSteps=1)
mock_reses.return_value = _heat_reses_example
mock_reses.return_value[13]['physical_resource_id'] = (
'res_id_VDU1_1_new')
self.driver.scale_rollback(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
# error
del mock_reses.return_value[13]['parent_resource']
self.assertRaises(
sol_ex.UnexpectedParentResourceDefinition,
self.driver.scale_rollback, req, inst,
grant_req, grant, self.vnfd_1)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_change_ext_conn(self, mock_template, mock_parameters,
mock_reses, mock_stack):
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_change_ext_conn))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.CHANGE_EXT_CONN
)
grant = objects.GrantV1()
req = objects.ChangeExtVnfConnectivityRequest.from_dict(
_change_ext_conn_req_example)
mock_parameters.return_value = {'nfv': json.dumps(_heat_parameters)}
mock_reses.return_value = _heat_reses_example_change_ext_conn
mock_template.return_value = _heat_get_template_example
self.driver.change_ext_conn(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_change_ext_conn, result)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_change_ext_conn_rollback(
self, mock_template, mock_parameters, mock_reses, mock_stack):
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_change_ext_conn))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.CHANGE_EXT_CONN
)
grant = objects.GrantV1()
req = objects.ChangeExtVnfConnectivityRequest.from_dict(
_change_ext_conn_req_example)
mock_parameters.return_value = {'nfv': json.dumps(_heat_parameters)}
mock_reses.return_value = _heat_reses_example_change_ext_conn
mock_template.return_value = _heat_get_template_example
self.driver.change_ext_conn_rollback(
req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_change_ext_conn, result)
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'mark_unhealthy')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'delete_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'create_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_files')
def test_heal(self, mock_files, mock_template,
mock_parameters, mock_create, mock_delete,
mock_reses, mock_unhealthy, mock_update, mock_get_status):
mock_get_status.return_value = ["DELETE_COMPLETE", None]
req_inst = objects.InstantiateVnfRequest.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req_inst.vimConnectionInfo,
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_expected_inst_info_vnfc_updated))
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.HEAL
)
grant = objects.GrantV1()
mock_parameters.return_value = {'nfv': json.dumps(_heat_parameters)}
mock_template.return_value = _heat_get_template_example
# re-create
req = objects.HealVnfRequest(
additionalParams={
"all": True
}
)
mock_reses.return_value = _heat_reses_example
mock_create.return_value = STACK_ID
self.driver.heal(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
# no re-create
grant_req = objects.GrantRequestV1.from_dict(_grant_req_example)
req = objects.HealVnfRequest()
mock_reses.return_value = _heat_reses_example
self.driver.heal(req, inst, grant_req, grant, self.vnfd_1)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info_vnfc_updated, result)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
def test_update_stack_retry_fallback_best_effort_false(
self, mock_update_stack):
# prepare
# Default value for placement_fallback_best_effort is False.
# Set it in the unit test. In that case, do not retry.
CONF.v2_vnfm.placement_fallback_best_effort = False
sol_detail = ("Resource CREATE failed: ResourceInError: resources."
"VDU1-0.resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , Code: 500\"")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
ex = self.assertRaises(
sol_ex.StackOperationFailed, self.driver._update_stack_retry,
mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), error_ex,
mock.Mock(), mock.Mock(), mock.Mock())
self.assertEqual(error_ex.detail, ex.detail)
mock_update_stack.assert_not_called()
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
def test_update_stack_retry_other_detail(self, mock_update_stack):
# prepare
CONF.v2_vnfm.placement_fallback_best_effort = True
fields_example = copy.deepcopy(_fields_example_instantiate)
sol_detail = ("Resource CREATE failed: unit test")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
ex = self.assertRaises(
sol_ex.StackOperationFailed, self.driver._update_stack_retry,
mock.Mock(), fields_example, mock.Mock(), mock.Mock(), error_ex,
mock.Mock(), mock.Mock(), mock.Mock())
self.assertEqual(error_ex.detail, ex.detail)
mock_update_stack.assert_not_called()
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
def test_update_stack_retry_not_match_vdu_id(self, mock_update_stack):
# prepare
CONF.v2_vnfm.placement_fallback_best_effort = True
CONF.v2_vnfm.placement_az_resource_error = (
r'Resource CREATE failed: ResourceInError: '
r'error\.(.*)\.(.*): (.*)')
fields_example = copy.deepcopy(_fields_example_instantiate)
sol_detail = ("Resource CREATE failed: ResourceInError: error."
"VDU1-0.res.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , Code: 500\"")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
ex = self.assertRaises(
sol_ex.StackOperationFailed, self.driver._update_stack_retry,
mock.Mock(), fields_example, mock.Mock(), mock.Mock(), error_ex,
mock.Mock(), mock.Mock(), mock.Mock())
self.assertEqual(error_ex.detail, ex.detail)
mock_update_stack.assert_not_called()
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.nova_utils.NovaClient, 'get_zone')
def test_update_stack_retry_retry_out_no_zone(self, mock_get_zone,
mock_update_stack):
# prepare
CONF.v2_vnfm.placement_fallback_best_effort = True
CONF.v2_vnfm.placement_az_select_retry = 10
vim_info = objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid()
)
fields_example = copy.deepcopy(_fields_example_instantiate)
heat_client = openstack.heat_utils.HeatClient(vim_info)
vdu_ids = {"VDU1-0", "VDU2-0", "VDU2-VirtualStorage-0"}
anti_rules = []
sol_detail = ("Resource CREATE failed: ResourceInError: resources."
"VDU1-0.resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , Code: 500\"")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_get_zone.return_value = {'az-1', 'az-2', 'az-3', 'az-4'}
def _retry(stack_name, fields):
sol_detail = ("Resource UPDATE failed: resources.VDU1-0: "
"Resource CREATE failed: ResourceInError: "
"resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , "
"Code: 500\"")
raise sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_update_stack.side_effect = _retry
# execute
self.assertRaises(
sol_ex.StackOperationFailed, self.driver._update_stack_retry,
heat_client, fields_example, inst, STACK_ID, error_ex, vim_info,
vdu_ids, anti_rules)
self.assertEqual(len(mock_get_zone.return_value) - 1,
mock_update_stack.call_count)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.nova_utils.NovaClient, 'get_zone')
def test_update_stack_retry_retry_out_retry_limit(self, mock_get_zone,
mock_update_stack):
# prepare
CONF.v2_vnfm.placement_fallback_best_effort = True
CONF.v2_vnfm.placement_az_select_retry = 3
vim_info = objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid()
)
fields_example = copy.deepcopy(_fields_example_instantiate)
heat_client = openstack.heat_utils.HeatClient(vim_info)
vdu_ids = {"VDU1-0", "VDU2-0", "VDU2-VirtualStorage-0"}
anti_rules = []
sol_detail = ("Resource CREATE failed: ResourceInError: resources."
"VDU1-0.resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , Code: 500\"")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_get_zone.return_value = {'az-1', 'az-2', 'az-3', 'az-4', 'az-5'}
def _retry(stack_name, fields):
sol_detail = ("Resource UPDATE failed: resources.VDU1-0: "
"Resource CREATE failed: ResourceInError: "
"resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , "
"Code: 500\"")
raise sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_update_stack.side_effect = _retry
# execute
self.assertRaises(
sol_ex.StackOperationFailed, self.driver._update_stack_retry,
heat_client, fields_example, inst, STACK_ID, error_ex, vim_info,
vdu_ids, anti_rules)
self.assertEqual(CONF.v2_vnfm.placement_az_select_retry,
mock_update_stack.call_count)
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.nova_utils.NovaClient, 'get_zone')
def test_update_stack_retry_check_zone_value(self, mock_get_zone,
mock_update_stack):
# prepare
CONF.v2_vnfm.placement_fallback_best_effort = True
vim_info = objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_update_retry_instantiated_vnfinfo))
)
fields_example = copy.deepcopy(_fields_example_scale)
heat_client = openstack.heat_utils.HeatClient(vim_info)
vdu_ids = {"VDU1-1", "VDU1-2"}
anti_rules = [(['VDU1', 'VDU2'], 'zone')]
sol_detail = ("Resource CREATE failed: ResourceInError: resources."
"VDU1-1.resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , Code: 500\"")
error_ex = sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_get_zone.return_value = {'az-1', 'az-2', 'az-3', 'az-4'}
use_zone_list = []
def _retry(stack_name, fields):
vdu_dict = fields['parameters']['nfv']['VDU']
use_zone = {vdu_id: parameters.get('locationConstraints')
for vdu_id, parameters in vdu_dict.items()
if parameters.get('locationConstraints') is not None}
use_zone_list.append(use_zone)
if mock_update_stack.call_count >= 3:
return
else:
sol_detail = ("Resource UPDATE failed: resources.VDU1-1: "
"Resource CREATE failed: ResourceInError: "
"resources.VDU1: Went to status ERROR due to "
"\"Message: No valid host was found. , "
"Code: 500\"")
raise sol_ex.StackOperationFailed(sol_detail=sol_detail,
sol_title="stack failed")
mock_update_stack.side_effect = _retry
# execute
self.driver._update_stack_retry(
heat_client, fields_example, inst, STACK_ID, error_ex, vim_info,
vdu_ids, anti_rules)
self.assertEqual(3, mock_update_stack.call_count)
self.assertEqual(use_zone_list[0]['VDU1-1'],
use_zone_list[0]['VDU1-2'])
self.assertEqual(use_zone_list[1]['VDU1-1'],
use_zone_list[1]['VDU1-2'])
self.assertEqual(use_zone_list[2]['VDU1-1'],
use_zone_list[2]['VDU1-2'])
self.assertNotEqual(use_zone_list[0]['VDU1-0'],
use_zone_list[0]['VDU1-1'])
self.assertNotEqual(use_zone_list[1]['VDU1-0'],
use_zone_list[1]['VDU1-1'])
self.assertNotEqual(use_zone_list[2]['VDU1-0'],
use_zone_list[2]['VDU1-1'])
# Check for excluded zone used in VDU2-0
expected_zone = 'az-2'
self.assertNotEqual(expected_zone, use_zone_list[0]['VDU1-1'])
self.assertNotEqual(expected_zone, use_zone_list[1]['VDU1-1'])
self.assertEqual(expected_zone, use_zone_list[2]['VDU1-1'])
def test_get_exclude_zone(self):
# prepare
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_update_retry_instantiated_vnfinfo))
)
failed_vdu_id = 'VDU1-1'
vdu_ids = {"VDU1-1", "VDU1-2"}
vdu_dict = _vdu_dict_example_get_exclude_zone
# Check exclude_zones
# The target members of the Anti-Affinity rule are VDU1 and VDU2.
anti_rules = [(['VDU1', 'VDU2'], 'zone')]
# execute
result = self.driver._get_exclude_zone(
inst, anti_rules, failed_vdu_id, vdu_ids, vdu_dict)
self.assertEqual({'az-2'}, result)
# Check exclude_zones
# The target member of the Anti-Affinity rule is only VDU1.
anti_rules = [(['VDU1'], 'zone')]
# execute
result = self.driver._get_exclude_zone(
inst, anti_rules, failed_vdu_id, vdu_ids, vdu_dict)
self.assertEqual({'az-1', 'az-3', 'az-4'}, result)
@mock.patch.object(openstack.Openstack, '_get_additional_vdu_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_stack_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'create_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_https_with_instantiate(self, mock_template, mock_parameters,
mock_resources, mock_update_stack, mock_create_stack,
mock_status, mock_stack_id, mock_get_vdus_ids):
# prepare
req = objects.InstantiateVnfRequest.from_dict(_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req.vimConnectionInfo
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
mock_resources.return_value = _heat_reses_example
mock_parameters.return_value = _heat_get_parameters_example
mock_template.return_value = _heat_get_template_example
mock_stack_id.return_value = None
# execute
CONF.v2_vnfm.use_oauth2_mtls_for_heat = False
CONF.v2_vnfm.heat_verify_cert = True
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_create_stack.assert_called_once()
mock_stack_id.return_value = STACK_ID
# execute
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_update_stack.assert_called_once()
@mock.patch.object(openstack.Openstack, '_get_additional_vdu_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_stack_id')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_status')
@mock.patch.object(openstack.heat_utils.HeatClient, 'create_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'update_stack')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_resources')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_parameters')
@mock.patch.object(openstack.heat_utils.HeatClient, 'get_template')
def test_oauth2_mtls_with_instantiate(self, mock_template, mock_parameters,
mock_resources, mock_update_stack, mock_create_stack,
mock_status, mock_stack_id, mock_get_vdus_ids):
# prepare
req = objects.InstantiateVnfRequest.from_dict(_instantiate_req_example)
inst = objects.VnfInstanceV2(
# required fields
id=uuidutils.generate_uuid(),
vnfdId=SAMPLE_VNFD_ID,
vnfProvider='provider',
vnfProductName='product name',
vnfSoftwareVersion='software version',
vnfdVersion='vnfd version',
instantiationState='INSTANTIATED',
vimConnectionInfo=req.vimConnectionInfo
)
inst.vimConnectionInfo['vim1'].interfaceInfo = {
'tokenEndpoint': 'https://host/identity/v3/OS-OAUTH2/token',
'heatEndpoint': 'https://host/heat-api/v1/test_tenant_a'}
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
mock_resources.return_value = _heat_reses_example
mock_parameters.return_value = _heat_get_parameters_example
mock_template.return_value = _heat_get_template_example
mock_stack_id.return_value = None
CONF.v2_vnfm.use_oauth2_mtls_for_heat = True
CONF.v2_vnfm.heat_verify_cert = True
CONF.v2_vnfm.heat_mtls_ca_cert_file = '/path/to/cacert'
CONF.v2_vnfm.heat_mtls_client_cert_file = '/path/to/clientcert'
# execute
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_create_stack.assert_called_once()
mock_stack_id.return_value = STACK_ID
# execute
self.driver.instantiate(req, inst, grant_req, grant, self.vnfd_1)
mock_update_stack.assert_called_once()
def test_get_additional_vdu_id(self):
# prepare
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo(
flavourId='fake_flavour_id',
vnfState='STOPPED'
)
)
)
grant_req = objects.GrantRequestV1(
addResources=[
objects.ResourceDefinitionV1(
type='COMPUTE',
resourceTemplateId='VDU1'
),
objects.ResourceDefinitionV1(
type='COMPUTE',
resourceTemplateId='VDU2'
),
objects.ResourceDefinitionV1(
type='LINKPORT',
resourceTemplateId='VDU1-CP1'
)
]
)
# execute
result = self.driver._get_additional_vdu_id(grant_req, inst)
self.assertEqual({'VDU1-0', 'VDU2-0'}, result)
inst = objects.VnfInstanceV2(
id=uuidutils.generate_uuid(),
instantiatedVnfInfo=(
objects.VnfInstanceV2_InstantiatedVnfInfo.from_dict(
_update_retry_instantiated_vnfinfo))
)
grant_req = objects.GrantRequestV1(
addResources=[
objects.ResourceDefinitionV1(
type='COMPUTE',
resourceTemplateId='VDU1'
),
objects.ResourceDefinitionV1(
type='COMPUTE',
resourceTemplateId='VDU1'
)
]
)
# execute
result = self.driver._get_additional_vdu_id(grant_req, inst)
self.assertEqual({'VDU1-1', 'VDU1-2'}, result)