def doDiscovery(shell, hostOsh, managedSystemOsh, framework, osType): vector = ObjectStateHolderVector() scsiAdaptersList = [] physAdaptList = [] virtAdaptList = [] seaAdaptList = [] linkAggrAdaptList = [] volumeGroupsDict = {} physicalVolumeDict = {} logicalVolumeDict = {} scsiManList = [] pvAssignList = [] fiberChannelAdaptersList = [] ethAliasesList = [] isVio = ibm_hmc_lib.isVio(shell) if isVio: try: cpus = discoverCpus(shell) for cpu in cpus: cpuOsh = modeling.createCpuOsh(cpu.idStr, managedSystemOsh, cpu.speed, cpu.coresCount, 'ibm_corp', data_name = cpu.model) vector.add(cpuOsh) except: logger.errorException('') framework.reportWarning('Failed to discover CPUs') if osType and osType.upper() == 'AIX': try: fiberChannelAdaptersList = discoverFiberChannels(shell) except: framework.reportWarning("Failed to discover Fibre Channel adapters") ethAdaptersDict = {} if isVio: ethAdaptersDict = discoverEthernetAdapters(shell) ethAliasesList = discoverEhernetAdapterAliasses(shell) else: ethAdaptersDict = discoverAixLparEthernetAdapters(shell) physAdaptList = getPhysicalEthAdapters(ethAdaptersDict.values()) virtAdaptList = getVirtualEthAdapters(ethAdaptersDict.values()) seaAdaptList = getSeaAdapters(ethAdaptersDict.values()) linkAggrAdaptList = getLinkAggregationInterfaces(ethAdaptersDict.values()) calculateAdaptersSpeed(linkAggrAdaptList, ethAdaptersDict) calculateAdaptersSpeed(seaAdaptList, ethAdaptersDict) calculateAdaptersSpeed(virtAdaptList, ethAdaptersDict) volumeGroupsDict = discoverVolumeGroups(shell) physicalVolumeDict = discoverPhysicalVolumes(shell) logicalVolumeDict = discoverLogicalVolumes(shell, volumeGroupsDict) if isVio: scsiAdaptersList = discoverScsi(shell, physicalVolumeDict, logicalVolumeDict) (scsiManList, pvAssignList) = discoverPhysScsiAndRaid(shell, physicalVolumeDict) else: (scsiManList, pvAssignList) = discoverLparPhysScsiAndRaid(shell, physicalVolumeDict) elif osType and osType.upper() == 'LINUX': scsiAdaptersList = discoverLinuxVScsiAdapters(shell) (volumeGroupsDict, logicalVolumeDict, physicalVolumeDict) = discoverLinuxStorageInfo(shell) ethAdaptersDict = {} if physAdaptList: for physAdapt in physAdaptList: physAdaptOsh = createInterfaceOsh(physAdapt, hostOsh) linkOsh = modeling.createLinkOSH('contained', managedSystemOsh, physAdaptOsh) vector.add(linkOsh) if physAdapt.physicalPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = physAdapt.physicalPath ioSlot.drcName = physAdapt.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName(ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, physAdaptOsh) vector.add(ioSlotOsh) vector.add(linkOsh) if ethAliasesList: for aliasName in ['en'+str(physAdapt.interfaceIndex), 'et'+str(physAdapt.interfaceIndex)]: if aliasName in ethAliasesList: aliasOsh = createAliasOsh(aliasName, hostOsh, physAdapt) if aliasOsh: vector.add(aliasOsh) vector.add(vector.add(modeling.createLinkOSH('realization', physAdaptOsh, aliasOsh))) if logger.Version().getVersion(framework) < 9: interfaceIndexOsh = createInterfaceIndexOsh(physAdapt, hostOsh) if interfaceIndexOsh: linkOsh = modeling.createLinkOSH('parent', interfaceIndexOsh, physAdaptOsh) vector.add(interfaceIndexOsh) vector.add(linkOsh) # vector.add(physAdaptOsh) ethAdaptersDict[physAdapt.name] = physAdaptOsh if linkAggrAdaptList: for linkAggr in linkAggrAdaptList: linkAggrOsh = createLinkAggrOsh(linkAggr, hostOsh) if linkAggr.usedAdapters: vector.add(linkAggrOsh) ethAdaptersDict[linkAggr.name] = linkAggrOsh for usedAdapterName in linkAggr.usedAdapters: physAdaptOsh = ethAdaptersDict.get(usedAdapterName) if physAdaptOsh: #change the KEY attribute for the Physical Ethernet Adapter mac = physAdaptOsh.getAttributeValue('interface_macaddr') newKey = '%s_%s' % (mac, usedAdapterName) physAdaptOsh.setAttribute('interface_macaddr', newKey) ethAdaptersDict[usedAdapterName] = physAdaptOsh linkOsh = modeling.createLinkOSH('member', linkAggrOsh, physAdaptOsh) vector.add(linkOsh) if linkAggr.backupAdapter: ethBackOsh = ethAdaptersDict.get(linkAggr.backupAdapter) linkOsh = modeling.createLinkOSH('member', linkAggrOsh, ethBackOsh) vector.add(linkOsh) #Adding Physical ETH adapters to the result vector if ethAdaptersDict: for physAdaptOsh in ethAdaptersDict.values(): vector.add(physAdaptOsh) if seaAdaptList: for seaAdapter in seaAdaptList: seaAdapterOsh = createSeaOsh(seaAdapter, hostOsh) if seaAdapter.usedAdapters: vector.add(seaAdapterOsh) ethAdaptersDict[seaAdapter.name] = seaAdapterOsh for usedAdapterName in seaAdapter.usedAdapters: backAdapterOsh = ethAdaptersDict.get(usedAdapterName) if backAdapterOsh: linkOsh = modeling.createLinkOSH('use', seaAdapterOsh, backAdapterOsh) vector.add(linkOsh) if virtAdaptList: for virtualAdapter in virtAdaptList: virtAdapterOsh = ibm_hmc_lib.createVEthOsh(virtualAdapter, hostOsh) vector.add(virtAdapterOsh) if ethAliasesList: for aliasName in ['en'+str(virtualAdapter.interfaceIndex), 'et'+str(virtualAdapter.interfaceIndex)]: if aliasName in ethAliasesList: aliasOsh = createAliasOsh(aliasName, hostOsh, virtualAdapter) if aliasOsh: vector.add(aliasOsh) vector.add(vector.add(modeling.createLinkOSH('realization', virtAdapterOsh, aliasOsh))) if virtualAdapter.usedAdapters: for usedAdapterName in virtualAdapter.usedAdapters: backAdapterOsh = ethAdaptersDict.get(usedAdapterName) if backAdapterOsh: linkOsh = modeling.createLinkOSH('use', virtAdapterOsh, backAdapterOsh) vector.add(linkOsh) #FIXME: move to function to avoid code dups if virtualAdapter.physicalPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = virtualAdapter.physicalPath ioSlot.drcName = virtualAdapter.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName(ioSlot.drcName) if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, virtAdapterOsh) vector.add(ioSlotOsh) vector.add(linkOsh) if fiberChannelAdaptersList: for fiberChannelAdapter in fiberChannelAdaptersList: fiberChannelOsh = createFiberChannelOsh(fiberChannelAdapter, managedSystemOsh) vector.add(fiberChannelOsh) linkOsh = modeling.createLinkOSH('contained', hostOsh, fiberChannelOsh) vector.add(linkOsh) if fiberChannelAdapter.physPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = fiberChannelAdapter.physPath ioSlot.drcName = fiberChannelAdapter.physPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName(ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, fiberChannelOsh) vector.add(ioSlotOsh) vector.add(linkOsh) #create Storage Topology vector.addAll(storage_topology.createStorageTopology(volumeGroupsDict.values(), logicalVolumeDict.values(), physicalVolumeDict.values(), scsiAdaptersList, hostOsh)) if scsiManList and pvAssignList: pScsiDict = {} for scsi in scsiManList: scsiOsh = None ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = scsi.physicalPath ioSlot.drcName = scsi.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName(ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, managedSystemOsh) scsiOsh = storage_topology.createScsiAdapterOsh(scsi, managedSystemOsh) linkOsh = modeling.createLinkOSH('contained', hostOsh, scsiOsh) vector.add(linkOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) scsiOsh = storage_topology.createScsiAdapterOsh(scsi, hostOsh) vector.add(scsiOsh) pScsiDict[scsi.slotNumber] = scsiOsh linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, scsiOsh) vector.add(ioSlotOsh) vector.add(linkOsh) for pv in pvAssignList: pvOsh = storage_topology.createPhysicalVolumeOsh(pv, hostOsh) scsiOsh = pScsiDict.get(pv.scsiAdapterSlotNumber) if pvOsh and scsiOsh: vector.add(pvOsh) linkOsh = modeling.createLinkOSH("depend", pvOsh, scsiOsh) vector.add(linkOsh) return vector
def createstorage(shell, HostOsh): myVec = ObjectStateHolderVector() volumegroupDictionary = {} pvolumelist = [] lvolumelist = [] # Get all the Physical Volumes , this will also give us the volume groups try: cmdForVG = 'lspv' logger.debug(concatenate(' Executing command: ', cmdForVG)) rawCmdResult = shell.execCmd(cmdForVG) cmdResult = rawCmdResult.strip() if shell.getLastCmdReturnCode() != 0: raise ValueError, "Failed getting storage topology" except: msg = "Failed getting storage topology" errobj = errorobject.createError( errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None ## Sample output... # dwscmdb : lspv # hdisk1 00ca4bbe84bdab4f rootvg active # hdisk0 00ca4bbe84bdac14 rootvg active # hdisk2 00ca4bbeeeb6b3c2 QSWIQ9A0_vg concurrent # hdisk3 00ca4bbeeeb3c581 None # hdisk4 00ca4bbeeeb6b499 QSWIQ9A0_vg concurrent # hdisk5 00ca4bbeeeb3c403 None # hdisk6 00ca4bbeeeb6b60d QSWIQ9B0_vg concurrent keywords = ['Error'] for keyword in keywords: if re.search(keyword, cmdResult, re.I): msg = concatenate("Error in getting storage topology, ", cmdResult) errobj = errorobject.createError( errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None if (cmdResult == ''): logger.info('Storage topology command result empty ') return myVec cmdResult = re.split('[\r\n]+', cmdResult) for line in cmdResult: line = line.strip() ## Parse out headers and blank lines if not line or re.match('#', line): continue m = re.search('^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', line) if (m): physicalvolume = PhysicalVolume() physicalvolume.pvName = m.group(1) physicalvolume.pvId = m.group(2) volume_group = m.group(3) physicalvolume.pvState = m.group(4) physicalvolume.volumeGroupName = volume_group if volume_group != 'None': pvolumelist.append(physicalvolume) volumegroupDictionary[volume_group] = None logger.debug('Physical Volumes count', len(pvolumelist), ' ', len(lvolumelist)) # Now get all the logical volumes for volume_group in volumegroupDictionary.keys(): lvolumelist = [] parselogical = 0 try: cmdForVG = concatenate('lsvg -l ', volume_group) logger.debug(concatenate(' Executing command: ', cmdForVG)) rawCmdResult = shell.execCmd(cmdForVG) cmdResult = rawCmdResult.strip() if shell.getLastCmdReturnCode() != 0: raise ValueError, "Failed getting storage topology" except: msg = "Failure to get logical volume information" errobj = errorobject.createError( errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None ## Sample output... #bash-4.0$ lsvg -l db2dbm9c_vg # db2dbm9c_vg: # LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT # db2dbm9c_log_lv jfs2log 2 4 2 closed/syncd N/A # db2dbm9c_IH_lv jfs2 48 96 2 closed/syncd /export/l11s03p03/db2dbm9c_IH # db2dbm9c_tiv_lv jfs2 4 8 2 closed/syncd /export/l11s03p03/db2dbm9c_tiv keywords = ['Error'] for keyword in keywords: if re.search(keyword, cmdResult, re.I): msg = concatenate("Error in getting logical volume topology, ", cmdResult) errobj = errorobject.createError( errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None if not cmdResult: logger.info('No Logical Volumes in Volume group, skipping ', volume_group) continue cmdResult = re.split('[\r\n]+', cmdResult) for line in cmdResult: line = line.strip() if not line: continue logger.debug('lsvg -l Line = ', line) ## Parse out headers and blank lines if re.search('^LV NAME', line): parselogical = 1 continue if not parselogical: continue m = re.search( '(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', line) if (m): logicalvolume = LogicalVolume() logicalvolume.lvName = m.group(1) logicalvolume.lvAccType = m.group(2) logicalvolume.lvState = m.group(6) logicalvolume.mountPoint = m.group(7) logicalvolume.volumeGroupName = volume_group if volume_group != 'None': lvolumelist.append(logicalvolume) volumegroupDictionary[volume_group] = None logger.debug('Logical Volumes count', len(pvolumelist), ' ', len(lvolumelist)) #Create the Volume Groups for vg in volumegroupDictionary.keys(): volumeGroup = VolumeGroup() volumeGroup.vgName = vg volumeGroupOsh = createVolumeGroupOsh(volumeGroup, HostOsh) volumegroupDictionary[vg] = volumeGroupOsh myVec.add(volumeGroupOsh) #Create the Logical Volumes for logicalVolume in lvolumelist: volumeGroupOsh = volumegroupDictionary.get( logicalVolume.volumeGroupName) if volumeGroupOsh: logicalVolumeOsh = createLogicalVolumeOsh(logicalVolume, HostOsh) myVec.add(logicalVolumeOsh) myVec.add( modeling.createLinkOSH("contained", volumeGroupOsh, logicalVolumeOsh)) #Create the Physical Volumes for physicalVolume in pvolumelist: volumeGroupOsh = volumegroupDictionary.get( physicalVolume.volumeGroupName) if volumeGroupOsh: physicalVolumeOsh = createPhysicalVolumeOsh( physicalVolume, HostOsh) myVec.add(physicalVolumeOsh) myVec.add( modeling.createLinkOSH("contained", volumeGroupOsh, physicalVolumeOsh)) return myVec
def doDiscovery(shell, hostOsh, managedSystemOsh, framework, osType): vector = ObjectStateHolderVector() scsiAdaptersList = [] physAdaptList = [] virtAdaptList = [] seaAdaptList = [] linkAggrAdaptList = [] volumeGroupsDict = {} physicalVolumeDict = {} logicalVolumeDict = {} scsiManList = [] pvAssignList = [] fiberChannelAdaptersList = [] ethAliasesList = [] isVio = ibm_hmc_lib.isVio(shell) try: cpus = discover_cpus(shell, framework, isVio) for cpu in cpus: cpuOsh = modeling.createCpuOsh(cpu.idStr, managedSystemOsh, cpu.speed, cpu.coresCount, 'ibm_corp', data_name=cpu.model) vector.add(cpuOsh) except: logger.errorException('') framework.reportWarning('Failed to discover CPUs') if osType and osType.upper() == 'AIX': try: fiberChannelAdaptersList = discoverFiberChannels(shell) except: framework.reportWarning( "Failed to discover Fibre Channel adapters") ethAdaptersDict = {} if isVio: ethAdaptersDict = discoverEthernetAdapters(shell) ethAliasesList = discoverEhernetAdapterAliasses(shell) else: ethAdaptersDict = discoverAixLparEthernetAdapters(shell) physAdaptList = getPhysicalEthAdapters(ethAdaptersDict.values()) virtAdaptList = getVirtualEthAdapters(ethAdaptersDict.values()) seaAdaptList = getSeaAdapters(ethAdaptersDict.values()) linkAggrAdaptList = getLinkAggregationInterfaces( ethAdaptersDict.values()) calculateAdaptersSpeed(linkAggrAdaptList, ethAdaptersDict) calculateAdaptersSpeed(seaAdaptList, ethAdaptersDict) calculateAdaptersSpeed(virtAdaptList, ethAdaptersDict) volumeGroupsDict = discoverVolumeGroups(shell) physicalVolumeDict = discoverPhysicalVolumes(shell) logicalVolumeDict = discoverLogicalVolumes(shell, volumeGroupsDict) if isVio: scsiAdaptersList = discoverScsi(shell, physicalVolumeDict, logicalVolumeDict) (scsiManList, pvAssignList) = discoverPhysScsiAndRaid(shell, physicalVolumeDict) else: (scsiManList, pvAssignList) = discoverLparPhysScsiAndRaid( shell, physicalVolumeDict) elif osType and osType.upper() == 'LINUX': scsiAdaptersList = discoverLinuxVScsiAdapters(shell) (volumeGroupsDict, logicalVolumeDict, physicalVolumeDict) = discoverLinuxStorageInfo(shell) ethAdaptersDict = {} if physAdaptList: for physAdapt in physAdaptList: physAdaptOsh = createInterfaceOsh(physAdapt, hostOsh) linkOsh = modeling.createLinkOSH('contained', managedSystemOsh, physAdaptOsh) vector.add(linkOsh) if physAdapt.physicalPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = physAdapt.physicalPath ioSlot.drcName = physAdapt.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName( ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh( ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, physAdaptOsh) vector.add(ioSlotOsh) vector.add(linkOsh) if ethAliasesList: for aliasName in [ 'en' + str(physAdapt.interfaceIndex), 'et' + str(physAdapt.interfaceIndex) ]: if aliasName in ethAliasesList: aliasOsh = createAliasOsh(aliasName, hostOsh, physAdapt) if aliasOsh: vector.add(aliasOsh) vector.add( vector.add( modeling.createLinkOSH( 'realization', physAdaptOsh, aliasOsh))) if logger.Version().getVersion(framework) < 9: interfaceIndexOsh = createInterfaceIndexOsh(physAdapt, hostOsh) if interfaceIndexOsh: linkOsh = modeling.createLinkOSH('parent', interfaceIndexOsh, physAdaptOsh) vector.add(interfaceIndexOsh) vector.add(linkOsh) # vector.add(physAdaptOsh) ethAdaptersDict[physAdapt.name] = physAdaptOsh if linkAggrAdaptList: for linkAggr in linkAggrAdaptList: linkAggrOsh = createLinkAggrOsh(linkAggr, hostOsh) if linkAggr.usedAdapters: vector.add(linkAggrOsh) ethAdaptersDict[linkAggr.name] = linkAggrOsh for usedAdapterName in linkAggr.usedAdapters: physAdaptOsh = ethAdaptersDict.get(usedAdapterName) if physAdaptOsh: #change the KEY attribute for the Physical Ethernet Adapter mac = physAdaptOsh.getAttributeValue( 'interface_macaddr') newKey = '%s_%s' % (mac, usedAdapterName) physAdaptOsh.setAttribute('interface_macaddr', newKey) ethAdaptersDict[usedAdapterName] = physAdaptOsh linkOsh = modeling.createLinkOSH( 'member', linkAggrOsh, physAdaptOsh) vector.add(linkOsh) if linkAggr.backupAdapter: ethBackOsh = ethAdaptersDict.get(linkAggr.backupAdapter) linkOsh = modeling.createLinkOSH('member', linkAggrOsh, ethBackOsh) vector.add(linkOsh) #Adding Physical ETH adapters to the result vector if ethAdaptersDict: for physAdaptOsh in ethAdaptersDict.values(): vector.add(physAdaptOsh) if seaAdaptList: for seaAdapter in seaAdaptList: seaAdapterOsh = createSeaOsh(seaAdapter, hostOsh) if seaAdapter.usedAdapters: vector.add(seaAdapterOsh) ethAdaptersDict[seaAdapter.name] = seaAdapterOsh for usedAdapterName in seaAdapter.usedAdapters: backAdapterOsh = ethAdaptersDict.get(usedAdapterName) if backAdapterOsh: linkOsh = modeling.createLinkOSH( 'use', seaAdapterOsh, backAdapterOsh) vector.add(linkOsh) if virtAdaptList: for virtualAdapter in virtAdaptList: virtAdapterOsh = ibm_hmc_lib.createVEthOsh(virtualAdapter, hostOsh) vector.add(virtAdapterOsh) if ethAliasesList: for aliasName in [ 'en' + str(virtualAdapter.interfaceIndex), 'et' + str(virtualAdapter.interfaceIndex) ]: if aliasName in ethAliasesList: aliasOsh = createAliasOsh(aliasName, hostOsh, virtualAdapter) if aliasOsh: vector.add(aliasOsh) vector.add( vector.add( modeling.createLinkOSH( 'realization', virtAdapterOsh, aliasOsh))) if virtualAdapter.usedAdapters: for usedAdapterName in virtualAdapter.usedAdapters: backAdapterOsh = ethAdaptersDict.get(usedAdapterName) if backAdapterOsh: linkOsh = modeling.createLinkOSH( 'use', virtAdapterOsh, backAdapterOsh) vector.add(linkOsh) if virtualAdapter.physicalPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = virtualAdapter.physicalPath ioSlot.drcName = virtualAdapter.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName( ioSlot.drcName) if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh( ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, virtAdapterOsh) vector.add(ioSlotOsh) vector.add(linkOsh) if fiberChannelAdaptersList: for fiberChannelAdapter in fiberChannelAdaptersList: fiberChannelOsh = createFiberChannelOsh(fiberChannelAdapter, managedSystemOsh) vector.add(fiberChannelOsh) linkOsh = modeling.createLinkOSH('contained', hostOsh, fiberChannelOsh) vector.add(linkOsh) if fiberChannelAdapter.physPath: ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = fiberChannelAdapter.physPath ioSlot.drcName = fiberChannelAdapter.physPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName( ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh( ioSlot, managedSystemOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, fiberChannelOsh) vector.add(ioSlotOsh) vector.add(linkOsh) #create Storage Topology vector.addAll( storage_topology.createStorageTopology(volumeGroupsDict.values(), logicalVolumeDict.values(), physicalVolumeDict.values(), scsiAdaptersList, hostOsh)) if scsiManList and pvAssignList: pScsiDict = {} for scsi in scsiManList: scsiOsh = None ioSlot = ibm_hmc_lib.IoSlot() ioSlot.name = scsi.physicalPath ioSlot.drcName = scsi.physicalPath ioSlot.normalizedDrcName = ibm_hmc_lib.normaliseIoSlotDrcName( ioSlot.drcName) ioSlotOsh = None if isPhysicalSlot(ioSlot): ioSlotOsh = ibm_hmc_lib.createIoSlotOsh( ioSlot, managedSystemOsh) scsiOsh = storage_topology.createScsiAdapterOsh( scsi, managedSystemOsh) linkOsh = modeling.createLinkOSH('contained', hostOsh, scsiOsh) vector.add(linkOsh) else: ioSlotOsh = ibm_hmc_lib.createIoSlotOsh(ioSlot, hostOsh) scsiOsh = storage_topology.createScsiAdapterOsh(scsi, hostOsh) vector.add(scsiOsh) pScsiDict[scsi.slotNumber] = scsiOsh linkOsh = modeling.createLinkOSH('contained', ioSlotOsh, scsiOsh) vector.add(ioSlotOsh) vector.add(linkOsh) for pv in pvAssignList: pvOsh = storage_topology.createPhysicalVolumeOsh(pv, hostOsh) scsiOsh = pScsiDict.get(pv.scsiAdapterSlotNumber) if pvOsh and scsiOsh: vector.add(pvOsh) linkOsh = modeling.createLinkOSH("depend", pvOsh, scsiOsh) vector.add(linkOsh) return vector
def createstorage(shell, HostOsh): myVec = ObjectStateHolderVector() volumegroupDictionary = {} pvolumelist = [] lvolumelist = [] # Get all the Physical Volumes , this will also give us the volume groups try: cmdForVG = 'lspv' logger.debug(concatenate(' Executing command: ', cmdForVG)) rawCmdResult = shell.execCmd(cmdForVG) cmdResult = rawCmdResult.strip() if shell.getLastCmdReturnCode() != 0: raise ValueError, "Failed getting storage topology" except: msg = "Failed getting storage topology" errobj = errorobject.createError(errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None ## Sample output... # dwscmdb : lspv # hdisk1 00ca4bbe84bdab4f rootvg active # hdisk0 00ca4bbe84bdac14 rootvg active # hdisk2 00ca4bbeeeb6b3c2 QSWIQ9A0_vg concurrent # hdisk3 00ca4bbeeeb3c581 None # hdisk4 00ca4bbeeeb6b499 QSWIQ9A0_vg concurrent # hdisk5 00ca4bbeeeb3c403 None # hdisk6 00ca4bbeeeb6b60d QSWIQ9B0_vg concurrent keywords = [ 'Error'] for keyword in keywords: if re.search(keyword,cmdResult,re.I): msg = concatenate("Error in getting storage topology, ",cmdResult) errobj = errorobject.createError(errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None if (cmdResult == ''): logger.info('Storage topology command result empty ') return myVec cmdResult = re.split('[\r\n]+', cmdResult) for line in cmdResult: line = line.strip() ## Parse out headers and blank lines if not line or re.match('#', line): continue m = re.search('^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', line) if (m): physicalvolume = PhysicalVolume() physicalvolume.pvName = m.group(1) physicalvolume.pvId = m.group(2) volume_group = m.group(3) physicalvolume.pvState = m.group(4) physicalvolume.volumeGroupName = volume_group if volume_group != 'None': pvolumelist.append (physicalvolume) volumegroupDictionary[volume_group] = None logger.debug ('Physical Volumes count', len(pvolumelist), ' ',len(lvolumelist)) # Now get all the logical volumes for volume_group in volumegroupDictionary.keys(): lvolumelist = [] parselogical = 0 try: cmdForVG = concatenate('lsvg -l ', volume_group) logger.debug(concatenate(' Executing command: ', cmdForVG)) rawCmdResult = shell.execCmd(cmdForVG) cmdResult = rawCmdResult.strip() if shell.getLastCmdReturnCode() != 0: raise ValueError, "Failed getting storage topology" except: msg = "Failure to get logical volume information" errobj = errorobject.createError(errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None ## Sample output... #bash-4.0$ lsvg -l db2dbm9c_vg # db2dbm9c_vg: # LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT # db2dbm9c_log_lv jfs2log 2 4 2 closed/syncd N/A # db2dbm9c_IH_lv jfs2 48 96 2 closed/syncd /export/l11s03p03/db2dbm9c_IH # db2dbm9c_tiv_lv jfs2 4 8 2 closed/syncd /export/l11s03p03/db2dbm9c_tiv keywords = ['Error'] for keyword in keywords: if re.search(keyword,cmdResult,re.I): msg = concatenate("Error in getting logical volume topology, ",cmdResult) errobj = errorobject.createError(errorcodes.COMMAND_OUTPUT_VERIFICATION_FAILED, None, msg) logger.reportWarningObject(errobj) logger.debug(msg) return None if not cmdResult: logger.info('No Logical Volumes in Volume group, skipping ', volume_group) continue cmdResult = re.split('[\r\n]+', cmdResult) for line in cmdResult: line = line.strip() if not line: continue logger.debug ('lsvg -l Line = ',line) ## Parse out headers and blank lines if re.search('^LV NAME', line): parselogical = 1 continue if not parselogical: continue m = re.search('(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', line) if (m): logicalvolume = LogicalVolume() logicalvolume.lvName = m.group(1) logicalvolume.lvAccType = m.group(2) logicalvolume.lvState = m.group(6) logicalvolume.mountPoint = m.group(7) logicalvolume.volumeGroupName = volume_group if volume_group != 'None': lvolumelist.append (logicalvolume) volumegroupDictionary[volume_group] = None logger.debug ('Logical Volumes count', len(pvolumelist), ' ',len(lvolumelist)) #Create the Volume Groups for vg in volumegroupDictionary.keys(): volumeGroup = VolumeGroup() volumeGroup.vgName = vg volumeGroupOsh = createVolumeGroupOsh(volumeGroup, HostOsh) volumegroupDictionary[vg]= volumeGroupOsh myVec.add(volumeGroupOsh) #Create the Logical Volumes for logicalVolume in lvolumelist: volumeGroupOsh = volumegroupDictionary.get(logicalVolume.volumeGroupName) if volumeGroupOsh: logicalVolumeOsh = createLogicalVolumeOsh(logicalVolume, HostOsh) myVec.add(logicalVolumeOsh) myVec.add(modeling.createLinkOSH("contained", volumeGroupOsh, logicalVolumeOsh)) #Create the Physical Volumes for physicalVolume in pvolumelist: volumeGroupOsh = volumegroupDictionary.get(physicalVolume.volumeGroupName) if volumeGroupOsh: physicalVolumeOsh = createPhysicalVolumeOsh(physicalVolume, HostOsh) myVec.add(physicalVolumeOsh) myVec.add(modeling.createLinkOSH("contained", volumeGroupOsh, physicalVolumeOsh)) return myVec