a5dd22c8af6fa796903dc3aeacb0426e376e5bb1
[multicloud/framework.git] / multivimbroker / multivimbroker / forwarder / views.py
1 # Copyright 2017 Wind River Systems, Inc.
2 # Copyright (c) 2017-2018 VMware, Inc.
3 #
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
7 #
8 #         http://www.apache.org/licenses/LICENSE-2.0
9 #
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.
15
16 import os
17 import json
18 import tempfile
19 from poster.encode import multipart_encode
20 from poster.streaminghttp import register_openers
21
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
29
30
31 class BaseServer(BaseHandler, APIView):
32
33     def get(self, request, vimid):
34         raise NotImplementedError()
35
36     def post(self, request, vimid):
37         raise NotImplementedError()
38
39     def put(self, request, vimid):
40         raise NotImplementedError()
41
42     def delete(self, request, vimid):
43         raise NotImplementedError()
44
45     def head(self, request, vimid):
46         raise NotImplementedError()
47
48     def patch(self, request, vimid):
49         raise NotImplementedError()
50
51
52 # proxy handler
53 class Identity(BaseServer):
54
55     def get(self, request, vimid):
56
57         return self.send(vimid, request.get_full_path(), request.body, "GET",
58                          headers=originHeaders(request))
59
60     def post(self, request, vimid):
61
62         return self.send(vimid, request.get_full_path(), request.body, "POST",
63                          headers=originHeaders(request))
64
65
66 class Registry(BaseServer):
67
68     def post(self, request, vimid):
69
70         return self.send(vimid, request.get_full_path(), request.body, "POST",
71                          headers=originHeaders(request))
72
73
74 class UnRegistry(BaseServer):
75
76     def delete(self, request, vimid):
77
78         return self.send(vimid, request.get_full_path(), request.body,
79                          "DELETE", headers=originHeaders(request))
80
81
82 class Extension(BaseServer):
83
84     def get(self, request, vimid):
85
86         return self.send(vimid, request.get_full_path(), request.body, "GET",
87                          headers=originHeaders(request))
88
89
90 class VIMTypes(BaseServer):
91
92     def get(self, request):
93         return Response(data=syscomm.getVIMTypes(), status=status.HTTP_200_OK)
94
95
96 class CheckCapacity(BaseServer):
97
98     def post(self, request):
99         try:
100             body = json.loads(request.body)
101         except ValueError as e:
102             return Response(
103                 data={'error': 'Invalidate request body %s.' % e},
104                 status=status.HTTP_400_BAD_REQUEST)
105
106         ret = {"VIMs": []}
107         newbody = {
108             "vCPU": body.get("vCPU", 0),
109             "Memory": body.get("Memory", 0),
110             "Storage": body.get("Storage", 0)
111         }
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:
117                 continue
118             try:
119                 resp_body = json.loads(resp.body)
120             except ValueError:
121                 continue
122             if not resp_body.get("result", False):
123                 continue
124             ret['VIMs'].append(vim)
125         return Response(data=ret, status=status.HTTP_200_OK)
126
127
128 # forward  handler
129 class Forward(BaseServer):
130
131     def get(self, request, vimid):
132
133         return self.send(vimid, request.get_full_path(), request.body, "GET")
134
135     def post(self, request, vimid):
136
137         return self.send(vimid, request.get_full_path(), request.body, "POST",
138                          headers=None)
139
140     def patch(self, request, vimid):
141
142         return self.send(vimid, request.get_full_path(), request.body, "PATCH",
143                          headers=None)
144
145     def delete(self, request, vimid):
146
147         return self.send(vimid, request.get_full_path(), request.body,
148                          "DELETE", headers=None)
149
150     def head(self, request, vimid):
151
152         return self.send(vimid, request.get_full_path(), request.body, "HEAD")
153
154     def put(self, request, vimid):
155
156         return self.send(vimid, request.get_full_path(), request.body, "PUT",
157                          headers=None)
158
159
160 # Multipart view
161 class MultiPartView(BaseServer):
162
163     parser_classes = (MultiPartParser, )
164
165     def post(self, request, vimid):
166         try:
167             register_openers()
168             fileDict = dict(request.FILES.iterlists())
169             params = {}
170             for key in fileDict.keys():
171                 fileObj = fileDict[key][0]
172                 f = tempfile.NamedTemporaryFile(prefix="django_",
173                                                 suffix=fileObj._name,
174                                                 delete=False)
175                 f.write(fileObj.file.read())
176                 f.seek(fileObj.file.tell(), 0)
177                 fileObj.file.close()
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))
182         finally:
183             for key in params:
184                 fileRef = params[key]
185                 if fileRef.closed is False:
186                     fileRef.close()
187                 os.remove(fileRef.name)
188         return resp