VMware: Updates the DRS rule without deletion (#57119)
* The DRS rule will be updated if any changes in the configuration without deleting the existing rule. The rule itself is updated by the given configuration. * Lint errors fixed * VMware: update vmware_vm_vm_drs_rule testcases
This commit is contained in:
parent
2fb06650a7
commit
641f7c4ae3
2 changed files with 152 additions and 29 deletions
|
@ -62,7 +62,7 @@ options:
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
- If set to C(present), then the DRS rule is created if not present.
|
- If set to C(present), then the DRS rule is created if not present.
|
||||||
- If set to C(present), then the DRS rule is deleted and created if present already.
|
- If set to C(present), then the DRS rule is already present, it updates to the given configurations.
|
||||||
- If set to C(absent), then the DRS rule is deleted if present.
|
- If set to C(absent), then the DRS rule is deleted if present.
|
||||||
required: False
|
required: False
|
||||||
default: present
|
default: present
|
||||||
|
@ -94,11 +94,11 @@ EXAMPLES = r'''
|
||||||
password: "{{ esxi_password }}"
|
password: "{{ esxi_password }}"
|
||||||
cluster_name: "{{ cluster_name }}"
|
cluster_name: "{{ cluster_name }}"
|
||||||
validate_certs: no
|
validate_certs: no
|
||||||
|
enabled: True
|
||||||
vms:
|
vms:
|
||||||
- vm1
|
- vm1
|
||||||
- vm2
|
- vm2
|
||||||
drs_rule_name: vm1-vm2-affinity-rule-001
|
drs_rule_name: vm1-vm2-affinity-rule-001
|
||||||
enabled: True
|
|
||||||
mandatory: True
|
mandatory: True
|
||||||
affinity_rule: False
|
affinity_rule: False
|
||||||
delegate_to: localhost
|
delegate_to: localhost
|
||||||
|
@ -169,7 +169,7 @@ class VmwareDrs(PyVmomi):
|
||||||
# Getter
|
# Getter
|
||||||
def get_all_vms_info(self, vms_list=None):
|
def get_all_vms_info(self, vms_list=None):
|
||||||
"""
|
"""
|
||||||
Function to get all VM objects using name from given cluster
|
Get all VM objects using name from given cluster
|
||||||
Args:
|
Args:
|
||||||
vms_list: List of VM names
|
vms_list: List of VM names
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ class VmwareDrs(PyVmomi):
|
||||||
|
|
||||||
def get_rule_key_by_name(self, cluster_obj=None, rule_name=None):
|
def get_rule_key_by_name(self, cluster_obj=None, rule_name=None):
|
||||||
"""
|
"""
|
||||||
Function to get a specific DRS rule key by name
|
Get a specific DRS rule key by name
|
||||||
Args:
|
Args:
|
||||||
rule_name: Name of rule
|
rule_name: Name of rule
|
||||||
cluster_obj: Cluster managed object
|
cluster_obj: Cluster managed object
|
||||||
|
@ -213,7 +213,7 @@ class VmwareDrs(PyVmomi):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def normalize_rule_spec(rule_obj=None):
|
def normalize_rule_spec(rule_obj=None):
|
||||||
"""
|
"""
|
||||||
Function to return human readable rule spec
|
Return human readable rule spec
|
||||||
Args:
|
Args:
|
||||||
rule_obj: Rule managed object
|
rule_obj: Rule managed object
|
||||||
|
|
||||||
|
@ -234,29 +234,26 @@ class VmwareDrs(PyVmomi):
|
||||||
# Create
|
# Create
|
||||||
def create(self):
|
def create(self):
|
||||||
"""
|
"""
|
||||||
Function to create a DRS rule if rule does not exist
|
Create a DRS rule if rule does not exist
|
||||||
"""
|
"""
|
||||||
rule_obj = self.get_rule_key_by_name(rule_name=self.rule_name)
|
rule_obj = self.get_rule_key_by_name(rule_name=self.rule_name)
|
||||||
if rule_obj is not None:
|
if rule_obj is not None:
|
||||||
# Rule already exists, remove and create again
|
|
||||||
# Cluster does not allow editing existing rule
|
|
||||||
existing_rule = self.normalize_rule_spec(rule_obj=rule_obj)
|
existing_rule = self.normalize_rule_spec(rule_obj=rule_obj)
|
||||||
if ((sorted(existing_rule['rule_vms']) == sorted(self.vm_list)) and
|
if ((sorted(existing_rule['rule_vms']) == sorted(self.vm_list)) and
|
||||||
(existing_rule['rule_enabled'] == self.enabled) and
|
(existing_rule['rule_enabled'] == self.enabled) and
|
||||||
(existing_rule['rule_mandatory'] == self.mandatory) and
|
(existing_rule['rule_mandatory'] == self.mandatory) and
|
||||||
(existing_rule['rule_affinity'] == self.affinity_rule)):
|
(existing_rule['rule_affinity'] == self.affinity_rule)):
|
||||||
# Rule is same as existing rule, evacuate
|
self.module.exit_json(changed=False, result=existing_rule, msg="Rule already exists with the same configuration")
|
||||||
self.module.exit_json(changed=False, result=existing_rule)
|
else:
|
||||||
# Delete existing rule as we cannot edit it
|
changed, result = self.update_rule_spec(rule_obj)
|
||||||
changed, result = self.delete(rule_name=self.rule_name)
|
return changed, result
|
||||||
if not changed:
|
else:
|
||||||
self.module.fail_json(msg="Failed to delete while updating rule %s due to %s" % (self.rule_name, result))
|
changed, result = self.create_rule_spec()
|
||||||
changed, result = self.create_rule_spec()
|
return changed, result
|
||||||
return changed, result
|
|
||||||
|
|
||||||
def create_rule_spec(self):
|
def create_rule_spec(self):
|
||||||
"""
|
"""
|
||||||
Function to create DRS rule
|
Create DRS rule
|
||||||
"""
|
"""
|
||||||
changed = False
|
changed = False
|
||||||
if self.affinity_rule:
|
if self.affinity_rule:
|
||||||
|
@ -286,10 +283,41 @@ class VmwareDrs(PyVmomi):
|
||||||
|
|
||||||
return changed, result
|
return changed, result
|
||||||
|
|
||||||
|
def update_rule_spec(self, rule_obj=None):
|
||||||
|
"""
|
||||||
|
Update DRS rule
|
||||||
|
"""
|
||||||
|
changed = False
|
||||||
|
|
||||||
|
rule_obj.vm = self.vm_obj_list
|
||||||
|
|
||||||
|
if (rule_obj.mandatory != self.mandatory):
|
||||||
|
rule_obj.mandatory = self.mandatory
|
||||||
|
|
||||||
|
if (rule_obj.enabled != self.enabled):
|
||||||
|
rule_obj.enabled = self.enabled
|
||||||
|
|
||||||
|
rule_spec = vim.cluster.RuleSpec(info=rule_obj, operation='edit')
|
||||||
|
config_spec = vim.cluster.ConfigSpec(rulesSpec=[rule_spec])
|
||||||
|
|
||||||
|
try:
|
||||||
|
task = self.cluster_obj.ReconfigureCluster_Task(config_spec, modify=True)
|
||||||
|
changed, result = wait_for_task(task)
|
||||||
|
except vmodl.fault.InvalidRequest as e:
|
||||||
|
result = to_native(e.msg)
|
||||||
|
except Exception as e:
|
||||||
|
result = to_native(e)
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
rule_obj = self.get_rule_key_by_name(rule_name=self.rule_name)
|
||||||
|
result = self.normalize_rule_spec(rule_obj)
|
||||||
|
|
||||||
|
return changed, result
|
||||||
|
|
||||||
# Delete
|
# Delete
|
||||||
def delete(self, rule_name=None):
|
def delete(self, rule_name=None):
|
||||||
"""
|
"""
|
||||||
Function to delete DRS rule using name
|
Delete DRS rule using name
|
||||||
"""
|
"""
|
||||||
changed = False
|
changed = False
|
||||||
if rule_name is None:
|
if rule_name is None:
|
||||||
|
@ -326,7 +354,7 @@ def main():
|
||||||
)
|
)
|
||||||
|
|
||||||
required_if = [
|
required_if = [
|
||||||
['state', 'present', ['vms']],
|
['state', 'present', ['vms']]
|
||||||
]
|
]
|
||||||
module = AnsibleModule(argument_spec=argument_spec,
|
module = AnsibleModule(argument_spec=argument_spec,
|
||||||
required_if=required_if,
|
required_if=required_if,
|
||||||
|
@ -347,7 +375,6 @@ def main():
|
||||||
else:
|
else:
|
||||||
results['failed'] = True
|
results['failed'] = True
|
||||||
results['msg'] = "Failed to create DRS rule %s" % vm_drs.rule_name
|
results['msg'] = "Failed to create DRS rule %s" % vm_drs.rule_name
|
||||||
|
|
||||||
results['result'] = result
|
results['result'] = result
|
||||||
elif state == 'absent':
|
elif state == 'absent':
|
||||||
# Delete Rule
|
# Delete Rule
|
||||||
|
|
|
@ -11,7 +11,9 @@
|
||||||
setup_attach_host: true
|
setup_attach_host: true
|
||||||
setup_datastore: true
|
setup_datastore: true
|
||||||
setup_virtualmachines: true
|
setup_virtualmachines: true
|
||||||
- name: Create a DRS Affinity rule for vms
|
|
||||||
|
- &create_drs_rule
|
||||||
|
name: Create a DRS Affinity rule for vms
|
||||||
vmware_vm_vm_drs_rule:
|
vmware_vm_vm_drs_rule:
|
||||||
validate_certs: False
|
validate_certs: False
|
||||||
hostname: "{{ vcenter_hostname }}"
|
hostname: "{{ vcenter_hostname }}"
|
||||||
|
@ -24,12 +26,24 @@
|
||||||
affinity_rule: True
|
affinity_rule: True
|
||||||
mandatory: True
|
mandatory: True
|
||||||
register: drs_rule_0001_results
|
register: drs_rule_0001_results
|
||||||
- debug: var=drs_rule_0001_results
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- "{{ drs_rule_0001_results.changed }}"
|
|
||||||
|
|
||||||
- name: Create a DRS Anti-Affinity rule for vms
|
- debug: var=drs_rule_0001_results
|
||||||
|
|
||||||
|
- name: Check if changes are made
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- <<: *create_drs_rule
|
||||||
|
name: Create a DRS Affinity rule for vms again
|
||||||
|
|
||||||
|
- name: Check if no changes are made if drs rule is created again
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- &update_drs_rule
|
||||||
|
name: Update a DRS Affinity rule for vms
|
||||||
vmware_vm_vm_drs_rule:
|
vmware_vm_vm_drs_rule:
|
||||||
validate_certs: False
|
validate_certs: False
|
||||||
hostname: "{{ vcenter_hostname }}"
|
hostname: "{{ vcenter_hostname }}"
|
||||||
|
@ -37,12 +51,94 @@
|
||||||
password: "{{ vcenter_password }}"
|
password: "{{ vcenter_password }}"
|
||||||
drs_rule_name: drs_rule_0001
|
drs_rule_name: drs_rule_0001
|
||||||
cluster_name: "{{ ccr1 }}"
|
cluster_name: "{{ ccr1 }}"
|
||||||
vms: "{{ virtual_machines | map(attribute='name') | list }}"
|
vms: "{{ virtual_machines_in_cluster | map(attribute='name') | list }}"
|
||||||
enabled: False
|
enabled: False
|
||||||
|
affinity_rule: True
|
||||||
|
mandatory: False
|
||||||
|
register: drs_rule_0001_results
|
||||||
|
|
||||||
|
- name: Check if changes are made if drs rule is created
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- <<: *update_drs_rule
|
||||||
|
name: Update a DRS Affinity rule for vms again
|
||||||
|
|
||||||
|
- name: Check if no changes are made if drs rule is created again
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- &delete_drs_rule
|
||||||
|
name: Delete a DRS Affinity rule for vms
|
||||||
|
vmware_vm_vm_drs_rule:
|
||||||
|
validate_certs: False
|
||||||
|
hostname: "{{ vcenter_hostname }}"
|
||||||
|
username: "{{ vcenter_username }}"
|
||||||
|
password: "{{ vcenter_password }}"
|
||||||
|
drs_rule_name: drs_rule_0001
|
||||||
|
cluster_name: "{{ ccr1 }}"
|
||||||
|
state: absent
|
||||||
|
register: drs_rule_0001_results
|
||||||
|
|
||||||
|
- name: Check if DRS rule is delete
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- <<: *delete_drs_rule
|
||||||
|
name: Delete a DRS Affinity rule for vms again
|
||||||
|
|
||||||
|
- name: Check if DRS rule is not delete again
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not drs_rule_0001_results.changed
|
||||||
|
|
||||||
|
- &create_anti_drs_rule
|
||||||
|
name: Create a DRS Anti-Affinity rule for vms
|
||||||
|
vmware_vm_vm_drs_rule:
|
||||||
|
validate_certs: False
|
||||||
|
hostname: "{{ vcenter_hostname }}"
|
||||||
|
username: "{{ vcenter_username }}"
|
||||||
|
password: "{{ vcenter_password }}"
|
||||||
|
drs_rule_name: drs_rule_0002
|
||||||
|
cluster_name: "{{ ccr1 }}"
|
||||||
|
vms: "{{ virtual_machines_in_cluster | map(attribute='name') | list }}"
|
||||||
|
enabled: True
|
||||||
affinity_rule: False
|
affinity_rule: False
|
||||||
mandatory: False
|
mandatory: False
|
||||||
register: drs_rule_0002_results
|
register: drs_rule_0002_results
|
||||||
|
|
||||||
- debug: var=drs_rule_0002_results
|
- debug: var=drs_rule_0002_results
|
||||||
- assert:
|
|
||||||
|
- name: Check if DRS Anti-Affinity rule is created
|
||||||
|
assert:
|
||||||
that:
|
that:
|
||||||
- "{{ drs_rule_0002_results.changed }}"
|
- drs_rule_0002_results.changed
|
||||||
|
|
||||||
|
- <<: *create_anti_drs_rule
|
||||||
|
name: Create a DRS Anti-Affinity rule for vms again
|
||||||
|
|
||||||
|
- debug: var=drs_rule_0002_results
|
||||||
|
|
||||||
|
- name: Check if no changes are made if DRS Anti-Affinity rule is created again
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not drs_rule_0002_results.changed
|
||||||
|
|
||||||
|
- name: Delete a DRS Anti-Affinity rule for vms
|
||||||
|
vmware_vm_vm_drs_rule:
|
||||||
|
validate_certs: False
|
||||||
|
hostname: "{{ vcenter_hostname }}"
|
||||||
|
username: "{{ vcenter_username }}"
|
||||||
|
password: "{{ vcenter_password }}"
|
||||||
|
drs_rule_name: drs_rule_0002
|
||||||
|
cluster_name: "{{ ccr1 }}"
|
||||||
|
state: absent
|
||||||
|
register: drs_rule_0002_results
|
||||||
|
|
||||||
|
- name: Check if DRS rule is not delete
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- drs_rule_0002_results.changed
|
||||||
|
|
Loading…
Reference in a new issue