From a40dc1174e56adcc35b3c61f157f278e61adfa9b Mon Sep 17 00:00:00 2001 From: Ankur Gupta Date: Tue, 28 May 2019 17:28:13 +0530 Subject: [PATCH] Add support to start a vm and put it on hold in one_vm (#56841) * Add support to start a vm and put it on hold in one_vm * Add version_added to vm_start_on_hold option for one_vm * Add version_added to vm_start_on_hold option for one_vm#2 * Add version_added to vm_start_on_hold option for one_vm#3 * Fix indentation for one_vm --- .../modules/cloud/opennebula/one_vm.py | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/ansible/modules/cloud/opennebula/one_vm.py b/lib/ansible/modules/cloud/opennebula/one_vm.py index cab6384ab10..4e692ee2d58 100644 --- a/lib/ansible/modules/cloud/opennebula/one_vm.py +++ b/lib/ansible/modules/cloud/opennebula/one_vm.py @@ -61,6 +61,11 @@ options: template_id: description: - ID of a VM template to use to create a new instance + vm_start_on_hold: + description: + - Set to true to put vm on hold while creating + default: False + version_added: '2.9' instance_ids: description: - A list of instance ids used for states':' C(absent), C(running), C(rebooted), C(poweredoff) @@ -182,6 +187,11 @@ EXAMPLES = ''' - debug: msg: result +# Deploy a new VM on hold +- one_vm: + template_name: 'app1_template' + vm_start_on_hold: 'True' + # Deploy a new VM and set its name to 'foo' - one_vm: template_name: 'app1_template' @@ -847,14 +857,14 @@ def create_nics_str(network_attrs_list): return nics_str -def create_vm(module, client, template_id, attributes_dict, labels_list, disk_size, network_attrs_list): +def create_vm(module, client, template_id, attributes_dict, labels_list, disk_size, network_attrs_list, vm_start_on_hold): if attributes_dict: vm_name = attributes_dict.get('NAME', '') disk_str = create_disk_str(module, client, template_id, disk_size) vm_extra_template_str = create_attributes_str(attributes_dict, labels_list) + create_nics_str(network_attrs_list) + disk_str - vm_id = client.call('template.instantiate', template_id, vm_name, False, vm_extra_template_str) + vm_id = client.call('template.instantiate', template_id, vm_name, vm_start_on_hold, vm_extra_template_str) vm = get_vm_by_id(client, vm_id) return get_vm_info(client, vm) @@ -946,7 +956,7 @@ def get_all_vms_by_attributes(client, attributes_dict, labels_list): return vm_list -def create_count_of_vms(module, client, template_id, count, attributes_dict, labels_list, disk_size, network_attrs_list, wait, wait_timeout): +def create_count_of_vms(module, client, template_id, count, attributes_dict, labels_list, disk_size, network_attrs_list, wait, wait_timeout, vm_start_on_hold): new_vms_list = [] vm_name = '' @@ -975,21 +985,26 @@ def create_count_of_vms(module, client, template_id, count, attributes_dict, lab new_vm_name += next_index # Update NAME value in the attributes in case there is index attributes_dict['NAME'] = new_vm_name - new_vm_dict = create_vm(module, client, template_id, attributes_dict, labels_list, disk_size, network_attrs_list) + new_vm_dict = create_vm(module, client, template_id, attributes_dict, labels_list, disk_size, network_attrs_list, vm_start_on_hold) new_vm_id = new_vm_dict.get('vm_id') new_vm = get_vm_by_id(client, new_vm_id) new_vms_list.append(new_vm) count -= 1 - if wait: - for vm in new_vms_list: - wait_for_running(module, vm, wait_timeout) + if vm_start_on_hold: + if wait: + for vm in new_vms_list: + wait_for_hold(module, vm, wait_timeout) + else: + if wait: + for vm in new_vms_list: + wait_for_running(module, vm, wait_timeout) return True, new_vms_list, [] def create_exact_count_of_vms(module, client, template_id, exact_count, attributes_dict, count_attributes_dict, - labels_list, count_labels_list, disk_size, network_attrs_list, hard, wait, wait_timeout): + labels_list, count_labels_list, disk_size, network_attrs_list, hard, wait, wait_timeout, vm_start_on_hold): vm_list = get_all_vms_by_attributes(client, count_attributes_dict, count_labels_list) @@ -1006,7 +1021,7 @@ def create_exact_count_of_vms(module, client, template_id, exact_count, attribut if vm_count_diff > 0: # Add more VMs changed, instances_list, tagged_instances = create_count_of_vms(module, client, template_id, vm_count_diff, attributes_dict, - labels_list, disk_size, network_attrs_list, wait, wait_timeout) + labels_list, disk_size, network_attrs_list, wait, wait_timeout, vm_start_on_hold) tagged_instances_list += instances_list elif vm_count_diff < 0: @@ -1068,6 +1083,10 @@ def wait_for_done(module, vm, wait_timeout): return wait_for_state(module, vm, wait_timeout, lambda state, lcm_state: (state in [VM_STATES.index('DONE')])) +def wait_for_hold(module, vm, wait_timeout): + return wait_for_state(module, vm, wait_timeout, lambda state, lcm_state: (state in [VM_STATES.index('HOLD')])) + + def wait_for_poweroff(module, vm, wait_timeout): return wait_for_state(module, vm, wait_timeout, lambda state, lcm_state: (state in [VM_STATES.index('POWEROFF')])) @@ -1240,6 +1259,7 @@ def main(): "instance_ids": {"required": False, "aliases": ['ids'], "type": "list"}, "template_name": {"required": False, "type": "str"}, "template_id": {"required": False, "type": "int"}, + "vm_start_on_hold": {"default": False, "type": "bool"}, "state": { "default": "present", "choices": ['present', 'absent', 'rebooted', 'poweredoff', 'running'], @@ -1292,6 +1312,7 @@ def main(): instance_ids = params.get('instance_ids') requested_template_name = params.get('template_name') requested_template_id = params.get('template_id') + put_vm_on_hold = params.get('vm_start_on_hold') state = params.get('state') permissions = params.get('mode') owner_id = params.get('owner_id') @@ -1376,12 +1397,12 @@ def main(): # Deploy an exact count of VMs changed, instances_list, tagged_instances_list = create_exact_count_of_vms(module, client, template_id, exact_count, attributes, count_attributes, labels, count_labels, disk_size, - networks, hard, wait, wait_timeout) + networks, hard, wait, wait_timeout, put_vm_on_hold) vms = tagged_instances_list elif template_id is not None and state == 'present': # Deploy count VMs changed, instances_list, tagged_instances_list = create_count_of_vms(module, client, template_id, count, - attributes, labels, disk_size, networks, wait, wait_timeout) + attributes, labels, disk_size, networks, wait, wait_timeout, put_vm_on_hold) # instances_list - new instances # tagged_instances_list - all instances with specified `count_attributes` and `count_labels` vms = instances_list