def __init__(self, ipaddr, creds, pOptions): if PY2: super(WsManProtocol, self).__init__(ipaddr, creds, pOptions) else: super().__init__(ipaddr, creds, pOptions) headers = {'Content-Type': 'application/soap+xml;charset=UTF-8'} self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers)
class RedfishProtocol(RedfishProtocolBase): def __init__(self, ipaddr, creds, pOptions): if PY2: super(RedfishProtocol, self).__init__(ipaddr, creds, pOptions) else: super().__init__(ipaddr, creds, pOptions) headers = { 'Content-Type': '"application/json;charset=UTF-8' } self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers) self.ipaddr = ipaddr self.username = creds.username self.password = creds.password def _proto_connect(self): self.proto.connect() def _proto_ship_payload(self, payload): return self.proto.ship_payload(payload) def _proto_endpoint(self): return self.proto.endpoint def _proto_reset(self): return self.proto.reset()
def __init__(self, ipaddr, creds, pOptions): if PY2: super(RestProtocol, self).__init__() else: super().__init__() headers = {'Content-Type': 'application/json'} self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers) self._logger = logging.getLogger(__name__)
def __init__(self, ipaddr, creds, pOptions): if PY2: super(RedfishProtocol, self).__init__(ipaddr, creds, pOptions) else: super().__init__(ipaddr, creds, pOptions) headers = { 'Content-Type': '"application/json;charset=UTF-8' } self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers) self.ipaddr = ipaddr self.username = creds.username self.password = creds.password
class WsManProtocol(WsManProtocolBase): def __init__(self, ipaddr, creds, pOptions): if PY2: super(WsManProtocol, self).__init__(ipaddr, creds, pOptions) else: super().__init__(ipaddr, creds, pOptions) headers = {'Content-Type': 'application/soap+xml;charset=UTF-8'} self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers) def _proto_connect(self): self.proto.connect() def _proto_ship_payload(self, payload): return self.proto.ship_payload(payload) def _proto_endpoint(self): return self.proto.endpoint def _proto_reset(self): return self.proto.reset()
class RestProtocol(ProtocolBase): def __init__(self, ipaddr, creds, pOptions): if PY2: super(RestProtocol, self).__init__() else: super().__init__() headers = {'Content-Type': 'application/json'} self.proto = HttpEndPoint(ipaddr, creds, pOptions, headers) self._logger = logging.getLogger(__name__) def identify(self): """ Identifies the target product """ wsm = RestRequest() wsm.identify() return self._communicate(wsm) def enumerate(self, clsName, resource, select={}, resetTransport=False): wsm = RestRequest() wsm.enumerate(to=self.proto.endpoint, ruri=resource, selectors=select) return self._communicate(wsm) def operation(self, wsmancmds, cmdname, *args): ruri = wsmancmds[cmdname]["ResourceURI"] act = wsmancmds[cmdname]["Action"] sset = {} tset = wsmancmds[cmdname]["SelectorSet"] for i in tset["w:Selector"]: sset[i['@Name']] = i['#text'] toargs = self._build_ops(wsmancmds, cmdname, *args) wsm = RestRequest() wsm.set_header(self.endpoint, ruri, (ruri + "/" + act)) wsm.add_selectors(sset) wsm.add_body(ruri, act, toargs['retval']) return self._communicate(wsm) def _communicate(self, wsm, name=None): try: self.proto.connect() self._logger.debug("Sending: " + wsm.get_text()) result = self.proto.ship_payload(wsm.get_text()) # Status = 202 - job created successfully # Status = 200 - job created successfully self._logger.debug("Received: " + str(result)) en = RestResponse().execute_str(result) out = self._parse_output(en, name) return out except Exception as ex: self._logger.debug(str(ex)) # fake as if the error came from the WSMAN subsystem sx = RestRequest() sx.add_error(ex) self._logger.debug(sx.get_text()) en = RestResponse().execute_str(sx.get_text()) out = self._parse_output(en) return out def printx(self, json_object): if json_object is None: logger.debug("<empty json>") return False logger.debug(json.dumps(json_object, sort_keys=True, indent=4, \ separators=(',', ': '))) # retVal['Status'] = Success, Failed, Invalid JSON, # retval['Data'][component] = {} # retval['Fault.Data']['Reason'] = Reason # retval['Fault.Data']['Text'] = Message # retval['Message'] = Message # retval['Return'] = enum(ReturnValue).value # retval['Job']['JobId'] = jobid def _parse_output(self, en, name=None): retval = {} if "Header" in en: rgsp = "http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse" if "Action" in en["Header"] and en["Header"]["Action"] == rgsp: retval['Status'] = 'Success' retval['Data'] = en['Body'] if not "Body" in en: retval['Status'] = 'Invalid JSON. Does not have Body!' elif "ClientFault" in en["Body"]: retval['Status'] = 'Found Client (SDK) Side Fault' retval['Fault.Data'] = en["Body"]["ClientFault"] if "Reason" in en["Body"]["ClientFault"] and \ "Text" in en["Body"]["ClientFault"]["Reason"]: retval['Message'] = RestResponse().get_message( en["Body"]["ClientFault"]["Reason"]) elif "Fault" in en["Body"]: retval['Status'] = 'Found Fault' retval['Fault.Data'] = en["Body"]["Fault"] if "Detail" in en["Body"]["Fault"]: retval['Message'] = RestResponse().get_message( en["Body"]["Fault"]["Reason"]) if retval['Message'] == "": retval['Message'] = RestResponse().get_message( en["Body"]["Fault"]["Detail"]) elif "EnumerateResponse" in en["Body"]: retval['Status'] = 'Success' retval['Data'] = en["Body"]["EnumerateResponse"]["Items"] elif "IdentifyResponse" in en["Body"]: retval['Status'] = 'Success' retval['Data'] = en["Body"] else: for entry in en["Body"]: if not entry.endswith("_OUTPUT"): continue retval['Data'] = en["Body"] retval['Status'] = 'Not understood the message. Sorry!' if "Message" in en["Body"][entry]: retval['Status'] = en["Body"][entry]["Message"] retval['Message'] = en["Body"][entry]["Message"] if "MessageID" in en["Body"][entry]: retval['MessageID'] = en["Body"][entry]["MessageID"] if "ReturnValue" in en["Body"][entry]: ret = int(en["Body"][entry]["ReturnValue"]) retval['Return'] = TypeHelper.get_name(ret, ReturnValueMap) retval['Status'] = retval['Return'] if ret == TypeHelper.resolve(ReturnValue.JobCreated): retval['Job'] = {"ResourceURI": "", "JobId": ""} ss = en["Body"][entry] if "Job" in ss: ss = ss["Job"] if "EndpointReference" in ss: ss = ss["EndpointReference"] if "ReferenceParameters" in ss: ss = ss["ReferenceParameters"] if "ResourceURI" in ss: retval['Job']['ResourceURI'] = ss["ResourceURI"] if "SelectorSet" in ss: ss = ss["SelectorSet"] if "Selector" in ss: ss = ss["Selector"] retval['Job']['JobId'] = ss[0] retval['Status'] = 'Success' if not 'Status' in retval: retval['Status'] = 'Dont understand the message' retval['Data'] = en["Body"] return retval