diff options
-rw-r--r-- | vio/vio/heatbridge.py | 3 | ||||
-rw-r--r-- | vio/vio/swagger/views/workload/views.py | 41 | ||||
-rw-r--r-- | vio/vio/tests/test_fake_execute_view.py | 39 | ||||
-rw-r--r-- | vio/vio/tests/test_heatbridge.py | 61 |
4 files changed, 141 insertions, 3 deletions
diff --git a/vio/vio/heatbridge.py b/vio/vio/heatbridge.py index 325d20c..94912c1 100644 --- a/vio/vio/heatbridge.py +++ b/vio/vio/heatbridge.py @@ -41,9 +41,10 @@ def heat_bridge(vim_info, stack_id): if instance is None: logger.info("can not find server %s" % res.physical_resource_id) continue + slink = "" for link in instance.links: if link['rel'] == "self": - slink = link['rel'] + slink = link['href'] break ret['servers'].append({ "name": instance.name, 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) diff --git a/vio/vio/tests/test_heatbridge.py b/vio/vio/tests/test_heatbridge.py new file mode 100644 index 0000000..53df009 --- /dev/null +++ b/vio/vio/tests/test_heatbridge.py @@ -0,0 +1,61 @@ +# 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 unittest + +from vio import heatbridge +from vio.pub.vim.vimapi.heat import OperateStack +from vio.pub.vim.vimapi.nova import OperateServers + + +class TestHeatBridge(unittest.TestCase): + + @mock.patch.object(OperateServers, "OperateServers") + @mock.patch.object(OperateStack, "OperateStack") + def test_heat_bridge(self, mock_stack, mock_server): + stack_op = mock.Mock() + stack_op.get_stack_resources.return_value = [mock.Mock( + resource_type="OS::Nova::Server", + status="CREATE_COMPLETE", + physical_resource_id="server-id", + )] + mock_stack.return_value = stack_op + server_op = mock.Mock() + server = mock.Mock( + name="server", + id="server-id", + status="ACTIVE", + links=[{ + "rel": "self", + "href": "/servers/server-id" + }] + ) + server_op.get_server.return_value = server + mock_server.return_value = server_op + vim_info = { + "vimId": "vim-id", + "name": "vmware_nova", + "userName": "user", + "password": "pass", + "url": "http://1.2.3.4:5000" + } + ret = heatbridge.heat_bridge(vim_info, "stack-id") + expect_ret = { + "servers": [{ + "name": server.name, + "id": server.id, + "status": server.status, + "link": "/servers/server-id" + }] + } + self.assertEqual(ret, expect_ret) |