From 703c0cbdda37a1bb1786f36b3e06cba3fde833c7 Mon Sep 17 00:00:00 2001 From: Sean Gadson Date: Sat, 22 Jun 2024 16:47:58 +0000 Subject: [PATCH] updated avns --- plugins/modules/sddc_manager_avns.py | 156 +++++++++++++-------------- roles/create_avns/tasks/main.yml | 47 ++++---- 2 files changed, 99 insertions(+), 104 deletions(-) diff --git a/plugins/modules/sddc_manager_avns.py b/plugins/modules/sddc_manager_avns.py index fff9ea4..03018bb 100644 --- a/plugins/modules/sddc_manager_avns.py +++ b/plugins/modules/sddc_manager_avns.py @@ -77,57 +77,78 @@ ''' #Todo Documentation +class SDDCManagerAVNS: + def __init__(self, module): + self.module = module + self.sddc_manager_ip = module.params['sddc_manager_ip'] + self.sddc_manager_user = module.params['sddc_manager_user'] + self.sddc_manager_password = module.params['sddc_manager_password'] + self.avns_payload = module.params['avns_payload'] + self.operation = module.params['operation'] + self.management_edge_cluster_name = module.params['management_edge_cluster_name'] + + def get_edge_cluster_by_name(self): + try: + api_client = SddcManagerApiClient(self.sddc_manager_ip, self.sddc_manager_user, self.sddc_manager_password) + api_response = api_client.get_edge_clusters() + edge_clusters = api_response.data + except Exception as e: + self.module.fail_json(msg=f"Error: {e}") + for edge_cluster in edge_clusters['elements']: + if edge_cluster['name'] == self.management_edge_cluster_name: + return edge_cluster + return None + + def create_avns(self): + edge_cluster = self.get_edge_cluster_by_name() + if edge_cluster is None: + self.module.fail_json(msg=f"Edge cluster {self.management_edge_cluster_name} not found") + + edge_cluster_id = edge_cluster['id'] + self.avns_payload['edgeClusterId'] = edge_cluster_id + try: + api_client = SddcManagerApiClient(self.sddc_manager_ip, self.sddc_manager_user, self.sddc_manager_password) + api_response = api_client.create_avns(json.dumps(self.avns_payload)) + payload_data = api_response.data + return payload_data + except VcfAPIException as e: + self.module.fail_json(msg=f"Error: {e}") -def get_edge_cluster_by_name(sddc_manager_ip, sddc_manager_user, sddc_manager_password, edge_cluster_name): - api_client = SddcManagerApiClient(sddc_manager_ip, sddc_manager_user, sddc_manager_password) - api_response = api_client.get_edge_clusters() - edge_clusters = api_response.data - #print(type(edge_clusters)) # Check the type of edge_clusters - #print(edge_clusters) # Check the value of edge_clusters - for edge_cluster in edge_clusters['elements']: # Access the 'elements' key of the dictionary - #print(type(edge_cluster)) # Check the type of each edge_cluster - #print(edge_cluster) # Check the value of each edge_cluster - if edge_cluster['name'] == edge_cluster_name: - return edge_cluster - return None -def check_avn_current_operation(sddc_manager_ip, sddc_manager_user, sddc_manager_password): - api_client = SddcManagerApiClient(sddc_manager_ip, sddc_manager_user, sddc_manager_password) - api_response = api_client.get_avns() - payload_data = api_response.data - return payload_data - -def create_avns_(sddc_manager_ip, sddc_manager_user, sddc_manager_password, avns_payload): - payload_data = avns_payload - try: - api_client = SddcManagerApiClient(sddc_manager_ip, sddc_manager_user, sddc_manager_password) - api_response = api_client.create_avns(payload_data) - payload_data = api_response.data - return payload_data - except VcfAPIException as e: - raise VcfAPIException(f"Error: {e}") - - #Mimic This - # try: - # api_client = SddcManagerApiClient(sddc_manager_ip, sddc_manager_user, sddc_manager_password) - # api_response = api_client.validate_domains(json.dumps(updated_workload_domain_payload)) - # payload_data = api_response.data - # response = evaluate_response(payload_data) - # if response['message'] == "Successful": - # module.exit_json(changed=False, meta=payload_data) - # else: - # module.fail_json(msg="Workload Domain Validation Has Failed", meta=response) - # except Exception as e: - # module.fail_json(msg="Failed to validate workload domain: " + str(e)) -def validate_avns_(sddc_manager_ip, sddc_manager_user, sddc_manager_password, avns_payload): - payload_data = avns_payload - try: - api_client = SddcManagerApiClient(sddc_manager_ip, sddc_manager_user, sddc_manager_password) - api_response = api_client.validate_avns(payload_data) - payload_data = api_response.data - #print(f"Payload Data: {payload_data}") - return payload_data - except VcfAPIException as e: - raise VcfAPIException(f"Error: {e}") + def validate_avns(self): + edge_cluster = self.get_edge_cluster_by_name() + if edge_cluster is None: + self.module.fail_json(msg=f"Edge cluster {self.management_edge_cluster_name} not found") + + edge_cluster_id = edge_cluster['id'] + self.avns_payload['edgeClusterId'] = edge_cluster_id + try: + api_client = SddcManagerApiClient(self.sddc_manager_ip, self.sddc_manager_user, self.sddc_manager_password) + api_response = api_client.validate_avns(json.dumps(self.avns_payload)) + payload_data = api_response.data + return payload_data + except VcfAPIException as e: + self.module.fail_json(msg=f"Error: {e}") + + def run(self): + edge_cluster = self.get_edge_cluster_by_name() + if edge_cluster is None: + self.module.fail_json(msg=f"Edge cluster {self.management_edge_cluster_name} not found") + + edge_cluster_id = edge_cluster['id'] + self.avns_payload['edgeClusterId'] = edge_cluster_id + + if self.operation == 'create': + try: + payload_data = self.create_avns() + self.module.exit_json(changed=True, meta=payload_data) + except Exception as e: + self.module.fail_json(msg=f"Error: {e}") + elif self.operation == 'validate': + try: + payload_data = self.validate_avns() + self.module.exit_json(changed=True, meta=payload_data) + except Exception as e: + self.module.fail_json(msg=f"Error: {e}") def main(): parameters = dict( @@ -136,39 +157,12 @@ def main(): sddc_manager_password=dict(type='str', required=True, no_log=True), avns_payload=dict(type='dict', required=True), operation=dict(type='str', choices=['create', 'validate'], default='create'), - management_edge_cluster_name = dict(type='str', required=True) + management_edge_cluster_name=dict(type='str', required=True) ) - module = AnsibleModule(supports_check_mode=True, argument_spec=parameters) - sddc_manager_ip = module.params['sddc_manager_ip'] - sddc_manager_user = module.params['sddc_manager_user'] - sddc_manager_password = module.params['sddc_manager_password'] - operation = module.params['operation'] - avns_payload = module.params['avns_payload'] - management_edge_cluster_name = module.params['management_edge_cluster_name'] - - edge_cluster = get_edge_cluster_by_name(sddc_manager_ip, sddc_manager_user, sddc_manager_password, management_edge_cluster_name) - if edge_cluster is None: - module.fail_json(msg=f"Edge cluster {management_edge_cluster_name} not found") - - edge_cluster_id = edge_cluster['id'] - avns_payload['edgeClusterId'] = edge_cluster_id - - if operation == 'create': - try: - #print("Creating AVNs-Yes") - payload_data = create_avns_(sddc_manager_ip, sddc_manager_user, sddc_manager_password, json.dumps(avns_payload)) - module.exit_json(changed=True, meta=payload_data) - except VcfAPIException as e: - module.fail_json(msg=f"Error: {e}") - elif operation == 'validate': - #print("Validating-Yes") - try: - payload_data = validate_avns_(sddc_manager_ip, sddc_manager_user, sddc_manager_password, json.dumps(avns_payload)) - #print(f"Payload Data: {payload_data}") - module.exit_json(changed=True, meta=payload_data) - except VcfAPIException as e: - module.fail_json(msg=f"Error: {e}") + module = AnsibleModule(argument_spec=parameters, supports_check_mode=True) + sddc_manager_avns = SDDCManagerAVNS(module) + sddc_manager_avns.run() if __name__ == '__main__': main() \ No newline at end of file diff --git a/roles/create_avns/tasks/main.yml b/roles/create_avns/tasks/main.yml index 1fdb6c0..d7f4ed5 100644 --- a/roles/create_avns/tasks/main.yml +++ b/roles/create_avns/tasks/main.yml @@ -7,48 +7,49 @@ avns_payload: "{{ avns_payload }}" management_edge_cluster_name: "{{ management_edge_cluster_name }}" operation: validate - register: result + register: avn_validation_response -- name: Check if task completed - debug: - msg: "Task completed" - when: result.meta.executionStatus == 'COMPLETED' -- set_fact: - task_id: "{{ result.meta.id }}" -- name: Debug output - debug: - var: result +- name: Check task execution status + block: + - name: Debug success message + debug: + msg: "Task {{ avn_validation_response.meta.resultStatus }}" + when: avn_validation_response.meta.resultStatus == 'SUCCEEDED' - -- name: Validate AVNs + - name: Fail the task if execution status is FAILED + fail: + msg: "Task execution failed" + when: avn_validation_response.meta.executionStatus == 'FAILED' + when: avn_validation_response.meta.resultStatus in ['SUCCEEDED', 'FAILED'] + +- name: Create AVNs sddc_manager_avns: sddc_manager_ip: "{{ sddc_manager_ip }}" - sddc_manager_user: "{{ sddc_manager_username }}" + sddc_manager_user: "{{ sddc_manager_username }}" # Ensure consistent variable naming sddc_manager_password: "{{ sddc_manager_password }}" avns_payload: "{{ avns_payload }}" management_edge_cluster_name: "{{ management_edge_cluster_name }}" operation: create - register: result + register: avns_created_response -- set_fact: - task_id: "{{ result.meta.id }}" - name: Debug output debug: - var: result + var: avns_created_response -- name: Wait for AVNs to be ready +- name: Check AVNs Creation Status sddc_manager_tasks_status: sddc_manager_ip: "{{ sddc_manager_ip }}" sddc_manager_user: "{{ sddc_manager_username }}" sddc_manager_password: "{{ sddc_manager_password }}" - tasks_id: "{{ task_id }}" + tasks_id: "{{ avns_created_response.id }}" # Assuming task_id comes from avns_created_response sddc_manager_tasks_type: avns validation: False - register: result - until: result.meta.status == 'Successful' or result.meta.status == 'Failed' + register: avns_created_tasks_status + until: avns_created_tasks_status.meta.status in ['Successful', 'Failed'] # Simplified condition retries: 60 delay: 10 - failed_when: result.meta.status == "Failed" + failed_when: avns_created_tasks_status.meta.status == "Failed" # Consistent error handling - debug: - msg: "NSX AVNs Created" \ No newline at end of file + msg: "NSX AVNs Created" + when: avns_created_tasks_status.meta.status == "Successful" # Explicit success message condition \ No newline at end of file