## @file vc.py
## @brief Functions for interacting with VirtualCenter.

"""
Functions for interacting with VirtualCenter.

Detailed docs go here.
"""

from pyVmomi import Vim, Vmodl
from . import invt
from . import connect
from .task import WaitForTask


def AddHost(host, port=443, user='root', pwd=None, dataCenter=None, clusterName=None, sslThumbprint=None):
   """
   Adds the given host to the VC inventory. Should be
   invoked after the connection to the server has been established.
   """

   if connect.GetSi() is None:
      raise Vmomi.InternalError()

   vmFolder = invt.GetVmFolder(dataCenter)
   hostFolder = invt.GetHostFolder(dataCenter)

   cnxSpec = Vim.Host.ConnectSpec()
   cnxSpec.SetHostName(host)
   cnxSpec.SetPort(port)
   cnxSpec.SetUserName(user)
   cnxSpec.SetPassword(pwd)
   cnxSpec.SetVmFolder(vmFolder)
   cnxSpec.SetForce(True)
   if sslThumbprint:
      cnxSpec.SetSslThumbprint(sslThumbprint)

   if clusterName is None:
      task = hostFolder.AddStandaloneHost(spec=cnxSpec, addConnected=True)
   else:
      cluster = invt.GetCluster(dataCenter, clusterName)
      # add to cluster, default resource pool
      #task = cluster.AddHost(cnxSpec, True, invt.GetResourcePool(dataCenter))
      task = cluster.AddHost(cnxSpec, True, None)

   if WaitForTask(task) == "error":
      raise task.info.error
   else:
      return task.info.result


def AddHostWithUnknownSSLThumbprint(host, port=443, user='root', pwd=None,
   dataCenter=None, clusterName=None):
   try:
      return AddHost(host, port, user, pwd, dataCenter, clusterName, None)
   except Vim.fault.SSLVerifyFault as e:
      return AddHost(host, port, user, pwd, dataCenter, clusterName,
         e.thumbprint)


def RemoveEntity(entity):
   if connect.GetSi() is None:
      raise Vmomi.InternalError()
   elif not isinstance(entity, Vim.ManagedEntity):
      raise TypeError("Must specify a managed entity")
   elif isinstance(entity, Vim.HostSystem):
      entity = entity.parent
      if isinstance(entity, Vim.ClusterComputeResource):
         raise Vmomi.InternalError("Removing a host from a cluster not implemented")
   elif isinstance(entity, Vim.ComputeResource) and \
          not isinstance(entity, Vim.ClusterComputeResource):
      pass
   else:
      raise TypeError("Removing '%s' not implemented" % entity.__class__.__name__)

   task = entity.Destroy()
   try:
      result = WaitForTask(task)
   except Vmodl.Fault.ManagedObjectNotFound:
      # PR252466: When the entity goes away, attempts to read the TaskInfo object
      # throw ManagedObjectNotFound trying to access the entity.  Assume that
      # the operation succeeded (seeing as the entity is gone and all).
      result = "success"

   if result == "error":
      raise task.info.error

def CreateDatacenter(name="default datacenter"):
   """
   Creates a datacenter with the given name to the root folder.
   """

   rootFolder = invt.GetRootFolder()
   return rootFolder.CreateDatacenter(name)
