Merge "Fix wrong word"
[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
19 from rest_framework.views import APIView
20 from rest_framework.views import Response
21 from rest_framework.views import status
22 from multivimbroker.forwarder.base import BaseHandler
23 from multivimbroker.pub.utils.syscomm import originHeaders
24
25
26 class BaseServer(BaseHandler, APIView):
27
28     def get(self, request, vimid):
29         raise NotImplementedError()
30
31     def post(self, request, vimid):
32         raise NotImplementedError()
33
34     def put(self, request, vimid):
35         raise NotImplementedError()
36
37     def delete(self, request, vimid):
38         raise NotImplementedError()
39
40     def head(self, request, vimid):
41         raise NotImplementedError()
42
43     def patch(self, request, vimid):
44         raise NotImplementedError()
45
46
47 # proxy handler
48 class Identity(BaseServer):
49
50     def get(self, request, vimid):
51
52         return self.send(vimid, request.get_full_path(), request.body, "GET",
53                          headers=originHeaders(request))
54
55     def post(self, request, vimid):
56
57         return self.send(vimid, request.get_full_path(), request.body, "POST",
58                          headers=originHeaders(request))
59
60
61 class Registry(BaseServer):
62
63     def post(self, request, vimid):
64
65         return self.send(vimid, request.get_full_path(), request.body, "POST",
66                          headers=originHeaders(request))
67
68
69 class UnRegistry(BaseServer):
70
71     def delete(self, request, vimid):
72
73         return self.send(vimid, request.get_full_path(), request.body,
74                          "DELETE", headers=originHeaders(request))
75
76
77 class Extension(BaseServer):
78
79     def get(self, request, vimid):
80
81         return self.send(vimid, request.get_full_path(), request.body, "GET",
82                          headers=originHeaders(request))
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         ret = []
94         for k, v in plugins.items():
95             item = {}
96             item["vim_type"] = v.get("vim_type")
97             item["versions"] = [k for k in v.get('versions', {})]
98             ret.append(item)
99         return Response(data=ret, status=status.HTTP_200_OK)
100
101
102 class CheckCapacity(BaseServer):
103
104     def post(self, request):
105         try:
106             body = json.loads(request.body)
107         except ValueError as e:
108             return Response(
109                 data={'error': 'Invalidate request body %s.' % e},
110                 status=status.HTTP_400_BAD_REQUEST)
111
112         ret = {"VIMs": []}
113         newbody = {
114             "vCPU": body.get("vCPU", 0),
115             "Memory": body.get("Memory", 0),
116             "Storage": body.get("Storage", 0)
117         }
118         for vim in body.get("VIMs", []):
119             url = request.get_full_path().replace(
120                 "check_vim_capacity", "%s/capacity_check" % vim)
121             resp = self.send(vim, url, newbody, "POST")
122             if resp.status_code != status.HTTP_200_OK:
123                 continue
124             try:
125                 resp_body = json.loads(resp.body)
126             except ValueError:
127                 continue
128             if not resp_body.get("result", False):
129                 continue
130             ret['VIMs'].append(vim)
131         return Response(data=ret, status=status.HTTP_200_OK)
132
133
134 # forward  handler
135 class Forward(BaseServer):
136
137     def get(self, request, vimid):
138
139         return self.send(vimid, request.get_full_path(), request.body, "GET")
140
141     def post(self, request, vimid):
142
143         return self.send(vimid, request.get_full_path(), request.body, "POST",
144                          headers=None)
145
146     def patch(self, request, vimid):
147
148         return self.send(vimid, request.get_full_path(), request.body, "PATCH",
149                          headers=None)
150
151     def delete(self, request, vimid):
152
153         return self.send(vimid, request.get_full_path(), request.body,
154                          "DELETE", headers=None)
155
156     def head(self, request, vimid):
157
158         return self.send(vimid, request.get_full_path(), request.body, "HEAD")
159
160     def put(self, request, vimid):
161
162         return self.send(vimid, request.get_full_path(), request.body, "PUT",
163                          headers=None)