diff options
-rw-r--r-- | vio/vio/swagger/views/workload/views.py | 41 | ||||
-rw-r--r-- | vio/vio/tests/test_fake_execute_view.py | 39 |
2 files changed, 78 insertions, 2 deletions
diff --git a/vio/vio/swagger/views/workload/views.py b/vio/vio/swagger/views/workload/views.py index efcc2f7..a1669c2 100644 --- a/vio/vio/swagger/views/workload/views.py +++ b/vio/vio/swagger/views/workload/views.py @@ -18,7 +18,9 @@ from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView +from vio import heatbridge from vio.pub.msapi import extsys +from vio.pub.utils.restcall import AAIClient from vio.pub.vim.vimapi.heat import OperateStack from vio.pub.exceptions import VimDriverVioException @@ -56,7 +58,7 @@ class CreateStackViewV1(APIView): body = json.loads(request.body) logger.debug("infra_workload post body: %s" % body) template_type = body['template_type'] - if template_type != "heat": + if template_type.lower() != "heat": return Response( data={ "error": "invalid template type %s" % template_type @@ -74,7 +76,9 @@ class CreateStackViewV1(APIView): stack = stack_op.create_vim_stack(**stack_body) rsp = { "template_type": "heat", - "workload_id": stack.id + "workload_id": stack.id, + "workload_status": stack.status, + "workload_status_reason": stack.status_reason, } return Response(data=rsp, status=status.HTTP_201_CREATED) except Exception as e: @@ -87,6 +91,7 @@ class CreateStackViewV1(APIView): class GetDelStackViewV1(APIView): def get(self, request, cloud_owner, cloud_region, workload_id): + # import ipdb; ipdb.set_trace() try: vim_info = extsys.get_vim_by_id(cloud_owner + "_" + cloud_region) # vim_info['tenant'] = tenantid @@ -95,10 +100,12 @@ class GetDelStackViewV1(APIView): try: stack_op = OperateStack.OperateStack(vim_info) stack = stack_op.get_vim_stack(workload_id) + # import ipdb; ipdb.set_trace() rsp = { "template_type": "heat", "workload_id": stack.id, "workload_status": stack.status, + "workload_status_reason": stack.status_reason, } return Response(data=rsp, status=status.HTTP_200_OK) except Exception as e: @@ -108,6 +115,36 @@ class GetDelStackViewV1(APIView): return Response(data={'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + def post(self, request, cloud_owner, cloud_region, workload_id): + # import ipdb; ipdb.set_trace() + try: + vim_info = extsys.get_vim_by_id(cloud_owner + "_" + cloud_region) + # vim_info['tenant'] = tenantid + except VimDriverVioException as e: + return Response(data={'error': str(e)}, status=e.status_code) + try: + body = json.loads(request.body) + vf_module_id = body.get("vf-module-id") + generic_vnf_id = body.get("generic-vnf-id") + contents = heatbridge.heat_bridge(vim_info, workload_id) + contents['vf-module-id'] = vf_module_id + contents['generic-vnf-id'] = generic_vnf_id + aai_adapter = AAIClient(cloud_owner, cloud_region) + aai_adapter.add_vservers(contents) + rsp = { + "template_type": "heat", + "workload_id": workload_id, + "workload_status": "AAI_IN_PROGRESS", + "workload_status_reason": "Updating AAI relationship", + } + return Response(data=rsp, status=status.HTTP_202_ACCEPTED) + except Exception as e: + if hasattr(e, "http_status"): + return Response(data={'error': str(e)}, status=e.http_status) + else: + return Response(data={'error': str(e)}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + def delete(self, request, cloud_owner, cloud_region, workload_id): try: vim_info = extsys.get_vim_by_id(cloud_owner + "_" + cloud_region) diff --git a/vio/vio/tests/test_fake_execute_view.py b/vio/vio/tests/test_fake_execute_view.py new file mode 100644 index 0000000..f1d1d9a --- /dev/null +++ b/vio/vio/tests/test_fake_execute_view.py @@ -0,0 +1,39 @@ +# Copyright (c) 2019 VMware, Inc. +# +# 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. + +import mock +import requests +import unittest + +from vio.swagger.views.fakeplugin.execute import views + + +class TestFakeExecute(unittest.TestCase): + + def setUp(self): + self.view = views.FakeExecute() + + @mock.patch.object(requests, "request") + def test_gexecute_get(self, mock_req): + req = mock.Mock() + req.body = """{ + "method": "get", + "url": "http://example.org" + } + """ + resp = mock.Mock() + resp.json.return_value = {} + resp.headers = {"Content-Type": "application/json"} + resp.status_code = 200 + mock_req.return_value = resp + resp = self.view.post(req) + self.assertEqual(200, resp.status_code) |