Add server action api for openstack newton 71/62071/5
authorfujinhua <fu.jinhua@zte.com.cn>
Thu, 23 Aug 2018 11:46:14 +0000 (19:46 +0800)
committerBin Yang <bin.yang@windriver.com>
Fri, 24 Aug 2018 06:27:16 +0000 (06:27 +0000)
Change-Id: I61cd2de2db764551e33e52f10e615a02bdcc65b3
Issue-ID: MULTICLOUD-332
Signed-off-by: fujinhua <fu.jinhua@zte.com.cn>
newton/newton/requests/urls.py
share/newton_base/openoapi/server.py

index 435ff23..ff1a7fb 100644 (file)
@@ -36,6 +36,8 @@ urlpatterns = [
         volume.Volumes.as_view()),
     url(r'^servers(/(?P<serverid>[0-9a-zA-Z_-]+))?',
         server.Servers.as_view()),
+    url(r'^servers(/(?P<serverid>[0-9a-zA-Z_-]+))/action/?$',
+        server.ServerAction.as_view()),
     url(r'^ports(/(?P<portid>[0-9a-zA-Z_-]+))?',
         vport.Vports.as_view()),
     url(r'^flavors(/(?P<flavorid>[0-9a-zA-Z_-]+))?',
index 3e90bf8..0dd813c 100644 (file)
@@ -526,3 +526,35 @@ class APIv1Servers(Servers):
 
         vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
         return super(APIv1Servers, self).delete(request, vimid, tenantid, serverid)
+
+
+class ServerAction(APIView):
+    service = {'service_type': 'compute',
+               'interface': 'public'}
+    def post(self, request, vimid="", tenantid="", serverid=""):
+        logger.debug("ServerAction--post::> %s" % request.data)
+        logger.debug("vimid=%s, tenantid=%s, serverid=%s", vimid, tenantid, serverid)
+        try:
+            # prepare request resource to vim instance
+            vim = VimDriverUtils.get_vim_info(vimid)
+            sess = VimDriverUtils.get_session(vim, tenantid)
+
+            # operate server now
+            req_resouce = "servers/{server_id}/action".format(server_id=serverid)
+            req_body = json.JSONEncoder().encode(request.data)
+            resp = sess.post(req_resouce, data=req_body,
+                             endpoint_filter=self.service,
+                             headers={"Content-Type": "application/json",
+                                      "Accept": "application/json"})
+            resp_body = resp.json()
+
+            return Response(data=resp_body, status=resp.status_code)
+        except VimDriverKiloException as e:
+            return Response(data={'error': e.content}, status=e.status_code)
+        except HttpError as e:
+            logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
+            return Response(data=e.response.json(), status=e.http_status)
+        except Exception as e:
+            logger.error(traceback.format_exc())
+            return Response(data={'error': str(e)},
+                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)