1 # Copyright 2017 Wind River Systems, Inc.
2 # Copyright (c) 2017-2018 VMware, Inc.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
19 from poster.encode import multipart_encode
20 from poster.streaminghttp import register_openers
22 from rest_framework.views import APIView
23 from rest_framework.views import Response
24 from rest_framework.views import status
25 from multivimbroker.forwarder.base import BaseHandler
26 from multivimbroker.pub.utils.syscomm import originHeaders
27 from multivimbroker.pub.utils import syscomm
28 from rest_framework.parsers import MultiPartParser
31 class BaseServer(BaseHandler, APIView):
33 def get(self, request, vimid):
34 raise NotImplementedError()
36 def post(self, request, vimid):
37 raise NotImplementedError()
39 def put(self, request, vimid):
40 raise NotImplementedError()
42 def delete(self, request, vimid):
43 raise NotImplementedError()
45 def head(self, request, vimid):
46 raise NotImplementedError()
48 def patch(self, request, vimid):
49 raise NotImplementedError()
53 class Identity(BaseServer):
55 def get(self, request, vimid):
57 return self.send(vimid, request.get_full_path(), request.body, "GET",
58 headers=originHeaders(request))
60 def post(self, request, vimid):
62 return self.send(vimid, request.get_full_path(), request.body, "POST",
63 headers=originHeaders(request))
66 class Registry(BaseServer):
68 def post(self, request, vimid):
70 return self.send(vimid, request.get_full_path(), request.body, "POST",
71 headers=originHeaders(request))
74 class UnRegistry(BaseServer):
76 def delete(self, request, vimid):
78 return self.send(vimid, request.get_full_path(), request.body,
79 "DELETE", headers=originHeaders(request))
82 class Extension(BaseServer):
84 def get(self, request, vimid):
86 return self.send(vimid, request.get_full_path(), request.body, "GET",
87 headers=originHeaders(request))
90 class VIMTypes(BaseServer):
92 def get(self, request):
93 return Response(data=syscomm.getVIMTypes(), status=status.HTTP_200_OK)
96 class CheckCapacity(BaseServer):
98 def post(self, request):
100 body = json.loads(request.body)
101 except ValueError as e:
103 data={'error': 'Invalidate request body %s.' % e},
104 status=status.HTTP_400_BAD_REQUEST)
108 "vCPU": body.get("vCPU", 0),
109 "Memory": body.get("Memory", 0),
110 "Storage": body.get("Storage", 0)
112 for vim in body.get("VIMs", []):
113 url = request.get_full_path().replace(
114 "check_vim_capacity", "%s/capacity_check" % vim)
115 resp = self.send(vim, url, newbody, "POST")
116 if resp.status_code != status.HTTP_200_OK:
119 resp_body = json.loads(resp.body)
122 if not resp_body.get("result", False):
124 ret['VIMs'].append(vim)
125 return Response(data=ret, status=status.HTTP_200_OK)
129 class Forward(BaseServer):
131 def get(self, request, vimid):
133 return self.send(vimid, request.get_full_path(), request.body, "GET")
135 def post(self, request, vimid):
137 return self.send(vimid, request.get_full_path(), request.body, "POST",
140 def patch(self, request, vimid):
142 return self.send(vimid, request.get_full_path(), request.body, "PATCH",
145 def delete(self, request, vimid):
147 return self.send(vimid, request.get_full_path(), request.body,
148 "DELETE", headers=None)
150 def head(self, request, vimid):
152 return self.send(vimid, request.get_full_path(), request.body, "HEAD")
154 def put(self, request, vimid):
156 return self.send(vimid, request.get_full_path(), request.body, "PUT",
161 class MultiPartView(BaseServer):
163 parser_classes = (MultiPartParser, )
165 def post(self, request, vimid):
168 fileDict = dict(request.FILES.iterlists())
170 for key in fileDict.keys():
171 fileObj = fileDict[key][0]
172 f = tempfile.NamedTemporaryFile(prefix="django_",
173 suffix=fileObj._name,
175 f.write(fileObj.file.read())
176 f.seek(fileObj.file.tell(), 0)
178 params[key] = open(f.name, 'rb')
179 datagen, headers = multipart_encode(params)
180 resp = self.send(vimid, request.path, datagen, "POST",
181 headers=originHeaders(request))
184 fileRef = params[key]
185 if fileRef.closed is False:
187 os.remove(fileRef.name)