Data source for VMHost Impact state used by TimedDiscovery

com.apcc.ISXO.PRO.VMHostImpact.ImpactMonitorDSM (DataSourceModuleType)

Provides state information for the VMHosts known by StruxureWare Operations

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
DS1.Scheduler DataSource System.Scheduler Default
DS1.Probe ProbeAction Microsoft.Windows.PowerShellPropertyBagProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Interval (seconds)The interval in seconds
SyncTimestring$Config/SyncTime$SyncTimeSyncTime
TimeoutSecondsint$Config/TimeoutSeconds$Timeout (seconds)The timeout in seconds

Source Code:

<DataSourceModuleType ID="com.apcc.ISXO.PRO.VMHostImpact.ImpactMonitorDSM" Accessibility="Public" Batching="false">
<Configuration>
<xsd:element minOccurs="1" name="Endpoint" type="xsd:string"/>
<xsd:element minOccurs="1" name="Username" type="xsd:string"/>
<xsd:element minOccurs="1" name="Password" type="xsd:string"/>
<xsd:element minOccurs="1" name="VMMServer" type="xsd:string"/>
<xsd:element minOccurs="1" name="Port" type="xsd:string"/>
<xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element minOccurs="1" name="SyncTime" type="xsd:string"/>
<xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</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="DS1.Scheduler" TypeID="System!System.Scheduler">
<Scheduler>
<SimpleReccuringSchedule>
<Interval>$Config/IntervalSeconds$</Interval>
<SyncTime>$Config/SyncTime$</SyncTime>
</SimpleReccuringSchedule>
<ExcludeDates/>
</Scheduler>
</DataSource>
<ProbeAction ID="DS1.Probe" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
<ScriptName>com.apcc.ISXO.VMHostImpact.Monitoring.ps1</ScriptName>
<ScriptBody><Script>#############################################################################
# Filename: com.apcc.ISXO.PRO.VMHostImpact.Monitoring.ps1
#############################################################################
Param($endpoint, $username, $password, $vmmServerName, $vmmServerPort)

$isDebug = $false;

function LogInfo($logMessage, $doLog = $isDebug) {
if ($doLog) {
[Diagnostics.EventLog]::WriteEntry("PRO Monitoring", "Info: " + $logMessage);
}
}

function LogError($logMessage) {
[Diagnostics.EventLog]::WriteEntry("PRO Monitoring", "Error: " + $logMessage);
}

LogInfo("Request: Monitoring on VMM server: " + $vmmServerName + " Port: " + $vmmServerPort + " from: " + $endpoint) $false;

if ($username -eq $null -or $password -eq $null) {
LogError("Credentials missing");
eventcreate /T Error /ID 100 /L APPLICATION /SO VMMPro /D 'Monitoring credentials missing.';
return;
}

LogInfo("Monitoring started");

$vmmServer = Get-VMMServer -computerName $vmmServerName -TCPPort $vmmServerPort;

if ($Error.Count -ne 0) {
LogError("Unable to connect to VMM server: " + $Error[0]);
return;
}

$vmmServerHosts = Get-VMHost -vmmserver $vmmServer;
if (!$vmmServerHosts) {
return;
}

$impactedHosts = get-vmhoststate $endpoint $username $password $vmmServer;

$impactedHostsHashTable = @{};
$vmmServerHostsHashTable = @{};

foreach($impactedHost in $impactedHosts){
$impactedHostsHashTable.Add($impactedHost.Identifier.ToLower(), $impactedHost.Identifier.ToLower());
}

foreach($vmmServerHost in $vmmServerHosts){
$vmmServerHostsHashTable.Add($vmmServerHost.FQDN.ToLower(), $vmmServerHost.FQDN.ToLower());
}

foreach($vmmServerHost in $vmmServerHosts){
if($vmmServerHost.MaintenanceHost -eq $true){
if(-not $impactedHostsHashTable.ContainsKey($vmmServerHost.FQDN.ToLower())){
$eventLogs = Get-EventLog "Application" | Where-Object {$_.Message -eq "Info: " + " Host: " + $vmmServerHost.FQDN +" is not impacted. It is now safe to remove it from Maintenance Mode."};
if($eventLogs -eq $null){
[Diagnostics.EventLog]::WriteEntry("StruxureWare Operations PROPack", "Info: " + " Host: " + $vmmServerHost.FQDN +" is not impacted. It is now safe to remove it from Maintenance Mode.");
}
}
}
}

if ($Error.Count -ne 0) {
LogError("Unable to get VM host impact on VMM server: " + $vmmServerName + " from : " + $endpoint + ": " + $Error[0]);
$vmmServer.Disconnect();
return;
}

$momAPI = New-Object -comObject 'MOM.ScriptAPI'
if ($Error.Count -ne 0) {
LogError("Unable create script API: " + $Error[0]);
$vmmServer.Disconnect();
return;
}

$impactedHostsSet = @{};
foreach ($impactedHost in $impactedHosts) {
LogInfo("VM Hosts: " + $impactedHost.Identifier + " is not healthy: " + $impactedHost.Severity);
$state = switch ($impactedHost.Severity) {
"CRITICAL"
{"Critical" }
"WARNING"
{ "Healthy" } # convert warning to healthy
default
{ "Unknown" }
}
$bag = $momAPI.CreatePropertyBag();
$bag.AddValue("Identifier", $impactedHost.Identifier);
$bag.AddValue("State", $state);
$bag.AddValue("Description", $impactedHost.Description);
$bag;

$impactedHostsSet[$impactedHost.Identifier] = $true;
}

$vmhosts = get-vmhost -vmmserver $vmmServer
if ($Error.Count -ne 0) {
LogError("Unable to get information about VM hosts from VMM server: " + $vmmServerName + ": " + $Error[0]);
$vmmServer.Disconnect();
return;
}

# Handle healthy hosts
foreach ($vmhost in $vmhosts) {
$hostIdentifier = $vmhost.FQDN.toLower();
if (-not $impactedHostsSet.ContainsKey($hostIdentifier)) {
LogInfo("VM Hosts: " + $hostIdentifier + " is healthy");
$bag = $momAPI.CreatePropertyBag();
$bag.AddValue("Identifier", $hostIdentifier);
$bag.AddValue("State", "Healthy");
$bag;
}
}

$vmmServer.Disconnect();

LogInfo("Monitoring done");</Script></ScriptBody>
<SnapIns>
<SnapIn>Microsoft.SystemCenter.VirtualMachineManager</SnapIn>
<SnapIn>APC.ISXO.ITImpact</SnapIn>
</SnapIns>
<Parameters>
<Parameter>
<Name>endpoint</Name>
<Value>$Config/Endpoint$</Value>
</Parameter>
<Parameter>
<Name>username</Name>
<Value>$Config/Username$</Value>
</Parameter>
<Parameter>
<Name>password</Name>
<Value>$Config/Password$</Value>
</Parameter>
<Parameter>
<Name>vmmServerName</Name>
<Value>$Config/VMMServer$</Value>
</Parameter>
<Parameter>
<Name>vmmServerPort</Name>
<Value>$Config/Port$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="DS1.Probe">
<Node ID="DS1.Scheduler"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>