There was a recent question in the VMTN developers forum around automating the acknowledgment and resetting of a triggered vCenter alarm using vSphere SDK for Perl. This is actually a trivial task using the vSphere Client, you would first identify the alarm and acknowledge the alarm by right clicking on the alarm and selecting "Acknowledge Alarm". To reset the alarm, you would right click on the alarm and select "Reset Alarm to Green".
To automate this task using the vSphere SDK for Perl which uses the vSphere API, you would perform the same two API operations. Doing a search, you will find a method called AcknowledgeAarm which should does exactly that, but if you try to search for method to reset an alarm, you will notice no such method exists. This was something I was aware of since vSphere 3.5 API, but never understood why it was kept hidden.
Here is a screenshot of the alarmManager in the vSphere MOB and you will notice no methods pertains to resetting an alarm:
You might ask, how is the vSphere Client performing this operation and what API method is it using? Sadly, this operation is one of the many hidden API methods that VMware choose to hide and not public expose for various reasons.
However, there are several ways of identifying some of these hidden vSphere API methods and properties. When you install the vSphere Client on your workstation, there is a catalog directory (e.g. C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\4.1\Catalogs\Default) that is created based on the version of vSphere and within the vim directory, there are these *.vmsg files that contain information regarding the VIM API (Virtual Infrastructure Management API) and searching within these files, you will find some hidden goodies.
Searching the task.vmsg file and within the alarm section, you will see a method name called setAlarmStatus:
alarm.AlarmManager.setAlarmStatus.label = "Set alarm status"
alarm.AlarmManager.setAlarmStatus.summary = "Sets the status of an alarm for an entity"
As you can see, there are other methods with respect to the alarmManager that is documented, but the method above is not documented in the vSphere API reference. We can take this information and further validate by using the vSphere MOB to see what parameters are required for this method.
By generating the proper URL, you can see the method is exposed and the required parameters to this function:
We can perform one additional confirmation to ensure that the method above is actually the method the vSphere Client is performing when resetting an alarm. The tool that we will use here is Onyx, yep, it is not only useful for PowerCLI but for all vSphere developers and administrators. I created a dummy alarm that would trigger if a VM is powered on or powered off and by running Onyx to capture the API calls when acknowledging and resetting an alarm.
Here is the output from Onyx:
As you can see, the two operations uses the AcknowledgeAlarm and the hidden SetAlarmStatus API method. We now can definitively say that the above hidden API method is being used and now we need to figure out how we can incorporate this method into the existing vSphere SDK for Perl.
In this example, I will be working with the vSphere SDK for Perl found on vMA 4.1, but the same set of changes will apply to vCLI 4.x being installed on a Windows or Linux system. There are two client Perl stubs or Perl Modules that contains prototype and definition of a vSphere API method:
/usr/lib/perl5/5.8.8/VMware/VIM25Stub.pm (prototype definition)
/usr/lib/perl5/5.8.8/VMware/VIM25Runtime.pm (method definition)
We will first edit the VIM25Runtime.pm module and if you are on vMA, you will need to use 'sudo' to edit the file. We will add the SetAlarmStatus entry try similar the AcknowledgeAlarm method:
Next we will edit the VIM25Stub.pm and again it will be very similar to an existing method, but now we must populate the parameters based on what we discovered from the vSphere MOB:
Now we are ready to implement this method in a vSphere SDK for Perl Script. I quickly threw together a script that helps manages your vCenter alarms using the CLI by listing all active and triggered alarms in either a red or yellow state.
Download Script: alarmManagement.pl
Here is an example of listing all triggered alarms that are either in a red or yellow state:
Here is an example of acking and resetting the above alarm and utilizing the new hidden API method that was just implemented:
There you have it, a method that was once hidden is no longer =)
If you are interested in locating other hidden API goodies, take a look at this post on How to browse the internal vSphere APIs
Cool! Thank you William. I've looked at file task.vmsg as you wrote and I've found this lines: UpgradeManager.#####. But I don't know how to use it. Could you looked at this UpgradeManager ? Could you answer me how could I use this manager, please ?
There are many hidden API properties as mentioned in the blog post, some are trivial to implement and some are quite difficult or impossible. The "UpgradeManager" is more than just a simple method, it's most likely dealing with VUM based on some of the method names. Though this is not something you can just look at and reverse engineering, at least easily. I don't plan on reverse engineering this, especially not knowing what each of the method parameters require. You're more than welcome to try
I want to do it, but I don't know how could I call methods of UpgradeManager. F.e. i saw method: cluster.transitionalevcmanager and i can call it from MOB (managedobject browser) just typing: ...domainX&method=transitionalevcmanager. But I don't know how could I call methods from UpgradeManager and how could I find UpgradeManager object in MOB. If you could help me just to find UpgradeManager in the MOB I would very happy 🙂
Yea I've tried few variations through the MOB and unfortunately I had no luck, it may be under different path or different name all together. One of the difficulties when it's hidden, sorry. Good Luck
It's a pity but thanks anyway
is there any way we can trigger a compliance change notification in VCM when some admin changes a default VMware vCenter alarm that was enabled on the environment.
William Lam says
I'm not familiar with VCM, you would probably need to contact someone from your account team or potentially post on the VMTN Community forums for that question
fyi, for version 6 of viperl, you need to add one extra line to the VIM25STub.pm function, and modify a line:
my $soap_action = '"urn:vim25/6.0"';
my ($result, $fault) = $vim_soap->request('SetAlarmStatus', $arg_string, $soap_action);
I'm using VCSA and accessing via vsphere web client.I am running PRTG to monitor alarms in vCentre and have an alarm in vcentre that runs a bash script that disables and enables sensors in PRTG based on if the hypervisor is going into or out of standby mode. My problem is that if the Alarm is NOT reset to green the script isn't run again until that centre alarm is "reset to green" and PRTG starts to alert (and fills up email!). How do I accomplish the above when using a web client and VCSA? I need to be able to acknowledge the alarm/ Reset to green either within my script (which is a simply bash script using curl to post to the PRTG API). You solution doesn't work unless I have a client installed which isn't available for 6.5. Also I am using VCSA and not the Windows version so POWERCLI not an option not to mention installing anything onto VCSA if not advisable. Any help greatly appreciated.
I am getting empty results while using the script but when I use browser to use vCenter it does indeed show three alarms present. What would be the modification in the perl script?
Alarm Key | Alarm State | Alarm Name | Alarm Entity