Exemplo n.º 1
0
 def check_storage_configuration(self, cfgspec=None):
     rsp = self.wc.grab_json_response(
         '/api/function/raid_conf?params=raidlink_GetStatus')
     if rsp['items'][0]['status'] != 2:
         raise pygexc.TemporaryError('Storage configuration unavilable in '
                                     'current state (try boot to setup or '
                                     'an OS)')
     if not cfgspec:
         return True
     for pool in cfgspec.arrays:
         self._parse_storage_cfgspec(pool)
     return True
Exemplo n.º 2
0
 def update_firmware(self, filename, data=None, progress=None, bank=None):
     result = None
     if self.updating:
         raise pygexc.TemporaryError('Cannot run multiple updates to same '
                                     'target concurrently')
     self.updating = True
     try:
         result = self.update_firmware_backend(filename, data, progress,
                                               bank)
     except Exception:
         self.updating = False
         self._refresh_token()
         self.wc.grab_json_response('/api/providers/fwupdate',
                                    json.dumps({'UPD_WebCancel': 1}))
         self.weblogout()
         raise
     self.updating = False
     self.weblogout()
     return result
Exemplo n.º 3
0
 def hardware_inventory_map(self):
     hwmap = self.get_cached_data('lenovo_cached_hwmap')
     if hwmap:
         return hwmap
     hwmap = {}
     enclosureuuid = self.get_property('/v2/ibmc/smm/chassis/uuid')
     if enclosureuuid:
         hwmap['Enclosure'] = {'UUID': fixup_uuid(enclosureuuid)}
     adapterdata = self.get_cached_data('lenovo_cached_adapters')
     if not adapterdata:
         if self.updating:
             raise pygexc.TemporaryError(
                 'Cannot read extended inventory during firmware update')
         if self.wc:
             adapterdata = self.wc.grab_json_response(
                 self.ADP_URL, referer=self.adp_referer)
             if adapterdata:
                 self.datacache['lenovo_cached_adapters'] = (
                     adapterdata, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             skipadapter = False
             if not adata[self.ADP_OOB]:
                 continue
             aname = adata[self.ADP_NAME]
             clabel = adata[self.ADP_LABEL]
             if clabel == 'Unknown':
                 continue
             if clabel != 'Onboard':
                 aslot = adata[self.ADP_SLOTNO]
                 if clabel == 'ML2':
                     clabel = 'ML2 (Slot {0})'.format(aslot)
                 else:
                     clabel = 'Slot {0}'.format(aslot)
             bdata = {'location': clabel}
             for fundata in adata[self.ADP_FUN]:
                 bdata['pcislot'] = '{0:02x}:{1:02x}'.format(
                     fundata[self.BUSNO], fundata[self.DEVNO])
                 serialdata = fundata.get('vpd.serialNo', None)
                 if (serialdata and serialdata != 'N/A'
                         and '---' not in serialdata):
                     bdata['serial'] = serialdata
                 partnum = fundata.get('vpd.partNo', None)
                 if partnum and partnum != 'N/A':
                     bdata['partnumber'] = partnum
                 if self.PORTS in fundata:
                     for portinfo in fundata[self.PORTS]:
                         for lp in portinfo['logicalPorts']:
                             ma = lp['networkAddr']
                             ma = ':'.join([
                                 ma[i:i + 2] for i in range(0, len(ma), 2)
                             ]).lower()
                             bdata['MAC Address {0}'.format(
                                 portinfo['portIndex'])] = ma
                 elif clabel == 'Onboard':  # skip the various non-nic
                     skipadapter = True
             if not skipadapter:
                 hwmap[aname] = bdata
         self.datacache['lenovo_cached_hwmap'] = (hwmap,
                                                  util._monotonic_time())
     self.weblogout()
     return hwmap
Exemplo n.º 4
0
 def fetch_agentless_firmware(self):
     adapterdata = self.get_cached_data('lenovo_cached_adapters')
     if not adapterdata:
         if self.updating:
             raise pygexc.TemporaryError(
                 'Cannot read extended inventory during firmware update')
         if self.wc:
             adapterdata = self.wc.grab_json_response(
                 self.ADP_URL, referer=self.adp_referer)
             if adapterdata:
                 self.datacache['lenovo_cached_adapters'] = (
                     adapterdata, util._monotonic_time())
     if adapterdata and 'items' in adapterdata:
         for adata in adapterdata['items']:
             aname = adata[self.ADP_NAME]
             donenames = set([])
             for fundata in adata[self.ADP_FUN]:
                 fdata = fundata.get('firmwares', ())
                 for firm in fdata:
                     fname = firm['firmwareName'].rstrip()
                     if '.' in fname:
                         fname = firm['description'].rstrip()
                     if fname in donenames:
                         # ignore redundant entry
                         continue
                     donenames.add(fname)
                     bdata = {}
                     if 'versionStr' in firm and firm['versionStr']:
                         bdata['version'] = firm['versionStr']
                     if ('releaseDate' in firm and firm['releaseDate']
                             and firm['releaseDate'] != 'N/A'):
                         try:
                             bdata['date'] = self._parse_builddate(
                                 firm['releaseDate'])
                         except ValueError:
                             pass
                     yield ('{0} {1}'.format(aname, fname), bdata)
     storagedata = self.get_cached_data('lenovo_cached_storage')
     if not storagedata:
         if self.wc:
             storagedata = self.wc.grab_json_response(
                 '/designs/imm/dataproviders/raid_alldevices.php')
             if storagedata:
                 self.datacache['lenovo_cached_storage'] = (
                     storagedata, util._monotonic_time())
     if storagedata and 'items' in storagedata:
         for adp in storagedata['items']:
             if 'storage.vpd.productName' not in adp:
                 continue
             adpname = adp['storage.vpd.productName']
             if 'children' not in adp:
                 adp['children'] = ()
             for diskent in adp['children']:
                 bdata = {}
                 diskname = '{0} Disk {1}'.format(adpname,
                                                  diskent['storage.slotNo'])
                 bdata['model'] = diskent['storage.vpd.productName'].rstrip(
                 )
                 bdata['version'] = diskent['storage.firmwares'][0][
                     'versionStr']
                 yield (diskname, bdata)
     self.weblogout()