HPC 2008 R2 Node Discovery

Microsoft.HPC.2008R2.Discovery.Node (Discovery)

Element properties:

TargetMicrosoft.HPC.2008R2.ActiveHeadNode
EnabledTrue
Frequency86400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.HPC.2008R2.Module.TimedPowershellDiscoveryProvider Microsoft.HPC.RunAsProfile.AdminActionAccount

Source Code:

<Discovery ID="Microsoft.HPC.2008R2.Discovery.Node" Enabled="true" Target="Microsoft.HPC.2008R2.ActiveHeadNode" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.HPC.2008R2.NodeGroup"/>
<DiscoveryClass TypeID="Microsoft.HPC.2008R2.HeadNode"/>
<DiscoveryClass TypeID="Microsoft.HPC.2008R2.ComputeNode"/>
<DiscoveryClass TypeID="Microsoft.HPC.2008R2.BrokerNode"/>
<DiscoveryClass TypeID="Microsoft.HPC.2008R2.WorkstationNode"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.ClusterHostsNodeGroup"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.NodeGroupContainsNode"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.ClusterContainsHeadNode"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.ClusterContainsComputeNode"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.ClusterContainsBrokerNode"/>
<DiscoveryRelationship TypeID="Microsoft.HPC.2008R2.ClusterContainsWorkstationNode"/>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="HPCLibrary!Microsoft.HPC.RunAsProfile.AdminActionAccount" TypeID="Microsoft.HPC.2008R2.Module.TimedPowershellDiscoveryProvider">
<ScriptName>DiscoverHpcNode</ScriptName>
<ScriptBody><Script>

param($sourceId, $managedEntityId, $clusterName)

trap [Exception]
{
$severity = "Error"
$eventId = 301 # Discovery Failure Event
$message = "'Discovery Failure for Microsoft.HPC.2008R2.Discovery.Node: " + $_.Exception.Message.Replace('"', '').Replace("'", "") + "'"
eventcreate /T $severity /ID $eventId /L Application /SO HPCManagementPack /D $message
break
}

$momApi = New-Object -ComObject 'MOM.ScriptAPI'
$discoveryData = $momApi.CreateDiscoveryData(0, $sourceId, $managedEntityId)

Add-PSSnapin Microsoft.HPC

# Global variables
$nodeGroups = @{}
$roleTable = @{
"HeadNode" = "$MPElement[Name='Microsoft.HPC.2008R2.HeadNode']$";
"ComputeNode" = "$MPElement[Name='Microsoft.HPC.2008R2.ComputeNode']$";
"BrokerNode" = "$MPElement[Name='Microsoft.HPC.2008R2.BrokerNode']$";
"WorkstationNode" = "$MPElement[Name='Microsoft.HPC.2008R2.WorkstationNode']$";
}

$roleRelationTable = @{
"HeadNode" = "$MPElement[Name='Microsoft.HPC.2008R2.ClusterContainsHeadNode']$";
"ComputeNode" = "$MPElement[Name='Microsoft.HPC.2008R2.ClusterContainsComputeNode']$";
"BrokerNode" = "$MPElement[Name='Microsoft.HPC.2008R2.ClusterContainsBrokerNode']$";
"WorkstationNode" = "$MPElement[Name='Microsoft.HPC.2008R2.ClusterContainsWorkstationNode']$";
}

$roleNames = @{
"HeadNode" = "Head Node Role";
"ComputeNode" = "Compute Node Role";
"BrokerNode" = "Broker Node Role";
"WorkstationNode" = "Workstation Node Role";
}


# Discover Node Groups
$groups = Get-HpcGroup -Scheduler $clusterName
$azureGroup = ""
$groups | % {
if ($_.Id -ne 4) # exlude Azure node group
{
$group = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.HPC.2008R2.NodeGroup']$")
$group.AddProperty("$MPElement[Name='HPCLibrary!Microsoft.HPC.Cluster']/ClusterName$", $clusterName)
$group.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.NodeGroup']/Name$", $_.Name)
$group.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.NodeGroup']/Description$", $_.Description)
$group.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $_.Name)
$discoveryData.AddInstance($group)
$nodeGroups.Add($_.Name, $group)
}
else
{
$azureGroup = $_.Name
}
}

# Discover Node
$nodes = Get-HpcNode -State Provisioning,Offline,Starting,Online,Draining -Scheduler $clusterName
$nodes | % {
$isAzureNode = $false
if (($_.Groups -ne $null) -and ($_.Groups -ne "") -and ($azureGroup -ne ""))
{
$groups = $_.Groups.Split(',')
foreach ($group in $groups)
{
if ($group -eq $azureGroup)
{
$isAzureNode = $true
break
}
}
}

if ((-not $isAzureNode) -and ($_.FullyQualifiedDnsName -ne $null) -and ($_.FullyQualifiedDnsName -ne ""))
{
$node = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.HPC.2008R2.Node']$")
$node.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $_.FullyQualifiedDnsName)
$node.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/DNSName$", $_.FullyQualifiedDnsName)
$node.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/NetworkName$", $_.FullyQualifiedDnsName)
$node.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$", $_.NetBiosName)
$node.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.Node']/ClusterName$", $clusterName)
$node.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.Node']/Version$", $_.Version)
$node.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.Node']/InstallationPath$", $_.CcpInstallationPath)
$node.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.Node']/MachineGuid$", $_.MachineGuid)
$node.AddProperty("$MPElement[Name='Microsoft.HPC.2008R2.Node']/Template$", $_.Template)
$node.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $_.FullyQualifiedDnsName)
$discoveryData.AddInstance($node)

# Create the node instance again that only contains properties in the base class
# This allows the instance to be used to create the relationship before the derived instance is actually created
$node = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.HPC.2008R2.Node']$")
$node.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $_.FullyQualifiedDnsName)

# Discover relationship with node groups
if (($_.Groups -ne $null) -and ($_.Groups -ne ""))
{
$groups = $_.Groups.Split(',')
foreach ($group in $groups)
{
if ($nodeGroups.ContainsKey($group))
{
$nodeGroup = $nodeGroups.Get_Item($group)
$relationship = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.HPC.2008R2.NodeGroupContainsNode']$")
$relationship.Source = $nodeGroup
$relationship.Target = $node
$discoveryData.AddInstance($relationship)
}
}
}

# Discover node roles

$roles = New-Object System.Collections.ArrayList
if ($_.IsHeadNode)
{
$roles.Add("HeadNode")
}

if ($_.NodeRole -ne "None")
{
foreach ($nodeRole in ([string]$_.NodeRole).Split(','))
{
$roles.Add($nodeRole.Trim())
}
}


$cluster = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.HPC.2008R2.Cluster']$")
$cluster.AddProperty("$MPElement[Name='HPCLibrary!Microsoft.HPC.Cluster']/ClusterName$", $clusterName)
$discoveryData.AddInstance($cluster)

foreach ($nodeRole in $roles)
{
if ($roleTable.ContainsKey($nodeRole))
{
$element = $roleTable.Get_Item($nodeRole)
$displayName = $roleNames.Get_Item($nodeRole)
$role = $discoveryData.CreateClassInstance($element)
$role.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $_.FullyQualifiedDnsName)
$role.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $_.NetBiosName + " " + $displayName)
$discoveryData.AddInstance($role)

$relationshipName = $roleRelationTable.Get_Item($nodeRole)
$relationship = $discoveryData.CreateRelationshipInstance($relationshipName)
$relationship.Source = $cluster
$relationship.Target = $role
$discoveryData.AddInstance($relationship)
}
}
}
}

$momApi.Return($discoveryData)

</Script></ScriptBody>
<Parameters>'$MPElement$' '$Target/Id$' '$Target/Property[Type='Microsoft.HPC.2008R2.ActiveHeadNode']/ClusterName$'</Parameters>
<IntervalSeconds>86400</IntervalSeconds>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>