Exemplo n.º 1
0
 def get_name(self):
     return TypeHelper.resolve(self.enumid)
Exemplo n.º 2
0
 def __repr__(self):
     return (TypeHelper.resolve(str(self.enid)) + "(port=" +
             str(self.port) + ")" + "(timeout=" + str(self.timeout) +
             ")" / + "(nretries =" + str(self.nretries) + ")")
Exemplo n.º 3
0
    def _enumerate_view(self, index, views, bTrue):
        if not index in views:
            logger.debug("WARN: no " + str(index) + " for " + str(self.enumid))
            return {'Status': 'Success', 'Message': 'Not supported'}
        clsName = TypeHelper.resolve(index)
        logger.debug("Collecting " + clsName + " ... via " + str(self.enumid) +
                     "...")
        if Simulator.is_simulating():
            retval = Simulator.simulate_proto(self.ipaddr, self.enumid,
                                              clsName)
        else:
            # Changed True to False for having single session
            wsprof = views[index]
            filter = None
            if isinstance(views[index],
                          list) and self.enumid == ProtocolEnum.WSMAN:
                wsprof = views[index][0]
                filter = views[index][1]
            retval = self.proto.enumerate(clsName, wsprof, self.selectors,
                                          False, filter)
            if Simulator.is_recording():
                Simulator.record_proto(self.ipaddr, self.enumid, clsName,
                                       retval)
        if not 'Data' in retval or retval['Data'] is None:
            return retval
        if index in self.classifier_cond:
            chk_func = self.classifier_cond[index].get(self.enumid, None)
            if chk_func:
                (valid, flist) = chk_func(retval['Data'][clsName], clsName)
                if valid:
                    retval['Data'][clsName] = flist
                else:
                    return {
                        'Status': 'Failed',
                        'Message': 'Classifier condition not satisfied'
                    }
        if index in self.classifier:
            for attr in self.classifier[index]:
                if not clsName in retval['Data']:
                    return {
                        'Status': 'Failed',
                        'Message': clsName + ' instance is not found!'
                    }
                if not attr in retval['Data'][clsName]:
                    return {
                        'Status': 'Failed',
                        'Message': 'Classifier attribute not found!'
                    }
                if not re.search(self.classifier[index][attr],
                                 retval['Data'][clsName][attr]):
                    return {
                        'Status': 'Failed',
                        'Message': 'Classifier did not match!'
                    }

        for en in self.view_fieldspec:
            if en != index:
                continue
            for retobj in retval['Data']:
                if isinstance(retval['Data'][retobj], dict):
                    self._apply_spec(retval['Data'][retobj], en)
                else:
                    for i in retval['Data'][retobj]:
                        self._apply_spec(i, en)
        return retval
Exemplo n.º 4
0
    def get_job_status(self, jobid):
        """
            Get the job status

            :param jobid: Job ID
            :type jobid: str
            :return: success/failure response
            :rtype: JSON


            .. code-block:: python
                :caption: Examples
                :name: Examples

            # Get Job Status
            job_status = idrac.job_mgr.get_job_status(jobid="jid_1234")
        """
        if self.entity.use_redfish:
            return self.get_job_status_redfish(jobid)
        jobs = {}
        jobret = {"Status": TypeHelper.resolve(JobStatusEnum.InProgress)}
        if jobid.startswith('DCIM_OSD'):
            # Poll for OSD Concrete Job
            jobs = self._get_osd_job_details()
        else:
            jobs = self.get_job_details(jobid)
        logger.debug(self.entity.ipaddr+": job: "+str(jobs))
        if "Status" in jobs and jobs['Status'] != "Success":
            logger.error(self.entity.ipaddr+" : get_job_status failed: jobid: " + jobid + " : Status " + jobs['Status'])
            logger.error(self.entity.ipaddr+" : get_job_status failed: jobid: " + jobid + " : Message " + jobs['Message'])
            return jobs

        jb = jobs['Data']['Jobs']
        if jb['InstanceID'] != jobid:
            logger.error(self.entity.ipaddr + " : get_job_status failed: jobid: " + jobid + " : ERROR: Job instance not found")
            return jobs
        if 'JobStatus' in jb:
            jobstatus = jb['JobStatus']
            if jobstatus == 'Completed':
                jobstaten = JobStatusEnum.Success
            elif jobstatus == 'Failed':
                jobstaten = JobStatusEnum.Failed
            elif jobstatus == 'Pending':
                jobstaten = JobStatusEnum.InProgress
            elif jobstatus.endswith('In Progress'):
                jobstaten = JobStatusEnum.InProgress
            elif jobstatus.endswith('Scheduled'):
                jobstaten = JobStatusEnum.InProgress
            elif jobstatus.endswith('Running'):
                jobstaten = JobStatusEnum.InProgress
            elif jobstatus.endswith('Invalid'):
                jobstaten = JobStatusEnum.InProgress
            elif jobstatus.endswith('Success'):
                jobstaten = JobStatusEnum.Success
            elif jobstatus.endswith('Errors'):
                jobstaten = JobStatusEnum.Failed
            elif 'Message' in jb and jb['Message'] and 'completed' in jb['Message'] and 'errors' not in jb['Message']:
                jobstaten = JobStatusEnum.Success
            else:
                jobstaten = JobStatusEnum.InProgress
            jb['Status'] = TypeHelper.resolve(jobstaten)
        return jb
Exemplo n.º 5
0
 def unset(self, scopeType):
     n = TypeHelper.resolve(scopeType)
     self.mix = (~(self.mix & n) & self.mix)
Exemplo n.º 6
0
 def print_components(self):
     for comp in self.ComponentEnum:
         print(TypeHelper.resolve(comp))
Exemplo n.º 7
0
 def __repr__(self):
     return TypeHelper.resolve(self._value)
Exemplo n.º 8
0
 def __repr__(self):
     return TypeHelper.resolve(self.enid)
Exemplo n.º 9
0
 def __repr__(self):
     return (TypeHelper.resolve(self.enid) + "(community=" + self.community + ")")
Exemplo n.º 10
0
def _create_virtual_drive(idrac, module):
    """
    Create a virtual drive

    Keyword arguments:
    idrac  -- iDRAC handle
    module -- Ansible module
    """

    msg = {}

    span_length = module.params.get('span_length')
    span_depth = module.params.get('span_depth')
    pd_slots = module.params.get('pd_slots')
    raid_level = TypeHelper.convert_to_enum(module.params['raid_level'],
                                            RAIDTypesTypes)
    read_policy = TypeHelper.convert_to_enum(module.params['read_policy'],
                                             RAIDdefaultReadPolicyTypes)
    write_policy = TypeHelper.convert_to_enum(module.params['write_policy'],
                                              RAIDdefaultWritePolicyTypes)
    disk_policy = TypeHelper.convert_to_enum(module.params['disk_policy'],
                                             DiskCachePolicyTypes)

    # Physical Disk filter
    pd_filter = '((disk.parent.parent is Controller and disk.parent.parent.FQDD._value == "{0}")'.format(
        module.params['controller_fqdd'])
    pd_filter += ' or (disk.parent is Controller and disk.parent.FQDD._value == "{0}"))'.format(
        module.params['controller_fqdd'])
    pd_filter += ' and disk.MediaType == "{0}"'.format(
        module.params['media_type'])
    pd_filter += ' and disk.BusProtocol == "{0}"'.format(
        module.params['bus_protocol'])

    # Either one of Span Length and Physical Disks Slots must be defined
    if not (span_length or pd_slots):
        module.fail_json(
            msg="Either span_length or pd_slots must be defined for VD creation"
        )
    elif pd_slots:
        slots = ""
        for i in pd_slots:
            slots += "\"" + str(i) + "\","
        slots_list = "[" + slots[0:-1] + "]"
        pd_filter += " and disk.Slot._value in " + slots_list
        span_length = len(pd_slots)

    # check span_length
    if span_length < MIN_SPAN_LENGTH[TypeHelper.resolve(raid_level)]:
        module.fail_json(msg="Invalid span length for RAID Level: " +
                         TypeHelper.resolve(raid_level))

    # Span depth must be at least 1 which is used for RAID 0, 1, 5 and 6
    span_depth = 1 if (span_depth < 1) else span_depth

    # Span depth must be at least 2 for RAID levels 10, 50 and 60
    if raid_level in [
            RAIDTypesTypes.RAID_10, RAIDTypesTypes.RAID_50,
            RAIDTypesTypes.RAID_60
    ]:
        span_depth = 2 if (span_depth < 2) else span_depth

    msg = idrac.config_mgr.RaidHelper.new_virtual_disk(
        Name=module.params['vd_name'],
        Size=module.params['vd_size'],
        RAIDaction=RAIDactionTypes.Create,
        RAIDTypes=raid_level,
        RAIDdefaultReadPolicy=read_policy,
        RAIDdefaultWritePolicy=write_policy,
        DiskCachePolicy=disk_policy,
        SpanLength=span_length,
        SpanDepth=span_depth,
        StripeSize=module.params['stripe_size'],
        NumberDedicatedHotSpare=module.params['dedicated_hot_spare'],
        NumberGlobalHotSpare=module.params['global_hot_spare'],
        PhysicalDiskFilter=pd_filter)

    return msg
Exemplo n.º 11
0
 def json_encode(self):
     retval = {}
     for i in self.creds:
         retval[TypeHelper.resolve(i)] = str(self.creds[i])
     return retval
Exemplo n.º 12
0
    def _build_tree(self,
                    mTree,
                    device_json,
                    ctree,
                    parent=None,
                    parentClsName=None):

        comp_tree = {}
        if not ctree in mTree:
            return comp_tree
        for entry in mTree[ctree]:
            if isinstance(entry, str):
                comp_tree[entry] = self._build_tree(mTree, device_json, entry)
                continue

            # Enum
            enname = TypeHelper.resolve(entry)
            if not enname in device_json:
                logger.debug("Component " + enname +
                             " is not present in device!")
                continue

            if isinstance(device_json[enname], dict):
                if len(device_json[enname]) <= 0:
                    # Empty entry
                    continue
                child_index = self._get_obj_index(enname, device_json[enname])

                if parent == None or self._isin(parentClsName, parent, enname,
                                                device_json[enname]):
                    if not entry in mTree:
                        # entry is a leaf node
                        comp_tree[enname] = child_index
                    else:
                        # entry is not a leaf node
                        comp_tree[enname] = {
                            child_index:
                            self._build_tree(mTree, device_json, entry,
                                             device_json[enname], enname)
                        }

            elif isinstance(device_json[enname], list):
                if len(device_json[enname]) <= 0:
                    # Empty entry
                    continue

                dict_list = {}
                list_list = []
                for tt in device_json[enname]:
                    child_index = self._get_obj_index(enname, tt)
                    if parent == None or self._isin(parentClsName, parent,
                                                    enname, tt):
                        if not entry in mTree:
                            # entry is a leaf node
                            list_list.append(child_index)
                        else:
                            # entry is not a leaf node
                            dict_list[child_index] = self._build_tree(
                                mTree, device_json, entry, tt, enname)
                if len(dict_list) != 0 and len(list_list) == 0:
                    comp_tree[enname] = dict_list
                elif len(dict_list) == 0 and len(list_list) != 0:
                    comp_tree[enname] = list_list
                elif len(dict_list) != 0 and len(list_list) != 0:
                    comp_tree[enname] = dict_list
                    comp_tree[enname]["_unknown_"] = list_list
            else:
                logger.debug("Unexpected format!")
        return comp_tree
Exemplo n.º 13
0
    def _get_xml_string(self, everything=True, space='', deleted=False):
        s = UnicodeStringWriter()
        if not self._fname:
            # group object!!
            for i in self.Properties:
                if not self.__dict__[i].is_changed() and not everything:
                    continue
                attr_name = i
                if attr_name in self._ign_fields:
                    continue
                if '_' in attr_name:
                    attr_name = re.sub('_.*', '', attr_name)
                    attr_name = "{0}.{1}#{2}".format(self._alias,
                                                     self._index, attr_name)
                else:
                    attr_name = "{0}".format(attr_name)
                if isinstance(self.__dict__[i], FieldType):
                    if self.__dict__[i]._composite:
                        continue
                    if not self.__dict__[i]._modifyAllowed and deleted:
                        continue
                    value = TypeHelper.resolve(self.__dict__[i]._value)
                    if deleted: value = self.__dict__[i]._default_on_delete
                    s._write_output('  <Attribute Name="{0}">{1}</Attribute>\n'.format(
                        attr_name, value))
                else:
                    s._write_output(self.__dict__[i]._get_xml_string(everything, space + '  ', deleted))
            return s.getvalue()

        s._write_output(space + '<{0}'.format(self._fname))
        for i in self._attribs:
            if i not in self._ign_attribs:
                s._write_output(' {0}="{1}"'.format(i, self._attribs[i]))
        s._write_output('>\n')

        orig_len = len(s.getvalue())
        for i in self.Properties:
            if not self.__dict__[i].is_changed() and not everything:
                continue
            attr_name = i
            if attr_name in self._ign_fields:
                continue
            if isinstance(self.__dict__[i], FieldType):
                if not self.__dict__[i]._composite:
                    if not self.__dict__[i]._modifyAllowed and deleted:
                        continue
                    value = TypeHelper.resolve(self.__dict__[i]._value)
                    if deleted: value = self.__dict__[i]._default_on_delete
                    values = [value]
                    if self.__dict__[i]._list:
                        values = value.split(',')
                    for val in values:
                        s._write_output(space +
                                        '  <Attribute Name="{0}">{1}</Attribute>\n'.format(
                                            attr_name, val))
            else:
                s._write_output(self.__dict__[i]._get_xml_string(everything, space + '  ', deleted))
        new_len = len(s.getvalue())
        if new_len == orig_len:
            return ""

        s._write_output(space + '</{0}>\n'.format(self._fname))
        return s.getvalue()
Exemplo n.º 14
0
class SDKServer:
    # SDK Server instance and services data (Singleton)
    __sdk_server_instance = None
    __http_protocol = TypeHelper.resolve(SDKServerProtocolEnum.HTTP)
    __https_protocol = TypeHelper.resolve(SDKServerProtocolEnum.HTTPS)

    __server = {
        "http": {
            "server_instance": None,
            "server_config": {
                "port": None,
                "directory": None,
                "state": SDKServerStateEnum.Stopped,
                "handler": SDKHTTPServerRequestHandler,
            }
        },
        "https": {
            "server_instance": None,
            "server_config": {
                "port": None,
                "directory": None,
                "state": SDKServerStateEnum.Stopped,
                "handler": SDKHTTPSServerRequestHandler,
                "server_certificate": None,
                "private_key": None,
                "ca_chain_certificate": None
            }
        }
    }

    @staticmethod
    def __load_config(path):
        file_type = path.split(os.sep)[-1].split(".")[-1].lower()
        try:
            with open(path, 'rt') as f:
                if file_type == "json":
                    config = json.load(f)
                elif file_type == "yaml" or file_type == "yml":
                    config = yaml.safe_load(f.read())
            return config

        except IOError as e:
            logger.error("I/O error({0}): {1}".format(e.errno, e.strerror))

        return None

    @staticmethod
    def load_server_configuration(configuration_file=os.path.join(os.path.dirname(__file__), "config",
                                                                  "sdk-server-config.json")):
        configuration = SDKServer.__load_config(configuration_file)

        if configuration is None:
            logger.error("No configuration available...")
        else:
            # Load HTTP Server configuration
            http_port = configuration[SDKServer.__http_protocol]["port"]
            http_directory = configuration[SDKServer.__http_protocol]["directory"]

            sdk_http_server = SDKServer.__server[SDKServer.__http_protocol]

            sdk_http_server["server_config"]["port"] = choice(http_port) if type(
                http_port) == range else http_port
            sdk_http_server["server_config"]["directory"] = http_directory

            # Load HTTPS Server configuration
            https_port = configuration[SDKServer.__https_protocol]["port"]
            https_directory = configuration[SDKServer.__https_protocol]["directory"]

            https_server_certificate = configuration[SDKServer.__https_protocol]["certificate"]
            https_private_key = configuration[SDKServer.__https_protocol]["private_key"]
            https_ca_chain_certificate = configuration[SDKServer.__https_protocol]["ca_chain_certificate"]
            sdk_https_server = SDKServer.__server[SDKServer.__https_protocol]

            sdk_https_server["server_config"]["port"] = choice(https_port) if type(
                https_port) == range else https_port
            sdk_https_server["server_config"]["directory"] = https_directory
            sdk_https_server["server_config"]["server_certificate"] = https_server_certificate
            sdk_https_server["server_config"]["private_key"] = https_private_key
            sdk_https_server["server_config"]["ca_chain_certificate"] = https_ca_chain_certificate

    @staticmethod
    def get_server_instance():
        if SDKServer.__sdk_server_instance is None:
            SDKServer()

        sdk_http_server = SDKServer.__server[SDKServer.__http_protocol]

        print(sdk_http_server["server_config"]["directory"])
        if sdk_http_server["server_instance"] is None:
            sdk_http_server["server_instance"] = SDKHTTPServer(
                sdk_http_server["server_config"]["directory"],
                ("", sdk_http_server["server_config"]["port"]),
                sdk_http_server["server_config"]["handler"])

        sdk_https_server = SDKServer.__server[SDKServer.__https_protocol]

        if sdk_https_server["server_instance"] is None:
            sdk_https_server["server_instance"] = SDKHTTPServer(
                sdk_https_server["server_config"]["directory"],
                ("", sdk_https_server["server_config"]["port"]),
                sdk_https_server["server_config"]["handler"])

            context = ssl.SSLContext(ssl.PROTOCOL_TLS)
            context.verify_mode = ssl.CERT_NONE
            context.check_hostname = False

            context.load_cert_chain(certfile=sdk_https_server["server_config"]["server_certificate"],
                                    keyfile=sdk_https_server["server_config"]["private_key"],
                                    password="******")

            if sdk_https_server["server_config"]["ca_chain_certificate"] is not None:
                context.load_verify_locations(cafile=sdk_https_server["server_config"]["ca_chain_certificate"])

            sdk_https_server["server_instance"].socket = context.wrap_socket(
                sdk_https_server["server_instance"].socket, server_side=True)

        return SDKServer.__sdk_server_instance

    def __init__(self):
        if SDKServer.__sdk_server_instance is not None:
            logger.warning("SDK Server already instantiated..")

        SDKServer.__sdk_server_instance = self

    def start_server(self, protocol=SDKServerProtocolEnum.HTTP):
        server_protocol = TypeHelper.resolve(protocol)
        sdk_server = SDKServer.__server[server_protocol]

        if sdk_server["server_instance"] is None:
            logger.error("{} Server is not instantiated...".format(server_protocol))

        elif sdk_server["server_config"]["state"] == SDKServerStateEnum.Running:
            logger.warning("{} Server is already running...".format(server_protocol))

        else:
            server_address = sdk_server["server_instance"].socket.getsockname()
            sdk_server["server_config"]["state"] = SDKServerStateEnum.Running
            logger.debug("Starting {} server on {} at port {} ...".format(server_protocol, server_address[0],
                                                                          server_address[1]))
            sdk_server["server_instance"].serve_forever()

    def stop_server(self, protocol=SDKServerProtocolEnum.HTTP):
        server_protocol = TypeHelper.resolve(protocol)
        sdk_server = SDKServer.__server[server_protocol]

        if sdk_server["server_instance"] is None:
            logger.error("{} Server is not instantiated...".format(server_protocol))

        elif sdk_server["server_config"]["state"] == SDKServerStateEnum.Stopped:
            logger.warning("{} Server is already stopped...".format(server_protocol))

        else:
            server_address = sdk_server["server_instance"].socket.getsockname()

            logger.debug(
                "Stopping {} server on {} at port {} ...".format(server_protocol, server_address[0], server_address[1]))
            sdk_server["server_instance"].shutdown()
            sdk_server["server_config"]["state"] = SDKServerStateEnum.Stopped

    def get_server_status(self, protocol=SDKServerProtocolEnum.HTTP):
        server_details = SDKServer.__server[TypeHelper.resolve(protocol)]

        return {
            "IPAddress": socket.gethostbyname(socket.gethostname()),
            "Port": server_details["server_config"]["port"],
            "State": server_details["server_config"]["state"]
        }
Exemplo n.º 15
0
 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']
         rfault = "http://schemas.xmlsoap.org/ws/2004/08/addressing/fault"
         if "Action" in en["Header"] and en["Header"]["Action"] == rfault:
             retval['Status'] = 'Failed'
     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'] = WsManResponse().get_message(
                 en["Body"]["ClientFault"]["Reason"])
     elif "Fault" in en["Body"]:
         retval['Status'] = 'Found Fault'
         retval['Fault.Data'] = en["Body"]["Fault"]
         if "Reason" in en["Body"]["Fault"]:
             retval['Message'] = WsManResponse().get_message(
                 en["Body"]["Fault"]["Reason"])
         if retval['Message'] == "" and "Detail" in en["Body"]["Fault"]:
             retval['Message'] = WsManResponse().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 'RebootJobID' in ss:
                         ss = ss['RebootJobID']
                     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"]
                     if len(ss) >= 1:
                         retval['Job']['JobId'] = ss[0]
                         retval['Job']['JobIdRest'] = [
                             ss[i] for i in range(1, len(ss))
                         ]
                     else:
                         retval['Job']['JobId'] = 'Unknown'
                         retval['Job']['JobIdRest'] = ss
                     retval['Status'] = 'Success'
     if not 'Status' in retval:
         retval['Status'] = 'Dont understand the message'
         retval['Data'] = en["Body"]
     return retval
Exemplo n.º 16
0
 def __repr__(self):
     return (TypeHelper.resolve(self.enid) + "(username="******")")
Exemplo n.º 17
0
 def sanitized_value(self):
     if '_value' not in self.__dict__ or self._value is None:
         return None
     return TypeHelper.resolve(self._value)
Exemplo n.º 18
0
 def add(self, scopeType):
     if self.check(scopeType):
         self.mix = self.mix | TypeHelper.resolve(scopeType)
     else:
         raise AttributeError("Filter can only take Flag in argument")
Exemplo n.º 19
0
 def _should_i_include(self, component, entry):
     if component == 'System':
         if self.cfactory.work_protocols[0].name == "REDFISH":
             entry['IPAddress'] = self.ipaddr
             port = 443
             if isinstance(self.pOptions, ProtocolOptionsFactory):
                 pOptions = self.pOptions.get(ProtocolEnum.REDFISH)
                 if pOptions:
                     port = pOptions.port
             elif isinstance(self.pOptions, RedfishOptions):
                 port = self.pOptions.port
             if ':' in self.ipaddr:
                 entry['URLString'] = "https://[" + str(
                     self.ipaddr) + "]:" + str(port)
             else:
                 entry['URLString'] = "https://" + str(
                     self.ipaddr) + ":" + str(port)
         if "Devices" in self.entityjson:
             attrlist = ['PrimaryStatus', 'ServiceTag']
             sysdict = self.entityjson.get('System', [None])[0]
             devdict = self.entityjson.get('Devices', [None])[0]
             if sysdict and devdict:
                 for attr in attrlist:
                     sysdict[attr] = devdict.get(attr, None)
         if entry.get('ServiceTag', None):
             entry['Key'] = entry.get('ServiceTag')
         if entry.get("IPAddresses"):
             ips = entry.get("IPAddresses").split(",")
             IPv4Address = []
             IPv6Address = []
             for ip in ips:
                 if ':' in ip:
                     IPv6Address.append(ip)
                 else:
                     IPv4Address.append(ip)
             if IPv6Address:
                 entry['IPv6Address'] = ", ".join(
                     str(i) for i in set(IPv6Address))
             if IPv4Address:
                 entry['IPv4Address'] = ", ".join(
                     str(i) for i in set(IPv4Address))
         if entry.get("URLs"):
             ips = entry.get("URLs").split(",")
             IPv4URL = []
             IPv6URL = []
             for ip in ips:
                 if '[' in ip:
                     IPv6URL.append(ip)
                 else:
                     IPv4URL.append(ip)
             if IPv6URL:
                 entry['IPv6URL'] = ", ".join(str(i) for i in set(IPv6URL))
             if IPv4URL:
                 entry['IPv4URL'] = ", ".join(str(i) for i in set(IPv4URL))
     if component == "BladeSlot":
         if entry.get('DeviceType') != TypeHelper.resolve(
                 NGMDeviceTypes.BladeSlot):
             return False
     if component == "ComputeModule":
         model = entry.get('Model', "NA")
         if 'MX740c' in model:
             entry['FormFactor'] = 'Full length Single width'
         if 'MX840c' in model:
             entry['FormFactor'] = 'Full length Double width'
             entry['ExtensionSlot'] = str(
                 int(entry.get('MasterSlotNumber', 0)) + 1)
         if entry.get('DeviceType', "NA") != TypeHelper.resolve(
                 NGMDeviceTypes.ComputeModule) or entry.get(
                     "Occupied") != "True" or entry.get(
                         "IsPrimarySlot") != "True":
             return False
     if component == "StorageModule":
         if entry.get('DeviceType', "NA") != TypeHelper.resolve(
                 NGMDeviceTypes.StorageModule) or entry.get(
                     "Occupied") != "True" or entry.get(
                         "IsPrimarySlot") != "True":
             return False
         entry['FormFactor'] = 'Full length Single width'
     if component == "Slots_Summary":
         if entry.get('DeviceType', "NA") != 3000 and entry.get(
                 'DeviceType', "NA") != 1000:
             return False
     if component == "PowerUsageByDevice":
         values = ["", None, "NA"]
         if entry.get('MinPower', "NA") in values:
             entry['MinPower'] = "Not Available"
         if entry.get('PeakPower', "NA") in values:
             entry['PeakPower'] = "Not Available"
     if component == 'Subsystem':
         if entry['Key'] not in [
                 'PowerSupply', 'CMC', 'Fan', 'Temperature'
         ]:
             return False
     if component == "PowerSupply":
         try:
             values = ['Not Available', None, "", "NA"]
             if entry.get('MemberId', 'NA') in values:
                 entry['Slot'] = 'Not Available'
             else:
                 entry['Slot'] = entry['MemberId'][-1]
         except (IndexError, KeyError, ValueError):
             entry['Slot'] = 'Not Available'
         if entry.get('EnableState', 'NA') == 'Absent':
             entry.pop("PrimaryStatus", None)
     if component == "IOModule":
         if (entry.get("DeviceType") != 4000 and entry.get("DeviceType") != 8000) \
                 or entry.get("Occupied") != "True":
             return False
         if entry.get("IPAddresses"):
             ips = entry.get("IPAddresses").split(",")
             IPv4Address = []
             IPv6Address = []
             for ip in ips:
                 if ':' in ip:
                     IPv6Address.append(ip)
                 else:
                     IPv4Address.append(ip)
             if IPv6Address:
                 entry['IPv6Address'] = ", ".join(
                     str(i) for i in set(IPv6Address))
             if IPv4Address:
                 entry['IPv4Address'] = ", ".join(
                     str(i) for i in set(IPv4Address))
     return True
Exemplo n.º 20
0
 def isset(self, scopeType):
     n = TypeHelper.resolve(scopeType)
     return ((self.mix & n) == n)
Exemplo n.º 21
0
    def _download_file(self, rfile, lfile):
        try:
            fstatus = self._validate_file(rfile, lfile)

            if fstatus in [DownloadedFileStatusEnum.Same]:
                # if the file is same, no need to download file
                logger.debug(rfile['path'] + " is as expected!")
                if self.protocol in [DownloadProtocolEnum.HashCheck]:
                    print("{0:16} {1}".format(TypeHelper.resolve(fstatus),
                                              lfile))
                return True

            if self.protocol == DownloadProtocolEnum.HashCheck:
                # in case of hashcheck, return the status after printing
                if os.path.exists(lfile) and os.path.isfile(lfile):
                    print("{0:16} {1}".format(TypeHelper.resolve(fstatus),
                                              lfile))
                else:
                    print("{0:16} {1}".format('Does not exist', lfile))
                return True
            elif self.protocol == DownloadProtocolEnum.NoOp:
                print('Downloading :' + rfile['path'])
                print('         to :' + lfile)
                return True

            if not self.connect():
                return False
            if not self._create_dir(os.path.dirname(lfile)):
                return False

            file_metadata = {'dateTime': '1971-01-01T01:01:01Z', 'size': 0}
            try:
                if os.path.isfile(lfile + ".Metadata"):
                    with open(lfile + ".Metadata", "r") as f1:
                        file_metadata = json.load(f1)
                    logger.debug(
                        json.dumps(file_metadata,
                                   sort_keys=True,
                                   indent=4,
                                   separators=(',', ': ')))
            except Exception as ex:
                logger.debug("Error opening metadata file:" + str(ex))

            logger.debug('Downloading ' + rfile['path'] + " metadata")
            response = None
            if self.protocol == DownloadProtocolEnum.HTTP:
                self.conn.request('GET', '/' + rfile['path'])
                response = self.conn.getresponse()

            rfile_metadata = self._get_file_metadata(rfile['path'], response)
            fstatus = self._validate_file_metadata(rfile, file_metadata,
                                                   rfile_metadata)
            logger.debug("_validate_file_metadata() returned" + str(fstatus))
            if fstatus not in [
                    DownloadedFileStatusEnum.RemoteIsOld,
                    DownloadedFileStatusEnum.RemoteIsNew,
                    DownloadedFileStatusEnum.Different
            ]:
                if response: response.close()
                return True
            logger.debug('Downloading ' + rfile['path'] + " to " + lfile)
            print('Downloading ' + rfile['path'])
            with open(lfile + ".Metadata", "w") as f1:
                f1.write(
                    json.dumps(rfile_metadata,
                               sort_keys=True,
                               indent=4,
                               separators=(',', ': ')))
            if self.protocol == DownloadProtocolEnum.HTTP:
                with open(lfile, 'wb') as f:
                    f.write(response.read())
            elif self.protocol == DownloadProtocolEnum.FTP:
                f = open(lfile, 'wb')
                self.conn.retrbinary('RETR ' + rfile['path'], f.write)
                f.close()
            fstatus = self._validate_file(rfile, lfile)
            logger.debug("_validate_file() returned" + str(fstatus))
            return (fstatus in [
                DownloadedFileStatusEnum.Same, DownloadedFileStatusEnum.Present
            ])
        except Exception as ex:
            print(str(ex))
            logger.debug("File Download failed:" + str(ex))
            return False
Exemplo n.º 22
0
    def job_wait(self,
                 jobid,
                 track_jobid=True,
                 show_progress=False,
                 wait_for=2 * 60 * 60):  # wait for a 2 hours (longgg time)
        """Wait for the job to finish(fail/success)

        :param jobid: id of the job.
        :param path: str.         .
        :returns: returns a json/dict containing job details

        """
        logger.info(self.entity.ipaddr +
                    " : Waiting for the job to finish : " + jobid)
        if track_jobid:
            self.last_job = jobid
        ret_json = {}
        job_ret = False
        wait_till = time.time() + wait_for
        while True:
            status = {}
            if self.entity.use_redfish:
                status = self.get_job_status_redfish(jobid)
            else:
                status = self.get_job_status(jobid)
            if not 'Status' in status:
                logger.debug(self.entity.ipaddr + " : " + jobid +
                             " : Invalid Status")
            else:
                logger.debug(self.entity.ipaddr + " : " + jobid +
                             ": status: " + str(status))

                pcc = "0"
                msg = ""
                if 'PercentComplete' in status:
                    pcc = status['PercentComplete']
                if 'Message' in status:
                    msg = status['Message']
                if show_progress:
                    logger.debug(
                        self.entity.ipaddr +
                        "{0} : {1} : Percent Complete: {2} | Message = {3}".
                        format(jobid, status['Status'], pcc, msg))
                if status['Status'] == TypeHelper.resolve(
                        JobStatusEnum.Success):
                    if show_progress:
                        logger.debug(self.entity.ipaddr + " : " + jobid +
                                     ":Message:" + status['Message'])
                    job_ret = True
                    ret_json = status
                    break
                elif status['Status'] != TypeHelper.resolve(
                        JobStatusEnum.InProgress):
                    if show_progress:
                        logger.debug(self.entity.ipaddr + " : " + jobid +
                                     ":Message:" + status['Message'])
                    job_ret = False
                    ret_json = status
                    break
                else:
                    logger.debug(self.entity.ipaddr + " : " + jobid +
                                 ": status: " + str(status))
            time.sleep(5)
            if time.time() > wait_till:
                ret_json['Status'] = 'Failed'
                ret_json[
                    'Message'] = 'Job wait did not return for {0} seconds'.format(
                        wait_for)
                break
        ret_json['retval'] = job_ret
        return ret_json