summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vio/vio/heatbridge.py3
-rw-r--r--vio/vio/swagger/views/workload/views.py41
-rw-r--r--vio/vio/tests/test_fake_execute_view.py39
-rw-r--r--vio/vio/tests/test_heatbridge.py61
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)