Tacker: ETSI MANO NFV Orchestrator / VNF Manager. See https://wiki.openstack.org/wiki/Tacker
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3408 lines
154 KiB
3408 lines
154 KiB
# Copyright (c) 2020 NTT DATA |
|
# |
|
# 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 fixtures |
|
import os |
|
import shutil |
|
from unittest import mock |
|
import yaml |
|
|
|
from oslo_config import cfg |
|
from oslo_serialization import jsonutils |
|
from oslo_utils import uuidutils |
|
|
|
from heatclient.v1 import resources |
|
from tacker.common import driver_manager |
|
from tacker.common import exceptions |
|
from tacker.common import utils |
|
from tacker.conductor.conductorrpc.vnf_lcm_rpc import VNFLcmRPCAPI |
|
from tacker import context |
|
from tacker.db.common_services import common_services_db_plugin |
|
from tacker.manager import TackerManager |
|
from tacker import objects |
|
from tacker.objects import fields |
|
from tacker.objects.fields import ErrorPoint as EP |
|
from tacker.objects import vim_connection |
|
from tacker.tests.unit.db import base as db_base |
|
from tacker.tests.unit.nfvo.test_nfvo_plugin import FakeVNFMPlugin |
|
from tacker.tests.unit.vnflcm import fakes |
|
from tacker.tests import utils as test_utils |
|
from tacker.tests import uuidsentinel |
|
from tacker.vnflcm import vnflcm_driver |
|
from tacker.vnflcm.vnflcm_driver import VnfLcmDriver |
|
from tacker.vnfm.infra_drivers.openstack import heat_client |
|
from tacker.vnfm.infra_drivers.openstack import openstack as opn |
|
from tacker.vnfm import plugin |
|
from tacker.vnfm import vim_client |
|
|
|
|
|
vnf_dict = { |
|
'id': uuidutils.generate_uuid(), |
|
'mgmt_ip_address': '{"VDU1": "a.b.c.d"}', |
|
'vim_id': '6261579e-d6f3-49ad-8bc3-a9cb974778ff', |
|
'instance_id': 'a737497c-761c-11e5-89c3-9cb6541d805d', |
|
'vnfd': { |
|
'attributes': { |
|
'heat_template': { |
|
'resources': { |
|
'VDU1': { |
|
'properties': { |
|
'networks': [{'port': {'get_resource': 'CP1'}}]} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
OPTS_INFRA_DRIVER = [ |
|
cfg.ListOpt( |
|
'infra_driver', default=['noop', 'openstack', 'kubernetes'], |
|
help=_('Hosting vnf drivers tacker plugin will use')), |
|
] |
|
cfg.CONF.register_opts(OPTS_INFRA_DRIVER, 'tacker') |
|
|
|
|
|
class InfraDriverException(Exception): |
|
pass |
|
|
|
|
|
class FakeDriverManager(mock.Mock): |
|
def __init__(self, fail_method_name=None, vnf_resource_count=1): |
|
super(FakeDriverManager, self).__init__() |
|
self.fail_method_name = fail_method_name |
|
self.vnf_resource_count = vnf_resource_count |
|
|
|
def invoke(self, *args, **kwargs): |
|
if 'pre_instantiation_vnf' in args: |
|
vnf_resource_list = [fakes.return_vnf_resource() for index in |
|
range(self.vnf_resource_count)] |
|
return {'node_name': vnf_resource_list} |
|
if 'instantiate_vnf' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'instantiate_vnf': |
|
raise InfraDriverException("instantiate_vnf failed") |
|
|
|
instance_id = uuidsentinel.instance_id |
|
vnfd_dict = kwargs.get('vnfd_dict') |
|
vnfd_dict['instance_id'] = instance_id |
|
return instance_id |
|
if 'create_wait' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'create_wait': |
|
raise InfraDriverException("create_wait failed") |
|
elif 'post_vnf_instantiation' in args: |
|
pass |
|
if 'delete' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'delete': |
|
raise InfraDriverException("delete failed") |
|
if 'delete_wait' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'delete_wait': |
|
raise InfraDriverException("delete_wait failed") |
|
if 'delete_vnf_instance_resource' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'delete_vnf_resource': |
|
raise InfraDriverException("delete_vnf_resource failed") |
|
elif 'heal_vnf' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'heal_vnf': |
|
raise InfraDriverException("heal_vnf failed") |
|
elif 'heal_vnf_standard' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'heal_vnf_standard': |
|
raise InfraDriverException("heal_vnf_standard failed") |
|
elif 'heal_vnf_wait' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'heal_vnf_wait': |
|
raise InfraDriverException("heal_vnf_wait failed") |
|
elif 'post_heal_vnf' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'post_heal_vnf': |
|
raise InfraDriverException("post_heal_vnf failed") |
|
if 'get_rollback_ids' in args: |
|
return [], [], "" |
|
if 'change_ext_conn_vnf' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'change_ext_conn_vnf': |
|
raise InfraDriverException("change_ext_conn_vnf failed") |
|
elif 'change_ext_conn_vnf_wait' in args: |
|
if self.fail_method_name and \ |
|
self.fail_method_name == 'change_ext_conn_vnf_wait': |
|
raise InfraDriverException("change_ext_conn_vnf_wait failed") |
|
|
|
|
|
class FakeVimClient(mock.Mock): |
|
pass |
|
|
|
|
|
class FakeTackerManager(mock.MagicMock): |
|
pass |
|
|
|
|
|
class TestVnflcmDriver(db_base.SqlTestCase): |
|
|
|
def setUp(self): |
|
super(TestVnflcmDriver, self).setUp() |
|
self.addCleanup(mock.patch.stopall) |
|
self.context = context.get_admin_context() |
|
self._mock_vim_client() |
|
self._stub_get_vim() |
|
self.temp_dir = self.useFixture(fixtures.TempDir()).path |
|
|
|
def _mock_vnf_manager(self, fail_method_name=None, vnf_resource_count=1): |
|
self._vnf_manager = mock.Mock(wraps=FakeDriverManager( |
|
fail_method_name=fail_method_name, |
|
vnf_resource_count=vnf_resource_count)) |
|
self._vnf_manager.__contains__ = mock.Mock( |
|
return_value=True) |
|
fake_vnf_manager = mock.Mock() |
|
fake_vnf_manager.return_value = self._vnf_manager |
|
self._mock( |
|
'tacker.common.driver_manager.DriverManager', fake_vnf_manager) |
|
|
|
def _mock_vim_client(self): |
|
self.vim_client = mock.Mock(wraps=FakeVimClient()) |
|
fake_vim_client = mock.Mock() |
|
fake_vim_client.return_value = self.vim_client |
|
self._mock( |
|
'tacker.vnfm.vim_client.VimClient', fake_vim_client) |
|
|
|
def _stub_get_vim(self): |
|
vim_obj = {'vim_id': '6261579e-d6f3-49ad-8bc3-a9cb974778ff', |
|
'vim_name': 'fake_vim', 'vim_auth': |
|
{'auth_url': 'http://localhost/identity', 'password': |
|
'test_pw', 'username': 'test_user', 'project_name': |
|
'test_project'}, 'vim_type': 'openstack'} |
|
self.vim_client.get_vim.return_value = vim_obj |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(6, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_error_point_vnf_config_start( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_START} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(6, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_error_point_pre_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_error_point_post_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_error_point_internal_processing( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INTERNAL_PROCESSING} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_error_point_vnf_config_end( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_END} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_ext_virtual_links( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
req_body = fakes.get_instantiate_vnf_request_with_ext_virtual_links() |
|
instantiate_vnf_req_dict = utils.convert_camelcase_to_snakecase( |
|
req_body) |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(6, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_vim_connection_info( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
vim_connection_info = fakes.get_dummy_vim_connection_info() |
|
instantiate_vnf_req_dict = \ |
|
fakes.get_dummy_instantiate_vnf_request(**vim_connection_info) |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
|
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(6, self._vnf_manager.invoke.call_count) |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_infra_fails_to_instantiate( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
vim_connection_info = fakes.get_dummy_vim_connection_info() |
|
instantiate_vnf_req_dict = \ |
|
fakes.get_dummy_instantiate_vnf_request(**vim_connection_info) |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager(fail_method_name="instantiate_vnf") |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
error = self.assertRaises(exceptions.VnfInstantiationFailed, |
|
driver.instantiate_vnf, self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
expected_error = ("Vnf instantiation failed for vnf %s, error: " |
|
"instantiate_vnf failed") |
|
|
|
self.assertEqual(expected_error % vnf_instance_obj.id, str(error)) |
|
self.assertEqual("NOT_INSTANTIATED", |
|
vnf_instance_obj.instantiation_state) |
|
# 2->1 reason: rollback_vnf_instantiated_resources deleted |
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(3, self._vnf_manager.invoke.call_count) |
|
mock_final_vnf_dict.assert_called_once() |
|
|
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_infra_fails_to_wait_after_instantiate( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, mock_create, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict, |
|
mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
vim_connection_info = fakes.get_dummy_vim_connection_info() |
|
instantiate_vnf_req_dict = \ |
|
fakes.get_dummy_instantiate_vnf_request(**vim_connection_info) |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
level = instantiate_vnf_req_obj.instantiation_level_id |
|
vnf_instance_obj.instantiated_vnf_info = objects.InstantiatedVnfInfo( |
|
flavour_id=instantiate_vnf_req_obj.flavour_id, |
|
instantiation_level_id=level, |
|
vnf_instance_id=vnf_instance_obj.id, |
|
ext_cp_info=[]) |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
self._mock_vnf_manager(fail_method_name='create_wait') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
scale_status = objects.ScaleInfo(aspect_id='SP1', scale_level=0) |
|
vnf_dict = {"vnfd": {"attributes": {}}, |
|
"attributes": {"scaling_group_names": {"SP1": "G1"}}, |
|
"scale_status": [scale_status], |
|
"before_error_point": EP.INITIAL} |
|
error = self.assertRaises(exceptions.VnfInstantiationWaitFailed, |
|
driver.instantiate_vnf, self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
expected_error = ("Vnf instantiation wait failed for vnf %s, error: " |
|
"create_wait failed") |
|
|
|
self.assertEqual(expected_error % vnf_instance_obj.id, str(error)) |
|
self.assertEqual("NOT_INSTANTIATED", |
|
vnf_instance_obj.instantiation_state) |
|
# 3->1 reason: rollback_vnf_instantiated_resources deleted |
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
# 5->3 reason: rollback_vnf_instantiated_resources deleted |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_short_notation( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, |
|
mock_create, mock_get_service_plugins, mock_init_hash, |
|
mock_final_vnf_dict, mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files( |
|
fake_csar, "sample_vnf_package_csar_with_short_notation") |
|
self._mock_vnf_manager(vnf_resource_count=2) |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
self.assertEqual(2, mock_create.call_count) |
|
self.assertEqual("NOT_INSTANTIATED", |
|
vnf_instance_obj.instantiation_state) |
|
mock_final_vnf_dict.assert_called_once() |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch('tacker.vnflcm.utils.get_default_scale_status') |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(objects.VnfResource, 'create') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_instantiate_vnf_with_single_vnfd( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_vnf_instance_save, mock_vnf_package_vnfd, |
|
mock_create, mock_get_service_plugins, mock_init_hash, |
|
mock_final_vnf_dict, mock_default_status): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
instantiate_vnf_req_dict = fakes.get_dummy_instantiate_vnf_request() |
|
instantiate_vnf_req_obj = \ |
|
objects.InstantiateVnfRequest.obj_from_primitive( |
|
instantiate_vnf_req_dict, self.context) |
|
vnf_instance_obj = fakes.return_vnf_instance() |
|
mock_default_status.return_value = None |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files( |
|
fake_csar, "sample_vnfpkg_no_meta_single_vnfd") |
|
self._mock_vnf_manager(vnf_resource_count=2) |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.instantiate_vnf(self.context, vnf_instance_obj, vnf_dict, |
|
instantiate_vnf_req_obj) |
|
self.assertEqual(2, mock_create.call_count) |
|
mock_final_vnf_dict.assert_called_once() |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_error_point_vnf_config_start( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_START} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_error_point_pre_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_error_point_post_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_error_point_internal_processing( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INTERNAL_PROCESSING} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(0, mock_resource_destroy.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_error_point_vnf_config_end( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_END} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(0, mock_resource_destroy.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_graceful_no_timeout( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_destroy, |
|
mock_resource_list, mock_vim, mock_vnf_instance_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.GRACEFUL) |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
driver.terminate_vnf(self.context, vnf_instance, terminate_vnf_req, |
|
vnf_dict) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_delete_instance_failed( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_vim, |
|
mock_vnf_instance_save, mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.GRACEFUL, |
|
graceful_termination_timeout=10) |
|
|
|
self._mock_vnf_manager(fail_method_name='delete') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
error = self.assertRaises(InfraDriverException, driver.terminate_vnf, |
|
self.context, vnf_instance, terminate_vnf_req, vnf_dict) |
|
self.assertEqual("delete failed", str(error)) |
|
self.assertEqual(1, mock_vnf_instance_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_delete_wait_instance_failed( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_vim, |
|
mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
self._mock_vnf_manager(fail_method_name='delete_wait') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
error = self.assertRaises(InfraDriverException, driver.terminate_vnf, |
|
self.context, vnf_instance, terminate_vnf_req, vnf_dict) |
|
self.assertEqual("delete_wait failed", str(error)) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(2, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_terminate_vnf_delete_vnf_resource_failed( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_resource_list, |
|
mock_vim, mock_vnf_instance_save, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
terminate_vnf_req = objects.TerminateVnfRequest( |
|
termination_type=fields.VnfInstanceTerminationType.FORCEFUL) |
|
|
|
mock_resource_list.return_value = [fakes.return_vnf_resource()] |
|
self._mock_vnf_manager(fail_method_name='delete_vnf_resource') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
error = self.assertRaises(InfraDriverException, driver.terminate_vnf, |
|
self.context, vnf_instance, terminate_vnf_req, vnf_dict) |
|
self.assertEqual("delete_vnf_resource failed", str(error)) |
|
self.assertEqual(2, mock_vnf_instance_save.call_count) |
|
self.assertEqual(3, self._vnf_manager.invoke.call_count) |
|
|
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResource, "create") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_without_vnfc_instance( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_vnf_resource_list, mock_resource_destroy, |
|
mock_resource_create, mock_vim, mock_vnf_package_vnfd, |
|
mock_make_final_vnf_dict, mock_get_service_plugins, |
|
mock_init_hash, mock_final_vnf_dict): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()] |
|
# Heal as per SOL003 i.e. without vnfcInstanceId |
|
heal_vnf_req = objects.HealVnfRequest() |
|
|
|
vim_obj = {'vim_id': uuidsentinel.vim_id, |
|
'vim_name': 'fake_vim', |
|
'vim_type': 'openstack', |
|
'vim_auth': { |
|
'auth_url': 'http://localhost/identity', |
|
'password': 'test_pw', |
|
'username': 'test_user', |
|
'project_name': 'test_project'}} |
|
|
|
mock_vim.return_value = vim_obj |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
|
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
scale_status = objects.ScaleInfo(aspect_id='SP1', scale_level=0) |
|
vnf_dict = {"attributes": {"scaling_group_names": {"SP1": "G1"}}, |
|
"scale_status": [scale_status], |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
mock_make_final_vnf_dict.return_value = {} |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
# vnf resource software images will be deleted during |
|
# deleting vnf instance. |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
# Vnf resource software images will be created during |
|
# instantiation. |
|
self.assertEqual(1, mock_resource_create.call_count) |
|
# Invoke will be called 7 times, 3 for deleting the vnf |
|
# resources and 4 during instantiation. |
|
self.assertEqual(9, self._vnf_manager.invoke.call_count) |
|
expected_msg = ("Request received for healing vnf '%s' " |
|
"is completed successfully") |
|
mock_log.info.assert_called_with(expected_msg, |
|
vnf_instance.id) |
|
mock_final_vnf_dict.assert_called_once() |
|
shutil.rmtree(fake_csar) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_without_vnfc_instance_infra_delete_fail( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, |
|
mock_save, mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
# Heal as per SOL003 i.e. without vnfcInstanceId |
|
heal_vnf_req = objects.HealVnfRequest() |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
|
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
self._mock_vnf_manager(fail_method_name='delete') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"fake": "fake_dict", "grant": None, |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
self.assertRaises(exceptions.VnfHealFailed, |
|
driver.heal_vnf, self.context, vnf_instance, |
|
vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
self.assertEqual(fields.VnfInstanceTaskState.ERROR, |
|
vnf_instance.task_state) |
|
self.assertEqual(mock_log.error.call_count, 2) |
|
|
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch('tacker.vnflcm.utils._make_final_vnf_dict') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfResource, "create") |
|
@mock.patch.object(objects.VnfResource, "destroy") |
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id") |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_without_vnfc_instance_infra_instantiate_vnf_fail( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_log, mock_save, mock_vnf_resource_list, |
|
mock_resource_destroy, mock_resource_create, mock_vim, |
|
mock_vnf_package_vnfd, mock_make_final_vnf_dict, |
|
mock_get_service_plugins, mock_init_hash, mock_final_vnf_dict): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
vnf_package_vnfd = fakes.return_vnf_package_vnfd() |
|
vnf_package_id = vnf_package_vnfd.package_uuid |
|
mock_vnf_package_vnfd.return_value = vnf_package_vnfd |
|
|
|
fake_csar = os.path.join(self.temp_dir, vnf_package_id) |
|
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, |
|
group='vnf_package') |
|
test_utils.copy_csar_files(fake_csar, "vnflcm4") |
|
mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()] |
|
# Heal as per SOL003 i.e. without vnfcInstanceId |
|
heal_vnf_req = objects.HealVnfRequest() |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED) |
|
|
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
self._mock_vnf_manager(fail_method_name='instantiate_vnf') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = {"fake": "fake_dict", |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
mock_make_final_vnf_dict.return_value = {} |
|
self.assertRaises(exceptions.VnfHealFailed, |
|
driver.heal_vnf, self.context, |
|
vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
# vnf resource software images will be deleted during |
|
# deleting vnf instance. |
|
self.assertEqual(1, mock_resource_destroy.call_count) |
|
# Vnf resource software images will be created during |
|
# instantiation. |
|
self.assertEqual(1, mock_resource_create.call_count) |
|
|
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
self.assertEqual(fields.VnfInstanceTaskState.ERROR, |
|
vnf_instance.task_state) |
|
self.assertEqual(mock_log.error.call_count, 3) |
|
mock_final_vnf_dict.assert_called_once() |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
expected_msg = ("Request received for healing vnf '%s' " |
|
"is completed successfully") |
|
mock_log.info.assert_called_with(expected_msg, |
|
vnf_instance.id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance_error_point_vnf_config_start( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_START, |
|
"grant": None} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
expected_msg = ("Request received for healing vnf '%s' " |
|
"is completed successfully") |
|
mock_log.info.assert_called_with(expected_msg, |
|
vnf_instance.id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance_error_point_pre_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.PRE_VIM_CONTROL} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
expected_msg = ("Request received for healing vnf '%s' " |
|
"is completed successfully") |
|
mock_log.info.assert_called_with(expected_msg, |
|
vnf_instance.id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance_error_point_post_vim_control( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.POST_VIM_CONTROL} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
expected_msg = ("Request received for healing vnf '%s' " |
|
"is completed successfully") |
|
mock_log.info.assert_called_with(expected_msg, |
|
vnf_instance.id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance_error_point_internal_processing( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=None) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INTERNAL_PROCESSING} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(0, mock_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
self.assertEqual(1, mock_log.info.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_vnfc_instance_error_point_vnf_config_end( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, mock_save, |
|
mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=None) |
|
|
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.VNF_CONFIG_END} |
|
|
|
self._mock_vnf_manager() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, heal_vnf_req) |
|
self.assertEqual(0, mock_save.call_count) |
|
self.assertEqual(1, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
self.assertEqual(1, mock_log.info.call_count) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_infra_heal_vnf_fail( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, |
|
mock_log, mock_save, mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
|
|
vnf_dict = mock.ANY |
|
|
|
self._mock_vnf_manager(fail_method_name='heal_vnf') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL, |
|
"grant": None} |
|
self.assertRaises(exceptions.VnfHealFailed, |
|
driver.heal_vnf, self.context, vnf_instance, |
|
vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(2, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(fields.VnfInstanceTaskState.ERROR, |
|
vnf_instance.task_state) |
|
self.assertEqual(mock_log.error.call_count, 2) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_infra_heal_vnf_wait_fail( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, |
|
mock_save, mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL, |
|
"grant": None} |
|
self._mock_vnf_manager(fail_method_name='heal_vnf_wait') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
|
|
# It won't raise any exception if infra driver raises |
|
# heal_vnf_wait because there is a possibility the vnfc |
|
# resources could go into inconsistent state so it would |
|
# proceed further and call post_heal_vnf with a hope |
|
# it will work and vnflcm can update the vnfc resources |
|
# properly and hence the _vnf_manager.invoke.call_count |
|
# should be 3 instead of 2. |
|
driver.heal_vnf(self.context, vnf_instance, vnf_dict, |
|
heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(5, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(None, vnf_instance.task_state) |
|
expected_msg = ('Failed to update vnf %(id)s resources for ' |
|
'instance %(instance)s. Error: %(error)s') |
|
mock_log.error.assert_called_with(expected_msg, |
|
{'id': vnf_instance.id, |
|
'instance': vnf_instance.instantiated_vnf_info.instance_id, |
|
'error': 'heal_vnf_wait failed'}) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(objects.VnfInstance, "save") |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.LOG') |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch('tacker.vnflcm.vnflcm_driver.VnfLcmDriver.' |
|
'_load_vnf_interface') |
|
def test_heal_vnf_with_infra_post_heal_vnf_fail( |
|
self, mock_vnf_interfaces, mock_vnfd_dict, mock_log, |
|
mock_save, mock_init_hash, mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
mock_vnf_interfaces.return_value = fakes.return_vnf_interfaces() |
|
heal_vnf_req = objects.HealVnfRequest(vnfc_instance_id=[ |
|
uuidsentinel.vnfc_instance_id_1]) |
|
|
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.HEALING) |
|
|
|
vnf_instance.instantiated_vnf_info.instance_id =\ |
|
uuidsentinel.instance_id |
|
vnf_dict = { |
|
"vnfd": {"attributes": {}}, "attributes": {}, |
|
"before_error_point": EP.INITIAL, |
|
"grant": None} |
|
self._mock_vnf_manager(fail_method_name='post_heal_vnf') |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
self.assertRaises(exceptions.VnfHealFailed, |
|
driver.heal_vnf, self.context, vnf_instance, |
|
vnf_dict, heal_vnf_req) |
|
self.assertEqual(1, mock_save.call_count) |
|
self.assertEqual(4, self._vnf_manager.invoke.call_count) |
|
|
|
self.assertEqual(fields.VnfInstanceTaskState.ERROR, |
|
vnf_instance.task_state) |
|
self.assertEqual(mock_log.error.call_count, 2) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_true(self, mock_invoke, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
vnf_info = fakes._get_vnf() |
|
vnf_info['attributes']['scale_group'] = '{\"scaleGroupDict\": ' + \ |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + \ |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + \ |
|
'\"initialLevel\": 0, \"default\": 0 }}}' |
|
scale_vnf_request = fakes.scale_request("SCALE_IN", "SP1", 1, "True") |
|
vnf_info['vnf_lcm_op_occ'] = mock.ANY |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="openstack") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
|
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.scale(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request, vim_connection_info, |
|
scale_name_list, grp_id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(yaml, "safe_load") |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_false_in(self, mock_invoke, mock_safe_load, |
|
mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
vnf_info = fakes._get_vnf() |
|
vnf_info['attributes']['scale_group'] = '{\"scaleGroupDict\": ' + \ |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + \ |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + \ |
|
'\"initialLevel\": 0, \"default\": 0 }}}' |
|
scale_vnf_request = fakes.scale_request("SCALE_IN", "SP1", 1, "False") |
|
vnf_info['vnf_lcm_op_occ'] = mock.ANY |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="openstack") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
|
|
with open(vnf_info["attributes"]["heat_template"], "r") as f: |
|
mock_safe_load.return_value = yaml.safe_load(f) |
|
print(mock_safe_load.return_value) |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.scale(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request, vim_connection_info, |
|
scale_name_list, grp_id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(yaml, "safe_load") |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_false_out_initial(self, mock_invoke, mock_safe_load, |
|
mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
vnf_info = fakes._get_vnf() |
|
vnf_info['attributes']['scale_group'] = '{\"scaleGroupDict\": ' + \ |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + \ |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + \ |
|
'\"initialLevel\": 0, \"default\": 0 }}}' |
|
scale_vnf_request = fakes.scale_request("SCALE_OUT", "SP1", 1, "False") |
|
vnf_info['vnf_lcm_op_occ'] = mock.ANY |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="openstack") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
with open(vnf_info["attributes"]["heat_template"], "r") as f: |
|
mock_safe_load.return_value = yaml.safe_load(f) |
|
print(mock_safe_load.return_value) |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.scale(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request, |
|
vim_connection_info, scale_name_list, grp_id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(yaml, "safe_load") |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_false_out_level_up(self, mock_invoke, mock_safe_load, |
|
mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
vnf_info = fakes._get_vnf() |
|
vnf_info['attributes']['scale_group'] = '{\"scaleGroupDict\": ' + \ |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + \ |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + \ |
|
'\"initialLevel\": 0, \"default\": 1 }}}' |
|
scale_vnf_request = fakes.scale_request("SCALE_OUT", "SP1", 1, "False") |
|
vnf_info['vnf_lcm_op_occ'] = mock.ANY |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="openstack") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
|
|
with open(vnf_info["attributes"]["heat_template"], "r") as f: |
|
mock_safe_load.return_value = yaml.safe_load(f) |
|
print(mock_safe_load.return_value) |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
driver.scale(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request, |
|
vim_connection_info, scale_name_list, grp_id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(yaml, "safe_load") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(vim_client.VimClient, "get_vim") |
|
@mock.patch.object(objects.VnfLcmOpOcc, "save") |
|
@mock.patch.object(objects.VnfInstance, "get_by_id") |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_in_cnf(self, mock_invoke, mock_vnf_instance_get_by_id, |
|
mock_lcm_save, mock_vim, mock_vnf_package_vnfd, |
|
mock_vnfd_dict, mock_yaml_safe_load, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
vnf_info = fakes.vnf_dict_cnf() |
|
vnf_info['vnf_lcm_op_occ'] = fakes.vnflcm_scale_in_cnf() |
|
vnf_info['scale_level'] = 1 |
|
vnf_info['after_scale_level'] = 0 |
|
vnf_info['notification'] = {} |
|
vnf_info['before_error_point'] = EP.INITIAL |
|
scale_vnf_request = fakes.scale_request( |
|
"SCALE_IN", "vdu1_aspect", 1, "False") |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="kubernetes") |
|
update = {'vim_connection_info': [vim_connection_info]} |
|
scale_status = objects.ScaleInfo( |
|
aspect_id='vdu1_aspect', scale_level=1) |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, scale_status=scale_status, |
|
**update) |
|
mock_vnfd_dict.return_value = fakes.vnfd_dict_cnf() |
|
mock_yaml_safe_load.return_value = fakes.vnfd_dict_cnf() |
|
mock_invoke.side_effect = [ |
|
# Kubernetes.get_scale_in_ids called in _scale_vnf_pre() |
|
[[], [], None, None], |
|
# MgmtDriver called in scale_start() |
|
None, |
|
# Kubernetes.scale called in scale() |
|
None, |
|
# Kubernetes.scale_wait called in scale() |
|
None, |
|
# scale_resource_update called in _scale_resource_update() |
|
None] |
|
mock_vnf_package_vnfd.return_value = fakes.return_vnf_package_vnfd() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vim_obj = {'vim_id': uuidsentinel.vim_id, |
|
'vim_name': 'fake_vim', |
|
'vim_type': 'kubernetes', |
|
'vim_auth': { |
|
'auth_url': 'http://localhost:8443', |
|
'password': 'test_pw', |
|
'username': 'test_user', |
|
'project_name': 'test_project'}} |
|
self.vim_client.get_vim.return_value = vim_obj |
|
driver.scale_vnf(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(yaml, "safe_load") |
|
@mock.patch('tacker.vnflcm.utils._get_vnfd_dict') |
|
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') |
|
@mock.patch.object(objects.VnfLcmOpOcc, "save") |
|
@mock.patch.object(objects.VnfInstance, "get_by_id") |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_out_cnf(self, mock_invoke, mock_vnf_instance_get_by_id, |
|
mock_lcm_save, mock_vnf_package_vnfd, mock_vnfd_dict, |
|
mock_yaml_safe_load, mock_get_service_plugins): |
|
vnf_info = fakes.vnf_dict_cnf() |
|
vnf_info['vnf_lcm_op_occ'] = fakes.vnflcm_scale_out_cnf() |
|
vnf_info['scale_level'] = 0 |
|
vnf_info['after_scale_level'] = 1 |
|
vnf_info['notification'] = {} |
|
vnf_info['before_error_point'] = EP.INITIAL |
|
scale_vnf_request = fakes.scale_request( |
|
"SCALE_OUT", "vdu1_aspect", 1, "False") |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="kubernetes") |
|
update = {'vim_connection_info': [vim_connection_info]} |
|
scale_status = objects.ScaleInfo( |
|
aspect_id='vdu1_aspect', scale_level=1) |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, scale_status=scale_status, |
|
**update) |
|
mock_vnf_instance_get_by_id.return_value = vnf_instance |
|
mock_vnf_package_vnfd.return_value = fakes.return_vnf_package_vnfd() |
|
mock_vnfd_dict.return_value = fakes.vnfd_dict_cnf() |
|
mock_yaml_safe_load.return_value = fakes.vnfd_dict_cnf() |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vim_obj = {'vim_id': uuidsentinel.vim_id, |
|
'vim_name': 'fake_vim', |
|
'vim_type': 'kubernetes', |
|
'vim_auth': { |
|
'auth_url': 'http://localhost:8443', |
|
'password': 'test_pw', |
|
'username': 'test_user', |
|
'project_name': 'test_project'}} |
|
self.vim_client.get_vim.return_value = vim_obj |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
driver.scale_vnf(self.context, vnf_info, vnf_instance, |
|
scale_vnf_request) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_scale_type_unknown(self, mock_invoke, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
attributes = {'scale_group': '{\"scaleGroupDict\": ' + |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + |
|
'\"initialLevel\": 0, \"default\": 0 }}}'} |
|
vnf_info = fakes._get_vnf(attributes=attributes) |
|
scale_vnf_request = fakes.scale_request("UNKNOWN", "SP1", 1, "True") |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="openstack") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
driver = vnflcm_driver.VnfLcmDriver() |
|
vnf_instance = fakes.return_vnf_instance( |
|
fields.VnfInstanceState.INSTANTIATED, |
|
task_state=fields.VnfInstanceTaskState.SCALING) |
|
msg = 'Unknown scale type' |
|
self.assertRaisesRegex(exceptions.VnfScaleFailed, |
|
msg, |
|
driver.scale, |
|
self.context, |
|
vnf_info, |
|
vnf_instance, |
|
scale_vnf_request, |
|
vim_connection_info, |
|
scale_name_list, |
|
grp_id) |
|
|
|
@mock.patch.object(TackerManager, 'get_service_plugins', |
|
return_value={'VNFM': FakeVNFMPlugin()}) |
|
@mock.patch.object(VnfLcmDriver, |
|
'_init_mgmt_driver_hash') |
|
@mock.patch.object(driver_manager.DriverManager, "invoke") |
|
def test_scale_vim_type_unknown(self, mock_invoke, mock_init_hash, |
|
mock_get_service_plugins): |
|
mock_init_hash.return_value = { |
|
"vnflcm_noop": "ffea638bfdbde3fb01f191bbe75b031859" |
|
"b18d663b127100eb72b19eecd7ed51" |
|
} |
|
attributes = {'scale_group': '{\"scaleGroupDict\": ' + |
|
'{ \"SP1\": { \"vdu\": [\"VDU1\"], \"num\": ' + |
|
'1, \"maxLevel\": 3, \"initialNum\": 0, ' + |
|
'\"initialLevel\": 0, \"default\": 0 }}}'} |
|
vnf_info = fakes._get_vnf(attributes=attributes) |
|
scale_vnf_request = fakes.scale_request("SCALE_OUT", "SP1", 1, "True") |
|
vim_connection_info = vim_connection.VimConnectionInfo( |
|
vim_type="unknown") |
|
scale_name_list = ["fake"] |
|
grp_id = "fake_id" |
|
driver = vnflcm_driver |