Ejemplo n.º 1
0
class Vmops:
 client=None
 def connect(self):
     configuration=Config()
     server = configuration._config_value("general", "server")
     if server is None:
         raise ValueError("server must be supplied on command line"+"or in configuration file.")
     username = configuration._config_value("general", "username")
     if username is None:
         raise ValueError("username must be supplied on command line"
                      " or in configuration file.")
     password = configuration._config_value("general", "password")
     if password is None:
         raise ValueError("password must be supplied on command line"
                      " or in configuration file.")

     self.client=Client(server,username,password)


 def findVM(self,vmName):
     vm = self.client.find_entity_view("VirtualMachine",filter={"name": vmName})
     return vm


 def changevmConfig(self,vm_name,cpuCount):
    try:
     new_config = self.client.create("VirtualMachineConfigSpec")
     new_config.numCPUs = cpuCount
     new_config.cpuHotAddEnabled=True
     vm = VirtualMachine.get(self.client, name=vm_name)
     print("Reconfiguring %s" % vm_name)
     if vm.config.hardware.numCPU == cpuCount:
        print("Not reconfiguring %s as it already has 2 CPUs" % vm_name)
        sys.exit()
     task = vm.ReconfigVM_Task(spec=new_config)
     while task.info.state in ["queued", "running"]:
      print("Waiting 5 more seconds for VM creation")
      time.sleep(5)
      task.update()

     if task.info.state == "success":
      elapsed_time = task.info.completeTime - task.info.startTime
      print("Successfully reconfigured VM %s. Server took %s seconds." %
          (vm_name, elapsed_time.seconds))
     elif task.info.state == "error":
      print("ERROR: The task for reconfiguring the VM has finished with"
          " an error. If an error was reported it will follow.")
      print("ERROR: %s" % task.info.error.localizedMessage)
    except VimFault, e:
     print("Failed to reconfigure %s: " % e)
     sys.exit()
    except ObjectNotFoundError:
     print("ERROR: No VM found with name %s" % vm_name)
Ejemplo n.º 2
0
    reconfig_vm test

"""

import sys
import time

from psphere.client import Client
from psphere.soap import VimFault
from psphere.managedobjects import VirtualMachine
from psphere.errors import ObjectNotFoundError

vm_name = sys.argv[1]

client = Client()
new_config = client.create("VirtualMachineConfigSpec")
new_config.numCPUs = 2

try:
    vm = VirtualMachine.get(client, name=vm_name)
except ObjectNotFoundError:
    print("ERROR: No VM found with name %s" % vm_name)

print("Reconfiguring %s" % vm_name)
if vm.config.hardware.numCPU == 2:
    print("Not reconfiguring %s as it already has 2 CPUs" % vm_name)
    sys.exit()

try:
    task = vm.ReconfigVM_Task(spec=new_config)
except VimFault, e:
Ejemplo n.º 3
0
class VSphere(object):
    """
    Class represents a vSphere client.

    Example usage:
        my_client = sut.VSphere('16.xx.xx.xx', 'user1', 'passwd1')
        my_vm = my_client.get_vm('user1_vm1')
        my_client.power_on_vm(my_vm)
        my_client.end_session()
    """
    def __init__(self, vsphere_server, vsphere_username, vsphere_password):
        self.server = vsphere_server
        self.username = vsphere_username
        self.password = vsphere_password
        try:
            log._info("Attempting to connect to vCenter server: %s" %
                      (self.server))
            self.client = Client(self.server, self.username, self.password)
            log._info("CONNECTED to vCenter server: %s" % (self.server))
        except VimFault as e:
            log._warn("Failed to connect to vCenter: %s" % (e.fault_name))
            return False

    def end_session(self):
        """
        Terminates session with vSphere client
        """
        self.client.logout()

    def get_vm(self, vm_name):
        try:
            vm = VirtualMachine.get(self.client, name=vm_name)
        except ObjectNotFoundError:
            log._warn("Error finding VM '%s', does not exist within client" %
                      (vm_name))
            return False
        return vm

    def power_on_vm(self, vm_name):
        """
        Powers on a VM defined in the Client

        Params:
            - vm_name:  (str) The name of the virtual machine. (Ex. 'cosmos-jvm')
        """
        vm = self.get_vm(vm_name)
        if vm.runtime.powerState == "poweredOn":
            log._warn("ERROR: %s is already powered on." % vm.name)
        else:
            try:
                log._info("Powering on %s" % vm.name)
                task = vm.PowerOnVM_Task()
            except VimFault as e:
                log._warn("ERROR: Failed to power on %s %s" % (vm.name, e))

    def power_off_vm(self, vm_name):
        """
        Powers off a VM defined in the Client

        Params:
            - vm:  (str) The name of the virtual machine. (Ex. 'cosmos-jvm')
        """
        vm = self.get_vm(vm_name)
        if vm.runtime.powerState == "poweredOff":
            log._warn("ERROR: %s is already powered off." % vm.name)
        else:
            try:
                log._info("Powering off %s" % vm.name)
                task = vm.PowerOffVM_Task()
            except VimFault as e:
                log._warn("ERROR: Failed to power off %s %s" % (vm.name, e))

    def suspend_vm(self, vm):
        """
        Powers off a VM defined in the Client

        Params:
            - vm:  (str) The name of the virtual machine. (Ex. 'cosmos-jvm')
        """
        if vm.runtime.powerState in ["poweredOff", "suspended"]:
            log._warn(
                "ERROR: %s is powered off or suspended. Cannot suspend." %
                vm.name)
        else:
            try:
                log._info("Suspending %s" % vm.name)
                task = vm.SuspendVM_Task()
            except VimFault as e:
                log._warn("ERROR: Failed to suspend %s %s" % (vm.name, e))

    def reset_vm(self, vm):
        """
        Resets the virtual machine

        Params:
            - vm:  (str) The name of the virtual machine. (Ex. 'cosmos-jvm')
        """
        try:
            log._info("Restarting %s" % vm.name)
            task = vm.RestartVM_Task()
        except VimFault as e:
            log._warn("ERROR: Failed to restart %s %s" % (vm.name, e))

    def destroy_vm(self, vm_name):
        """
        Destroys VM*, deleting its contents and removing it from parent folder
        Params:
            - vm:  (str) The name of the virtual machine to be deleted.


        *Assumes proper permissions (VirtualMachine.Inventory.Delete)
        """
        vm = VirtualMachine.get(self.client, name=vm_name)

        try:
            log._info("Destroying %s" % vm.name)
            task = vm.Destroy_Task()
        except VimFault as e:
            log._warn("ERROR: Failed to destroy %s %s" % (vm.name, e))

    def clone_vm(self,
                 source_vm_name,
                 dest_vm_name,
                 power_on=False,
                 is_template=False):
        """
        Creates a clone of virtual machine 'vm'.  If the vm is a template,
        this method corresponds to deploying from a template

        Params:
            - (str)source_vm:     Name of Virtual machine (or template) to clone
            - (str)dest_vm_name:  Name of the new clone
        Optional:
            - power_on:     Option to power on the cloned vm after creation
            - is_template:  Option to mark cloned vm as a template


        * Assumes proper permissions.  The privilege required on the source
        virtual machine depends on the source and destination types:

        - source is virtual machine, destination is virtual machine - VirtualMachine.Provisioning.Clone
        - source is virtual machine, destination is template - VirtualMachine.Provisioning.CreateTemplateFromVM
        - source is template, destination is virtual machine - VirtualMachine.Provisioning.DeployTemplate
        - source is template, destination is template - VirtualMachine.Provisioning.CloneTemplate
        """
        # host_system = HostSystem.get(client, name=vm_host)

        # check to see if dest_vm already exists
        try:
            vm = VirtualMachine.get(self.client, name=dest_vm_name)
            if vm.name == dest_vm_name:
                log._warn("ERROR: Destination VM '%s' already exists." %
                          dest_vm_name)
                return False
        except ObjectNotFoundError:
            pass  # we want the object to not be found :)

        # also, check to see if the source vm exists
        try:
            source_vm = VirtualMachine.get(self.client, name=source_vm_name)
        except ObjectNotFoundError:
            log._warn("ERROR: No VM with name \"%s\" to clone" %
                      source_vm_name)
            return False

        vm_clone_spec = self.client.create("VirtualMachineCloneSpec")
        vm_reloc_spec = self.client.create("VirtualMachineRelocateSpec")
        vm_reloc_spec.datastore = source_vm.datastore  # [0]
        vm_reloc_spec.pool = source_vm.resourcePool
        vm_reloc_spec.host = None
        # vm_reloc_spec.disk = None #[]
        vm_reloc_spec.transform = None
        vm_clone_spec.powerOn = power_on
        vm_clone_spec.template = is_template
        vm_clone_spec.location = vm_reloc_spec
        vm_clone_spec.snapshot = None
        # Datacenter folder
        datacenter_folder = source_vm.parent.parent.vmFolder

        try:
            log._info("Attempting to clone %s" % source_vm.name)
            task = source_vm.CloneVM_Task(folder=datacenter_folder,
                                          name=dest_vm_name,
                                          spec=vm_clone_spec)
        except VimFault as e:
            log._warn("ERROR: Failed to clone '%s'" % e)
            return False
        while task.info.state in ["queued", "running"]:
            log._info("Waiting 5 more seconds for VM creation")
            time.sleep(5)
            task.update()

        if task.info.state == "success":
            elapsed_time = task.info.completeTime - task.info.startTime
            log._info(
                "Successfully cloned VM %s from %s. Server took %s seconds." %
                (dest_vm_name, source_vm_name, elapsed_time.seconds))
        elif task.info.state == "error":
            log._warn("ERROR: The task for cloning the VM has finished with"
                      " an error. If an error was reported it will follow.")
            try:
                log._warn("ERROR: %s" % task.info.error.localizedMessage)
            except AttributeError:
                log._warn("ERROR: There is no error message available.")
        else:
            log._warn("UNKNOWN: The task reports an unknown state %s" %
                      task.info.state)

    def deploy_from_ovf(self, ovf_path, vm_name):
        """
        Deploys a VM from an .ovf file
        """
        pass
        # def get_descriptor(ovf_path):
        # """
        # Opens .ovf file and returns descriptor
        # """
        # fh = open(ovf_path, "r")
        # ovf_descriptor = fh.read()
        # fh.close()
        # return ovf_descriptor

        # '''
        # https://groups.google.com/forum/#!topic/pysphere/NkTOy_GSaKw

        # def parse_descriptor(ovf_descriptor):
        # ovf_manager = s._do_service_content.OvfManager
        # request = VI.ParseDescriptorRequestMsg()
        # _this =request.new__this(ovf_manager)
        # _this.set_attribute_type(ovf_manager.get_attribute_type())
        # request.set_element__this(_this)
        # request.set_element_ovfDescriptor(ovf_descriptor)
        # pdp = request.new_pdp()
        # pdp.set_element_locale("")
        # pdp.set_element_deploymentOption("")
        # request.set_element_pdp(pdp)
        # return s._proxy.ParseDescriptor(request)._returnval
        # '''

        # def deploy(args):
        # """
        # """
        # ovfdesc = get_descriptor(ovf_path)

        # ovfmgr = self.client.sc.ovfManager

        # descriptor_info =  parse_descriptor(o)

        # descriptor_info = ovfmgr.ParseDescriptor(ovfdesc)
        # ovfimportresult = ovfmgr.CreateImportSpec(ovfDescriptor=ovfdesc, resourcePool=resourcepool, datastore=dstore, cisp=ocisp)

        # httpNfcLease = resourcepool.ImportVApp(spec=ovfimportresult.importSpec, folder=dl.vmFolder)

    def create_snapshot(self, vm_name, snapshot_name):
        """
        Creates a snapshot of 'vm' with name of 'snapshot_name'

        Both arguments are type 'str'
        """
        try:
            vm = VirtualMachine.get(self.client, vm_name)
        except ObjectNotFoundError:
            log._warn("ERROR: No VM with name \"%s\" to clone" %
                      source_vm_name)
            return False
        try:
            log._info("Creating snapshot for VM: %s" % vm.name)
            # task = vm.CreateSnapshot_Task(name=snapshot_name, memory=False, quiesce=False)
            task = vm.CreateSnapshot_Task(name=snapshot_name,
                                          memory=True,
                                          quiesce=True)
        except VimFault as e:
            log._warn("Failed to create snapshot %s: " % e)

        while task.info.state in ["queued", "running"]:
            log.info("Waiting 5 more seconds for VM snapshot to complete")
            time.sleep(5)
            task.update()

        if task.info.state == "success":
            elapsed_time = task.info.completeTime - task.info.startTime
            log._info(
                "Successfully create snapshot for VM %s. Processing took %s seconds."
                % (vm_name, elapsed_time.seconds))
        elif task.info.state == "error":
            log._warn(
                "ERROR: The task for creating the VM snapshot has finished with an error. If an error was reported it will follow."
            )
            try:
                log._warn("ERROR: %s" % task.info.error.localizedMessage)
            except AttributeError:
                log._warn("ERROR: There is no error message available.")
        else:
            log._warn("UNKNOWN: The task reports an unknown state %s" %
                      task.info.state)