For those of you that use Infoblox and want to collect and monitor the usage, health and service status in vRops for alerting purposes this next post is for you…..
So I needed to monitor Infoblox service’s for state change IE: DNS and DHCP changing from WORKING to UNKNOWN etc…. along with the heap, db… etc usage of the appliance…. unfortunately I had no real way of doing it that fit my needs and as I use vRops heavily I thought why not build a fully automated solution that runs on a schedule and collects the data from the Infoblox API and pushes it into the vROPS API.
So a new AdapterKind called INFOBLOX will be created and then a related ResourceKind called InfoBloxNODE!
As you can see the servers are listed under in the inventory explorer!
After if you hit up the metrics and properties for the created objects / resources you will see the metrics and properties coming through regularly if you have it setup on a schedule. So then all you need to do is setup alerts based on your needs in vRops!
OK how to set this up / use it….
So that I don’t keep being prompted for credentials I save the service account user and password with the powershell Get-Credential command, you will need to do this once for infoblox and once for the vRops account if the service account cannot be used by both solutions.
$cred = Get-Credential $cred | Export-Clixml -Path "E:\vRops\Infoblox\config\infoblox.xml""
To execute the script run:
.\Infoblox-Monitor.ps1 -vRopsAddress 'vRops.vman.ch' -infoblox 'infoblox.vman.ch' -vRopsCreds 'vRops' -InfobloxCreds 'Infoblox'
And here it is! the full script in all its glory… all based on Powershell, I has to massage some of the data to take into account some messy stuff in the Infoblox API… as you will see below it doesn’t always make sense but as I was building it I ran into issues that needed me to tweak the data.
I have started using GITHUB to store the code for versioning, check it here
#Powershell collector script for vRops Suite-api
#v1.0 vMan.ch, 15.06.2018 - Initial Version
<#
.SYNOPSIS
Collecting metric / state data from infoblox and pushes it into vRops for monitoring as a new ResourceKind.
Script requires Powershell v3 and above.
Run the command below to store user and pass in secure credential XML for each environment
$cred = Get-Credential
$cred | Export-Clixml -Path "E:\vRops\Infoblox\config\infoblox.xml"
Usage .\Infoblox-Monitor.ps1 -vRopsAddress 'vRops.vman.ch' -infoblox 'infoblox.vman.ch' -vRopsCreds 'vRops' -InfobloxCreds 'Infoblox'
#>
param
(
[String]$vRopsAddress,
[String]$infoblox,
[String]$vRopsCreds,
[String]$InfobloxCreds
)
$ScriptPath = (Get-Item -Path ".\" -Verbose).FullName
if($vRopsCreds -gt ""){
$vRopsCred = Import-Clixml -Path "$ScriptPath\config\$vRopsCreds.xml"
}
else
{
echo "vRops Credentials not specified, stop hammer time!"
Exit
}
if($InfobloxCreds -gt ""){
$InfobloxCred = Import-Clixml -Path "$ScriptPath\config\$InfobloxCreds.xml"
}
else
{
echo "Infoblox Credentials not specified, stop hammer time!"
Exit
}
#Functions
#Get vRops ResourceID from Name
Function GetObject([String]$vRopsObjName, [String]$resourceKindKey, [String]$vRopsServer, $vRopsCredentials){
$vRopsObjName = $vRopsObjName -replace ' ','%20'
[xml]$Checker = Invoke-RestMethod -Method Get -Uri "https://$vRopsServer/suite-api/api/resources?resourceKind=$resourceKindKey&name=$vRopsObjName" -Credential $vRopsCredentials -Headers $header -ContentType $ContentType
#Check if we get 0
if ([Int]$Checker.resources.pageInfo.totalCount -eq '0'){
Return $CheckerOutput = ''
}
else {
# Check if we get more than 1 result and apply some logic
If ([Int]$Checker.resources.pageInfo.totalCount -gt '1') {
$DataReceivingCount = $Checker.resources.resource.resourceStatusStates.resourceStatusState.resourceStatus -eq 'DATA_RECEIVING'
If ($DataReceivingCount.count -gt 1){
If ($Checker.resources.resource.ResourceKey.name -eq $vRopsObjName){
ForEach ($Result in $Checker.resources.resource){
IF ($Result.resourceStatusStates.resourceStatusState.resourceStatus -eq 'DATA_RECEIVING'){
$CheckerOutput = New-Object PsObject -Property @{Name=$vRopsObjName; resourceId=$Result.identifier; resourceKindKey=$Result.resourceKey.resourceKindKey}
Return $CheckerOutput
}
}
}
}
Else
{
ForEach ($Result in $Checker.resources.resource){
IF ($Result.resourceStatusStates.resourceStatusState.resourceStatus -eq 'DATA_RECEIVING'){
$CheckerOutput = New-Object PsObject -Property @{Name=$vRopsObjName; resourceId=$Result.identifier; resourceKindKey=$Result.resourceKey.resourceKindKey}
Return $CheckerOutput
}
}
}
}
else {
$CheckerOutput = New-Object PsObject -Property @{Name=$vRopsObjName; resourceId=$Checker.resources.resource.identifier; resourceKindKey=$Checker.resources.resource.resourceKey.resourceKindKey}
Return $CheckerOutput
}
}
}
#Function to create new vRops InfoBloxNODE
Function CreatevRopsObject([String]$vRopsServer, $CreateRopsObject, $vRopsCredentials){
[xml]$CreateXML = @('<ops:resource xmlns:ops="http://webservice.vmware.com/vRealizeOpsMgr/1.0/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ops:description>Infoblox Node</ops:description>
<ops:resourceKey>
<ops:name>{0}</ops:name>
<ops:adapterKindKey>INFOBLOX</ops:adapterKindKey>
<ops:resourceKindKey>InfoBloxNODE</ops:resourceKindKey>
<ops:resourceIdentifiers>
<ops:resourceIdentifier>
<ops:identifierType name="EntityName" dataType="STRING" isPartOfUniqueness="true" />
<ops:value>{0}</ops:value>
</ops:resourceIdentifier>
</ops:resourceIdentifiers>
</ops:resourceKey>
<ops:resourceStatusStates />
<ops:dtEnabled>true</ops:dtEnabled>
</ops:resource>' -f $CreateRopsObject
)
#Create URL string for voke-RestMethod
$Createurl = 'https://'+$vRopsServer+'/suite-api/api/resources/adapterkinds/OPENAPI'
#Send Attribute data to vRops.
$ContentType = "application/xml;charset=utf-8"
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Accept", 'application/xml')
$header.Add("X-vRealizeOps-API-use-unsupported", 'true')
try {
$result = Invoke-RestMethod -Method POST -uri $Createurl -Body $CreateXML -Credential $vRopsCredentials -ContentType $ContentType -Headers $header
}
catch {
$result = $_.Exception.Response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($result)
$reader.BaseStream.Position = 0
$reader.DiscardBufferedData()
$responseBody = $reader.ReadToEnd();
}
}
#Get Date / Time for vRops
[DateTime]$NowDate = (Get-date)
[int64]$NowDateEpoc = Get-Date -Date $NowDate.ToUniversalTime() -UFormat %s
$NowDateEpoc = $NowDateEpoc*1000
#Take all certs.
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls
#Stuff for Invoke-RestMethod
$ContentType = "application/xml"
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Accept", 'application/xml')
$header.Add("User-Agent", 'InfobloxHealthExtractor/1.0')
#Collect NodeInfo
$nodeinfo = Invoke-RestMethod -Method Get -Uri "https://$infoblox/wapi/v2.7/member?_return_fields=node_info" -Credential $InfobloxCred -Headers $header -ContentType $ContentType
#GetProperties
$InfoBloxProperties = @()
$InfoBloxMetrics = @()
$InfoBloxStatus = @()
ForEach ($blox in $nodeinfo.list.value){
$Name = $blox.'_ref'.Substring(($blox.'_ref'.IndexOf(":"))+1)
$resourceid = GetObject $Name 'InfoBloxNODE' $vRopsAddress $vRopsCred
If ($resourceid -eq ''){
#Debug
#Write-Host $Name 'Object does not exist in vRops, creating it now'
CreatevRopsObject $vRopsAddress $Name $vRopsCred
#Debug
#Write-Host 'Searching again for' $Name
$resourceid = GetObject $Name 'InfoBloxNODE' $vRopsAddress $vRopsCred
#Debug
#Write-host 'Found it' $resourceid.resourceId
}
ForEach ($Val in $blox){
$DISK_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DISK_USAGE' | select 'description').Description
$MEMORY = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'MEMORY' | select 'description').Description
$SWAP_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'SWAP_USAGE' | select 'description').Description
$DB_OBJECT = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DB_OBJECT' | select 'description').Description
$DISCOVERY_CAPACITY = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DISCOVERY_CAPACITY' | select 'description').Description
$CPU_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'CPU_USAGE' | select 'description').Description
$InfoBloxProperties += New-Object PSObject -Property @{
NAME = $Name
ResourceID = $resourceid.resourceId
NODE_STATUS = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'NODE_STATUS' | select 'description').Description
DISK_USAGE = $DISK_USAGE.Substring(($DISK_USAGE.IndexOf("- "))+2)
ENET_LAN = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'ENET_LAN' | select 'description').Description
REPLICATION = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'REPLICATION' | select 'description').Description
DB_OBJECT = $DB_OBJECT.Substring(($DB_OBJECT.IndexOf("- "))+2)
NTP_SYNC = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'NTP_SYNC' | select 'description').Description
OSPF = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'OSPF' | select 'description').Description
OSPF6 = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'OSPF6' | select 'description').Description
BGP = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'BGP' | select 'description').Description
BFD = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'BFD' | select 'description').Description
CORE_FILES = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'CORE_FILES' | select 'description').Description
MEMORY = $MEMORY.Substring(($MEMORY.IndexOf("- "))+2)
SWAP_USAGE = $SWAP_USAGE.Substring(($SWAP_USAGE.IndexOf("- "))+2)
DISCOVERY_CAPACITY = $DISCOVERY_CAPACITY.Substring(($DISCOVERY_CAPACITY.IndexOf("- "))+2)
VPN_CERT = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'VPN_CERT' | select 'description').Description
}
$InfoBloxMetrics += New-Object PSObject -Property @{
NAME = $Name
ResourceID = $resourceid.resourceId
DISK_USAGE = [regex]::Matches($DISK_USAGE, "\d+(?!.*\d+)").value
CPU_USAGE = [regex]::Matches($CPU_USAGE, "\d+(?!.*\d+)").value | select -unique
MEMORY = [regex]::Matches($MEMORY, "\d+(?!.*\d+)").value
SWAP_USAGE = [regex]::Matches($SWAP_USAGE, "\d+(?!.*\d+)").value
DISCOVERY_CAPACITY = [regex]::Matches($DISCOVERY_CAPACITY, "\d+(?!.*\d+)").value
DB_OBJECT = [regex]::Matches($DB_OBJECT, "\d+(?!.*\d+)").value
}
$InfoBloxStatus += New-Object PSObject -Property @{
NAME = $Name
ResourceID = $resourceid.resourceId
NODE_STATUS = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'NODE_STATUS' | select 'status').Status
DISK_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DISK_USAGE' | select 'status').Status
ENET_LAN = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'ENET_LAN' | select 'status').Status
REPLICATION = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'REPLICATION' | select 'status').Status
DB_OBJECT = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DB_OBJECT' | select 'status').Status
NTP_SYNC = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'NTP_SYNC' | select 'status').Status
CPU_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'CPU_USAGE' | select 'status').Status | select -unique
OSPF = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'OSPF' | select 'status').Status
OSPF6 = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'OSPF6' | select 'status').Status
BGP = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'BGP' | select 'status').Status
BFD = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'BFD' | select 'status').Status
CORE_FILES = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'CORE_FILES' | select 'status').Status
MEMORY = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'MEMORY' | select 'status').Status
SWAP_USAGE = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'SWAP_USAGE' | select 'status').Status
DISCOVERY_CAPACITY = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'DISCOVERY_CAPACITY' | select 'status').Status
VPN_CERT = ($Val.node_info.list.Value.service_status.list.Value | where service -eq 'VPN_CERT' | select 'status').Status
}
}
}
#Collect ServiceInfo
$Serviceinfo = Invoke-RestMethod -Method Get -Uri "https://$infoblox/wapi/v2.7/member?_return_fields=service_status" -Credential $InfobloxCred -Headers $header -ContentType $ContentType
$InfoBloxServices = @()
ForEach ($bloxService in $Serviceinfo.list.value){
$Name = $bloxService.'_ref'.Substring(($bloxService.'_ref'.IndexOf(":"))+1)
$resourceid = GetObject $Name 'INFOBLOXNODE' $vRopsAddress $vRopsCred
ForEach ($Serv in $bloxService.service_status.list.Value){
#Changeing the Service states to metrics
#INACTIVE = 0
#WORKING = 1
#UNKNOWN = 2
#Everything else = -1
$InfoBloxServices += New-Object PSObject -Property @{
NAME = $Name
ResourceID = $resourceid.resourceId
SERVICE = $Serv.Service
STATUS = $Serv.Status
CODE = If ($Serv.Status -eq 'INACTIVE'){'0'}ElseIf($Serv.Status -eq 'WORKING'){'1'}ElseIf($Serv.Status -eq 'UNKNOWN'){'2'}Else {'-1'}
}
}
}
#Check if the node exists
#Push in Properties
ForEach ($PropertyInsert in $InfoBloxProperties){
#Debug
#Write-Host 'Inserting Node Properties for' $PropertyInsert.Name
[xml]$PropertyXML = @('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ops:property-contents xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ops="http://webservice.vmware.com/vRealizeOpsMgr/1.0/">
<ops:property-content statKey="INFOBLOX|VALUES|OSPF">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{1}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|OSPF6">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{2}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|CORE_FILES">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{3}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|NTP_SYNC">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{4}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|DISK_USAGE">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{5}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|BGP">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{6}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|MEMORY">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{7}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|VPN_CERT">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{8}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|ENET_LAN">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{9}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|BFD">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{10}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|DISCOVERY_CAPACITY">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{11}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|DB_OBJECT">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{12}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|SWAP_USAGE">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{13}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|NODE_STATUS">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{14}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|VALUES|REPLICATION">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{15}</ops:values>
</ops:property-content>
</ops:property-contents>' -f $NowDateEpoc,
$PropertyInsert.OSPF,
$PropertyInsert.OSPF6,
$PropertyInsert.CORE_FILES,
$PropertyInsert.NTP_SYNC,
$PropertyInsert.DISK_USAGE,
$PropertyInsert.BGP,
$PropertyInsert.MEMORY,
$PropertyInsert.VPN_CERT,
$PropertyInsert.ENET_LAN,
$PropertyInsert.BFD,
$PropertyInsert.DISCOVERY_CAPACITY,
$PropertyInsert.DB_OBJECT,
$PropertyInsert.SWAP_USAGE,
$PropertyInsert.NODE_STATUS,
$PropertyInsert.REPLICATION
)
#Create URL string for Invoke-RestMethod
$vRopsPropertyURL = 'https://' + $vRopsAddress + '/suite-api/api/resources/'+$PropertyInsert.Resourceid+'/properties'
Invoke-RestMethod -Method POST -uri $vRopsPropertyURL -Body $PropertyXML -Credential $vRopsCred -ContentType "application/xml;charset=utf-8"
Remove-Variable vRopsPropertyURL -ErrorAction SilentlyContinue
Remove-Variable PropertyXML -ErrorAction SilentlyContinue
Remove-Variable PropertyInsert -ErrorAction SilentlyContinue
}
#Push in Metrics
ForEach ($MetricInsert in $InfoBloxMetrics){
#Debug
#Write-Host 'Inserting Node Metrics for' $MetricInsert.Name
[xml]$MetricXML = @('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ops:stat-contents xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ops="http://webservice.vmware.com/vRealizeOpsMgr/1.0/">
<ops:stat-content statKey="CPU|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{1}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
<ops:stat-content statKey="MEM|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{2}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
<ops:stat-content statKey="DISK|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{3}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
<ops:stat-content statKey="SWAP|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{4}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
<ops:stat-content statKey="DISCOVERY|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{5}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
<ops:stat-content statKey="DB_OBJECT|Usage">
<ops:timestamps>{0}</ops:timestamps>
<ops:data>{6}</ops:data>
<ops:unit>%</ops:unit>
</ops:stat-content>
</ops:stat-contents>' -f $NowDateEpoc,
$MetricInsert.CPU_USAGE,
$MetricInsert.MEMORY,
$MetricInsert.DISK_USAGE,
$MetricInsert.SWAP_USAGE,
$MetricInsert.DISCOVERY_CAPACITY,
$MetricInsert.DB_OBJECT
)
$vRopsMetricURL = 'https://' + $vRopsAddress + '/suite-api/api/resources/'+$MetricInsert.Resourceid+'/stats'
Invoke-RestMethod -Method POST -uri $vRopsMetricURL -Body $MetricXML -Credential $vRopsCred -ContentType "application/xml;charset=utf-8"
Remove-Variable vRopsMetricURL -ErrorAction SilentlyContinue
Remove-Variable MetricXML -ErrorAction SilentlyContinue
Remove-Variable MetricInsert -ErrorAction SilentlyContinue
}
ForEach ($StatusInsert in $InfoBloxStatus){
#Debug
#Write-Host 'Inserting Node Status for' $StatusInsert.Name
[xml]$StatusXML = @('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ops:property-contents xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ops="http://webservice.vmware.com/vRealizeOpsMgr/1.0/">
<ops:property-content statKey="INFOBLOX|STATUS|OSPF">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{1}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|OSPF6">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{2}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|CORE_FILES">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{3}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|NTP_SYNC">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{4}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|DISK_USAGE">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{5}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|BGP">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{6}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|MEMORY">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{7}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|VPN_CERT">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{8}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|ENET_LAN">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{9}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|BFD">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{10}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|DISCOVERY_CAPACITY">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{11}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|DB_OBJECT">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{12}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|SWAP_USAGE">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{13}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|NODE_STATUS">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{14}</ops:values>
</ops:property-content>
<ops:property-content statKey="INFOBLOX|STATUS|REPLICATION">
<ops:timestamps>{0}</ops:timestamps>
<ops:values>{15}</ops:values>
</ops:property-content>
</ops:property-contents>' -f $NowDateEpoc,
$StatusInsert.OSPF,
$StatusInsert.OSPF6,
$StatusInsert.CORE_FILES,
$StatusInsert.NTP_SYNC,
$StatusInsert.DISK_USAGE,
$StatusInsert.BGP,
$StatusInsert.MEMORY,
$StatusInsert.VPN_CERT,
$StatusInsert.ENET_LAN,
$StatusInsert.BFD,
$StatusInsert.DISCOVERY_CAPACITY,
$StatusInsert.DB_OBJECT,
$StatusInsert.SWAP_USAGE,
$StatusInsert.NODE_STATUS,
$StatusInsert.REPLICATION
)
$vRopsStatusURL = 'https://' + $vRopsAddress + '/suite-api/api/resources/'+$StatusInsert.Resourceid+'/properties'
Invoke-RestMethod -Method POST -uri $vRopsStatusURL -Body $StatusXML -Credential $vRopsCred -ContentType "application/xml;charset=utf-8"
Remove-Variable vRopsStatusURL -ErrorAction SilentlyContinue
Remove-Variable StatusXML -ErrorAction SilentlyContinue
#Pushing ServiceStatus
#Debug
#Write-Host 'Inserting Service Status for' $StatusInsert.Name
$InfoServiceStatusXML = @('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ops:stat-contents xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ops="http://webservice.vmware.com/vRealizeOpsMgr/1.0/">')
ForEach ($InfoService in $InfoBloxServices | where {$_.Resourceid -eq $StatusInsert.Resourceid}){
$InfoServiceStatusXML += @('<ops:stat-content statKey="SERVICE|'+$InfoService.SERVICE+'|Status">
<ops:timestamps>'+$NowDateEpoc+'</ops:timestamps>
<ops:data>'+$InfoService.CODE+'</ops:data>
<ops:unit>num</ops:unit>
</ops:stat-content>')
}
$InfoServiceStatusXML += @('</ops:stat-contents>')
[xml]$InfoServiceStatusXML = $InfoServiceStatusXML
$vRopsInfoServiceStatusURL = 'https://' + $vRopsAddress + '/suite-api/api/resources/'+$StatusInsert.Resourceid+'/stats'
Invoke-RestMethod -Method POST -uri $vRopsInfoServiceStatusURL -Body $InfoServiceStatusXML -Credential $vRopsCred -ContentType "application/xml;charset=utf-8"
#Debug
#Echo $InfoServiceStatusXML.'stat-contents'.'stat-content'
Remove-Variable vRopsStatusURL -ErrorAction SilentlyContinue
Remove-Variable StatusInsert -ErrorAction SilentlyContinue
Remove-Variable InfoServiceStatusXML -ErrorAction SilentlyContinue
Remove-Variable vRopsInfoServiceStatusURL -ErrorAction SilentlyContinue
}
vMan




Hi, i think you have a problem with your screenshots. There is no images attached to your article.
Thanks for letting me know, I will fix that soon as I can. Looks like the image has been deleted.
Hello Dany,
I have updated the post with screenshots, not sure what happened! thanks for letting me know.
Make sure to get the latest version from github as I wont update the code on the post.
vMan