Add Get register api implementation in framework
[multicloud/framework.git] / multivimbroker / multivimbroker / forwarder / views.py
index ef7ab95..898acc5 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os
+import os
 import json
-import re
-import tempfile
-from poster.encode import multipart_encode
-from poster.streaminghttp import register_openers
+# import re
+# import tempfile
+# from django.core.files.uploadedfile import InMemoryUploadedFile
+# from poster.encode import multipart_encode
+# from poster.streaminghttp import register_openers
 
 from rest_framework.views import APIView
 from rest_framework.views import Response
@@ -26,7 +27,6 @@ from rest_framework.views import status
 from multivimbroker.forwarder.base import BaseHandler
 from multivimbroker.pub.utils.syscomm import originHeaders
 from multivimbroker.pub.utils import syscomm
-from rest_framework.parsers import MultiPartParser
 from multivimbroker.pub.msapi import extsys
 
 
@@ -72,6 +72,11 @@ class Registry(BaseServer):
         return self.send(vimid, request.get_full_path(), request.body, "POST",
                          headers=originHeaders(request))
 
+    def get(self, request, vimid):
+
+        return self.send(vimid, request.get_full_path(), request.body, "GET",
+                         headers=originHeaders(request))
+
 
 class UnRegistry(BaseServer):
 
@@ -114,7 +119,8 @@ class CheckCapacity(BaseServer):
         for vim in body.get("VIMs", []):
             url = request.get_full_path().replace(
                 "check_vim_capacity", "%s/capacity_check" % vim)
-            resp = self.send(vim, url, json.dumps(newbody), "POST")
+            resp = self.send(vim, url, json.dumps(newbody), "POST",
+                             headers=originHeaders(request))
             if int(resp.status_code) != status.HTTP_200_OK:
                 continue
             try:
@@ -161,41 +167,6 @@ class Forward(BaseServer):
                          headers=originHeaders(request))
 
 
-# Multipart view
-class MultiPartView(BaseServer):
-
-    parser_classes = (MultiPartParser, )
-
-    def post(self, request, vimid):
-        try:
-            register_openers()
-            fileDict = dict(request.FILES.iterlists())
-            params = {}
-            for key in fileDict.keys():
-                fileObj = fileDict[key][0]
-                f = tempfile.NamedTemporaryFile(prefix="django_",
-                                                suffix=fileObj._name,
-                                                delete=False)
-                f.write(fileObj.file.read())
-                f.seek(fileObj.file.tell(), 0)
-                fileObj.file.close()
-                params[key] = open(f.name, 'rb')
-            datagen, headers = multipart_encode(params)
-            regex = re.compile('^HTTP_')
-            for key, value in request.META.iteritems():
-                if key.startswith("HTTP_"):
-                    headers[regex.sub('', key).replace('_', '-')] = value
-            resp = self.send(vimid, request.path, datagen, "POST",
-                             headers=headers)
-        finally:
-            for key in params:
-                fileRef = params[key]
-                if fileRef.closed is False:
-                    fileRef.close()
-                os.remove(fileRef.name)
-        return resp
-
-
 # API v1
 # proxy handler
 class APIv1Identity(Identity):
@@ -211,6 +182,10 @@ class APIv1Identity(Identity):
 
 class APIv1Registry(Registry):
 
+    def get(self, request, cloud_owner, cloud_region_id):
+        vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
+        return super(APIv1Registry, self).get(request, vimid)
+
     def post(self, request, cloud_owner, cloud_region_id):
         vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
         return super(APIv1Registry, self).post(request, vimid)
@@ -259,15 +234,20 @@ class APIv1CheckCapacity(CheckCapacity):
                 "check_vim_capacity", "%s/%s/capacity_check" %
                                       (cloud_owner, cloud_region_id))
             vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
-            resp = self.send(vimid, url, json.dumps(newbody), "POST")
+            resp = self.send(vimid, url, json.dumps(newbody), "POST",
+                             headers=originHeaders(request))
+
             if int(resp.status_code) != status.HTTP_200_OK:
                 continue
+
             try:
                 resp_body = json.loads(resp.content)
             except ValueError:
                 continue
             if not resp_body.get("result", False):
                 continue
+            azCapInfo = resp_body.get("AZs", [])
+            vim["AZs"] = azCapInfo
             ret['VIMs'].append(vim)
         return Response(data=ret, status=status.HTTP_200_OK)
 
@@ -300,10 +280,59 @@ class APIv1Forward(Forward):
         return super(APIv1Forward, self).put(request, vimid)
 
 
-# Multipart view
-class APIv1MultiPartView(MultiPartView):
+class APIv1InfraWorkload(BaseServer):
 
     def post(self, request, cloud_owner, cloud_region_id):
+        vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
+        content_type = request.META.get('CONTENT_TYPE', 'application/json')
+        if content_type.startswith("multipart"):
+            return self.__process_multipart(request, vimid)
+        return self.send(vimid, request.get_full_path(), request.body, "POST",
+                         headers=originHeaders(request))
+
+    def get(self, request, cloud_owner, cloud_region_id):
+        vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
+        return self.send(vimid, request.get_full_path(), request.body, "GET",
+                         headers=originHeaders(request))
 
+    def delete(self, request, cloud_owner, cloud_region_id):
         vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
-        return super(APIv1MultiPartView, self).post(request, vimid)
+        return self.send(vimid, request.get_full_path(), request.body,
+                         "DELETE", headers=originHeaders(request))
+
+    def __process_multipart(self, request, vimid):
+        return Response(
+            data={'error': 'multipart API is not supported yet'},
+            status=status.HTTP_400_BAD_REQUEST)
+#        try:
+#            API is depreciated due to poster not available in py3
+#            register_openers()
+#            dataDict = dict(request.data.iterlists())
+#            params = {}
+#            for key in dataDict.keys():
+#                dataObj = dataDict[key][0]
+#                if isinstance(dataObj, InMemoryUploadedFile):
+#                    f = tempfile.NamedTemporaryFile(prefix="django_",
+#                                                    suffix=dataObj._name,
+#                                                    delete=False)
+#                    f.write(dataObj.file.read())
+#                    f.seek(dataObj.file.tell(), 0)
+#                    dataObj.file.close()
+#                    params[key] = open(f.name, 'rb')
+#                else:
+#                    params[key] = dataObj
+#             datagen, headers = multipart_encode(params)
+#             regex = re.compile('^HTTP_')
+#             for key, value in request.META.iteritems():
+#                if key.startswith("HTTP_"):
+#                    headers[regex.sub('', key).replace('_', '-')] = value
+#             resp = self.send(vimid, request.path, datagen, "POST",
+#                             headers=headers, multipart=True)
+#        finally:
+#             for key in params or {}:
+#                refobj = params[key]
+#                if type(refobj) is not unicode:
+#                    if refobj.closed is False:
+#                        print (refobj.close())
+#                    os.remove(refobj.name)
+#        return resp