S2D 2016: Virtual Disk Discovery Data Source

Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.Discovery.DataSource.VirtualDisk (DataSourceModuleType)

Virtual disk discovery data source.

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
Scheduler DataSource System.Discovery.Scheduler Default
Script ProbeAction Microsoft.Windows.PowerShellDiscoveryProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Interval (sec)
SyncTimestring$Config/SyncTime$Sync Time
TimeoutSecondsint$Config/TimeoutSeconds$Timeout (sec)

Source Code:

<DataSourceModuleType ID="Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.Discovery.DataSource.VirtualDisk" Accessibility="Internal">
<Configuration>
<IncludeSchemaTypes>
<SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
<SchemaType>System!System.ExpressionEvaluatorSchema</SchemaType>
</IncludeSchemaTypes>
<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" minOccurs="1" maxOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SyncTime" type="xsd:string"/>
</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"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
<Scheduler>
<SimpleReccuringSchedule>
<Interval>$Config/IntervalSeconds$</Interval>
<SyncTime>$Config/SyncTime$</SyncTime>
</SimpleReccuringSchedule>
<ExcludeDates/>
</Scheduler>
</DataSource>
<ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.PowerShellDiscoveryProbe">
<ScriptName>VirtualDiskDiscoveryDataSourceScript.ps1</ScriptName>
<ScriptBody><Script>

param($ssUniqueId, $serverPrincipalName, $SourceId, $ManagedEntityId)
#general variables
#-----------------
$errorActionPreference = 'Stop'
$momAPI = New-Object -comObject 'MOM.ScriptAPI'

$errEvent = [System.Diagnostics.EventLogEntryType]::Error;
$infoEvent = [System.Diagnostics.EventLogEntryType]::Information;

Function AddTraceMessage
{
param($message)
$timeStamp = (get-date -format "HH:mm:ss:fff");
$script:traceMsg = $script:traceMsg + "`n[" + $timeStamp + "] " + $message;
}
$script:traceMsg = "";
$msft_namespace = "root\microsoft\windows\storage"
$cluster_namespace = "root\mscluster"
#-----------------
#Copyright (c) Microsoft Corporation. All rights reserved.

$GenericInformationEvent = 8861;
$GenericFailureEvent = 8862;
$scriptName = "VirtualDiskDiscoveryDataSourceScript.ps1"

Function Main
{
$oDiscoveryData = $momAPI.CreateDiscoveryData(0, $SourceId, $ManagedEntityId);

if ((DoDiscovery $ssUniqueId $serverPrincipalName $oDiscoveryData) -ne 0)
{
$oDiscoveryData = $momAPI.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)
$oDiscoveryData.IsSnapshot = $false
}

$oDiscoveryData
}

Function DoDiscovery
{
param ([string] $argSSUniqueId, $argPrincipalName, $oDisc)
$error.Clear()
$errorCount = 0
$errorActionPreference = "Stop"
try
{
$storageModule = get-module -name "Storage"
if ($storageModule -eq $null)
{
Import-Module Storage
}

$substorage = Get-StorageSubSystem -UniqueID $argSSUniqueId

if ($substorage -ne $null)
{
$associatedVD = @()
$associatedVD += (Get-CimAssociatedInstance -InputObject $substorage -Association MSFT_StorageSubSystemToVirtualDisk -Namespace $msft_namespace)
if ($associatedVD -ne $null -and $associatedVD.Count -gt 0)
{
foreach ($vDisk in $associatedVD)
{
$vdInstance = $oDisc.CreateClassInstance("$MPElement[Name='Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.VirtualDisk']$");
$vdInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $argPrincipalName)
$vdInstance.AddProperty("$MPElement[Name='MicrosoftStorageLibrary!Microsoft.Storage.Library.Windows.Disk']/UniqueID$", $vDisk.UniqueID)
$vdInstance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.VirtualDisk']/FriendlyName$", $vDisk.FriendlyName)
$vdInstance.AddProperty("$MPElement[Name='MicrosoftStorageLibrary!Microsoft.Storage.Library.Windows.Disk']/Name$", $vDisk.Name)
$vdInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $vDisk.FriendlyName)

$oDisc.AddInstance($vdInstance)
}
}
}
else
{
#Can't find Storage SubSystem with the provided UniqueID
#Throw [System.NullReferenceException] -join("Can't find Storage SubSystem with UniqueID = ", $storageSubSystemUniqueID);
}
}
catch
{
$errorCount += $error.Count
AddTraceMessage -message $_.Exception.Message
}
finally
{
if ($script:traceMsg -ne $null)
{
#Debug event
$momAPI.LogScriptEvent($scriptName, $GenericInformationEvent, 0, $script:traceMsg);
}

if ($error -ne $null -and $error.Count -gt 0 -and $error[0] -ne $null)
{
$momAPI.LogScriptEvent($scriptName, $GenericFailureEvent, 1, $error[0].ToString());
}
}
return $errorCount
}

Main</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>ssUniqueId</Name>
<Value>$Target/Property[Type="MicrosoftStorageLibrary!Microsoft.Storage.Library.StorageArray"]/UniqueID$</Value>
</Parameter>
<Parameter>
<Name>serverPrincipalName</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
<Parameter>
<Name>SourceId</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityId</Name>
<Value>$Target/Id$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Script">
<Node ID="Scheduler"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>