|  | #!/usr/bin/env python | 
|  |  | 
|  | r""" | 
|  | See redfish_plus class prolog below for details. | 
|  | """ | 
|  |  | 
|  | from redfish.rest.v1 import HttpClient | 
|  | import gen_print as gp | 
|  |  | 
|  |  | 
|  | def valid_http_status_code(status, valid_status_codes): | 
|  | r""" | 
|  | Raise exception if status is not found in the valid_status_codes list. | 
|  |  | 
|  | Description of argument(s): | 
|  | status                          An HTTP status code (e.g. 200, 400, etc.). | 
|  | valid_status_codes              A list of status codes that the caller | 
|  | considers acceptable.  If this is a null | 
|  | list, then any status code is considered | 
|  | acceptable.  Note that for the convenience | 
|  | of the caller, valid_status_codes may be | 
|  | either a python list or a string which can | 
|  | be evaluated to become a python list (e.g. | 
|  | "[200]"). | 
|  | """ | 
|  |  | 
|  | if type(valid_status_codes) is not list: | 
|  | valid_status_codes = eval(valid_status_codes) | 
|  | if len(valid_status_codes) == 0: | 
|  | return | 
|  | if status in valid_status_codes: | 
|  | return | 
|  |  | 
|  | message = "The HTTP status code was not valid:\n" | 
|  | message += gp.sprint_vars(status, valid_status_codes) | 
|  | raise ValueError(message) | 
|  |  | 
|  |  | 
|  | class redfish_plus(HttpClient): | 
|  | r""" | 
|  | redfish_plus is a wrapper for redfish rest that provides the following | 
|  | benefits vs. using redfish directly: | 
|  |  | 
|  | For rest_request functions (e.g. get, put, post, etc.): | 
|  | - Function-call logging to stdout. | 
|  | - Automatic valid_status_codes processing (i.e. an exception will be | 
|  | raised if the rest response status code is not as expected. | 
|  | - Easily used from robot programs. | 
|  | """ | 
|  |  | 
|  | ROBOT_LIBRARY_SCOPE = 'TEST SUITE' | 
|  |  | 
|  | def rest_request(self, func, *args, **kwargs): | 
|  | r""" | 
|  | Perform redfish rest request and return response. | 
|  |  | 
|  | This function provides the following additional functionality. | 
|  | - The calling function's call line is logged to standard out (provided | 
|  | that global variable "quiet" is not set). | 
|  | - The caller may include a valid_status_codes argument. | 
|  |  | 
|  | Description of argument(s): | 
|  | func                        A reference to the parent class function | 
|  | which is to be called (e.g. get, put, | 
|  | etc.). | 
|  | args                        This is passed directly to the function | 
|  | referenced by the func argument (see the | 
|  | documentation for the corresponding | 
|  | redfish HttpClient method for details). | 
|  | kwargs                      This is passed directly to the function | 
|  | referenced by the func argument (see the | 
|  | documentation for the corresponding | 
|  | redfish HttpClient method for details) | 
|  | with the following exception:  If kwargs | 
|  | contains a valid_status_codes key, it will | 
|  | be removed from kwargs and processed by | 
|  | this function.  This allows the caller to | 
|  | indicate what rest status codes are | 
|  | acceptable.  The default value is [200]. | 
|  | See the valid_http_status_code function | 
|  | above for details. | 
|  |  | 
|  | Example uses: | 
|  |  | 
|  | From a python program: | 
|  |  | 
|  | response = | 
|  | bmc_redfish.get("/redfish/v1/Managers/bmc/EthernetInterfaces", [200, | 
|  | 201]) | 
|  |  | 
|  | If this call to the get method generates a response.status equal to | 
|  | anything other than 200 or 201, an exception will be raised. | 
|  |  | 
|  | From a robot program: | 
|  |  | 
|  | BMC_Redfish.logout | 
|  | ${response}=  BMC_Redfish.Get | 
|  | /redfish/v1/Managers/bmc/EthernetInterfaces  valid_status_codes=[401] | 
|  |  | 
|  | As part of a robot test, the programmer has logged out to verify that | 
|  | the get request will generate a status code of 401 (i.e. | 
|  | "Unauthorized"). | 
|  | """ | 
|  | gp.qprint_executing(stack_frame_ix=3, style=gp.func_line_style_short) | 
|  | valid_status_codes = kwargs.pop('valid_status_codes', [200]) | 
|  | response = func(*args, **kwargs) | 
|  | valid_http_status_code(response.status, valid_status_codes) | 
|  | return response | 
|  |  | 
|  | # Define rest function wrappers. | 
|  | def get(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).get, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def head(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).head, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def post(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).post, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def put(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).put, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def patch(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).patch, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def delete(self, *args, **kwargs): | 
|  | return self.rest_request(super(redfish_plus, self).delete, *args, | 
|  | **kwargs) | 
|  |  | 
|  | def __del__(self): | 
|  | del self |