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
Example #2
0
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
Example #4
0
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