Veeam Virtualization Extensions for System Center Topology discovery

Veeam.Virt.Extensions.VMware.EMTopology.Discovery (Discovery)

Knowledge Base article:

Summary

This rule is used to discover (create) instances of Veeam MP for VMware objects in Operations Manager.

These discovery rules will insert objects such as vSphere hosts, clusters, virtual machines, and also Veeam MP for VMware elements such as the Collector itself.

This discovery will create objects in Operations Manager which may be essential for Veeam MP for VMware functionality and should not be disabled or modified unless advised by Veeam support.

External

Refer to the Microsoft System Center Online Documentation for more information on Operations Manager features such as discoveries.

Refer to the Veeam MP for VMware Documentation (especially the Operations Guide) for more details on advanced MP functionality such as Proxy agent monitoring, 'cascaded' discoveries, group management etc.

Element properties:

TargetVeeam.Virt.Extensions.VMware.EMServer
EnabledTrue
Frequency14400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Veeam.Virt.Extensions.ScriptDatasource.Discovery Default

Source Code:

<Discovery ID="Veeam.Virt.Extensions.VMware.EMTopology.Discovery" Enabled="true" Target="Veeam.Virt.Extensions.VMware.EMServer" ConfirmDelivery="false" Remotable="false" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Veeam.Virt.Extensions.VMware.EMCollector">
<Property TypeID="Veeam.Virt.Extensions.VMware.EMCollector" PropertyID="CollectorVersion"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMCollector" PropertyID="VEMServer"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMCollector" PropertyID="id"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Veeam.Virt.Extensions.VMware.EMTarget">
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMTarget" PropertyID="type"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMTarget" PropertyID="target"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMTarget" PropertyID="version"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMTarget" PropertyID="port"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Veeam.Virt.Extensions.VMware.EMServer">
<Property TypeID="Veeam.Virt.Extensions.VMware.EMServer" PropertyID="licSockets"/>
<Property TypeID="Veeam.Virt.Extensions.VMware.EMServer" PropertyID="licSocketsHyperV"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Veeam.Virt.Extensions.ScriptDatasource.Discovery">
<IntervalSeconds>14400</IntervalSeconds>
<SyncTime/>
<ScriptName>EMDiscovery.js</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ 0</Arguments>
<ScriptBody><Script>

var ARGUMENTS_COUNT = 4;
var SCRIPT_NAME = "EMDiscovery.js";
var SEVERITY_ERROR = 1;
var SEVERITY_WARNING = 2;
var SEVERITY_INFO = 4;

var sourceId = null;
var managedEntityId = null;
var targetComputer = null;
var bLoggingEnabled = true;

var momApi = null;
var discoveryData = null;
var eventId = 1001;
var logText = "";

var licEd = "";

Main();

function Main() {
try {
momApi = new ActiveXObject("MOM.ScriptAPI");
SetGlobalVarsFromArguments();

discoveryData = momApi.CreateDiscoveryData(0, sourceId, managedEntityId);
discoveryData.isSnapshot = true;

licEd = GetEMLicEdition();

var shell = new ActiveXObject("WScript.Shell");
var dbFilePath = shell.RegRead("HKLM\\SOFTWARE\\Veeam\\Veeam Virtualization Extensions for VMware\\Manager\\dbFilePath");

if (dbFilePath == "") {
discoveryData.IsSnapshot = false;
momApi.Return(discoveryData);
return;
}

var _xmlDoc = GetXMLDoc(dbFilePath);
if (_xmlDoc == null) {
discoveryData.IsSnapshot = false;
momApi.Return(discoveryData);
return;
}

DiscoveryEMTopology(_xmlDoc);
DiscoverEMServerProps();
momApi.Return(discoveryData);

} catch (e) {
QuitOnError(e.message);
}
}

function SetGlobalVarsFromArguments() {
if (WScript.Arguments.length != ARGUMENTS_COUNT) {
QuitOnError("Invalid argument count");
}
sourceId = WScript.Arguments(0);
managedEntityId = WScript.Arguments(1);
targetComputer = WScript.Arguments(2);
bLoggingEnabled = WScript.Arguments(3);
}

function QuitOnError(message_in) {
if (discoveryData != null) {
discoveryData.IsSnapshot = false;
momApi.Return(discoveryData);
}
LogScriptEvent(message_in, SEVERITY_ERROR);
WScript.Quit(0);
}

function QuitWithWarning(message_in) {
discoveryData.IsSnapshot = false;
momApi.Return(discoveryData);
LogScriptEvent(message_in, SEVERITY_WARNING);
WScript.Quit(0);
}

function LogScriptEvent(message_in, severity_in) {
momApi.LogScriptEvent(SCRIPT_NAME, eventId, severity_in, message_in);
}

function GetXMLDoc(path_in) {
var _fso = new ActiveXObject("Scripting.FileSystemObject");
if (!_fso.FileExists(path_in)) {
eventId = 1002;
QuitWithWarning("Veeam Extensions Service configuration file '" + path_in + "' not found.");
return null;
}

var _xdoc = new ActiveXObject("Microsoft.XMLDOM");
_xdoc.setProperty("SelectionLanguage", "XPath");
_xdoc.validateOnParse = false;

if (_xdoc.load(path_in)) {
return _xdoc;
} else {
eventId = 1001;
QuitOnError("Error Loading XML document " + path_in + " - " + _xdoc.parseError.reason);
return null;
}
}

function GetDataFromNode(xmlNode_in) {
var _dict = new ActiveXObject("Scripting.Dictionary");
var _nodes = xmlNode_in.childNodes;
for (var _i = 0; _i &lt; _nodes.length; _i++) {
var _node = _nodes.item(_i);
_dict.Add(_node.nodeName, _node.text);
}

return _dict;
}

function GetValueSafe(dictionary_in, valueName_in) {
var _value = "";
if (dictionary_in.Exists(valueName_in)) {
_value = dictionary_in.Item(valueName_in);
}
return _value;
}

function DiscoveryEMTopology(xmlDoc_in) {
var _monitoringGroups = xmlDoc_in.selectNodes("//*[ local-name() = 'MonitoringGroup' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']");
var _mgNameDict = new ActiveXObject("Scripting.Dictionary");
var _i = 0;
for (_i = 0; _i &lt; _monitoringGroups.length; _i++) {
var _mgNode = _monitoringGroups.item(_i);
var _mgProps = GetDataFromNode(_mgNode);
CreateMonitoringGroup(_mgProps);
var _mgid = GetValueSafe(_mgProps, "ID");
if (!_mgNameDict.Exists(_mgid))
_mgNameDict.Add(_mgid, GetValueSafe(_mgProps, "Name"));
}

var _collectors = xmlDoc_in.selectNodes("//*[ local-name() = 'Collector' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']");
var _i = 0;
for (_i = 0; _i &lt; _collectors.length; _i++) {
CreateCollector(_collectors.item(_i), _mgNameDict);
}

var _targets = xmlDoc_in.selectNodes("//*[ local-name() = 'Target' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']");
for (_i = 0; _i &lt; _targets.length; _i++) {
CreateTarget(_targets.item(_i), xmlDoc_in);
}
}

function CreateMonitoringGroup(dictionary_in) {
var _monitoringGroup = discoveryData.CreateClassInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup']$");
_monitoringGroup.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup']/id$", GetValueSafe(dictionary_in, "ID"));
_monitoringGroup.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", GetValueSafe(dictionary_in, "Name"));
_monitoringGroup.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputer);
discoveryData.AddInstance(_monitoringGroup);
}

function CreateCollector(xmlNode_in, mgDict_in) {
var _collector = discoveryData.CreateClassInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']$");
var _nodePropertiesDict = GetDataFromNode(xmlNode_in);
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']/id$", GetValueSafe(_nodePropertiesDict, "GUID"));
_collector.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", GetValueSafe(_nodePropertiesDict, "Name"));
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']/VEMServer$", GetValueSafe(_nodePropertiesDict, "Name"));
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']/CollectorVersion$", GetValueSafe(_nodePropertiesDict, "Version"));
_collector.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputer);
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']/virtExtService$", targetComputer);
var _mgId = GetValueSafe(_nodePropertiesDict, "MonitoringGroup_ID");
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup']/id$", _mgId);
if (mgDict_in.Exists(_mgId)) {
_collector.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMCollector']/monitoringGroup$", mgDict_in.Item(_mgId));
}
discoveryData.AddInstance(_collector);
}

function CreateTarget(xmlNode_in, xmlDoc_in) {
var _target = discoveryData.CreateClassInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']$");
var _nodePropertiesDict = GetDataFromNode(xmlNode_in);

_target.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']/type$", GetValueSafe(_nodePropertiesDict, "Type"));
_target.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']/version$", GetValueSafe(_nodePropertiesDict, "Version"));
var _id = GetValueSafe(_nodePropertiesDict, "ID");
var _connectionSettingNode = xmlDoc_in.selectSingleNode("//*[ local-name() = 'ConnectionSetting' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']/*[local-name() = 'ID' and text()='" + _id + "' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']/..");
if (_connectionSettingNode != null) {
var _connectionSettingDict = GetDataFromNode(_connectionSettingNode);
_target.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", GetValueSafe(_connectionSettingDict, "Host"));
_target.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']/target$", GetValueSafe(_connectionSettingDict, "Host"));
_target.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']/port$", GetValueSafe(_connectionSettingDict, "Port"));
}

if (licEd != "") {
_target.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMTarget']/licEdition$", licEd);
}

discoveryData.AddInstance(_target);
CreateHealthServiceRelationship(_target);

var _topNodes = xmlDoc_in.selectNodes("//*[ local-name() = 'TopologyNode' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']/*[local-name() = 'Target_ID' and text()='" + _id + "' and namespace-uri() = 'http://tempuri.org/EMDataSet.xsd']/..");
for (var i = 0; i &lt; _topNodes.length; i++) {
var _tn = _topNodes.item(i);
var _children = _tn.childNodes;
for (var j = 0; j &lt; _children.length; j++) {
var t = _children.item(j);
if (t.nodeName != "MonitoringGroup_ID")
continue;
var _mgId = t.text;

var _source = discoveryData.CreateClassInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup']$");
_source.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup']/id$", _mgId);
_source.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputer);
discoveryData.AddInstance(_source);

var _rel = discoveryData.CreateRelationshipInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMMonitoringGroup.Contains.EMTarget']$");
_rel.Source = _source;
_rel.Target = _target;
discoveryData.AddInstance(_rel);
}

}
}

function DiscoverEMServerProps() {
try {
var _HKLM = 0x80000002;
var _sRegPath = "SOFTWARE\\Veeam\\Veeam Virtualization Extensions for VMware\\Manager";
var _oLoc = new ActiveXObject("WbemScripting.SWbemLocator");
var _oSvc = _oLoc.ConnectServer(null, "root\\default");
var _oReg = _oSvc.Get("StdRegProv");
var _oMethod = _oReg.Methods_.Item("GetDWORDValue");
var _oInParam = _oMethod.InParameters.SpawnInstance_();
_oInParam.hDefKey = _HKLM;
_oInParam.sSubKeyName = _sRegPath;

_oInParam.sValueName = "LicensedvSphereSockets";
var _oOutParam = _oReg.ExecMethod_(_oMethod.Name, _oInParam);
var _sockets = _oOutParam.uValue;

_oInParam.sValueName = "LicensedHyperVSockets";
_oOutParam = _oReg.ExecMethod_(_oMethod.Name, _oInParam);
var _socketsHyperV = _oOutParam.uValue;

var _emSrv = discoveryData.CreateClassInstance("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMServer']$");
_emSrv.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputer);

if (_sockets != null &amp;&amp; _sockets % 1 === 0) {
_emSrv.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMServer']/licSockets$", _sockets);
}

if (_socketsHyperV != null &amp;&amp; _socketsHyperV % 1 === 0) {
_emSrv.AddProperty("$MPElement[Name='Veeam.Virt.Extensions.VMware.EMServer']/licSocketsHyperV$", _socketsHyperV);
}

discoveryData.AddInstance(_emSrv);

} catch (_e) { }
}

function CreateHealthServiceRelationship(target_in) {
var _source = discoveryData.CreateClassInstance("$MPElement[Name='SC!Microsoft.SystemCenter.HealthService']$");
_source.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputer);
discoveryData.AddInstance(_source);

var _rel = discoveryData.CreateRelationshipInstance("$MPElement[Name='SC!Microsoft.SystemCenter.HealthServiceShouldManageEntity']$");
_rel.Source = _source;
_rel.Target = target_in;
discoveryData.AddInstance(_rel);
}

function GetEMLicEdition() {
var _licEd = "";
try {
var _HKLM = 0x80000002;
var _sRegPath = "SOFTWARE\\Veeam\\Veeam Virtualization Extensions for VMware\\Manager";
var _oLoc = new ActiveXObject("WbemScripting.SWbemLocator");
var _oSvc = _oLoc.ConnectServer(null, "root\\default");
var _oReg = _oSvc.Get("StdRegProv");
var _oMethod = _oReg.Methods_.Item("GetStringValue");
var _oInParam = _oMethod.InParameters.SpawnInstance_();
_oInParam.hDefKey = _HKLM;
_oInParam.sSubKeyName = _sRegPath;
_oInParam.sValueName = "LicenseEdition";
var _oOutParam = _oReg.ExecMethod_(_oMethod.Name, _oInParam);
_licEd = _oOutParam.sValue;
} catch (_e) { }
return _licEd;
}
</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>