1 # -------------------------------------------------------------------------
2 # Copyright (c) 2015-2017 AT&T Intellectual Property
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
16 # -------------------------------------------------------------------------
23 from osdf.config.base import creds_prefixes
24 from osdf.config.base import osdf_config
25 from osdf.logging.osdf_logging import debug_log
26 from osdf.logging.osdf_logging import MH
29 def get_rest_client(request_json, service):
30 """Get a RestClient based on request_json's callback URL and osdf_config's credentials based on service name
33 :param service: so or cm
34 :return: rc -- RestClient
36 callback_url = request_json["requestInfo"]["callbackUrl"]
37 prefix = creds_prefixes[service]
38 config = osdf_config.deployment
39 c_userid, c_passwd = config[prefix + "Username"], config[prefix + "Password"]
40 return RestClient(url=callback_url, userid=c_userid, passwd=c_passwd)
43 def json_from_file(file_name):
44 """Read a policy from a file"""
45 with open(file_name) as fid:
49 def yaml_from_file(file_name):
50 """Read a policy from a file"""
51 with open(file_name) as fid:
55 class RestClient(object):
56 """Simple REST Client that supports get/post and basic auth"""
58 def __init__(self, userid=None, passwd=None, log_func=None, url=None, timeout=None, headers=None,
59 method="POST", req_id=None, verify=None):
60 self.auth = (userid, passwd) if userid and passwd else None
61 self.headers = headers if headers else {}
64 self.log_func = log_func
65 self.timeout = (30, 90) if timeout is None else timeout
69 def add_headers(self, headers):
70 self.headers.update(headers)
72 def request(self, url=None, method=None, asjson=True, ok_codes=(2, ),
73 raw_response=False, noresponse=False, timeout=None, **kwargs):
74 """Sends http request to the specified url
76 :param url: REST end point to query
77 :param method: GET or POST (default is None => self.method)
78 :param asjson: whether the expected response is in json format
79 :param ok_codes: expected codes (prefix matching -- e.g. can be (20, 21, 32) or (2, 3))
80 :param noresponse: If no response is expected (as long as response codes are OK)
81 :param raw_response: If we need just the raw response (e.g. conductor sends transaction IDs in headers)
82 :param timeout: Connection and read timeouts
83 :param kwargs: Other parameters
87 debug_log.debug("Requesting URL: {}".format(url or self.url))
89 debug_log.debug("Requesting URL: {} for request ID: {}".format(url or self.url, self.req_id))
93 if not self.verify and url.startswith("https"):
94 verify = osdf_config.deployment["aaf_ca_certs"]
98 res = requests.request(url=url or self.url, method=method or self.method,
99 auth=self.auth, headers=self.headers,
100 timeout=timeout or self.timeout, verify=verify, **kwargs)
103 self.log_func(MH.received_http_response(res))
105 res_code = str(res.status_code)
106 if not any(res_code.startswith(x) for x in map(str, ok_codes)):
107 raise BaseException(res.raise_for_status())