PureStorage.FlashArray.PureHost.Discovery.DS (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

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

Overrideable Parameters:

IDParameterTypeSelector
IntervalSecondsint$Config/IntervalSeconds$
SyncTimestring$Config/SyncTime$
TimeoutSecondsint$Config/TimeoutSeconds$
LogToArraybool$Config/LogToArray$

Source Code:

<DataSourceModuleType ID="PureStorage.FlashArray.PureHost.Discovery.DS" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SyncTime" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="LogToArray" type="xsd:boolean"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
<OverrideableParameter ID="LogToArray" Selector="$Config/LogToArray$" ParameterType="bool"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
<ScriptName>PureStorage.FlashArray.PureHost.Discovery.ps1</ScriptName>
<ScriptBody><Script>
param($SourceId, $ManagedEntityId, $Endpoint, $Username, $Password, $LogToArray)
# This discovery script scans for PureHosts on the host PureArray
# Returns discovery objects if any hosts are found.

function Discover-PureHosts($DiscoveryBag, $HostReference, $HostgroupReference, $HostgroupRelationshipReference) {
# Import the SCOM PowerShell module
$StartTime = Get-Date
$ScriptName = "PureHostDiscovery.ps1"
LoadOperationsManagerModule $ScriptName
$disableLoggingToArray = -not $LogToArray

$Password = $Password | ConvertTo-SecureString -AsPlainText -Force
$whoami = whoami
$momapi = New-Object -comObject "Mom.ScriptAPI"
if (!$DiscoveryBag) {
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Creating discovery data bag."
$DiscoveryBag = $momapi.CreateDiscoveryData(0, $SourceId, $ManagedEntityID)
}
Log $ScriptName $GLOBAL:INFO_LEVEL "Starting script. Running as ($whoami)"
LoadPowerShellSDK $ScriptName

# Attempts to connect to a FlashArray given the credentials, and retrieve host information
try {
$IgnoreCertErrors = GetIgnoreCertErrors $true
$FlashArray = New-PfaArray -EndPoint $Endpoint -UserName $Username -Password $Password -ClientName $GLOBAL:clientName -ClientVersion $GLOBAL:mpVersion -IgnoreCertificateError:$IgnoreCertErrors -HttpTimeOutInMilliSeconds 60000 -DisableLoggingToArray:$disableLoggingToArray
} catch {
Log $ScriptName $GLOBAL:ERROR_LEVEL "Connection to array failed on these credentials. $Username. Check that the PurePowershell cmdlet is installed, and your credentials are correct. Error: $_"
exit
}

$Hostgroups = Get-PfaHostgroups -Array $FlashArray
$Hosts = Get-PfaHosts -Array $FlashArray

# Add all discovered Hostgroup instances to $DiscoveryBag
$HostgroupInstancesHashTable = @{}
foreach ($Hostgroup in $Hostgroups) {
$Name = $Hostgroup.name

# Add property to object instance and place object in $DiscoveryBag
$instance = $DiscoveryBag.CreateClassInstance($HostgroupReference)
$instance.AddProperty("Endpoint", $Endpoint)
$instance.AddProperty("Name", $Name)
$DiscoveryBag.AddInstance($instance)
$HostgroupInstancesHashTable[$Name] = $instance
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Discovery script Pure Host Group object created. $Name"
}

# Add all discovered Host instances to $DiscoveryBag. Discover Hostgroup to Host relationships
foreach ($PureHost in $Hosts) {
$Name = $PureHost.name
$IQN = $PureHost.iqn -join ','
$WWN = $PureHost.wwn -join ','
$Hostgroup = $PureHost.hgroup
$Size = [double](Get-PfaHostSpaceMetrics -Array $FlashArray -Name $PureHost.name).size / (1024*1024)
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Discovered host ($Name, $IQN, $WWN, $HostGroup)"

# Add property to object instance and place object in $DiscoveryBag
$instance = $DiscoveryBag.CreateClassInstance($HostReference)
$instance.AddProperty("Endpoint", $Endpoint)
$instance.AddProperty("Name", $Name)
$instance.AddProperty("IQN", $IQN)
$instance.AddProperty("WWN", $WWN)
$instance.AddProperty("Hostgroup", $Hostgroup)
$instance.AddProperty("Size", $Size)
$DiscoveryBag.AddInstance($instance)


if ($Hostgroup -ne $null) {
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Retrieving ($Hostgroup) data"
$hostGroupInstance = $HostgroupInstancesHashTable[$Hostgroup]
if ($hostGroupInstance) {
$relationshipInstance = $momapi.CreateRelationshipInstance($HostgroupRelationshipReference)
$relationshipInstance.Source = $HostgroupInstance
$relationshipInstance.Target = $instance
$DiscoveryBag.AddInstance($relationshipInstance)
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Relationship between $Hostgroup and $Name discovered."
}
}
Log $ScriptName $GLOBAL:VERBOSE_LEVEL "Discovery script Pure Host object created. $Name"
}
Disconnect-PfaArray -Array $FlashArray

$EndTime = Get-Date
$ScriptTime = ($EndTime - $StartTime).TotalSeconds
Log $ScriptName $GLOBAL:INFO_LEVEL "Script has completed. Runtime was ($ScriptTime) seconds."
$DiscoveryBag
}function SetLogLevel ($LogLevel){
Write-Host "Setting LogLevel to $LogLevel"
if ($LogLevel -ge 1 -and $LogLevel -le 4){
New-Item -Path HKLM:\SOFTWARE\PureStorage\SCOM -Name LogLevel -Force
Set-Item -Path HKLM:\SOFTWARE\PureStorage\SCOM\LogLevel -Value $LogLevel
$GLOBAL:CURRENT_LOG_LEVEL = $LogLevel
}
}

function GetLogLevel ($default){
if (Test-Path HKLM:\SOFTWARE\PureStorage\SCOM\LogLevel){
$item = Get-ItemProperty "HKLM:\SOFTWARE\PureStorage\SCOM\LogLevel"
$log_level = $item.'(default)'
$log_level
}
else
{
$default
}
}

function SetIgnoreCertErrors ($value){
Write-Host "Setting IgnoreCertErros to $value"
New-Item -Path HKLM:\SOFTWARE\PureStorage\SCOM -Name IgnoreCertErrors -Force
Set-Item -Path HKLM:\SOFTWARE\PureStorage\SCOM\IgnoreCertErrors -Value $value
}

function GetIgnoreCertErrors ($default){
if (Test-Path HKLM:\SOFTWARE\PureStorage\SCOM\IgnoreCertErrors){
$item = Get-ItemProperty "HKLM:\SOFTWARE\PureStorage\SCOM\IgnoreCertErrors"
$log_level = [bool]($item.'(default)')
$log_level
}
else
{
$default
}
}


function InitLogging () {
$GLOBAL:MOMAPI = New-Object -comObject "Mom.ScriptAPI"
$GLOBAL:mpVersion = (Get-SCOMManagementPack -name "PureStorageFlashArray").Version.ToString()
if(!$GLOBAL:mpVersion) {$GLOBAL:mpVersion = 'unknown'}
$GLOBAL:clientName = "SCOM"
##### LOG LEVEL ####
# 1 Errors
# 2 Warnings
# 3 Information
# 4 Verbose
$GLOBAL:ERROR_LEVEL = 1
$GLOBAL:WARNING_LEVEL = 2
$GLOBAL:INFO_LEVEL = 3
$GLOBAL:VERBOSE_LEVEL = 4
$GLOBAL:CURRENT_LOG_LEVEL = GetLogLevel $GLOBAL:VERBOSE_LEVEL

$GLOBAL:LOG_CODES_MAP = @{}
$GLOBAL:DEFAULT_LOG_CODE = 5555
################## Discoveries ##################
$GLOBAL:LOG_CODES_MAP.Add("PureVolumeDiscovery.ps1", 2001)
$GLOBAL:LOG_CODES_MAP.Add("PurePortDiscovery.ps1", 2002)
$GLOBAL:LOG_CODES_MAP.Add("PureHostDiscovery.ps1", 2003)
$GLOBAL:LOG_CODES_MAP.Add("PureControllerDiscovery.ps1", 2004)
$GLOBAL:LOG_CODES_MAP.Add("PureArrayDiscovery.ps1", 2005)
$GLOBAL:LOG_CODES_MAP.Add("InitialArrayDiscovery.ps1", 2006)
##################### Rules #######################
$GLOBAL:LOG_CODES_MAP.Add("AlertsRule.ps1", 2101)
$GLOBAL:LOG_CODES_MAP.Add("ArrayPerformanceRule.ps1", 2102)
$GLOBAL:LOG_CODES_MAP.Add("HostgroupPerformanceRule.ps1", 2103)
$GLOBAL:LOG_CODES_MAP.Add("HostPerformanceRule.ps1", 2104)
$GLOBAL:LOG_CODES_MAP.Add("VolumePerformanceRule.ps1", 2105)
#################### Monitors ######################
$GLOBAL:LOG_CODES_MAP.Add("AlertsRuleMonitor.ps1", 2201)
$GLOBAL:LOG_CODES_MAP.Add("ArrayIOSpaceMonitor.ps1", 2202)
$GLOBAL:LOG_CODES_MAP.Add("ConnectionHealthMonitor.ps1", 2203)
$GLOBAL:LOG_CODES_MAP.Add("ControllerHealthMonitor.ps1", 2204)
$GLOBAL:LOG_CODES_MAP.Add("VolumeIOMonitor.ps1", 2205)
$GLOBAL:LOG_CODES_MAP.Add("HostIOMonitor.ps1", 2206)
$GLOBAL:LOG_CODES_MAP.Add("PortHealthMonitor.ps1", 2207)
##################### Tasks #######################
$GLOBAL:LOG_CODES_MAP.Add("NewHostTask.ps1", 2301)
$GLOBAL:LOG_CODES_MAP.Add("NewVolumeTask.ps1", 2302)
$GLOBAL:LOG_CODES_MAP.Add("VerifyEndpointTask.ps1", 2303)
################### Dashboards ####################
$GLOBAL:LOG_CODES_MAP.Add("PureVolumeState.ps1", 2401)
$GLOBAL:LOG_CODES_MAP.Add("PureArrayDashboardIOPSData.ps1", 2402)
$GLOBAL:LOG_CODES_MAP.Add("PureArrayDashboardLatencyData.ps1", 2403)
$GLOBAL:LOG_CODES_MAP.Add("PureArrayDashboardBandwidthData.ps1", 2404)
$GLOBAL:LOG_CODES_MAP.Add("PureHostState.ps1", 2405)
$GLOBAL:LOG_CODES_MAP.Add("PureArrayDashboardSpaceMetricsData.ps1", 2406)
}

function GetLogCode ($filename) {
$code = $GLOBAL:LOG_CODES_MAP[$filename]
if ($code -eq $null) {
$code = $DEFAULT_LOG_CODE
}
return $code
}

function GetSCOMLogLevel ($level) {
switch ($level){
$GLOBAL:ERROR_LEVEL {1}
$GLOBAL:WARNING_LEVEL {2}
$GLOBAL:INFO_LEVEL {0}
$GLOBAL:VERBOSE_LEVEL {0}
}
}

function Log ($script_name, $level, $message) {
if ($level -le $GLOBAL:CURRENT_LOG_LEVEL){
$code = GetLogCode $script_name
$level = GetSCOMLogLevel $level
if($GLOBAL:mpVersion -eq 'unknown') {$GLOBAL:mpVersion = (Get-SCOMManagementPack -name "PureStorageFlashArray").Version.ToString()}
$fullScriptName = "$script_name" + " [$GLOBAL:mpVersion]"
$GLOBAL:MOMAPI.LogScriptEvent($fullScriptName, $code, $level, $message)
}
}

function LoadPowerShellSDK ($script_name){
Log $script_name $GLOBAL:VERBOSE_LEVEL "Importing PowerShell SDK in $script_name"

try {
$PurePowerShellSDKKey = Get-ItemProperty "HKLM:\SOFTWARE\PureStorage\SCOM\PowerShellSDKPath"
$PurePowerShellSDKLocation = $PurePowerShellSDKKey.'(default)'
Log $script_name $GLOBAL:VERBOSE_LEVEL "Importing PowerShell SDK from $PurePowerShellSDKLocation"
Import-Module $PurePowerShellSDKLocation -Verbose
}
catch {
Log $script_name $GLOBAL:ERROR_LEVEL "Failed to import PowerShell SDK from $PurePowerShellSDKLocation"
}
}

function LoadOperationsManagerModule ($script_name)
{
Log $script_name $GLOBAL:INFO_LEVEL "Importing Operations Manager module in $script_name"
try
{
# https://blogs.technet.microsoft.com/cchamp/2015/09/30/loading-the-scom-powershell-module-for-real-this-time/
$OMCmdletsTest = (Get-Module|% {$_.Name}) -Join ' '
If (!$OMCmdletsTest.Contains('OperationsManager')) {
$ModuleFound = $false
$SetupKeys = @('HKLM:\Software\Microsoft\Microsoft Operations Manager\3.0\Setup',
'HKLM:\SOFTWARE\Microsoft\System Center Operations Manager\12\Setup')
foreach($setupKey in $SetupKeys) {
If ((Test-Path $setupKey) -and ($ModuleFound -eq $false)) {
$setupKey = Get-Item -Path $setupKey
$installDirectory = $setupKey.GetValue('InstallDirectory')
$psmPath = $installdirectory + '\Powershell\OperationsManager\OperationsManager.psm1'
If (Test-Path $psmPath) {
$ModuleFound = $true
}
}
}
If ($ModuleFound) {
Import-Module $psmPath
} else {
Import-Module OperationsManager
}
}
else { Log $ScriptName $GLOBAL:INFO_LEVEL "Operations Manager module is already present" }
}
catch
{
Log $script_name $GLOBAL:INFO_LEVEL "Failed to import Operations Manager: $_"
}
}

InitLogging


Discover-PureHosts -HostReference $MPElement[Name='PureStorage.FlashArray.PureHost']$ -HostgroupReference $MPElement[Name='PureStorage.FlashArray.PureHostgroup']$ -HostgroupRelationshipReference $MPElement[Name='PureStorage.FlashArray.HostgroupHost.Relationship']$
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>SourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>Endpoint</Name>
<Value>$Target/Property[Type="PureStorage.FlashArray.PureArray"]/Endpoint$</Value>
</Parameter>
<Parameter>
<Name>Username</Name>
<Value>$RunAs[Name="PureStorage.FlashArray.FlashArrayAdminAccount"]/UserName$</Value>
</Parameter>
<Parameter>
<Name>Password</Name>
<Value>$RunAs[Name="PureStorage.FlashArray.FlashArrayAdminAccount"]/Password$</Value>
</Parameter>
<Parameter>
<Name>LogToArray</Name>
<Value>$Config/LogToArray$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>