Support for Multipart has been added to Broker
[multicloud/framework.git] / multivimbroker / multivimbroker / forwarder / views.py
1 # Copyright 2017 Wind River Systems, Inc.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import os
16 import json
17 from poster.encode import multipart_encode
18 from poster.streaminghttp import register_openers
19 import re
20
21 from rest_framework.views import APIView
22 from rest_framework.views import Response
23 from rest_framework.views import status
24 from multivimbroker.forwarder.base import BaseHandler
25 from rest_framework.parsers import MultiPartParser
26
27 #
28
29
30 class BaseServer(BaseHandler, APIView):
31
32     def get(self, request, vimid):
33         raise NotImplementedError()
34
35     def post(self, request, vimid):
36         raise NotImplementedError()
37
38     def put(self, request, vimid):
39         raise NotImplementedError()
40
41     def delete(self, request, vimid):
42         raise NotImplementedError()
43
44     def head(self, request, vimid):
45         raise NotImplementedError()
46
47     def patch(self, request, vimid):
48         raise NotImplementedError()
49
50
51 # proxy handler
52 class Identity(BaseServer):
53
54     def get(self, request, vimid):
55
56         return self.send(vimid, request.get_full_path(), request.body, "GET")
57
58     def post(self, request, vimid):
59
60         return self.send(vimid, request.get_full_path(), request.body, "POST")
61
62
63 class Registry(BaseServer):
64
65     def post(self, request, vimid):
66
67         return self.send(vimid, request.get_full_path(), request.body, "POST")
68
69
70 class UnRegistry(BaseServer):
71
72     def delete(self, request, vimid):
73
74         return self.send(vimid, request.get_full_path(), request.body,
75                          "DELETE")
76
77
78 class Extension(BaseServer):
79
80     def get(self, request, vimid):
81
82         return self.send(vimid, request.get_full_path(), request.body, "GET")
83
84
85 class VIMTypes(BaseServer):
86
87     def get(self, request):
88         # Fix here unless we have plugin registry
89         json_file = os.path.join(os.path.dirname(__file__),
90                                  '../pub/config/provider-plugin.json')
91         with open(json_file, "r") as f:
92             plugins = json.load(f)
93         data = {"vim_types": plugins}
94         return Response(data=data, status=status.HTTP_200_OK)
95
96
97 # forward  handler
98 class Forward(BaseServer):
99
100     def get(self, request, vimid):
101
102         return self.send(vimid, request.get_full_path(), request.body, "GET")
103
104     def post(self, request, vimid):
105
106         return self.send(vimid, request.get_full_path(), request.body, "POST",
107                          headers=None)
108
109     def patch(self, request, vimid):
110
111         return self.send(vimid, request.get_full_path(), request.body, "PATCH",
112                          headers=None)
113
114     def delete(self, request, vimid):
115
116         return self.send(vimid, request.get_full_path(), request.body,
117                          "DELETE", headers=None)
118
119     def head(self, request, vimid):
120
121         return self.send(vimid, request.get_full_path(), request.body, "HEAD")
122
123     def put(self, request, vimid):
124
125         return self.send(vimid, request.get_full_path(), request.body, "PUT",
126                          headers=None)
127
128
129 # Multipart view
130 class MultiPartView(BaseServer):
131
132     parser_classes = (MultiPartParser, )
133
134     def post(self, request, vimid):
135         register_openers()
136         datagen, headers = multipart_encode(dict(request.data.iterlists()))
137         # will convert the datagen to be accepted by httplib2 body param
138         requestData = "".join(datagen)
139         # MultiPart parser store the header keys in request.META
140         # A custom header in request body(for ex: Cloud_Type) 
141         # will be transformed to HTTP_CLOUD_TYPE
142         regex = re.compile('^HTTP_')
143         for key, value in request.META.iteritems():
144             if key.startswith("HTTP_"):
145                 headers[regex.sub('',key).replace('_','-')] = value
146         return self.send(vimid, request.path, requestData, "POST",
147                          headers=headers)