Beispiel #1
0
    def run(self, vm_id, vm_name, datastore_cluster, datastore, disk_size,
            provision_type):
        # ensure that minimal inputs are provided
        checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name")

        vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name)
        spec = vim.vm.ConfigSpec()
        hdd_unit_number = self.get_next_unit_number(vm)
        ctrl_key = self.get_controller_key(vm)

        # Prepare new Disk configuration
        disk_changes = []
        disk_spec = vim.vm.device.VirtualDeviceSpec()
        disk_spec.fileOperation = "create"
        disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
        disk_spec.device = vim.vm.device.VirtualDisk()
        disk_spec.device.backing =\
            vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
        disk_spec.device.backing.diskMode = "persistent"

        if provision_type == 'thin':
            disk_spec.device.backing.thinProvisioned = True

        disk_spec.device.unitNumber = hdd_unit_number
        disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024
        disk_spec.device.controllerKey = ctrl_key

        # If Datastore Cluster is provided attach Disk via that
        if datastore_cluster:
            ds_clust_obj = inventory.get_datastore_cluster(
                self.si_content, name=datastore_cluster)
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            srm = self.si_content.storageResourceManager

            storage_placement_spec = self.get_storage_placement_spec(
                ds_clust_obj, vm, spec)
            datastores = srm.RecommendDatastores(
                storageSpec=storage_placement_spec)

            if not datastores.recommendations:
                sys.stderr.write('Skipping as No datastore Recommendations')

            add_disk_task = srm.ApplyStorageDrsRecommendation_Task(
                datastores.recommendations[0].key)

        elif datastore:
            datastore_obj = inventory.get_datastore(self.si_content,
                                                    name=datastore)
            disk_spec.device.backing.datastore = datastore_obj
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)
        else:
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)

        successfully_added_disk = self._wait_for_task(add_disk_task)
        return {'state': successfully_added_disk}
Beispiel #2
0
    def run(self, vm_id, vm_name, datastore_cluster,
            datastore, disk_size, provision_type):
        # ensure that minimal inputs are provided
        checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name")

        vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name)
        spec = vim.vm.ConfigSpec()
        hdd_unit_number = self.get_next_unit_number(vm)
        ctrl_key = self.get_controller_key(vm)

        # Prepare new Disk configuration
        disk_changes = []
        disk_spec = vim.vm.device.VirtualDeviceSpec()
        disk_spec.fileOperation = "create"
        disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
        disk_spec.device = vim.vm.device.VirtualDisk()
        disk_spec.device.backing =\
            vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
        disk_spec.device.backing.diskMode = "persistent"

        if provision_type == 'thin':
            disk_spec.device.backing.thinProvisioned = True

        disk_spec.device.unitNumber = hdd_unit_number
        disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024
        disk_spec.device.controllerKey = ctrl_key

        # If Datastore Cluster is provided attach Disk via that
        if datastore_cluster:
            ds_clust_obj = inventory.get_datastore_cluster(
                self.si_content, name=datastore_cluster)
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            srm = self.si_content.storageResourceManager

            storage_placement_spec = self.get_storage_placement_spec(
                ds_clust_obj, vm, spec)
            datastores = srm.RecommendDatastores(
                storageSpec=storage_placement_spec)

            if not datastores.recommendations:
                sys.stderr.write('Skipping as No datastore Recommendations')

            add_disk_task = srm.ApplyStorageDrsRecommendation_Task(
                datastores.recommendations[0].key)

        elif datastore:
            datastore_obj = inventory.get_datastore(self.si_content,
                                                    name=datastore)
            disk_spec.device.backing.datastore = datastore_obj
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)
        else:
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)

        successfully_added_disk = self._wait_for_task(add_disk_task)
        return {'state': successfully_added_disk}
    def run(self,
            vm_id,
            vm_name,
            datastore_cluster,
            datastore,
            disk_size,
            provision_type,
            vsphere=None):
        """
        Add Hard Drive object to Virtual Machine

        Args:
        - vm_id: Moid of Virtual Machine to edit
        - vm_name: Name of Virtual Machine to edit
        - datastore_cluster: Datastore Cluster to store new hdd files
        - datastore: Datastore to put new files in
        - disk_size: Sze of HDD in GB
        - provisioning_type: Type of Provisioning to use for HDD
        - vsphere: Pre-configured vsphere connection details (config.yaml)


        Returns:
        - dict: Success
        """
        # ensure that minimal inputs are provided
        checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name")

        self.establish_connection(vsphere)

        vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name)
        spec = vim.vm.ConfigSpec()
        hdd_unit_number = self.get_next_unit_number(vm)
        ctrl_key = self.get_controller_key(vm)

        # Prepare new Disk configuration
        disk_changes = []
        disk_spec = vim.vm.device.VirtualDeviceSpec()
        disk_spec.fileOperation = "create"
        disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
        disk_spec.device = vim.vm.device.VirtualDisk()
        disk_spec.device.backing =\
            vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
        disk_spec.device.backing.diskMode = "persistent"

        if provision_type == 'thin':
            disk_spec.device.backing.thinProvisioned = True

        disk_spec.device.unitNumber = hdd_unit_number
        disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024
        disk_spec.device.controllerKey = ctrl_key

        # If Datastore Cluster is provided attach Disk via that
        if datastore_cluster:
            ds_clust_obj = inventory.get_datastore_cluster(
                self.si_content, name=datastore_cluster)
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            srm = self.si_content.storageResourceManager

            storage_placement_spec = self.get_storage_placement_spec(
                ds_clust_obj, vm, spec)
            datastores = srm.RecommendDatastores(
                storageSpec=storage_placement_spec)

            if not datastores.recommendations:
                sys.stderr.write('Skipping as No datastore Recommendations')

            add_disk_task = srm.ApplyStorageDrsRecommendation_Task(
                datastores.recommendations[0].key)

        elif datastore:
            datastore_obj = inventory.get_datastore(self.si_content,
                                                    name=datastore)
            disk_spec.device.backing.datastore = datastore_obj
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)
        else:
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)

        successfully_added_disk = self._wait_for_task(add_disk_task)
        return {'state': successfully_added_disk}
Beispiel #4
0
    def run(self,
            vm_name,
            cluster,
            datastore_cluster,
            datastore,
            resourcepool,
            cpu_size,
            ram_size,
            guestos,
            version,
            description,
            vsphere=None):
        """
        Create barebones VM (CPU/RAM/Graphics)

        Args:
        - vm_name: Name of Virtual Machine to create
        - vsphere: Pre-configured vsphere connection details (config.yaml)
        - description: Short Description of VM and it's purpose
        - cpu_size: Number of vCPUs to allocate
        - ram_size: Ammount of memory to assign (GB)
        - datastore_cluster: name of DataStore Cluster to use for VM Files
        - datastore: Individual datastore to put vm files within.
                     Not needed if datastore_cluster is set
        - cluster: Cluster within vsphere to host virtual machine
        - version: VM version to set
        - guestos: Code for GuestOS that will be installed on this VM
        - resourepool: vsphere resource pool to assign new VM to

        Returns:
        - dict: vm moid of newly created vm
        """
        # Setup Identifiers for objects
        self.establish_connection(vsphere)
        si = self.si
        si_content = si.RetrieveContent()
        # checkinputs.vm_storage(datastore_cluster, datastore)
        checkinputs.one_of_two_strings(datastore_cluster, datastore,
                                       "Datastore Cluster or Datastore")

        data_center = self.si_content.rootFolder.childEntity[0]
        cluster = inventory.get_cluster(self.si_content, name=cluster)
        data_store_cluster = inventory.get_datastore_cluster(
            self.si_content, name=datastore_cluster)
        # data_store = inventory.get_datastore(self.si_content, name=datastore)
        target_folder = data_center.vmFolder

        # If No Resource Pool issued the Default one for
        # the Cluster will be selected.
        if resourcepool:
            resource_pool = inventory.get_resource_pool(self.si_content,
                                                        name=resourcepool)
        else:
            resource_pool = cluster.resourcePool

        # Config created that is required for DS selection
        # Config is BareBones, CPU RAM no more.
        config = vim.vm.ConfigSpec(name=vm_name,
                                   memoryMB=(ram_size * 1024),
                                   numCPUs=cpu_size,
                                   guestId=guestos,
                                   version=version,
                                   cpuHotAddEnabled=True,
                                   memoryHotAddEnabled=True,
                                   annotation=description)

        # if Datastore cluster is provided it will find the
        # recommended Datastore to store VM files
        if datastore_cluster:
            podsel = vim.storageDrs.PodSelectionSpec()
            podsel.storagePod = data_store_cluster

            storage_spec = vim.storageDrs.StoragePlacementSpec(
                type='create',
                configSpec=config,
                resourcePool=resource_pool,
                podSelectionSpec=podsel,
                folder=target_folder)

            # Create Instance of Storage Resource Manager -
            # This is used to identify a Recommended Datastore from a Cluster
            srm = si_content.storageResourceManager
            results = srm.RecommendDatastores(storageSpec=storage_spec)
            rec_ds = results.recommendations[0].action[0]\
                .relocateSpec.datastore
            datastore_path = '[' + rec_ds.name + '] ' + vm_name
        else:
            # No Datastore Cluster has been offered so using the D
            if datastore:
                datastore_path = '[' + datastore + '] ' + vm_name
            else:
                raise Exception('Error No Storage Data Provided')

        # Now Datastore is known the remaining
        # of VM Config can be setup and added
        vmx_file = vim.vm.FileInfo(logDirectory=None,
                                   snapshotDirectory=None,
                                   suspendDirectory=None,
                                   vmPathName=datastore_path)
        config.files = vmx_file

        # Create task to Build actual Machine
        task = target_folder.CreateVM_Task(config=config, pool=resource_pool)
        self._wait_for_task(task)
        if task.info.state != vim.TaskInfo.State.success:
            raise Exception(task.info.error.msg)

        return {'vm_id': task.info.result._moId}
    def run(self, vm_name, cluster, datastore_cluster,
            datastore, resourcepool, cpu_size, ram_size,
            guestos, version, description, vsphere=None):
        """
        Create barebones VM (CPU/RAM/Graphics)

        Args:
        - vm_name: Name of Virtual Machine to create
        - vsphere: Pre-configured vsphere connection details (config.yaml)
        - description: Short Description of VM and it's purpose
        - cpu_size: Number of vCPUs to allocate
        - ram_size: Ammount of memory to assign (GB)
        - datastore_cluster: name of DataStore Cluster to use for VM Files
        - datastore: Individual datastore to put vm files within.
                     Not needed if datastore_cluster is set
        - cluster: Cluster within vsphere to host virtual machine
        - version: VM version to set
        - guestos: Code for GuestOS that will be installed on this VM
        - resourepool: vsphere resource pool to assign new VM to

        Returns:
        - dict: vm moid of newly created vm
        """
        # Setup Identifiers for objects
        self.establish_connection(vsphere)
        si = self.si
        si_content = si.RetrieveContent()
        # checkinputs.vm_storage(datastore_cluster, datastore)
        checkinputs.one_of_two_strings(datastore_cluster,
                                       datastore,
                                       "Datastore Cluster or Datastore")

        data_center = self.si_content.rootFolder.childEntity[0]
        cluster = inventory.get_cluster(self.si_content, name=cluster)
        data_store_cluster = inventory.get_datastore_cluster(
            self.si_content,
            name=datastore_cluster)
        # data_store = inventory.get_datastore(self.si_content, name=datastore)
        target_folder = data_center.vmFolder

        # If No Resource Pool issued the Default one for
        # the Cluster will be selected.
        if resourcepool:
            resource_pool = inventory.get_resource_pool(self.si_content,
                                                        name=resourcepool)
        else:
            resource_pool = cluster.resourcePool

        # Config created that is required for DS selection
        # Config is BareBones, CPU RAM no more.
        config = vim.vm.ConfigSpec(name=vm_name,
                                   memoryMB=(ram_size * 1024),
                                   numCPUs=cpu_size,
                                   guestId=guestos,
                                   version=version,
                                   cpuHotAddEnabled=True,
                                   memoryHotAddEnabled=True,
                                   annotation=description)

        # if Datastore cluster is provided it will find the
        # recommended Datastore to store VM files
        if datastore_cluster:
            podsel = vim.storageDrs.PodSelectionSpec()
            podsel.storagePod = data_store_cluster

            storage_spec = vim.storageDrs.StoragePlacementSpec(
                type='create',
                configSpec=config,
                resourcePool=resource_pool,
                podSelectionSpec=podsel,
                folder=target_folder)

            # Create Instance of Storage Resource Manager -
            # This is used to identify a Recommended Datastore from a Cluster
            srm = si_content.storageResourceManager
            results = srm.RecommendDatastores(storageSpec=storage_spec)
            rec_ds = results.recommendations[0].action[0]\
                .relocateSpec.datastore
            datastore_path = '[' + rec_ds.name + '] ' + vm_name
        else:
            # No Datastore Cluster has been offered so using the D
            if datastore:
                datastore_path = '[' + datastore + '] ' + vm_name
            else:
                raise Exception('Error No Storage Data Provided')

        # Now Datastore is known the remaining
        # of VM Config can be setup and added
        vmx_file = vim.vm.FileInfo(logDirectory=None,
                                   snapshotDirectory=None,
                                   suspendDirectory=None,
                                   vmPathName=datastore_path)
        config.files = vmx_file

        # Create task to Build actual Machine
        task = target_folder.CreateVM_Task(config=config, pool=resource_pool)
        self._wait_for_task(task)
        if task.info.state != vim.TaskInfo.State.success:
            raise Exception(task.info.error.msg)

        return {'vm_id': task.info.result._moId}
    def run(self, vm_name, cluster, datastore_cluster,
            datastore, resourcepool, cpu_size, ram_size,
            guestos, version, description):
        # Setup Identifiers for objects
        si = self.si
        si_content = si.RetrieveContent()
        # checkinputs.vm_storage(datastore_cluster, datastore)
        checkinputs.one_of_two_strings(datastore_cluster,
                                       datastore,
                                       "Datastore Cluster or Datastore")

        data_center = self.si_content.rootFolder.childEntity[0]
        cluster = inventory.get_cluster(self.si_content, name=cluster)
        data_store_cluster = inventory.get_datastore_cluster(
            self.si_content,
            name=datastore_cluster)
        # data_store = inventory.get_datastore(self.si_content, name=datastore)
        target_folder = data_center.vmFolder

        # If No Resource Pool issued the Default one for
        # the Cluster will be selected.
        if resourcepool:
            resource_pool = inventory.get_resource_pool(self.si_content,
                                                        name=resourcepool)
        else:
            resource_pool = cluster.resourcePool

        # Config created that is required for DS selection
        # Config is BareBones, CPU RAM no more.
        config = vim.vm.ConfigSpec(name=vm_name,
                                   memoryMB=(ram_size * 1024),
                                   numCPUs=cpu_size,
                                   guestId=guestos,
                                   version=version,
                                   cpuHotAddEnabled=True,
                                   memoryHotAddEnabled=True,
                                   annotation=description)

        # if Datastore cluster is provided it will find the
        # recommended Datastore to store VM files
        if datastore_cluster:
            podsel = vim.storageDrs.PodSelectionSpec()
            podsel.storagePod = data_store_cluster

            storage_spec = vim.storageDrs.StoragePlacementSpec(
                type='create',
                configSpec=config,
                resourcePool=resource_pool,
                podSelectionSpec=podsel,
                folder=target_folder)

            # Create Instance of Storage Resource Manager -
            # This is used to identify a Recommended Datastore from a Cluster
            srm = si_content.storageResourceManager
            results = srm.RecommendDatastores(storageSpec=storage_spec)
            rec_ds = results.recommendations[0].action[0]\
                .relocateSpec.datastore
            datastore_path = '[' + rec_ds.name + '] ' + vm_name
        else:
            # No Datastore Cluster has been offered so using the D
            if datastore:
                datastore_path = '[' + datastore + '] ' + vm_name
            else:
                raise Exception('Error No Storage Data Provided')

        # Now Datastore is known the remaining
        # of VM Config can be setup and added
        vmx_file = vim.vm.FileInfo(logDirectory=None,
                                   snapshotDirectory=None,
                                   suspendDirectory=None,
                                   vmPathName=datastore_path)
        config.files = vmx_file

        # Create task to Build actual Machine
        task = target_folder.CreateVM_Task(config=config, pool=resource_pool)
        self._wait_for_task(task)
        if task.info.state != vim.TaskInfo.State.success:
            raise Exception(task.info.error.msg)

        return {'vm_id': task.info.result._moId}
    def run(self, vm_name, cluster, datastore_cluster, datastore, resourcepool,
            cpu_size, ram_size, guestos, version, description):
        # Setup Identifiers for objects
        si = self.si
        si_content = si.RetrieveContent()
        # checkinputs.vm_storage(datastore_cluster, datastore)
        checkinputs.one_of_two_strings(datastore_cluster, datastore,
                                       "Datastore Cluster or Datastore")

        data_center = self.si_content.rootFolder.childEntity[0]
        cluster = inventory.get_cluster(self.si_content, name=cluster)
        data_store_cluster = inventory.get_datastore_cluster(
            self.si_content, name=datastore_cluster)
        # data_store = inventory.get_datastore(self.si_content, name=datastore)
        target_folder = data_center.vmFolder

        # If No Resource Pool issued the Default one for
        # the Cluster will be selected.
        if resourcepool:
            resource_pool = inventory.get_resource_pool(self.si_content,
                                                        name=resourcepool)
        else:
            resource_pool = cluster.resourcePool

        # Config created that is required for DS selection
        # Config is BareBones, CPU RAM no more.
        config = vim.vm.ConfigSpec(name=vm_name,
                                   memoryMB=(ram_size * 1024),
                                   numCPUs=cpu_size,
                                   guestId=guestos,
                                   version=version,
                                   cpuHotAddEnabled=True,
                                   memoryHotAddEnabled=True,
                                   annotation=description)

        # if Datastore cluster is provided it will find the
        # recommended Datastore to store VM files
        if datastore_cluster:
            podsel = vim.storageDrs.PodSelectionSpec()
            podsel.storagePod = data_store_cluster

            storage_spec = vim.storageDrs.StoragePlacementSpec(
                type='create',
                configSpec=config,
                resourcePool=resource_pool,
                podSelectionSpec=podsel,
                folder=target_folder)

            # Create Instance of Storage Resource Manager -
            # This is used to identify a Recommended Datastore from a Cluster
            srm = si_content.storageResourceManager
            results = srm.RecommendDatastores(storageSpec=storage_spec)
            rec_ds = results.recommendations[0].action[0]\
                .relocateSpec.datastore
            datastore_path = '[' + rec_ds.name + '] ' + vm_name
        else:
            # No Datastore Cluster has been offered so using the D
            if datastore:
                datastore_path = '[' + datastore + '] ' + vm_name
            else:
                raise Exception('Error No Storage Data Provided')

        # Now Datastore is known the remaining
        # of VM Config can be setup and added
        vmx_file = vim.vm.FileInfo(logDirectory=None,
                                   snapshotDirectory=None,
                                   suspendDirectory=None,
                                   vmPathName=datastore_path)
        config.files = vmx_file

        # Create task to Build actual Machine
        task = target_folder.CreateVM_Task(config=config, pool=resource_pool)
        self._wait_for_task(task)
        if task.info.state != vim.TaskInfo.State.success:
            raise Exception(task.info.error.msg)

        return {'vm_id': task.info.result._moId}
Beispiel #8
0
    def run(self, vm_id, vm_name, datastore_cluster,
            datastore, disk_size, provision_type, vsphere=None):
        """
        Add Hard Drive object to Virtual Machine

        Args:
        - vm_id: Moid of Virtual Machine to edit
        - vm_name: Name of Virtual Machine to edit
        - datastore_cluster: Datastore Cluster to store new hdd files
        - datastore: Datastore to put new files in
        - disk_size: Sze of HDD in GB
        - provisioning_type: Type of Provisioning to use for HDD
        - vsphere: Pre-configured vsphere connection details (config.yaml)


        Returns:
        - dict: Success
        """
        # ensure that minimal inputs are provided
        checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name")

        self.establish_connection(vsphere)

        vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name)
        spec = vim.vm.ConfigSpec()
        hdd_unit_number = self.get_next_unit_number(vm)
        ctrl_key = self.get_controller_key(vm)

        # Prepare new Disk configuration
        disk_changes = []
        disk_spec = vim.vm.device.VirtualDeviceSpec()
        disk_spec.fileOperation = "create"
        disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
        disk_spec.device = vim.vm.device.VirtualDisk()
        disk_spec.device.backing =\
            vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
        disk_spec.device.backing.diskMode = "persistent"

        if provision_type == 'thin':
            disk_spec.device.backing.thinProvisioned = True

        disk_spec.device.unitNumber = hdd_unit_number
        disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024
        disk_spec.device.controllerKey = ctrl_key

        # If Datastore Cluster is provided attach Disk via that
        if datastore_cluster:
            ds_clust_obj = inventory.get_datastore_cluster(
                self.si_content, name=datastore_cluster)
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            srm = self.si_content.storageResourceManager

            storage_placement_spec = self.get_storage_placement_spec(
                ds_clust_obj, vm, spec)
            datastores = srm.RecommendDatastores(
                storageSpec=storage_placement_spec)

            if not datastores.recommendations:
                sys.stderr.write('Skipping as No datastore Recommendations')

            add_disk_task = srm.ApplyStorageDrsRecommendation_Task(
                datastores.recommendations[0].key)

        elif datastore:
            datastore_obj = inventory.get_datastore(self.si_content,
                                                    name=datastore)
            disk_spec.device.backing.datastore = datastore_obj
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)
        else:
            disk_changes.append(disk_spec)
            spec.deviceChange = disk_changes
            add_disk_task = vm.ReconfigVM_Task(spec)

        successfully_added_disk = self._wait_for_task(add_disk_task)
        return {'state': successfully_added_disk}