diff --git a/tacker/api/vnflcm/v1/controller.py b/tacker/api/vnflcm/v1/controller.py index e90f4b574..c066828d6 100644 --- a/tacker/api/vnflcm/v1/controller.py +++ b/tacker/api/vnflcm/v1/controller.py @@ -608,12 +608,13 @@ class VnfLcmController(wsgi.Controller): @wsgi.expected_errors((http_client.FORBIDDEN, http_client.NOT_FOUND)) def show(self, request, id): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'show') vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'show', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'show', + target={'project_id': vnf_instance.tenant_id}) return self._view_builder.show(vnf_instance) @@ -708,6 +709,9 @@ class VnfLcmController(wsgi.Controller): if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'delete', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'delete', + target={'project_id': vnf_instance.tenant_id}) vnf = self._get_vnf(context, id) self._delete(context, vnf_instance, vnf) @@ -779,14 +783,15 @@ class VnfLcmController(wsgi.Controller): @validation.schema(vnf_lcm.instantiate) def instantiate(self, request, id, body): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'instantiate') vnf = self._get_vnf(context, id) vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'instantiate', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'instantiate', + target={'project_id': vnf_instance.tenant_id}) return self._instantiate(context, vnf_instance, vnf, body) @@ -834,14 +839,15 @@ class VnfLcmController(wsgi.Controller): @validation.schema(vnf_lcm.terminate) def terminate(self, request, id, body): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'terminate') - vnf = self._get_vnf(context, id) vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'terminate', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'terminate', + target={'project_id': vnf_instance.tenant_id}) + return self._terminate(context, vnf_instance, vnf, body) @check_vnf_status_and_error_point(action="heal", @@ -894,14 +900,15 @@ class VnfLcmController(wsgi.Controller): @validation.schema(vnf_lcm.heal) def heal(self, request, id, body): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'heal') vnf = self._get_vnf(context, id) vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'heal', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'heal', + target={'project_id': vnf_instance.tenant_id}) if vnf_instance.instantiation_state not in \ [fields.VnfInstanceState.INSTANTIATED]: @@ -941,12 +948,13 @@ class VnfLcmController(wsgi.Controller): @wsgi.expected_errors((http_client.FORBIDDEN, http_client.NOT_FOUND)) def update(self, request, id, body): context = request.environ['tacker.context'] + vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: - vnf_instance = self._get_vnf_instance(context, id) context.can(vnf_lcm_policies.VNFLCM % 'update_vnf', target=self._get_policy_target(vnf_instance)) else: - context.can(vnf_lcm_policies.VNFLCM % 'update_vnf') + context.can(vnf_lcm_policies.VNFLCM % 'update_vnf', + target={'project_id': vnf_instance.tenant_id}) # get body body_data = {} @@ -1425,8 +1433,6 @@ class VnfLcmController(wsgi.Controller): http_client.NOT_FOUND, http_client.CONFLICT)) def scale(self, request, id, body): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'scale') try: vnf_info = self._vnfm_plugin.get_vnf(context, id) @@ -1437,6 +1443,9 @@ class VnfLcmController(wsgi.Controller): if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'scale', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'scale', + target={'project_id': vnf_instance.tenant_id}) if not vnf_instance.instantiated_vnf_info.scale_status: return self._make_problem_detail( 'NOT SCALE VNF', 409, title='NOT SCALE VNF') @@ -1485,10 +1494,14 @@ class VnfLcmController(wsgi.Controller): http_client.NOT_FOUND, http_client.CONFLICT)) def rollback(self, request, id): context = request.environ['tacker.context'] - context.can(vnf_lcm_policies.VNFLCM % 'rollback') try: vnf_lcm_op_occs = objects.VnfLcmOpOcc.get_by_id(context, id) + vnf_instance = self._get_vnf_instance( + context, vnf_lcm_op_occs.vnf_instance_id) + context.can(vnf_lcm_policies.VNFLCM % 'rollback', + target={'project_id': vnf_instance.tenant_id}) + if vnf_lcm_op_occs.operation_state != 'FAILED_TEMP': return self._make_problem_detail( 'OperationState IS NOT FAILED_TEMP', @@ -1513,8 +1526,6 @@ class VnfLcmController(wsgi.Controller): vnf_info = self._get_rollback_vnf( context, vnf_lcm_op_occs.vnf_instance_id) - vnf_instance = self._get_vnf_instance( - context, vnf_lcm_op_occs.vnf_instance_id) inst_vnf_info = vnf_instance.instantiated_vnf_info if inst_vnf_info is not None: @@ -1537,6 +1548,8 @@ class VnfLcmController(wsgi.Controller): except webob.exc.HTTPNotFound as inst_e: return self._make_problem_detail( str(inst_e), 404, title='VNF NOT FOUND') + except exceptions.PolicyNotAuthorized: + raise except Exception as e: LOG.error(traceback.format_exc()) return self._make_problem_detail( @@ -1573,7 +1586,6 @@ class VnfLcmController(wsgi.Controller): """ context = request.environ['tacker.context'] - context.can(vnf_lcm_policies.VNFLCM % 'cancel') req_body = utils.convert_camelcase_to_snakecase(body) _ = objects.CancelMode(context=context, **req_body) @@ -1581,9 +1593,13 @@ class VnfLcmController(wsgi.Controller): vnf_lcm_op_occs = objects.VnfLcmOpOcc.get_by_id(context, id) vnf_instance = self._get_vnf_instance( context, vnf_lcm_op_occs.vnf_instance_id) + context.can(vnf_lcm_policies.VNFLCM % 'cancel', + target={'project_id': vnf_instance.tenant_id}) except (webob.exc.HTTPNotFound, exceptions.NotFound) as e: return self._make_problem_detail( str(e), 404, title='VNF NOT FOUND') + except exceptions.PolicyNotAuthorized: + raise except Exception as e: LOG.error(traceback.format_exc()) return self._make_problem_detail( @@ -1652,26 +1668,30 @@ class VnfLcmController(wsgi.Controller): http_client.NOT_FOUND)) def fail(self, request, id): context = request.environ['tacker.context'] - context.can(vnf_lcm_policies.VNFLCM % 'fail') try: vnf_lcm_op_occs = objects.VnfLcmOpOcc.get_by_id(context, id) operation = vnf_lcm_op_occs.operation + vnf_instance_id = vnf_lcm_op_occs.vnf_instance_id + vnf_instance = self._get_vnf_instance(context, vnf_instance_id) + context.can(vnf_lcm_policies.VNFLCM % 'fail', + target={'project_id': vnf_instance.tenant_id}) + if (vnf_lcm_op_occs.operation_state != fields.LcmOccsOperationState.FAILED_TEMP): return self._make_problem_detail( 'Transitions to FAIL from state %s is not allowed' % vnf_lcm_op_occs.operation_state, 409, title='Conflict') - vnf_instance_id = vnf_lcm_op_occs.vnf_instance_id - vnf_instance = self._get_vnf_instance(context, vnf_instance_id) except webob.exc.HTTPNotFound as e: return self._make_problem_detail( str(e), 404, title='VNF NOT FOUND') except exceptions.NotFound as e: return self._make_problem_detail( str(e), 404, title='VNF LCM NOT FOUND') + except exceptions.PolicyNotAuthorized: + raise except Exception as e: LOG.error(traceback.format_exc()) return self._make_problem_detail( @@ -1741,7 +1761,6 @@ class VnfLcmController(wsgi.Controller): http_client.NOT_FOUND, http_client.CONFLICT)) def retry(self, request, id): context = request.environ['tacker.context'] - context.can(vnf_lcm_policies.VNFLCM % 'retry') try: vnf_lcm_op_occs = objects.VnfLcmOpOcc.get_by_id(context, id) @@ -1753,14 +1772,6 @@ class VnfLcmController(wsgi.Controller): return self._make_problem_detail(str(exc), 500, title='Internal Server Error') - # operation state checking - if vnf_lcm_op_occs.operation_state != \ - fields.LcmOccsOperationState.FAILED_TEMP: - error_msg = ('Cannot proceed with operation_state %s' - % vnf_lcm_op_occs.operation_state) - return self._make_problem_detail(error_msg, - 409, title='Conflict') - # get vnf try: vnf = self._get_vnf(context, vnf_lcm_op_occs.vnf_instance_id) @@ -1776,16 +1787,28 @@ class VnfLcmController(wsgi.Controller): try: vnf_instance = objects.VnfInstance.get_by_id( context, vnf_lcm_op_occs.vnf_instance_id) + context.can(vnf_lcm_policies.VNFLCM % 'retry', + target={'project_id': vnf_instance.tenant_id}) except exceptions.VnfInstanceNotFound: msg = (_("Can not find requested vnf instance: %s") % vnf_lcm_op_occs.vnf_instance_id) return self._make_problem_detail(msg, 404, title='Not Found') + except exceptions.PolicyNotAuthorized: + raise except Exception as exc: LOG.exception(exc) return self._make_problem_detail(str(exc), 500, title='Internal Server Error') + # operation state checking + if vnf_lcm_op_occs.operation_state != \ + fields.LcmOccsOperationState.FAILED_TEMP: + error_msg = ('Cannot proceed with operation_state %s' + % vnf_lcm_op_occs.operation_state) + return self._make_problem_detail(error_msg, + 409, title='Conflict') + operation = vnf_lcm_op_occs.operation body = jsonutils.loads(vnf_lcm_op_occs.operation_params) vnf['before_error_point'] = vnf_lcm_op_occs.error_point @@ -1907,14 +1930,15 @@ class VnfLcmController(wsgi.Controller): @validation.schema(vnf_lcm.change_ext_conn) def change_ext_conn(self, request, id, body): context = request.environ['tacker.context'] - if not CONF.oslo_policy.enhanced_tacker_policy: - context.can(vnf_lcm_policies.VNFLCM % 'change_ext_conn') vnf = self._get_vnf(context, id) vnf_instance = self._get_vnf_instance(context, id) if CONF.oslo_policy.enhanced_tacker_policy: context.can(vnf_lcm_policies.VNFLCM % 'change_ext_conn', target=self._get_policy_target(vnf_instance)) + else: + context.can(vnf_lcm_policies.VNFLCM % 'change_ext_conn', + target={'project_id': vnf_instance.tenant_id}) if (vnf_instance.instantiation_state != fields.VnfInstanceState.INSTANTIATED): return self._make_problem_detail( diff --git a/tacker/tests/unit/policies/test_vnf_lcm.py b/tacker/tests/unit/policies/test_vnf_lcm.py index 5092f4bc1..2fd2a5f7a 100644 --- a/tacker/tests/unit/policies/test_vnf_lcm.py +++ b/tacker/tests/unit/policies/test_vnf_lcm.py @@ -16,16 +16,24 @@ from unittest import mock from tacker.api.vnflcm.v1 import controller +import tacker.conductor.conductorrpc.vnf_lcm_rpc as vnf_lcm_rpc from tacker import objects +from tacker.objects import fields from tacker.policies import vnf_lcm as policies +from tacker.tests.unit.db import utils from tacker.tests.unit import fake_request -import tacker.tests.unit.nfvo.test_nfvo_plugin as test_nfvo_plugin from tacker.tests.unit.policies import base as base_test from tacker.tests.unit.vnflcm import fakes from tacker.tests import uuidsentinel from tacker.vnfm import vim_client +class FakePlugin(mock.Mock): + + def get_vnf(self, *args, **kwargs): + return utils.get_dummy_vnf(status='ACTIVE') + + class VNFLCMPolicyTest(base_test.BasePolicyTest): """Test VNF LCM APIs policies with all possible context. @@ -39,7 +47,7 @@ class VNFLCMPolicyTest(base_test.BasePolicyTest): super(VNFLCMPolicyTest, self).setUp() self.patcher = mock.patch( 'tacker.manager.TackerManager.get_service_plugins', - return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) + return_value={'VNFM': FakePlugin()}) self.mock_manager = self.patcher.start() self.controller = controller.VnfLcmController() self.vim_info = { @@ -50,15 +58,29 @@ class VNFLCMPolicyTest(base_test.BasePolicyTest): 'tenant': 'test', 'extra': {} } - # Below user's context will be allowed to create the VNF - # in their project. - self.create_authorized_contexts = [ + # Below user's context will be allowed to create VNF or a few of + # the VNF operations in their project. + self.project_authorized_contexts = [ self.legacy_admin_context, self.project_admin_context, self.project_member_context, self.project_reader_context, self.project_foo_context, self.other_project_member_context, self.other_project_reader_context ] - self.create_unauthorized_contexts = [] + self.project_unauthorized_contexts = [] + + # Admin or any user in same project will be allowed to get, + # instantiate, terminate etc operations of VNF of their project. + self.project_member_authorized_contexts = [ + self.legacy_admin_context, self.project_admin_context, + self.project_member_context, self.project_reader_context, + self.project_foo_context + ] + # User from other project will not be allowed to get or perform + # the other project's VNF operations. + self.project_member_unauthorized_contexts = [ + self.other_project_member_context, + self.other_project_reader_context + ] @mock.patch.object(vim_client.VimClient, "get_vim") @mock.patch.object(objects.VnfPackage, 'get_by_id') @@ -98,8 +120,311 @@ class VNFLCMPolicyTest(base_test.BasePolicyTest): 'metadata': {'key': 'value'}} req = fake_request.HTTPRequest.blank('/vnf_instances') rule_name = policies.VNFLCM % 'create' - self.common_policy_check(self.create_authorized_contexts, - self.create_unauthorized_contexts, + self.common_policy_check(self.project_authorized_contexts, + self.project_unauthorized_contexts, rule_name, self.controller.create, req, body=body) + + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_show_vnf(self, mock_vnf_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % uuidsentinel.instance_id) + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'show' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.show, + req, uuidsentinel.instance_id) + + @mock.patch.object(objects.VnfInstanceList, "get_by_marker_filter") + def test_index_vnf(self, mock_vnf_list): + req = fake_request.HTTPRequest.blank('/vnf_instances') + vnf_instance_1 = fakes.return_vnf_instance() + vnf_instance_2 = fakes.return_vnf_instance() + mock_vnf_list.return_value = [vnf_instance_1, vnf_instance_2] + rule_name = policies.VNFLCM % 'index' + self.common_policy_check(self.project_authorized_contexts, + self.project_unauthorized_contexts, + rule_name, + self.controller.index, + req) + + @mock.patch.object(objects.VNF, "vnf_index_list") + @mock.patch.object(objects.VnfInstanceList, "vnf_instance_list") + @mock.patch.object(objects.VnfPackageVnfd, 'get_vnf_package_vnfd') + @mock.patch.object(vnf_lcm_rpc.VNFLcmRPCAPI, "update") + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_update_vnf( + self, mock_vnf_by_id, mock_update, + mock_vnf_package_vnf_get_vnf_package_vnfd, + mock_vnf_instance_list, + mock_vnf_index_list,): + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf_index_list.return_value = fakes._get_vnf() + mock_vnf_instance_list.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf_package_vnf_get_vnf_package_vnfd.return_value =\ + fakes.return_vnf_package_vnfd() + + body = {"vnfInstanceName": "new_instance_name", + "vnfInstanceDescription": "new_instance_discription", + "vnfdId": "2c69a161-0000-4b0f-bcf8-391f8fc76600", + "vnfConfigurableProperties": { + "test": "test_value" + }, + "vnfcInfoModificationsDeleteIds": ["test1"], + "metadata": {"testkey": "test_value"}, + "vimConnectionInfo": {"id": "testid"}} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % uuidsentinel.instance_id) + rule_name = policies.VNFLCM % 'update_vnf' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.update, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._instantiate') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_instantiate_vnf( + self, mock_vnf_by_id, mock_instantiate, mock_vnf): + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf.return_value = utils.get_dummy_vnf() + mock_instantiate.return_value = { + 'status': 202, 'Location': 'vnf status check link'} + body = {"flavourId": "simple", + "instantiationLevelId": "instantiation_level_1"} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.instance_id) + rule_name = policies.VNFLCM % 'instantiate' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.instantiate, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._terminate') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_terminate_vnf(self, mock_vnf_by_id, mock_terminate, mock_vnf): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/terminate' % uuidsentinel.instance_id) + body = {'terminationType': 'GRACEFUL', + 'gracefulTerminationTimeout': 10} + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf.return_value = utils.get_dummy_vnf() + mock_terminate.return_value = { + 'status': 202, 'Location': 'vnf status check link'} + rule_name = policies.VNFLCM % 'terminate' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.terminate, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._delete') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_delete_vnf(self, mock_vnf_by_id, mock_delete, mock_vnf): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % uuidsentinel.instance_id) + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf.return_value = utils.get_dummy_vnf() + rule_name = policies.VNFLCM % 'delete' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.delete, + req, uuidsentinel.instance_id) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._heal') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_heal_vnf(self, mock_vnf_by_id, mock_heal, mock_vnf): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/heal' % uuidsentinel.instance_id) + body = {'cause': 'healing'} + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf.return_value = utils.get_dummy_vnf() + rule_name = policies.VNFLCM % 'heal' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.heal, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._scale') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_scale_vnf(self, mock_vnf_by_id, mock_scale): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % uuidsentinel.instance_id) + body = { + "type": "SCALE_OUT", + "aspectId": "SP1", + "numberOfSteps": 1, + "additionalParams": { + "test": "test_value"}} + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'scale' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.scale, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_rollback_vnf') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_rollback_vnf(self, mock_vnf_by_id, mock_rollback, + mock_lcm_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_lcm_op_occs/%s/rollback' % uuidsentinel.instance_id) + mock_lcm_by_id.return_value = fakes.vnflcm_rollback_active() + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'rollback' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.rollback, + req, uuidsentinel.instance_id) + + @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + @mock.patch.object(objects.VnfInstance, "get_by_id") + @mock.patch.object(objects.VnfInstance, "save") + @mock.patch.object(objects.VnfLcmOpOcc, "save") + def test_cancel_vnf(self, mock_save_occ, mock_vnf, mock_vnf_by_id, + mock_lcm_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_lcm_op_occs/%s/cancel' % uuidsentinel.instance_id) + body = {'cancelMode': 'FORCEFUL'} + mock_lcm_by_id.return_value = fakes.vnflcm_cancel_insta() + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'cancel' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.cancel, + req, uuidsentinel.instance_id, + body=body) + + @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + @mock.patch.object(objects.VnfInstance, "get_by_id") + @mock.patch.object(objects.VnfInstance, "save") + @mock.patch.object(objects.VnfLcmOpOcc, "save") + def test_fail_vnf(self, mock_save_occ, mock_vnf, mock_vnf_by_id, + mock_lcm_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_lcm_op_occs/%s/fail' % uuidsentinel.instance_id) + mock_lcm_by_id.return_value = fakes.vnflcm_fail_insta() + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'fail' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.fail, + req, uuidsentinel.instance_id) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + @mock.patch.object(objects.VnfInstance, "get_by_id") + @mock.patch.object(controller.VnfLcmController, "_instantiate") + def test_retry_vnf(self, mock_instantiate, mock_vnf_by_id, + mock_lcm_by_id, mock_vnf): + req = fake_request.HTTPRequest.blank( + '/vnf_lcm_op_occs/%s/fail' % uuidsentinel.instance_id) + mock_lcm_by_id.return_value = fakes.vnflcm_op_occs_retry_data() + mock_vnf.return_value = utils.get_dummy_vnf() + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + tenant_id=self.project_id) + rule_name = policies.VNFLCM % 'retry' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.retry, + req, uuidsentinel.instance_id) + + @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + def test_show_lcm_op_occs(self, mock_lcm_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_lcm_op_occs/%s' % uuidsentinel.instance_id) + mock_lcm_by_id.return_value = fakes.return_vnf_lcm_opoccs_obj() + rule_name = policies.VNFLCM % 'show_lcm_op_occs' + self.common_policy_check(self.project_authorized_contexts, + self.project_unauthorized_contexts, + rule_name, + self.controller.show_lcm_op_occs, + req, uuidsentinel.instance_id) + + @mock.patch.object(objects.VnfLcmOpOccList, "get_by_marker_filter") + def test_list_lcm_op_occs(self, mock_op_occ_list): + req = fake_request.HTTPRequest.blank( + '/vnflcm/v1/vnf_lcm_op_occs') + rule_name = policies.VNFLCM % 'list_lcm_op_occs' + self.common_policy_check(self.project_authorized_contexts, + self.project_unauthorized_contexts, + rule_name, + self.controller.list_lcm_op_occs, + req) + + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._get_vnf') + @mock.patch('tacker.api.vnflcm.v1.controller.' + 'VnfLcmController._change_ext_conn') + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_change_ext_conn_vnf(self, mock_vnf_by_id, + mock_change_ext_conn, mock_vnf): + req = fake_request.HTTPRequest.blank( + '/vnflcm/v1/vnf_instances/%s/change_ext_conn' % + uuidsentinel.instance_id) + body = fakes.get_change_ext_conn_request_body() + mock_vnf_by_id.return_value = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=self.project_id) + mock_vnf.return_value = utils.get_dummy_vnf() + rule_name = policies.VNFLCM % 'change_ext_conn' + self.common_policy_check(self.project_member_authorized_contexts, + self.project_member_unauthorized_contexts, + rule_name, + self.controller.change_ext_conn, + req, uuidsentinel.instance_id, + body=body) diff --git a/tacker/tests/unit/vnflcm/test_controller.py b/tacker/tests/unit/vnflcm/test_controller.py index 35ca42ee8..1d4e07e87 100644 --- a/tacker/tests/unit/vnflcm/test_controller.py +++ b/tacker/tests/unit/vnflcm/test_controller.py @@ -598,8 +598,11 @@ class TestController(base.TestCase): vim = fakes.return_default_vim() vim.update({'extra': {"area": "area_A@region_A"}}) mock_get_vim.return_value = vim + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -616,8 +619,6 @@ class TestController(base.TestCase): "vimType": 'openstack'} ]} body.update({"additionalParams": {"foo_number": 12}}) - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -645,8 +646,12 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) + mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -657,8 +662,6 @@ class TestController(base.TestCase): status='INACTIVE') body = {"flavourId": "invalid"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -692,11 +695,14 @@ class TestController(base.TestCase): mock_get_vnf, mock_insta_notif_process, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) vim = fakes.return_default_vim() vim.update({'extra': {"area": "area_A@region_A"}}) mock_get_vim.return_value = vim mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -708,8 +714,6 @@ class TestController(base.TestCase): body = {"flavourId": "simple", "instantiationLevelId": "instantiation_level_1"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -742,8 +746,12 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vim, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) + mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() vnf_package = fakes.return_vnf_package_with_deployment_flavour() @@ -758,8 +766,6 @@ class TestController(base.TestCase): # request body = {"flavourId": "simple", "instantiationLevelId": "instantiation_level_1"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -789,8 +795,12 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) + mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -802,8 +812,6 @@ class TestController(base.TestCase): body = {"flavourId": "simple", "instantiationLevelId": "non-existing"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -840,8 +848,11 @@ class TestController(base.TestCase): vim = fakes.return_default_vim() vim.update({'extra': {"area": "area_A@region_A"}}) mock_get_vim.return_value = vim + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -858,8 +869,6 @@ class TestController(base.TestCase): "vimType": 'openstack'} ]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -890,8 +899,11 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vim, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -908,8 +920,6 @@ class TestController(base.TestCase): "vimId": uuidsentinel.vim_id, "vimType": 'openstack'} ]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -939,8 +949,11 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vim, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -958,8 +971,6 @@ class TestController(base.TestCase): 'vimType': 'openstack', 'accessInfo': {"region": 'region_non_existing'}} ]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -989,8 +1000,11 @@ class TestController(base.TestCase): mock_vnf_instance_get_by_id, mock_get_vim, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance_model() + fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnfd_get_by_id.return_value = \ fakes.return_vnf_package_vnfd() mock_vnf_package_get_by_id.return_value = \ @@ -1002,8 +1016,6 @@ class TestController(base.TestCase): status='INACTIVE') body = {"flavourId": "simple"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1025,13 +1037,14 @@ class TestController(base.TestCase): @mock.patch.object(objects.vnf_instance, "_vnf_instance_get_by_id") def test_instantiate_incorrect_instantiation_state( self, mock_vnf_by_id, mock_get_vnf, mock_get_service_plugins): - vnf_instance = fakes.return_vnf_instance_model() + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) + vnf_instance = fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) vnf_instance.instantiation_state = 'INSTANTIATED' mock_vnf_by_id.return_value = vnf_instance body = {"flavourId": "simple"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1052,13 +1065,14 @@ class TestController(base.TestCase): mock_vnf_by_id, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) vnf_instance = fakes.return_vnf_instance_model( - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance body = {"flavourId": "simple"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/instantiate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1226,7 +1240,8 @@ class TestController(base.TestCase): mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % uuidsentinel.instance_id) - mock_vnf_by_id.return_value = fakes.return_vnf_instance_model() + mock_vnf_by_id.return_value = fakes.return_vnf_instance_model( + tenant_id=req.environ['tacker.context'].project_id) expected_result = fakes.fake_vnf_instance_response() res_dict = self.controller.show(req, uuidsentinel.instance_id) self.assertEqual(expected_result, res_dict) @@ -1240,7 +1255,8 @@ class TestController(base.TestCase): req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % uuidsentinel.instance_id) mock_vnf_by_id.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) expected_result = fakes.fake_vnf_instance_response( fields.VnfInstanceState.INSTANTIATED) res_dict = self.controller.show(req, uuidsentinel.instance_id) @@ -1278,7 +1294,8 @@ class TestController(base.TestCase): mock_vnf_by_id.return_value = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, - vim_connection_info=[vim_connection_info]) + vim_connection_info=[vim_connection_info], + tenant_id=req.environ['tacker.context'].project_id) vim_info = common_utils.convert_snakecase_to_camelcase(vim_info) expected_result = fakes.fake_vnf_instance_response( @@ -1353,14 +1370,15 @@ class TestController(base.TestCase): mock_get_by_id, mock_get_vnf, mock_notification_process, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/terminate' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_get_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/terminate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1486,14 +1504,15 @@ class TestController(base.TestCase): mock_vnf_by_id, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/terminate' % uuidsentinel.vnf_instance_id) vnf_instance = fakes.return_vnf_instance( instantiated_state=fields.VnfInstanceState.INSTANTIATED, - task_state=fields.VnfInstanceTaskState.TERMINATING) + task_state=fields.VnfInstanceTaskState.TERMINATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance body = {"terminationType": "FORCEFUL"} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/terminate' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1523,14 +1542,15 @@ class TestController(base.TestCase): mock_vnf_by_id, mock_get_vnf, mock_heal_notif_process, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1573,13 +1593,14 @@ class TestController(base.TestCase): mock_get_vnf, mock_notif, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.NOT_INSTANTIATED) + fields.VnfInstanceState.NOT_INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj body = {} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1604,14 +1625,15 @@ class TestController(base.TestCase): @mock.patch.object(objects.VnfInstance, "get_by_id") def test_heal_incorrect_task_state(self, mock_vnf_by_id, mock_get_vnf, mock_notif, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, - task_state=fields.VnfInstanceTaskState.HEALING) + task_state=fields.VnfInstanceTaskState.HEALING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj body = {} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1640,15 +1662,16 @@ class TestController(base.TestCase): mock_get_vnf, mock_notif, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') body = {'vnfcInstanceId': [uuidsentinel.vnfc_instance_id]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/heal' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -1760,7 +1783,8 @@ class TestController(base.TestCase): req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % uuidsentinel.vnf_instance_id) req.method = 'DELETE' - mock_vnf_by_id.return_value = fakes.return_vnf_instance_delete() + mock_vnf_by_id.return_value = fakes.return_vnf_instance_delete( + tenant_id=req.environ['tacker.context'].project_id) req.headers['Content-Type'] = 'application/json' # Call delete API @@ -1817,7 +1841,8 @@ class TestController(base.TestCase): req.method = 'DELETE' vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance # Call delete API @@ -1843,7 +1868,8 @@ class TestController(base.TestCase): vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.ERROR) + task_state=fields.VnfInstanceTaskState.ERROR, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance # Call delete API @@ -2195,6 +2221,7 @@ class TestController(base.TestCase): self.assertEqual(http_client.NOT_FOUND, resp.status_code) + @mock.patch.object(objects.VnfInstance, "get_by_id") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) @@ -2208,11 +2235,19 @@ class TestController(base.TestCase): mock_vnf_package_vnf_get_vnf_package_vnfd, mock_vnf_instance_list, mock_vnf_index_list, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value =\ fakes.return_vnf_package_vnfd() @@ -2225,8 +2260,6 @@ class TestController(base.TestCase): "vnfcInfoModificationsDeleteIds": ["test1"], "metadata": {"testkey": "test_value"}, "vimConnectionInfo": {"id": "testid"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2236,6 +2269,7 @@ class TestController(base.TestCase): self.assertEqual(http_client.ACCEPTED, resp.status_code) mock_update.assert_called_once() + @mock.patch.object(objects.VnfInstance, "get_by_id") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) @@ -2243,7 +2277,8 @@ class TestController(base.TestCase): def test_update_vnf_none_vnf_data( self, mock_vnf_index_list, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): mock_vnf_index_list.return_value = None @@ -2258,6 +2293,10 @@ class TestController(base.TestCase): "vimConnectionInfo": {"id": "testid"}} req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2268,6 +2307,7 @@ class TestController(base.TestCase): resp = req.get_response(self.app) self.assertEqual(res.text, resp.text) + @mock.patch.object(objects.VnfInstance, "get_by_id") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) @@ -2275,7 +2315,8 @@ class TestController(base.TestCase): def test_update_vnf_status_err( self, mock_vnf_index_list, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): updates = {'status': 'ERROR'} mock_vnf_index_list.return_value = fakes._get_vnf(**updates) @@ -2290,6 +2331,10 @@ class TestController(base.TestCase): "vimConnectionInfo": {"id": "testid"}} req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' @@ -2303,6 +2348,7 @@ class TestController(base.TestCase): resp = req.get_response(self.app) self.assertEqual(res.text, resp.text) + @mock.patch.object(objects.VnfInstance, "get_by_id") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) @@ -2312,7 +2358,8 @@ class TestController(base.TestCase): self, mock_vnf_instance_list, mock_vnf_index_list, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = "" @@ -2328,6 +2375,10 @@ class TestController(base.TestCase): "vimConnectionInfo": {"id": "testid"}} req = fake_request.HTTPRequest.blank( '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2340,6 +2391,7 @@ class TestController(base.TestCase): resp = req.get_response(self.app) self.assertEqual(res.text, resp.text) + @mock.patch.object(objects.VnfInstance, "get_by_id") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': test_nfvo_plugin.FakeVNFMPlugin()}) @@ -2360,11 +2412,19 @@ class TestController(base.TestCase): mock_index, mock_get_vnf_package_vnfd, mock_create_package, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value = "" mock_get_vnf_package_vnfd.side_effect =\ exceptions.VnfPackageVnfdNotFound @@ -2381,8 +2441,6 @@ class TestController(base.TestCase): "vnfPkgId": "2c69a161-0000-4b0f-bcf8-391f8fc76600", "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2398,15 +2456,23 @@ class TestController(base.TestCase): @mock.patch.object(objects.VnfInstanceList, "vnf_instance_list") @mock.patch.object(objects.VnfPackageVnfd, 'get_vnf_package_vnfd') @mock.patch.object(vnf_lcm_rpc.VNFLcmRPCAPI, "update") + @mock.patch.object(objects.VnfInstance, "get_by_id") def test_update_vnf_with_pkg_id( - self, mock_update, + self, mock_vnf_instance, mock_update, mock_vnf_package_vnf_get_vnf_package_vnfd, mock_vnf_instance_list, mock_vnf_index_list, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value =\ fakes.return_vnf_package_vnfd() @@ -2415,8 +2481,6 @@ class TestController(base.TestCase): "vnfPkgId": "2c69a161-0000-4b0f-bcf8-391f8fc76600", "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2426,6 +2490,7 @@ class TestController(base.TestCase): self.assertEqual(http_client.ACCEPTED, resp.status_code) mock_update.assert_called_once() + @mock.patch.object(objects.VnfInstance, "get_by_id") @ddt.data("vnfdId", "vnfPkgId") @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': @@ -2447,11 +2512,19 @@ class TestController(base.TestCase): mock_index, mock_get_vnf_package_vnfd, mock_create_package, - mock_get_service_plugins): + mock_get_service_plugins, + mock_vnf_instance): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value = "" mock_get_vnf_package_vnfd.side_effect =\ exceptions.VnfPackageVnfdNotFound @@ -2468,8 +2541,6 @@ class TestController(base.TestCase): input_id: "2c69a161-0000-4b0f-bcf8-391f8fc76600", "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2500,9 +2571,12 @@ class TestController(base.TestCase): mock_create_package, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value = "" mock_get_vnf_package_vnfd.return_value = None mock_create_package.return_value = None @@ -2518,8 +2592,6 @@ class TestController(base.TestCase): input_id: "2c69a161-0000-4b0f-bcf8-391f8fc76600", "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -2534,8 +2606,12 @@ class TestController(base.TestCase): self, mock_vnf_instance_get_by_id, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + constants.UUID) mock_vnf_instance_get_by_id.return_value =\ - fakes.return_vnf_instance(fields.VnfInstanceState.INSTANTIATED) + fakes.return_vnf_instance(fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) body = { "type": "SCALE_OUT", @@ -2543,9 +2619,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "test": "test_value"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2622,7 +2695,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes._get_vnf() vim_connection_info = objects.VimConnectionInfo( vim_type="openstack") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + constants.UUID) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, scale_status="scale_status", **update) @@ -2636,9 +2713,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "test": "test_value"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2669,7 +2743,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes._get_vnf() vim_connection_info = objects.VimConnectionInfo( vim_type="openstack") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + constants.UUID) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, scale_status="scale_status", **update) @@ -2683,9 +2761,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "test": "test_value"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2714,7 +2789,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes._get_vnf() vim_connection_info = objects.VimConnectionInfo( vim_type="openstack") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + constants.UUID) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, scale_status="scale_status", **update) @@ -2729,9 +2808,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "test": "test_value"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2760,7 +2836,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes._get_vnf() vim_connection_info = objects.VimConnectionInfo( vim_type="openstack") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + constants.UUID) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, scale_status="scale_status", **update) @@ -2774,9 +2854,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "test": "test_value"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2817,7 +2894,8 @@ class TestController(base.TestCase): vim_connection_info = objects.VimConnectionInfo( vim_type="openstack") - update = {'vim_connection_info': [vim_connection_info]} + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.INSTANTIATED, scale_status="scale_status", @@ -2881,7 +2959,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes.vnf_dict_cnf() vim_connection_info = objects.VimConnectionInfo( vim_type="kubernetes") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + FakeVNFMPlugin().vnf_for_cnf_vnf_id) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} scale_status = objects.ScaleInfo( aspect_id='vdu1_aspect', scale_level=1) mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( @@ -2899,9 +2981,6 @@ class TestController(base.TestCase): "aspectId": "vdu1_aspect", "numberOfSteps": 1, "additionalParams": {}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - FakeVNFMPlugin().vnf_for_cnf_vnf_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2937,7 +3016,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_info vim_connection_info = objects.VimConnectionInfo( vim_type="kubernetes") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + FakeVNFMPlugin().vnf_for_cnf_vnf_id) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} scale_status = objects.ScaleInfo( aspect_id='vdu1_aspect', scale_level=1) mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( @@ -2956,9 +3039,6 @@ class TestController(base.TestCase): "aspectId": "vdu1_aspect", "numberOfSteps": 1, "additionalParams": {}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - FakeVNFMPlugin().vnf_for_cnf_vnf_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -2989,7 +3069,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = fakes.vnf_dict_cnf() vim_connection_info = objects.VimConnectionInfo( vim_type="kubernetes") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + FakeVNFMPlugin().vnf_for_cnf_vnf_id) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} scale_status = objects.ScaleInfo( aspect_id='vdu1_aspect', scale_level=1) mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( @@ -3007,9 +3091,6 @@ class TestController(base.TestCase): "numberOfSteps": 1, "additionalParams": { "is_reverse": "True"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - FakeVNFMPlugin().vnf_for_cnf_vnf_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -3047,7 +3128,11 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_info vim_connection_info = objects.VimConnectionInfo( vim_type="kubernetes") - update = {'vim_connection_info': [vim_connection_info]} + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/scale' % + FakeVNFMPlugin().vnf_for_cnf_vnf_id) + update = {'vim_connection_info': [vim_connection_info], + 'tenant_id': req.environ['tacker.context'].project_id} scale_status = objects.ScaleInfo( aspect_id='vdu1_aspect', scale_level=1) mock_vnf_instance_get_by_id.return_value = fakes.return_vnf_instance( @@ -3068,9 +3153,6 @@ class TestController(base.TestCase): "aspectId": "vdu1_aspect", "numberOfSteps": 3, "additionalParams": {}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/scale' % - FakeVNFMPlugin().vnf_for_cnf_vnf_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -3103,7 +3185,8 @@ class TestController(base.TestCase): vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.ERROR) + task_state=fields.VnfInstanceTaskState.ERROR, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3135,7 +3218,8 @@ class TestController(base.TestCase): vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.ERROR) + task_state=fields.VnfInstanceTaskState.ERROR, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3173,12 +3257,17 @@ class TestController(base.TestCase): @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': FakeVNFMPlugin()}) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") - def test_rollback_not_failed_temp(self, mock_lcm_by_id, + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_rollback_not_failed_temp(self, mock_vnf_get_by_id, + mock_lcm_by_id, mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/rollback' % uuidsentinel.vnf_instance_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' + vnf_instance = fakes.return_vnf_instance( + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_rollback_active() mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -3189,12 +3278,17 @@ class TestController(base.TestCase): @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': FakeVNFMPlugin()}) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id",) - def test_rollback_not_ope(self, mock_lcm_by_id, + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_rollback_not_ope(self, mock_vnf_get_by_id, + mock_lcm_by_id, mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/rollback' % uuidsentinel.vnf_instance_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' + vnf_instance = fakes.return_vnf_instance( + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_rollback_ope() mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -3205,12 +3299,17 @@ class TestController(base.TestCase): @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': FakeVNFMPlugin()}) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") - def test_rollback_not_scale_in(self, mock_lcm_by_id, + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_rollback_not_scale_in(self, mock_vnf_get_by_id, + mock_lcm_by_id, mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/rollback' % uuidsentinel.vnf_instance_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' + vnf_instance = fakes.return_vnf_instance( + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_rollback_scale_in() mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -3240,12 +3339,17 @@ class TestController(base.TestCase): return_value={'VNFM': FakeVNFMPlugin()}) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") @mock.patch.object(controller.VnfLcmController, "_get_rollback_vnf") - def test_rollback_vnf_not_found(self, mock_get_vnf, mock_lcm_by_id, + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_rollback_vnf_not_found(self, mock_vnf_get_by_id, + mock_get_vnf, mock_lcm_by_id, mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/rollback' % uuidsentinel.vnf_instance_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' + vnf_instance = fakes.return_vnf_instance( + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_rollback_insta() mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -3320,7 +3424,8 @@ class TestController(base.TestCase): mock_lcm_get_by_id.return_value = fakes.vnflcm_cancel_insta() vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_get_by_id.return_value = vnf_instance resp = req.get_response(self.app) @@ -3353,7 +3458,8 @@ class TestController(base.TestCase): mock_lcm_get_by_id.return_value = fakes.vnflcm_cancel_insta() vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_get_by_id.return_value = vnf_instance resp = req.get_response(self.app) @@ -3380,7 +3486,8 @@ class TestController(base.TestCase): mock_lcm_get_by_id.return_value = fakes.vnflcm_cancel_insta() vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_get_by_id.return_value = vnf_instance resp = req.get_response(self.app) @@ -3407,7 +3514,8 @@ class TestController(base.TestCase): mock_lcm_get_by_id.return_value = fake_cancel_opocc vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_get_by_id.return_value = vnf_instance resp = req.get_response(self.app) @@ -3492,7 +3600,8 @@ class TestController(base.TestCase): mock_lcm_get_by_id.return_value = fakes.vnflcm_cancel_insta() vnf_instance = fakes.return_vnf_instance( fields.VnfInstanceState.NOT_INSTANTIATED, - task_state=fields.VnfInstanceTaskState.INSTANTIATING) + task_state=fields.VnfInstanceTaskState.INSTANTIATING, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_get_by_id.return_value = vnf_instance mock_lcm_save.side_effect = Exception() @@ -3514,6 +3623,10 @@ class TestController(base.TestCase): mock_send_notification): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/fail' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance mock_lcm_get_by_id.return_value = fakes.vnflcm_fail_insta() res_dict = self.controller.fail(req, constants.UUID) self.assertEqual('FAILED', res_dict['operationState']) @@ -3556,9 +3669,15 @@ class TestController(base.TestCase): self.assertEqual(http_client.NOT_FOUND, res_dict.status_code) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") - def test_fail_lcm_op_occs_vnf_not_failed_temp(self, mock_lcm_get_by_id): + @mock.patch.object(objects.VnfInstance, "get_by_id") + def test_fail_lcm_op_occs_vnf_not_failed_temp( + self, mock_vnf_instance, mock_lcm_get_by_id): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/fail' % constants.UUID) + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance vnflcm_fail_object = fakes.vnflcm_fail_insta() vnflcm_fail_object.operation_state = 'STARTED' mock_lcm_get_by_id.return_value = vnflcm_fail_object @@ -3589,7 +3708,8 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_obj vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3617,7 +3737,8 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_obj vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3644,7 +3765,8 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_obj vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3671,7 +3793,8 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_obj vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3699,7 +3822,8 @@ class TestController(base.TestCase): mock_get_vnf.return_value = vnf_obj vnf_instance = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_instance.return_value = vnf_instance resp = req.get_response(self.app) @@ -3739,13 +3863,17 @@ class TestController(base.TestCase): @mock.patch.object(TackerManager, 'get_service_plugins', return_value={'VNFM': FakeVNFMPlugin()}) @mock.patch.object(objects.VnfLcmOpOcc, "get_by_id") + @mock.patch.object(objects.VnfInstance, "get_by_id") def test_retry_vnf_lcm_occ_conflict( - self, mock_lcm_by_id, mock_get_service_plugins): + self, mock_vnf_instance, mock_lcm_by_id, mock_get_service_plugins): req = fake_request.HTTPRequest.blank( '/vnf_lcm_op_occs/%s/retry' % uuidsentinel.vnf_lcm_op_occs_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' - + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_instance.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_op_occs_retry_data( operation_state='invalid operation state') mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -3849,7 +3977,10 @@ class TestController(base.TestCase): '/vnf_lcm_op_occs/%s/retry' % uuidsentinel.vnf_lcm_op_occs_id) req.headers['Content-Type'] = 'application/json' req.method = 'POST' - + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_get_vnf_instance.return_value = vnf_instance vnf_lcm_op_occs = fakes.vnflcm_op_occs_retry_data( operation='Invalid operation type') mock_lcm_by_id.return_value = vnf_lcm_op_occs @@ -4112,6 +4243,10 @@ class TestController(base.TestCase): '/vnf_lcm_op_occs/%s/fail' % constants.UUID) mock_lcm_get_by_id.return_value = \ fakes.vnflcm_fail_insta() + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance res_dict = self.controller.fail(req, constants.UUID) ref_dict = copy.deepcopy(fakes.VNFLCMOPOCC_RESPONSE) @@ -4133,6 +4268,10 @@ class TestController(base.TestCase): '/vnf_lcm_op_occs/%s/fail' % constants.UUID) mock_lcm_get_by_id.return_value = \ fakes.vnflcm_fail_check_added_params() + vnf_instance = fakes.return_vnf_instance( + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) + mock_vnf_get_by_id.return_value = vnf_instance res_dict = self.controller.fail(req, constants.UUID) ref_dict = fakes.VNFLCMOPOCC_RESPONSE @@ -4162,15 +4301,16 @@ class TestController(base.TestCase): mock_vnf_by_id, mock_get_vnf, mock_notification_process, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') body = fakes.get_change_ext_conn_request_body() - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -4196,14 +4336,15 @@ class TestController(base.TestCase): mock_vnf_by_id, mock_get_vnf, mock_notification_process, mock_get_service_plugins, mock_insta_notfi_process): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') body = fakes.get_change_ext_conn_request_body() - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -4223,13 +4364,14 @@ class TestController(base.TestCase): def test_change_ext_conn_incorrect_instantiated_state( self, mock_vnf_by_id, mock_get_vnf, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.NOT_INSTANTIATED) + fields.VnfInstanceState.NOT_INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj body = fakes.get_change_ext_conn_request_body() - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -4292,8 +4434,11 @@ class TestController(base.TestCase): mock_get_vnf, mock_notification_process, mock_get_service_plugins): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) vnf_instance_obj = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_by_id.return_value = vnf_instance_obj mock_get_vnf.return_value = \ self._get_dummy_vnf(vnf_id=vnf_instance_obj.id, status='ACTIVE') @@ -4302,8 +4447,6 @@ class TestController(base.TestCase): body['extVirtualLinks'][0]['extCps'][0]['cpConfig'][0][ 'cpProtocolData'][0]['ipOverEthernet'][ 'ipAddresses'] = [ip_address] - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s/change_ext_conn' % uuidsentinel.vnf_instance_id) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -4820,11 +4963,13 @@ class TestController(base.TestCase): mock_vnf_package_get_by_id.return_value = \ fakes.return_vnf_package_with_deployment_flavour() + req = fake_request.HTTPRequest.blank('/vnf_instances') updates = {'vnfd_id': uuidsentinel.vnfd_id, 'vnf_instance_description': 'SampleVnf Description', 'vnf_instance_name': 'SampleVnf', 'vnf_pkg_id': uuidsentinel.vnf_pkg_id, - 'vnf_metadata': {"key": "value"}} + 'vnf_metadata': {"key": "value"}, + 'tenant_id': req.environ['tacker.context'].project_id} mock_vnf_instance_create.return_value =\ fakes.return_vnf_instance_model(**updates) @@ -4833,7 +4978,6 @@ class TestController(base.TestCase): "vnfInstanceName": "SampleVnf", "vnfInstanceDescription": "SampleVnf Description", 'metadata': {"key": "value"}} - req = fake_request.HTTPRequest.blank('/vnf_instances') req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'POST' @@ -4874,6 +5018,8 @@ class TestControllerEnhancedPolicy(TestController): mock_vnf_package_vnf_get_vnf_package_vnfd, mock_vnf_instance_list, mock_vnf_index_list, mock_get_service_plugins, mock_vnf_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) mock_vnf_by_id.return_value = fakes.return_vnf_instance() mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( @@ -4886,8 +5032,6 @@ class TestControllerEnhancedPolicy(TestController): "vnfPkgId": "2c69a161-0000-4b0f-bcf8-391f8fc76600", "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"]} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH' @@ -4907,6 +5051,8 @@ class TestControllerEnhancedPolicy(TestController): mock_vnf_index_list, mock_get_service_plugins, mock_vnf_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) mock_vnf_by_id.return_value = fakes.return_vnf_instance() updates = {'status': 'ERROR'} mock_vnf_index_list.return_value = fakes._get_vnf(**updates) @@ -4920,8 +5066,6 @@ class TestControllerEnhancedPolicy(TestController): "vnfcInfoModificationsDeleteIds": ["test1"], "metadata": {"testkey": "test_value"}, "vimConnectionInfo": {"id": "testid"}} - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' @@ -4959,10 +5103,13 @@ class TestControllerEnhancedPolicy(TestController): mock_get_service_plugins, mock_vnf_by_id): + req = fake_request.HTTPRequest.blank( + '/vnf_instances/%s' % constants.UUID) mock_vnf_by_id.return_value = fakes.return_vnf_instance() mock_vnf_index_list.return_value = fakes._get_vnf() mock_vnf_instance_list.return_value = fakes.return_vnf_instance( - fields.VnfInstanceState.INSTANTIATED) + fields.VnfInstanceState.INSTANTIATED, + tenant_id=req.environ['tacker.context'].project_id) mock_vnf_package_vnf_get_vnf_package_vnfd.return_value = "" mock_get_vnf_package_vnfd.side_effect =\ exceptions.VnfPackageVnfdNotFound @@ -4981,8 +5128,6 @@ class TestControllerEnhancedPolicy(TestController): "vnfConfigurableProperties": {"test": "test_value"}, "vnfcInfoModificationsDeleteIds": ["test1"] } - req = fake_request.HTTPRequest.blank( - '/vnf_instances/%s' % constants.UUID) req.body = jsonutils.dump_as_bytes(body) req.headers['Content-Type'] = 'application/json' req.method = 'PATCH'