18c3bd21407adf2718d6d402ebe93c12bcf7a947
[osm/RO.git] / RO-SDN-juniper_contrail / osm_rosdn_juniper_contrail / rest_lib.py
1 # Copyright 2020 ETSI
2 #
3 # All Rights Reserved.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
15 # under the License.
16
17 from io import BytesIO
18 import pycurl
19 import json
20 import copy
21
22 class HttpException(Exception):
23 pass
24
25 class NotFound(HttpException):
26 pass
27
28 class Http(object):
29
30 def __init__(self, logger):
31 self._logger = logger
32 self._response_headers = None
33
34
35 def _check_http_response(self, http_code, data):
36 if http_code >= 300:
37 resp = ""
38 if data.getvalue():
39 data_text = data.getvalue().decode()
40 self._logger.info("Response {} DATA: {}".format(http_code, data_text))
41 resp = ": " + data_text
42 else:
43 self._logger.info("Response {}".format(http_code))
44 if http_code == 404:
45 raise NotFound("Error {}{}".format(http_code, resp))
46 raise HttpException("Error {}{}".format(http_code, resp))
47
48
49 def _get_curl_cmd(self, url, headers):
50 self._logger.debug("")
51 curl_cmd = pycurl.Curl()
52 curl_cmd.setopt(pycurl.URL, url)
53 curl_cmd.setopt(pycurl.SSL_VERIFYPEER, 0)
54 curl_cmd.setopt(pycurl.SSL_VERIFYHOST, 0)
55 if headers:
56 curl_cmd.setopt(pycurl.HTTPHEADER, headers)
57 return curl_cmd
58
59
60 def get_cmd(self, url, headers):
61 self._logger.debug("")
62 data = BytesIO()
63 curl_cmd = self._get_curl_cmd(url, headers)
64 curl_cmd.setopt(pycurl.HTTPGET, 1)
65 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
66 self._logger.info("Request METHOD: {} URL: {}".format("GET", url))
67 curl_cmd.perform()
68 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
69 self._logger.info("Response HTTPCODE: {}".format(http_code))
70 curl_cmd.close()
71 if data.getvalue():
72 data_text = data.getvalue().decode()
73 self._logger.debug("Response DATA: {}".format(data_text))
74 return http_code, data_text
75 return http_code, None
76
77
78 def delete_cmd(self, url, headers):
79 self._logger.debug("")
80 data = BytesIO()
81 curl_cmd = self._get_curl_cmd(url, headers)
82 curl_cmd.setopt(pycurl.CUSTOMREQUEST, "DELETE")
83 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
84 self._logger.info("Request METHOD: {} URL: {}".format("DELETE", url))
85 curl_cmd.perform()
86 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
87 self._logger.info("Response HTTPCODE: {}".format(http_code))
88 curl_cmd.close()
89 self._check_http_response(http_code, data)
90 # TODO 202 accepted should be returned somehow
91 if data.getvalue():
92 data_text = data.getvalue().decode()
93 self._logger.debug("Response DATA: {}".format(data_text))
94 return http_code, data_text
95 else:
96 self._logger.debug("Response DATA: NONE")
97 return http_code, None
98
99
100 def header_function(self, header_line):
101 header_line = header_line.decode('iso-8859-1')
102 if ':' not in header_line:
103 return
104 name, value = header_line.split(':', 1)
105 name = name.strip()
106 value = value.strip()
107 name = name.lower()
108 self._response_headers[name] = value
109
110
111 def post_cmd(self, url, headers, postfields_dict=None, return_header=None):
112 self._logger.debug('url: {}, headers: {}, postfields_dict: {}, return_header: {}'.format(url, headers, postfields_dict, return_header))
113 data = BytesIO()
114 curl_cmd = self._get_curl_cmd(url, headers)
115 curl_cmd.setopt(pycurl.POST, 1)
116 curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write)
117 if return_header:
118 self._response_headers = {}
119 curl_cmd.setopt(pycurl.HEADERFUNCTION, self.header_function)
120
121 jsondata = json.dumps(postfields_dict)
122 if postfields_dict.get('auth',{}).get('identity',{}).get('password',{}).get('user',{}).get('password'):
123 postfields_dict_copy = copy.deepcopy(postfields_dict)
124 postfields_dict_copy['auth']['identity']['password']['user']['password'] = '******'
125 jsondata_log = json.dumps(postfields_dict_copy)
126 else:
127 jsondata_log = jsondata
128 self._logger.debug("Request POSTFIELDS: {}".format(jsondata_log))
129 curl_cmd.setopt(pycurl.POSTFIELDS, jsondata)
130
131 self._logger.info("Request METHOD: {} URL: {}".format("POST", url))
132 curl_cmd.perform()
133 http_code = curl_cmd.getinfo(pycurl.HTTP_CODE)
134 self._logger.info("Response HTTPCODE: {}".format(http_code))
135 curl_cmd.close()
136 if return_header:
137 data_text = self._response_headers.get(return_header)
138 self._logger.debug("Response HEADER: {}".format(data_text))
139 return http_code, data_text
140 if data.getvalue():
141 data_text = data.getvalue().decode()
142 self._logger.debug("Response DATA: {}".format(data_text))
143 return http_code, data_text
144 else:
145 return http_code, None
146