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

1329 lines
43 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 os
from tacker import context
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"
# instantiateVnfRequest example
_vim_connection_info_example = {
"vimId": "vim_id_1",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3",
# "interfaceInfo": omitted
# "accessInfo": omitted
}
_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
}
}
# heat resources example
# 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 = [
{
"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: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: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_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-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_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"
},
{
"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"
}
]
# expected results
_expected_inst_info = {
"flavourId": "simple",
"vnfState": "STARTED",
"extCpInfo": [
{
'id': 'cp-req-link_port_id_VDU2_CP2',
'cpdId': 'VDU2_CP2',
'cpConfigId': 'VDU2_CP2_1',
'extLinkPortId': 'req-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": "vim_id_1",
"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": "vim_id_1",
"resourceId": "res_id_VDU1_CP1_2",
"vimLevelResourceType": "OS::Neutron::Port"
},
"cpInstanceId": "cp-res_id_VDU1_CP1_2"
},
{
"id": "res_id_VDU2_CP1",
"resourceHandle": {
"vimConnectionId": "vim_id_1",
"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": "req-link_port_id_VDU2_CP2",
"resourceHandle": {
"resourceId": "res_id_VDU2_CP2",
},
"cpInstanceId": "cp-req-link_port_id_VDU2_CP2"
},
{
"id": "res_id_VDU1_CP2_1",
"resourceHandle": {
"vimConnectionId": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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"
}
},
{
"id": "res_id_VDU1_1",
"vduId": "VDU1",
"computeResource": {
"vimConnectionId": "vim_id_1",
"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"
}
},
{
"id": "res_id_VDU2",
"vduId": "VDU2",
"computeResource": {
"vimConnectionId": "vim_id_1",
"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"
}
}
],
"vnfVirtualLinkResourceInfo": [
{
"id": "res_id_internalVL2",
"vnfVirtualLinkDescId": "internalVL2",
"networkResource": {
"vimConnectionId": "vim_id_1",
"resourceId": "res_id_internalVL2",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP4_1",
"resourceHandle": {
"vimConnectionId": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"resourceId": "res_id_internalVL3",
"vimLevelResourceType": "OS::Neutron::Net"
},
"vnfLinkPorts": [
{
"id": "res_id_VDU1_CP5_1",
"resourceHandle": {
"vimConnectionId": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"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": "vim_id_1",
"resourceId": "res_id_VirtualStorage_1",
"vimLevelResourceType": "OS::Cinder::Volume"
}
},
{
"id": "res_id_VirtualStorage_2",
"virtualStorageDescId": "VirtualStorage",
"storageResource": {
"vimConnectionId": "vim_id_1",
"resourceId": "res_id_VirtualStorage_2",
"vimLevelResourceType": "OS::Cinder::Volume"
}
}
],
"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"
}
]
}
class TestOpenstack(base.BaseTestCase):
def setUp(self):
super(TestOpenstack, self).setUp()
objects.register_all()
self.driver = openstack.Openstack()
self.context = context.get_admin_context()
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"))
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)
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"])
# 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.InstantiateVnfRequestV2.from_dict(
_instantiate_req_example)
inst = objects.VnfInstanceV2(
vimConnectionInfo=req.vimConnectionInfo
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.INSTANTIATE
)
grant = objects.GrantV1()
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(req, inst, grant_req, grant,
self.vnfd_1, _heat_reses_example)
# 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)
vim_info = {
"vim1": objects.VimConnectionInfo.from_dict(
_vim_connection_info_example)
}
inst = objects.VnfInstanceV2(
instantiatedVnfInfo=inst_info,
vimConnectionInfo=vim_info
)
grant_req = objects.GrantRequestV1(
operation=fields.LcmOperationType.SCALE
)
grant = objects.GrantV1()
# execute make_instantiated_vnf_info
self.driver._make_instantiated_vnf_info(req, inst, grant_req, grant,
self.vnfd_1, _heat_reses_example)
# check
result = inst.to_dict()["instantiatedVnfInfo"]
self._check_inst_info(_expected_inst_info, result)