pythonvmwarepyvmomi

How do I put a ESXi host into maintenance mode using pyvmomi?


I was asked to write some python code that would put an VMWare ESXi host into maintenance mode. I was given the name of a virtual center, test-vc, and the hostname of an ESXi host, test-esxi-host and this link ...

https://github.com/vmware/pyvmomi/blob/master/docs/vim/HostSystem.rst

... which provides some documentation on the method I am suppose to use, EnterMaintenanceMode(timeout, evacuatePoweredOffVms, maintenanceSpec).

I am really a complete loss as to what to do really and could use some help. I have tried doing this from a python console:

from pyVmomi import vim
vim.HostSystem.EnterMaintenanceMode(timeout=0)

Which results in this error trace:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/apps/cpm/red/env/lib/python2.7/site-packages/pyVmomi/VmomiSupport.py", line 574, in __call__
    return self.f(*args, **kwargs)
TypeError: _InvokeMethod() takes at least 2 arguments (1 given)

Also I am a kind of confused about how the EnterMaintenanaceMode routine would know that I want to put the host test-esxi-host in virtual center test-vc?

Update: I think I have figured it out. Here's what I think I need to do:

from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import atexit

si = SmartConnectNoSSL(host=vc_host, user=user, pwd=pwd)
cont = si.RetrieveContent()
atexit.register(Disconnect, si) # maybe. I am not really sure what this does
objview = si.content.viewManager.CreateContainerView(si.content.rootFolder, [vim.HostSystem], True)
objview.view[0].EnterMaintenanceMode(0)

Of course the line

objview.view[0].EnterMaintenanceMode(0)

is sure to wreak havoc as I have no idea if that is the host, 'test-esxi-host', I want to put into maintenance mode. I guess I could do this

for h in objview.view:
   if h.name == 'test-esxi-host'
      h.EnterMaintenanceMode(0)

I hope there is a better way to do the above. Something like

get_host(objview.view, 'test-esxi-host').EnterMaintenanceMode(0)

Solution

  • Have a look at Getting started with VMwares ESXi/vSphere API in Python.

    To get a VM object or a list of objects you can use the searchIndex class. The class had methods to search for VMs by UUID, DNS name, IP address or datastore path.

    Hopefuly, there are a couple of ways to look for objects in vCenter:

    Many of these also have FindAll.. methods which allow a much broader look up.

    For this particular case, you could use FindByDnsName to look for your host.

    searcher = si.content.searchIndex
    host = searcher.FindByDnsName(dnsName='test-esxi-host', vmSearch=False)
    host.EnterMaintenanceMode(0)
    

    This code requires you to authenticate to vCenter (@SmartConnectNoSSL) with a user having Host.Config.Maintenance privileges.

    Finally you can take your host out of maintenance mode with: host.ExitMaintenanceMode(0)