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