Port Discovery

Brocade.FCHBA.Monitoring.2012.PortDiscovery (Discovery)

Discovery of all ports across all FC HBAs.

Knowledge Base article:

Summary

Discovery of all ports across all FC HBAs.

Element properties:

TargetBrocade.FCHBA.Monitoring.2012.HBA
EnabledTrue
Frequency14400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.DiscoveryProvider Default

Source Code:

<Discovery ID="Brocade.FCHBA.Monitoring.2012.PortDiscovery" Enabled="true" Target="Brocade.FCHBA.Monitoring.2012.HBA" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Brocade.FCHBA.Monitoring.2012.Port">
<Property TypeID="Brocade.FCHBA.Monitoring.2012.Port" PropertyID="PortWWN"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
<IntervalSeconds>14400</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverHBAPorts.vbs</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Brocade.FCHBA.Monitoring.2012.Host"]/ImagePath$ $Target/Property[Type="Brocade.FCHBA.Monitoring.2012.HBA"]/SerialNumber$ $Target/Property[Type="System!System.Entity"]/DisplayName$ $Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Host/Property[Type="Brocade.FCHBA.Monitoring.2012.Host"]/HyperVGUID$ $Target/Host/Property[Type="Brocade.FCHBA.Monitoring.2012.Host"]/VMMServerName$</Arguments>
<ScriptBody><Script>
Option Explicit
SetLocale("en-us")
'declare constants
'map event types numbers to friendly names
Const EVENT_TYPE_ERROR = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_SUCCESS = 4
Const MAX_PHYSICALPORTS = 514

'Constant used in HBA driver file(hbaapi.h)
Const HBA_PORTSPEED_UNKNOWN = 0 'Unknown - transceiver incapable of reporting */
Const HBA_PORTSPEED_1GBIT = 1 '1 GBit/sec */
Const HBA_PORTSPEED_2GBIT = 2 '2 GBit/sec */
Const HBA_PORTSPEED_10GBIT = 4 '10 GBit/sec */
Const HBA_PORTSPEED_4GBIT = 8 '4 GBit/sec */

Const SCOM_PORTSPEED_UNKNOWN = "Unknown" 'Unknown - transceiver incapable of reporting */
Const SCOM_PORTSPEED_1GBIT = "1" '1 GBit/sec */
Const SCOM_PORTSPEED_2GBIT = "2" '2 GBit/sec */
Const SCOM_PORTSPEED_4GBIT = "4" '4 GBit/sec */
Const SCOM_PORTSPEED_10GBIT = "10" '10 GBit/sec */

Dim objArgs, SourceID, ManagedEntityId, TargetComputer, ImagePath, SerialNumber
Dim objMOMAPI, objWMIService, objDiscoveryData
Dim colobjPorts, objHBAs, AdaptName, strQuery
Dim objPort, objHBA
Dim arrOfInst(97) '2 * maxadapters.
Dim objPortInst, InstanceName
Dim bFoundInstance, Index, portIndex,SystemEntity, portWWN, FabricName
Dim HyperVGUID
Dim VMMServerName
Dim objAdapInst,objHBAPortRel

bFoundInstance = True

Set objArgs = WScript.Arguments

If WScript.Arguments.Count &gt; 0 Then
SourceId = objArgs(0)
ManagedEntityId = objArgs(1)
ImagePath = objArgs(2)
SerialNumber = objArgs(3)
AdaptName = objArgs(4)
TargetComputer = objArgs(5)
HyperVGUID = objArgs(6)
VMMServerName = objArgs(7)
End If

Set objMOMAPI = CreateObject("MOM.ScriptAPI")
Set objDiscoveryData = objMOMAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)

Set objWMIService = GetObject( "winmgmts:\\localhost\root\wmi" )
strQuery = "select * from MSFC_FCAdapterHBAAttributes Where SerialNumber='" + SerialNumber +"'"

Set objHBAs = objWMIService.ExecQuery( strQuery)
If (objHBAs is Nothing) Then
bFoundInstance = False
End If

'Get number of port InstanceNames with the same SerialNumber.
Index = 0
For Each objHBA In objHBAs
arrOfInst(Index) = objHBA.InstanceName
Index = Index + 1
Next

Set colobjPorts = objWMIService.ExecQuery("select * from MSFC_FibrePortHBAAttributes" )

If (colobjPorts is Nothing And bFoundInstance) Then
bFoundInstance = False
End If

portIndex = 0
If (colobjPorts.count &gt; 0 And bFoundInstance) Then
For Each objPort In colobjPorts
If (ChkStrExistsInArray(arrOfInst,objPort.InstanceName,Index,False) = true) Then

'Create HBA Instance and HBA PORT relation object.
Set objAdapInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.HBA']$")
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Host']/ImagePath$", ImagePath)
Call objAdapInst.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.HBA']/SerialNumber$", SerialNumber)
'End of new code.

FabricName = WWNToString(objPort.Attributes.FabricName)'unique to this adapter port.
portWWN = WWNToString(objPort.Attributes.PortWWN)'unique to this adapter port.
SystemEntity = AdaptName + "_Port" + CStr(portIndex)
Set objPortInst = objDiscoveryData.CreateClassInstance("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']$")
Call objPortInst.AddProperty ("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortWWN$", portWWN)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/UniquePortId$", objPort.UniquePortId)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortFcId$", objPort.Attributes.PortFcId)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/FabricName$", FabricName)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortSpeed$", getPortSpeed(objPort.Attributes.PortSpeed))
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/PortState$", objPort.Attributes.PortState)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/HostName$", TargetComputer)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/VMMServerName$", VMMServerName)
Call objPortInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/InstanceName$", objPort.InstanceName)
Call objAdapInst.AddProperty("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.Port']/AdapterSerialNumber$", SerialNumber)
' Added for SC2012 integation as a pre-requisite for PRO feature to work.
Call objPortInst.AddProperty("$MPElement[Name='PRO!Microsoft.SystemCenter.VirtualMachineManager.PRO.Base']/Name$", TargetComputer)
Call objDiscoveryData.AddInstance(objPortInst)

Set objHBAPortRel = objDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Brocade.FCHBA.Monitoring.2012.HBA_PORT_Relation']$")
objHBAPortRel.Source = objAdapInst
objHBAPortRel.Target = objPortInst
Call objDiscoveryData.AddInstance(objHBAPortRel)

'Call objMOMAPI.LogScriptEvent("DiscoverHBAPorts.vbs", 200, 2, "one Port instance added")
portIndex = portIndex + 1
End If
Next
End If

'Call objMOMAPI.LogScriptEvent("DiscoverHBAPorts.vbs", 200, 2, "Completed DiscoverHBAPorts.vbs.")
'Submit the discovery data for processing.
Call objMOMAPI.Return(objDiscoveryData)
WScript.Quit
'----------------------------End Of Main Fn---------------
'Converts WWN to StringWWN
Function WWNToString(arrayWWN)
Dim I
WWNToString = Hex0(arrayWWN(0))
For I = 1 To 7
WWNToString = WWNToString + ":" + Hex0(arrayWWN(I))
Next
End Function

'Returns the hexadecimal string value of input number(as two digits).
Function Hex0(n)
Hex0 = Hex(n)
If (n &lt; &amp;h10) Then Hex0 = "0" + Hex0
End Function
'If str exists then returns true
'If not exists then returns false and adds the string to the array (if bAddTo is true)
'If not exists then returns false and does not add the inputstring to the list(if bAddTo is false)
Function ChkStrExistsInArray(arrayOfStrs(),InputStr,LastItemIndex,bAddTo)
Dim I
ChkStrExistsInArray = False
For I = 0 To LastItemIndex
If (StrComp(LCase(arrayOfStrs(I)),LCase(InputStr)) = 0) Then
ChkStrExistsInArray = true
Exit For
End If
Next
If (ChkStrExistsInArray = False And bAddTo=True) Then
arrayOfStrs(LastItemIndex+1) = InputStr
End If
End Function

' Function to map the HBA constants to SCOM constant.
Function getPortSpeed(portSpeed)
Dim speed
speed = "Unknown"
If portSpeed = HBA_PORTSPEED_UNKNOWN Then
speed = SCOM_PORTSPEED_UNKNOWN
ElseIf portSpeed = HBA_PORTSPEED_1GBIT Then
speed = SCOM_PORTSPEED_1GBIT
ElseIf portSpeed = HBA_PORTSPEED_2GBIT Then
speed = SCOM_PORTSPEED_2GBIT
ElseIf portSpeed = HBA_PORTSPEED_10GBIT Then
speed = SCOM_PORTSPEED_10GBIT
ElseIf portSpeed = HBA_PORTSPEED_4GBIT Then
speed = SCOM_PORTSPEED_4GBIT
End If
getPortSpeed = speed
End Function

</Script></ScriptBody>
<TimeoutSeconds>400</TimeoutSeconds>
</DataSource>
</Discovery>