| #!/usr/bin/env python3 |
| |
| import json |
| import secrets |
| import string |
| import urllib.request |
| |
| import requests |
| from robot.api import logger |
| from robot.api.deco import keyword |
| from robot.libraries.BuiltIn import BuiltIn |
| from urllib3.exceptions import InsecureRequestWarning |
| |
| |
| class redfish_request(object): |
| @staticmethod |
| def generate_clientid(): |
| r""" |
| Generate 10 character unique id. |
| |
| e.g. "oMBhLv2Q9e" |
| |
| """ |
| |
| clientid = "".join( |
| secrets.choice(string.ascii_letters + string.digits) |
| for i in range(10) |
| ) |
| clientid = "".join(str(i) for i in clientid) |
| |
| return clientid |
| |
| @staticmethod |
| def form_url(url): |
| r""" |
| Form a complete path for user url. |
| |
| Description of argument(s): |
| url Url passed by user e.g. /redfish/v1/Systems/system. |
| """ |
| |
| openbmc_host = BuiltIn().get_variable_value( |
| "${OPENBMC_HOST}", default="" |
| ) |
| https_port = BuiltIn().get_variable_value("${HTTPS_PORT}", default="") |
| form_url = ( |
| "https://" + str(openbmc_host) + ":" + str(https_port) + str(url) |
| ) |
| |
| return form_url |
| |
| @staticmethod |
| def log_console(response): |
| r""" |
| Print function for console. |
| |
| Description of argument(s): |
| response Response from requests. |
| """ |
| |
| logger.console(msg="", newline=True) |
| logger.info( |
| "Response : [%s]" % response.status_code, also_console=True |
| ) |
| logger.console(msg="", newline=True) |
| |
| def request_login(self, headers, url, credential, timeout=10): |
| r""" |
| Redfish request to create a session. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user assign the headers, |
| then default headers is not considered. |
| url Requested path from user. |
| credential User has to assign the credential like username and |
| password. |
| UserName = xxxxxxxx Password = xxxxxxxx |
| Client id, user need to assign None in order to auto |
| generate, else user can assign any value. |
| timeout By default timeout is set to 10 seconds. |
| If user assign the timeout, then default timeout |
| value is not considered. |
| """ |
| |
| if headers == "None": |
| headers = dict() |
| headers["Content-Type"] = "application/json" |
| |
| client_id = credential["Oem"]["OpenBMC"].get("ClientID", "None") |
| |
| if "None" == client_id: |
| self.clientid = redfish_request.generate_clientid() |
| credential["Oem"]["OpenBMC"]["ClientID"] = self.clientid |
| |
| logger.console(msg="", newline=True) |
| requests.packages.urllib3.disable_warnings( |
| category=InsecureRequestWarning |
| ) |
| response = redfish_request.request_post( |
| self, headers=headers, url=url, data=credential |
| ) |
| |
| return response |
| |
| def request_get(self, headers, url, timeout=10, verify=False): |
| r""" |
| Redfish get request. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user assign the headers, then default headers is not |
| considered. |
| url Requested path from user. |
| timeout By default timeout is set to 10 seconds. |
| If user assign the timeout, then default timeout value |
| is not considered. |
| verify By default verify is set to false means no certificate |
| verification is performed |
| else in case of true, certificate needs to be verified. |
| If user assign the verify, then default verify value |
| is not considered. |
| """ |
| |
| if headers.get("Content-Type", None) is None: |
| headers["Content-Type"] = "application/json" |
| |
| url = redfish_request.form_url(url) |
| |
| logger.console(msg="", newline=True) |
| msg = ( |
| "Request Method : GET ,headers = " |
| + json.dumps(headers) |
| + " ,uri = " |
| + str(url) |
| + " ,timeout = " |
| + str(timeout) |
| + " ,verify = " |
| + str(verify) |
| ) |
| logger.info(msg, also_console=True) |
| |
| response = requests.get( |
| url, headers=headers, timeout=timeout, verify=verify |
| ) |
| redfish_request.log_console(response) |
| |
| return response |
| |
| def request_patch(self, headers, url, data=None, timeout=10, verify=False): |
| r""" |
| Redfish patch request. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user assign the headers, then default headers is not |
| considered. |
| url Requested path from user. |
| data By default data is None. |
| If user assign the data, then default data value is not |
| considered. |
| timeout By default timeout is set to 10 seconds. |
| If user assign the timeout, then default timeout value |
| is not considered. |
| verify By default verify is set to false means no certificate |
| verification is performed |
| else in case of true, certificate needs to be verified. |
| If user assign the verify, then default verify value |
| is not considered. |
| """ |
| |
| if headers.get("Content-Type", None) is None: |
| headers["Content-Type"] = "application/json" |
| |
| url = redfish_request.form_url(url) |
| |
| logger.console(msg="", newline=True) |
| msg = ( |
| "Request Method : PATCH ,headers = " |
| + json.dumps(headers) |
| + " ,uri = " |
| + str(url) |
| + " ,data = " |
| + json.dumps(data) |
| + " ,timeout = " |
| + str(timeout) |
| + " ,verify = " |
| + str(verify) |
| ) |
| logger.info(msg, also_console=True) |
| |
| response = requests.patch( |
| url, headers=headers, data=data, timeout=timeout, verify=verify |
| ) |
| redfish_request.log_console(response) |
| |
| return response |
| |
| def request_post(self, headers, url, data=None, timeout=10, verify=False): |
| r""" |
| Redfish post request. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user assign the headers, then default headers is not |
| considered. |
| url Requested path from user. |
| data By default data is None. |
| If user assign the data, then default data value is not |
| considered. |
| timeout By default timeout is set to 10 seconds. |
| If user assign the timeout, then default timeout value |
| is not considered. |
| verify By default verify is set to false means no |
| certificate verification is performed |
| else in case of true, certificate needs to be verified. |
| If user assign the verify, then default verify value |
| is not considered. |
| """ |
| |
| if headers.get("Content-Type", None) is None: |
| headers["Content-Type"] = "application/json" |
| |
| url = redfish_request.form_url(url) |
| |
| logger.console(msg="", newline=True) |
| msg = ( |
| "Request Method : POST ,headers = " |
| + json.dumps(headers) |
| + " ,uri = " |
| + str(url) |
| + " ,data = " |
| + json.dumps(data) |
| + " ,timeout = " |
| + str(timeout) |
| + " ,verify = " |
| + str(verify) |
| ) |
| logger.info(msg, also_console=True) |
| |
| response = requests.post( |
| url, |
| headers=headers, |
| data=json.dumps(data), |
| timeout=timeout, |
| verify=verify, |
| ) |
| redfish_request.log_console(response) |
| |
| return response |
| |
| def request_put( |
| self, headers, url, files=None, data=None, timeout=10, verify=False |
| ): |
| r""" |
| Redfish put request. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user assign the headers, then default headers is not |
| considered. |
| url Requested path from user. |
| files By default files is None. |
| If user assign the files, then default files value |
| is not considered. |
| data By default data is None. |
| If user pass the data, then default data value is not |
| considered. |
| timeout By default timeout is set to 10 seconds. |
| If user pass the timeout, then default timeout value |
| is not considered. |
| verify By default verify is set to false means no |
| certificate verification is performed |
| else in case of true, certificate needs to be verified. |
| If user assign the verify, then default verify value |
| is not considered. |
| """ |
| |
| if headers.get("Content-Type", None) is None: |
| headers["Content-Type"] = "application/json" |
| |
| url = redfish_request.form_url(url) |
| |
| logger.console(msg="", newline=True) |
| msg = ( |
| "Request Method : PUT ,headers = " |
| + json.dumps(headers) |
| + " ,uri = " |
| + str(url) |
| + " ,data = " |
| + json.dumps(data) |
| + " ,timeout = " |
| + str(timeout) |
| + " ,verify = " |
| + str(verify) |
| ) |
| logger.info(msg, also_console=True) |
| |
| response = requests.put( |
| url, |
| headers=headers, |
| files=files, |
| data=data, |
| timeout=timeout, |
| verify=verify, |
| ) |
| redfish_request.log_console(response) |
| |
| return response |
| |
| def request_delete( |
| self, headers, url, data=None, timeout=10, verify=False |
| ): |
| r""" |
| Redfish delete request. |
| |
| Description of argument(s): |
| headers By default headers is assigned as application/json. |
| If user pass the headers then default header is not |
| considered. |
| url Requested path from user. |
| data By default data is None. |
| If user pass the data, then default data value is not |
| considered. |
| timeout By default timeout is set to 10 seconds. |
| If user pass the timeout, then default timeout value |
| is not considered. |
| verify By default verify is set to false means no |
| certificate verification is performed |
| else in case of true, certificate needs to be verified. |
| If user assign the verify, then default verify value |
| is not considered. |
| """ |
| |
| if headers.get("Content-Type", None) is None: |
| headers["Content-Type"] = "application/json" |
| |
| url = redfish_request.form_url(url) |
| |
| logger.console(msg="", newline=True) |
| msg = ( |
| "Request Method : DELETE ,headers = " |
| + json.dumps(headers) |
| + " ,uri = " |
| + str(url) |
| + " ,data = " |
| + json.dumps(data) |
| + " ,timeout = " |
| + str(timeout) |
| + " ,verify = " |
| + str(verify) |
| ) |
| logger.console(msg="", newline=True) |
| |
| response = requests.delete( |
| url, headers=headers, data=data, timeout=timeout, verify=verify |
| ) |
| redfish_request.log_console(response) |
| |
| return response |
| |
| @staticmethod |
| def dict_parse(variable, lookup_dict): |
| r""" |
| Find a variable in dict. |
| |
| Description of argument(s): |
| variable Variable that need to be searched in dict. |
| lookup_dict Disctionay contains variables. |
| """ |
| |
| result = lookup_dict.get(variable, None) |
| return result |
| |
| @staticmethod |
| def get_target_actions(target_attribute, response): |
| r""" |
| Get target entry of the searched target attribute. |
| |
| Description of argument(s): |
| target_attribute Name of the attribute (e.g. 'Manager.Reset'). |
| response Response from url. |
| |
| 'Actions' : { |
| '#Manager.Reset' : { |
| '@Redfish.ActionInfo' : '/redfish/v1/Managers/${MANAGER_ID}/ResetActionInfo', |
| 'target' : '/redfish/v1/Managers/${MANAGER_ID}/Actions/Manager.Reset' |
| } |
| } |
| """ |
| |
| lookup_list = ["Actions", "#" + attribute, "target"] |
| for lookup_item in lookup_list: |
| response = redfish_request.dict_parse(lookup_item, response) |
| if response is not None and type(response) is dict(): |
| continue |
| else: |
| return response |
| return None |
| |
| @staticmethod |
| def get_attribute(attribute, data): |
| r""" |
| Get resource attribute. |
| |
| Description of argument(s): |
| attribute Pass the attribute needs to be searched. |
| data Pass the request response. |
| """ |
| |
| value = data.get(attribute, None) |
| return value |