def add_vm(self):
        params = self.params
        source_vapp_resource = self.get_source_resource()
        target_vm_name = params.get('target_vm_name')
        source_vm_name = params.get('source_vm_name')
        hostname = params.get('hostname')
        vmpassword = params.get('vmpassword')
        vmpassword_auto = params.get('vmpassword_auto')
        vmpassword_reset = params.get('vmpassword_reset')
        network = params.get('network')
        all_eulas_accepted = params.get('all_eulas_accepted')
        power_on = params.get('power_on')
        ip_allocation_mode = params.get('ip_allocation_mode')
        cust_script = params.get('cust_script')
        storage_profile = params.get('storage_profile')
        properties = params.get('properties')
        response = dict()
        response['changed'] = False

        try:
            self.get_vm()
        except EntityNotFoundException:
            spec = {
                'source_vm_name': source_vm_name,
                'vapp': source_vapp_resource,
                'target_vm_name': target_vm_name,
                'hostname': hostname,
                'password': vmpassword,
                'password_auto': vmpassword_auto,
                'password_reset': vmpassword_reset,
                'ip_allocation_mode': ip_allocation_mode,
                'network': network,
                'cust_script': cust_script
            }
            if storage_profile!='':
                spec['storage_profile'] = self.get_storage_profile(storage_profile)
            spec = {k: v for k, v in spec.items() if v}
            source_vm = self.vapp.to_sourced_item(spec)

            # Check the source vm if we need to inject OVF properties.
            source_vapp = VApp(self.client, resource=source_vapp_resource)
            vm = source_vapp.get_vm(source_vm_name)
            productsection = vm.find('ovf:ProductSection', NSMAP)
            if productsection is not None:
                for prop in productsection.iterfind('ovf:Property', NSMAP):
                    if properties and prop.get('{'+NSMAP['ovf']+'}key') in properties:
                        val = prop.find('ovf:Value', NSMAP)
                        if val:
                            prop.remove(val)
                        val = E_OVF.Value()
                        val.set('{'+NSMAP['ovf']+'}value', properties[prop.get('{'+NSMAP['ovf']+'}key')])
                        prop.append(val)
                source_vm.InstantiationParams.append(productsection)
                source_vm.VmGeneralParams.NeedsCustomization = E.NeedsCustomization('true')

            params = E.RecomposeVAppParams(deploy='true', powerOn='true' if power_on else 'false')
            params.append(source_vm)
            if all_eulas_accepted is not None:
                params.append(E.AllEULAsAccepted(all_eulas_accepted))

            add_vms_task = self.client.post_linked_resource(
                self.get_target_resource(), RelationType.RECOMPOSE,
                EntityType.RECOMPOSE_VAPP_PARAMS.value, params)
            self.execute_task(add_vms_task)
            response['msg'] = 'Vapp VM {} has been created.'.format(
                target_vm_name)
            response['changed'] = True
        else:
            response['warnings'] = 'Vapp VM {} is already present.'.format(
                target_vm_name)

        return response
    def update_vm_ng(self):
        source_vapp_resource = self.get_source_resource()
        source_vapp_name = self.params.get('vapp')
        target_vapp_name = self.params.get('vapp')
        vapp = self.params.get('vapp')
        source_vm_name = self.params.get('vm_name')
        target_vm_name = self.params.get('vm_name')
        vm_name = self.params.get('vm_name')
        force_customization = self.params.get('force_customization')
        hostname = self.params.get('hostname')
        vmpassword = self.params.get('vmpassword')
        vmpassword_auto = self.params.get('vmpassword_auto')
        vmpassword_reset = self.params.get('vmpassword_reset')
        network = self.params.get('network')
        all_eulas_accepted = self.params.get('all_eulas_accepted')
        power_on = self.params.get('power_on')
        deploy = self.params.get('deploy')
        ip_allocation_mode = self.params.get('ip_allocation_mode')
        cust_script = self.params.get('cust_script')
        storage_profile = self.params.get('storage_profile')
        properties = self.params.get('properties')
        response = dict()
        response['changed'] = False
        self.vapp = vapp
        self.target_vm_name = target_vm_name
        self.source_vm_name = source_vm_name
        self.source_vapp_name = vapp
        self.target_vapp_name = vapp
        self.vm_name = vm_name
        self.hostname = hostname
        self.vmpassword = vmpassword
        self.vmpassword_auto = vmpassword_auto
        self.vmpassword_reset = vmpassword_reset
        self.network = network
        self.force_customization = force_customization
        self.all_eulas_accepted = all_eulas_accepted
        self.power_on = power_on
        self.ip_allocation_mode = ip_allocation_mode
        self.cust_script = cust_script
        self.storage_profile = storage_profile
        # self.params =
        vm = self.get_vm()
        self.vm = vm
        source_vm = vm
        target_vm = vm
        self.source_vm = source_vm
        self.target_vm = target_vm
        spec = {
            'source_vm_name': source_vm,
            'target_vm_name': target_vm,
            'vapp': vapp,
            'vm_name': vm_name,
            'hostname': hostname,
            'password': vmpassword,
            'password_auto': vmpassword_auto,
            'password_reset': vmpassword_reset,
            'ip_allocation_mode': ip_allocation_mode,
            'network': network,
            'cust_script': cust_script,
            'force_customization': force_customization
        }

        spec = {k: v for k, v in spec.items() if v}
        if storage_profile != '':
            spec['storage_profile'] = self.get_storage_profile(storage_profile)
        # source_vm = self.vapp.to_sourced_item(spec)

        # # Check the source vm if we need to inject OVF properties.
        # source_vapp = VApp(self.client, resource=source_vapp_resource)
        # vm = source_vapp.get_vm(source_vm_name)
        productsection = vm.find('ovf:ProductSection', NSMAP)
        if productsection is not None:
            for prop in productsection.iterfind('ovf:Property', NSMAP):
                if properties and prop.get('{' + NSMAP['ovf'] +
                                           '}key') in properties:
                    val = prop.find('ovf:Value', NSMAP)
                    if val:
                        prop.remove(val)
                    val = E_OVF.Value()
                    val.set('{' + NSMAP['ovf'] + '}value',
                            properties[prop.get('{' + NSMAP['ovf'] + '}key')])
                    prop.append(val)
            source_vm.InstantiationParams.append(productsection)
            source_vm.VmGeneralParams.NeedsCustomization = E.NeedsCustomization(
                'true')

        params = E.RecomposeVAppParams(state='update' if state else 'false',
                                       deploy='true' if deploy else 'false',
                                       powerOn='true' if power_on else 'false')
        params.append(source_vm)
        if all_eulas_accepted is not None:
            params.update(E.AllEULAsAccepted(all_eulas_accepted))

        update_vm_ngs_task = self.client.post_linked_resource(
            self.get_target_resource(), RelationType.RECOMPOSE,
            EntityType.RECOMPOSE_VAPP_PARAMS.value, params)
        self.execute_task(update_vm_ngs_task)
        response['msg'] = 'VM {} has been created.'.format(target_vm_name)
        response['changed'] = True

        return response