Beispiel #1
0
def add_disk(ctx, name, vm_name, size, storage_profile):
    try:
        client = ctx.obj['client']
        vdc_href = ctx.obj['profiles'].get('vdc_href')
        vdc = VDC(client, href=vdc_href)
        vapp_resource = vdc.get_vapp(name)
        vapp = VApp(client, resource=vapp_resource)
        task = vapp.add_disk_to_vm(vm_name, size)
        stdout(task, ctx)
    except Exception as e:
        stderr(e, ctx)
Beispiel #2
0
def add_disk(ctx, name, vm_name, size, storage_profile):
    try:
        restore_session(ctx, vdc_required=True)
        client = ctx.obj['client']
        vdc_href = ctx.obj['profiles'].get('vdc_href')
        vdc = VDC(client, href=vdc_href)
        vapp_resource = vdc.get_vapp(name)
        vapp = VApp(client, resource=vapp_resource)
        task = vapp.add_disk_to_vm(vm_name, size)
        stdout(task, ctx)
    except Exception as e:
        stderr(e, ctx)
Beispiel #3
0
 def test_012_add_disk(self):
     logged_in_org = self.client.get_org()
     org = Org(self.client, resource=logged_in_org)
     v = org.get_vdc(self.config['vcd']['vdc'])
     vdc = VDC(self.client, href=v.get('href'))
     assert self.config['vcd']['vdc'] == vdc.get_resource().get('name')
     vapp_resource = vdc.get_vapp(self.config['vcd']['vapp'])
     assert self.config['vcd']['vapp'] == vapp_resource.get('name')
     vm_name = self.config['vcd']['vm']
     vapp = VApp(self.client, resource=vapp_resource)
     disk_size = 1024  # 1GB
     result = vapp.add_disk_to_vm(vm_name, disk_size)
     task = self.client.get_task_monitor().wait_for_status(
         task=result,
         timeout=60,
         poll_frequency=2,
         fail_on_status=None,
         expected_target_statuses=[
             TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR,
             TaskStatus.CANCELED
         ],
         callback=None)
     assert task.get('status') == TaskStatus.SUCCESS.value
Beispiel #4
0
 def test_012_add_disk(self):
     logged_in_org = self.client.get_org()
     org = Org(self.client, resource=logged_in_org)
     v = org.get_vdc(self.config['vcd']['vdc'])
     vdc = VDC(self.client, href=v.get('href'))
     assert self.config['vcd']['vdc'] == vdc.get_resource().get('name')
     vapp_resource = vdc.get_vapp(self.config['vcd']['vapp'])
     assert self.config['vcd']['vapp'] == vapp_resource.get('name')
     vm_name = self.config['vcd']['vm']
     vapp = VApp(self.client, resource=vapp_resource)
     disk_size = 1024  # 1GB
     result = vapp.add_disk_to_vm(vm_name, disk_size)
     task = self.client.get_task_monitor().wait_for_status(
         task=result,
         timeout=60,
         poll_frequency=2,
         fail_on_statuses=None,
         expected_target_statuses=[
             TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR,
             TaskStatus.CANCELED
         ],
         callback=None)
     assert task.get('status') == TaskStatus.SUCCESS.value
class VappVMDisk(VcdAnsibleModule):
    def __init__(self, **kwargs):
        super(VappVMDisk, self).__init__(**kwargs)
        self.org = self.get_org()
        vapp_resource = self.get_resource()
        self.vapp = VApp(self.client, resource=vapp_resource)

    def manage_states(self):
        state = self.params.get('state')
        if state == "present":
            return self.add_disk()

        if state == "update":
            return self.update_disk()

        if state == "absent":
            return self.delete_disk()

    def manage_operations(self):
        operation = self.params.get('operation')

        if operation == "read":
            return self.read_disks()

    def get_org(self):
        org_name = self.params.get('org_name')
        org_resource = self.client.get_org()
        if org_name:
            org_resource = self.client.get_org_by_name(org_name)

        return Org(self.client, resource=org_resource)

    def get_resource(self):
        vapp = self.params.get('vapp')
        vdc = self.params.get('vdc')
        vdc_resource = VDC(self.client, resource=self.org.get_vdc(vdc))
        vapp_resource_href = vdc_resource.get_resource_href(
            name=vapp, entity_type=EntityType.VAPP)
        vapp_resource = self.client.get_resource(vapp_resource_href)

        return vapp_resource

    def get_vm(self):
        vapp_vm_resource = self.vapp.get_vm(self.params.get('vm_name'))

        return VM(self.client, resource=vapp_vm_resource)

    def get_formatted_disk_size(self, disk_size):
        '''
            Convert disk byte size into GB or MB
            MB = 1024 * 1024 ( 2 ** 20 )
            GB = 1024 * 1024 * 1024 ( 2 ** 30 )

            Note - only MB and GB are supported from vCD

        '''
        log_value = int(math.floor(math.log(disk_size, 1024)))
        pow_value = math.pow(1024, log_value)
        size_metric = ' MB' if log_value == 2 else ' GB'

        return str(round(disk_size / pow_value, 1)) + size_metric

    def add_disk(self):
        disks = self.params.get('disks')
        vm_name = self.params.get('vm_name')
        response = dict()
        response['msg'] = list()
        response['changed'] = False
        available_disks = self.read_disks().get("disks").keys()
        warnings = list()

        for disk in disks:
            disk_size = int(disk.get("size"))
            disk_controller = disk.get("controller")
            disk_name = disk.get("name")
            '''
            here the condition covers both the situtation
            1. if someone has given the disk name then first it will
            check for disk availability first before adding it.
            2. if someone has ignored giving the disk name then it will
            add a new disk any way.
            '''
            if disk_name not in available_disks:
                add_disk_task = self.vapp.add_disk_to_vm(
                    vm_name, disk_size, disk_controller)
                self.execute_task(add_disk_task)
                msg = "A disk with size {0} and controller {1} has been added to VM {2}"
                msg = msg.format(disk_size, disk_controller, vm_name)
                response['changed'] = True
                response['msg'].append(msg)
            else:
                warnings.append(disk_name)
        if warnings:
            warnings = ','.join(warnings)
            msg = "Hard disk(s) with name '{0}' are already present"
            response["warnings"] = msg.format(warnings)

        return response

    def read_disks(self):
        vm = self.get_vm()
        response = dict()
        response['changed'] = False
        response['disks'] = dict()
        disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')

        for disk in disks.Item:
            if disk['{' + NSMAP['rasd'] + '}Description'] == "Hard disk":
                disk_name = str(disk['{' + NSMAP['rasd'] + '}ElementName'])
                disk_instance = int(disk['{' + NSMAP['rasd'] + '}InstanceID'])
                disk_size = int(disk['{' + NSMAP['rasd'] + '}VirtualQuantity'])
                disk_hostresource = disk['{' + NSMAP['rasd'] + '}HostResource']
                disk_capacity = int(
                    disk_hostresource.get('{' + NSMAP['vcloud'] + '}capacity'))
                response['disks'][disk_name] = {
                    'InstanceID': disk_instance,
                    'VirtualQuantity': self.get_formatted_disk_size(disk_size),
                    'HostResource': str(round(disk_capacity / 1024, 1)) + ' GB'
                }

        return response

    def update_disk(self):
        disks = self.params.get('disks')
        response = dict()
        response['changed'] = False
        response['msg'] = list()
        vm = self.get_vm()

        vm_disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')
        disk_names = [disk.get("name") for disk in disks]
        disk_sizes = [disk.get("size", None) for disk in disks]
        disk_sizes = list(filter(lambda size: size is not None, disk_sizes))
        assert len(disk_sizes) == len(disk_names)

        for index, disk_name in enumerate(disk_names):
            for vm_disk_index, disk in enumerate(vm_disks.Item):
                disk_size = int(disk_sizes[index])
                if disk['{' + NSMAP['rasd'] + '}ElementName'] == disk_name:
                    disk['{' + NSMAP['rasd'] + '}VirtualQuantity'] = disk_size
                    disk['{' + NSMAP['rasd'] + '}HostResource'].set(
                        '{' + NSMAP['vcloud'] + '}capacity', str(disk_size))
                vm_disks.Item[vm_disk_index] = disk

        update_disk_task = self.client.put_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks',
            vm_disks, EntityType.RASD_ITEMS_LIST.value)
        self.execute_task(update_disk_task)
        msg = 'Vapp VM disk with name {0} has been updated.'
        response['msg'].append(msg.format(disk_name))
        response['changed'] = True

        return response

    def delete_disk(self):
        vm = self.get_vm()
        disks = self.params.get('disks')
        disks_to_remove = [disk.get("name") for disk in disks]
        response = dict()
        response['changed'] = False

        disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')

        for disk in disks.Item:
            if disk['{' + NSMAP['rasd'] + '}ElementName'] in disks_to_remove:
                disks.remove(disk)
                disks_to_remove.remove(disk['{' + NSMAP['rasd'] +
                                            '}ElementName'])

        if len(disks_to_remove) > 0:
            error = 'VM disk(s) with name {0} was not found.'
            error = error.format(','.join(disks_to_remove))
            raise EntityNotFoundException(error)

        remove_disk_task = self.client.put_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks', disks,
            EntityType.RASD_ITEMS_LIST.value)
        self.execute_task(remove_disk_task)
        response['msg'] = 'VM disk(s) has been deleted.'
        response['changed'] = True

        return response
Beispiel #6
0
class VappVMDisk(VcdAnsibleModule):
    def __init__(self, **kwargs):
        super(VappVMDisk, self).__init__(**kwargs)
        vapp_resource = self.get_resource()
        self.vapp = VApp(self.client, resource=vapp_resource)

    def manage_states(self):
        state = self.params.get('state')
        if state == "present":
            return self.add_disk()

        if state == "update":
            return self.update_disk()

        if state == "absent":
            return self.delete_disk()

    def manage_operations(self):
        operation = self.params.get('operation')

        if operation == "read":
            return self.read_disks()

    def get_resource(self):
        vapp = self.params.get('vapp')
        vdc = self.params.get('vdc')
        org_resource = Org(self.client, resource=self.client.get_org())
        vdc_resource = VDC(self.client, resource=org_resource.get_vdc(vdc))
        vapp_resource_href = vdc_resource.get_resource_href(
            name=vapp, entity_type=EntityType.VAPP)
        vapp_resource = self.client.get_resource(vapp_resource_href)

        return vapp_resource

    def get_vm(self):
        vapp_vm_resource = self.vapp.get_vm(self.params.get('vm_name'))

        return VM(self.client, resource=vapp_vm_resource)

    def add_disk(self):
        size = self.params.get('size')
        vm_name = self.params.get('vm_name')
        response = dict()
        response['changed'] = False

        disks = self.read_disks().get('disks')
        last_disk = list(disks.keys())[-1]
        last_disk_instance_id = int(disks[last_disk]['InstanceID'])
        new_disk_name = str(int(last_disk.split(' ')[2]) + 1)
        new_disk_instance_id = last_disk_instance_id + 1
        add_disk_task = self.vapp.add_disk_to_vm(vm_name, size)
        self.execute_task(add_disk_task)
        msg = 'Vapp VM disk of size {0} has been added.'
        response['msg'] = msg.format(str(size))
        response['metadata'] = {
            'new_disk_name': 'Hard disk {0}'.format(new_disk_name),
            'new_disk_size': size,
            'new_disk_instance_id': new_disk_instance_id
        }
        response['changed'] = True

        return response

    def read_disks(self):
        vm = self.get_vm()
        response = dict()
        response['changed'] = False
        response['disks'] = dict()
        disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')
        for disk in disks.Item:
            if disk['{' + NSMAP['rasd'] + '}Description'] == "Hard disk":
                disk_name = str(disk['{' + NSMAP['rasd'] + '}ElementName'])
                disk_instance = int(disk['{' + NSMAP['rasd'] + '}InstanceID'])
                disk_size = int(disk['{' + NSMAP['rasd'] + '}VirtualQuantity'])
                disk_hostresource = disk['{' + NSMAP['rasd'] + '}HostResource']
                disk_capacity = int(
                    disk_hostresource.get('{' + NSMAP['vcloud'] + '}capacity'))
                response['disks'][disk_name] = {
                    'InstanceID': disk_instance,
                    'VirtualQuantity': self.convert_bytes_to_gb(disk_size),
                    'HostResource': str(round(disk_capacity / 1024, 1)) + ' GB'
                }

        return response

    def convert_bytes_to_gb(self, disk_size):
        log_value = int(math.floor(math.log(disk_size, 1024)))
        pow_value = math.pow(1024, log_value)

        return str(round(disk_size / pow_value, 1)) + ' GB'

    def update_disk(self):
        vm = self.get_vm()
        disk_name = self.params.get('disk_name')
        size = self.params.get('size')
        response = dict()
        response['changed'] = False
        index = -1

        if not size:
            err = '''Hard disk size argument is missing. Disk \'update\' operation only allows disk size to be updated
            for the exisiting VM\'s.'''
            raise Exception(err)

        disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')
        for i, disk in enumerate(disks.Item):
            if disk['{' + NSMAP['rasd'] + '}ElementName'] == disk_name:
                index = i

        if index < 0:
            err = 'Can\'t find the specified VM disk with name {0}'
            err = err.format(disk_name)
            raise EntityNotFoundException(err)

        disks.Item[index]['{' + NSMAP['rasd'] +
                          '}VirtualQuantity'] = size * 1024 * 1024
        disks.Item[index]['{' + NSMAP['rasd'] + '}HostResource'].set(
            '{' + NSMAP['vcloud'] + '}capacity', str(size))
        update_disk_task = self.client.put_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks', disks,
            EntityType.RASD_ITEMS_LIST.value)
        self.execute_task(update_disk_task)

        msg = 'Vapp VM disk with name {0} has been updated.'
        response['msg'] = msg.format(disk_name)
        response['changed'] = True

        return response

    def delete_disk(self):
        vm = self.get_vm()
        disks_to_remove = self.params.get('disks')
        response = dict()
        response['changed'] = False

        disks = self.client.get_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks')

        for disk in disks.Item:
            if disk['{' + NSMAP['rasd'] + '}ElementName'] in disks_to_remove:
                disks.remove(disk)
                disks_to_remove.remove(disk['{' + NSMAP['rasd'] +
                                            '}ElementName'])

        if len(disks_to_remove) > 0:
            err = 'VM disk(s) with name {0} was not found.'
            err = err.format(','.join(disks_to_remove))

            raise EntityNotFoundException(err)

        remove_disk_task = self.client.put_resource(
            vm.resource.get('href') + '/virtualHardwareSection/disks', disks,
            EntityType.RASD_ITEMS_LIST.value)
        self.execute_task(remove_disk_task)
        response['msg'] = 'VM disk(s) has been deleted.'
        response['changed'] = True

        return response