Add delete vnf instance API

Implemented delete vnf instance API.

* DELETE /vnflcm/v1/vnf_instances/{vnf_instance_id}

Co-authored-By: Ajay Parja <ajay.parja@nttdata.com>
Co-authored-By: Niraj Singh <niraj.singh@nttdata.com>
Blueprint: support-etsi-nfv-specs
Change-Id: I66040705a2f2c15e3aa84112226ce77ab5a7e18d
This commit is contained in:
tpatil 2019-12-05 07:47:47 +00:00
parent 31beaa32b8
commit 840d754822
3 changed files with 109 additions and 1 deletions

View File

@ -209,8 +209,20 @@ class VnfLcmController(wsgi.Controller):
vnf_instances = objects.VnfInstanceList.get_all(context)
return self._view_builder.index(vnf_instances)
@check_vnf_state(action="delete",
instantiation_state=[fields.VnfInstanceState.NOT_INSTANTIATED],
task_state=[None])
def _delete(self, context, vnf_instance):
vnf_instance.destroy(context)
@wsgi.response(http_client.NO_CONTENT)
@wsgi.expected_errors((http_client.FORBIDDEN, http_client.NOT_FOUND,
http_client.CONFLICT))
def delete(self, request, id):
raise webob.exc.HTTPNotImplemented()
context = request.environ['tacker.context']
vnf_instance = self._get_vnf_instance(context, id)
self._delete(context, vnf_instance)
@check_vnf_state(action="instantiate",
instantiation_state=[fields.VnfInstanceState.NOT_INSTANTIATED],

View File

@ -88,6 +88,17 @@ rules = [
}
]
),
policy.DocumentedRuleDefault(
name=VNFLCM % 'delete',
check_str=base.RULE_ADMIN_OR_OWNER,
description="Delete an Individual VNF instance.",
operations=[
{
'method': 'DELETE',
'path': '/vnflcm/v1/vnf_instances/{vnfInstanceId}'
}
]
),
]

View File

@ -1004,3 +1004,88 @@ class TestController(base.TestCase):
req.method = method
resp = req.get_response(self.app)
self.assertEqual(http_client.METHOD_NOT_ALLOWED, resp.status_code)
@mock.patch.object(objects.vnf_instance, "_vnf_instance_get_by_id")
@mock.patch.object(objects.vnf_instance, '_destroy_vnf_instance')
def test_delete(self, mock_destroy_vnf_instance, mock_vnf_by_id):
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()
req.headers['Content-Type'] = 'application/json'
# Call delete API
resp = req.get_response(self.app)
self.assertEqual(http_client.NO_CONTENT, resp.status_code)
mock_destroy_vnf_instance.assert_called_once()
@mock.patch.object(objects.VnfInstance, "get_by_id")
def test_delete_with_non_existing_vnf_instance(self, mock_vnf_by_id):
req = fake_request.HTTPRequest.blank(
'/vnf_instances/%s' % uuidsentinel.vnf_instance_id)
req.method = 'DELETE'
mock_vnf_by_id.side_effect = exceptions.VnfInstanceNotFound
# Call delete API
resp = req.get_response(self.app)
self.assertEqual(http_client.NOT_FOUND, resp.status_code)
self.assertEqual("Can not find requested vnf instance: %s" %
uuidsentinel.vnf_instance_id,
resp.json['itemNotFound']['message'])
def test_delete_with_invalid_uuid(self):
req = fake_request.HTTPRequest.blank(
'/vnf_instances/%s' % constants.INVALID_UUID)
req.method = 'DELETE'
# Call delete API
resp = req.get_response(self.app)
self.assertEqual(http_client.NOT_FOUND, resp.status_code)
self.assertEqual("Can not find requested vnf instance: %s" %
constants.INVALID_UUID,
resp.json['itemNotFound']['message'])
@mock.patch.object(objects.VnfInstance, "get_by_id")
def test_delete_with_incorrect_instantiation_state(self, mock_vnf_by_id):
req = fake_request.HTTPRequest.blank(
'/vnf_instances/%s' % uuidsentinel.vnf_instance_id)
req.method = 'DELETE'
vnf_instance = fakes.return_vnf_instance(
fields.VnfInstanceState.INSTANTIATED)
mock_vnf_by_id.return_value = vnf_instance
# Call delete API
resp = req.get_response(self.app)
self.assertEqual(http_client.CONFLICT, resp.status_code)
expected_msg = ("Vnf instance %s in instantiation_state "
"INSTANTIATED. Cannot delete while the vnf instance "
"is in this state.")
self.assertEqual(expected_msg % uuidsentinel.vnf_instance_id,
resp.json['conflictingRequest']['message'])
@mock.patch.object(objects.VnfInstance, "get_by_id")
def test_delete_with_incorrect_task_state(self, mock_vnf_by_id):
req = fake_request.HTTPRequest.blank(
'/vnf_instances/%s' % uuidsentinel.vnf_instance_id)
req.method = 'DELETE'
vnf_instance = fakes.return_vnf_instance(
fields.VnfInstanceState.NOT_INSTANTIATED,
task_state=fields.VnfInstanceTaskState.ERROR)
mock_vnf_by_id.return_value = vnf_instance
# Call delete API
resp = req.get_response(self.app)
self.assertEqual(http_client.CONFLICT, resp.status_code)
expected_msg = ("Vnf instance %s in task_state ERROR. "
"Cannot delete while the vnf instance "
"is in this state.")
self.assertEqual(expected_msg % uuidsentinel.vnf_instance_id,
resp.json['conflictingRequest']['message'])