Browse Source

Issue #543: Test automation script for inventory

Signed-off-by: vedaprakashanp <vedaprakasha_n_putta@dellteam.com>
vedaprakashanp 3 years ago
parent
commit
a4a2636c71
1 changed files with 754 additions and 0 deletions
  1. 754 0
      control_plane/test/test_inventory.yml

+ 754 - 0
control_plane/test/test_inventory.yml

@@ -0,0 +1,754 @@
+#  Copyright 2021 Dell Inc. or its subsidiaries. All Rights Reserved.
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+---         
+# Test case to verify the prerequisites are installed and execute the AWX deployment
+- name: OMNIA_1.1_AWX_TC_001    
+  hosts: localhost
+  connection: local
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+  tasks:
+     
+   - name: Check login_vars file is encrypted
+     command: cat "{{ login_vars_path }}"
+     changed_when: false
+     register: config_content
+     tags: always
+      
+   - name: Decrpyt login_vars.yml
+     command: >-
+       ansible-vault decrypt {{ login_vars_path }}
+       --vault-password-file {{ login_vars_vault_path }}
+     changed_when: false
+     when: "'$ANSIBLE_VAULT;' in config_content.stdout"
+     tags: always
+
+   - name: Include variable file login_vars.yml
+     include_vars: "{{ login_vars_path }}"
+     tags: always
+       
+   - name: Encypt login file
+     command: >-
+       ansible-vault encrypt {{ login_vars_path }}
+       --vault-password-file {{ login_vars_vault_path }}
+     changed_when: false
+     tags: always
+                     
+   - name: Execute awx command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_001,VERIFY_OMNIA_01    
+     
+   - name: Validate awx operator containers
+     assert:
+      that:  
+       -  k8s_pods.stdout | regex_search("{{ item }}")
+      fail_msg: "{{ awx_fail_msg }}"
+      success_msg: "{{ awx_success_msg }}"
+     loop: 
+       - "awx-([A-Za-z0-9]{10})-([A-Za-z0-9]{5})"
+       - "awx-operator-([A-Za-z0-9]{10})-([A-Za-z0-9]{5})"
+       - "awx-postgres-([A-Za-z0-9]{1})"
+     run_once: true
+     tags: TC_001,VERIFY_OMNIA_01       
+            
+# Test case to verify inventory groups are present in AWX UI  (idrac, ethernet, inifiniband, rbod)  
+- name: OMNIA_1.1_AWX_TC_003   
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+  tasks:                 
+
+   - name: Execute get pods command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_003     
+     
+   - name: Get awx pod 
+     set_fact:
+      awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+      idrac_status: true
+     with_items: 
+       - "{{ k8s_pods.stdout_lines }}"
+     run_once: true
+     when: item | regex_search(awx_pod_item_regex)
+     tags: TC_003
+
+   - name: Get awx cluster ip
+     shell: "kubectl get svc awx-ui -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+     register: awx_cluster_ip
+     changed_when: false
+     ignore_errors: true
+     tags: TC_003
+
+   - name: Get AWX admin password
+     shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+     register: awx_admin_password
+     changed_when: false
+     ignore_errors: true
+     tags: TC_003
+          
+   - name: Execute awx get inventory hosts command
+     command: "awx --conf.host http://{{ awx_cluster_ip.stdout }}:8052 --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ item }} -f human --filter 'name'"
+     register: idrac_hosts
+     with_items:
+      - "idrac_inventory"
+      - "infiniband_inventory"
+      - "ethernet_inventory"
+      - "powervault_me4_inventory"
+     run_once: true
+     changed_when: false
+     tags: TC_003        
+       
+   - name: Verify  inventory are present in AWX UI  
+     assert:
+      that: 
+       - item.stdout_lines[0] | regex_search("name")
+      fail_msg: "{{ item.item }} - {{ inventory_fail_msg }}"
+      success_msg: "{{ item.item }} - {{ inventory_success_msg }}"
+     with_items:
+      - "{{ idrac_hosts.results }}"
+     changed_when: false
+     tags: TC_003
+              
+# Test case to validate ip of idrac     
+- name: OMNIA_1.1_AWX_TC_004    
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../input_params/base_vars.yml  
+  tasks:       
+      
+   - name: Execute get pods command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_004     
+     
+   - name: Get awx pod 
+     set_fact:
+      awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+     with_items: 
+       - "{{ k8s_pods.stdout_lines }}"
+     run_once: true
+     when: item | regex_search(awx_pod_item_regex)
+     changed_when: false
+     tags: TC_004
+
+   - name: Get awx cluster ip
+     shell: "kubectl get svc awx-ui -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+     register: awx_cluster_ip
+     changed_when: false
+     tags: TC_004
+
+   - name: Get AWX admin password
+     shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+     register: awx_admin_password
+     changed_when: false
+     ignore_errors: true
+     tags: TC_004
+          
+   - name: Execute awx get inventory hosts command
+     command: "awx --conf.host http://{{ awx_cluster_ip.stdout }}:8052 --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ idrac_inventory_name }} -f human --filter 'name'"
+     changed_when: true
+     register: idrac_hosts
+     run_once: true
+     tags: TC_004     
+     
+   - name: List of iDRAC host
+     include_tasks: "{{ validation_script_path }}"
+     with_items:
+      - "{{ idrac_hosts.stdout_lines[2:] }}"
+     when: idrac_hosts.stdout_lines | length > 2
+     ignore_errors: true
+     tags: TC_004
+     
+   - name: Empty iDRAC hosts
+     debug:
+      msg: "{{ empty_host_err }}"
+     when: idrac_hosts.stdout_lines | length < 3
+     failed_when: false
+     tags: TC_004     
+
+# Test case to validate ip of infiniband
+- name: OMNIA_1.1_AWX_TC_005    
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../input_params/base_vars.yml  
+  tasks:                 
+
+   - name: Execute get pods command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_005     
+     
+   - name: Get awx pod 
+     set_fact:
+      awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+     with_items: 
+       - "{{ k8s_pods.stdout_lines }}"
+     run_once: true
+     when: item | regex_search(awx_pod_item_regex)
+     failed_when: false
+     tags: TC_005
+
+   - name: Get awx cluster ip
+     shell: "kubectl get svc awx-ui -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+     register: awx_cluster_ip
+     changed_when: false
+     tags: TC_005
+
+   - name: Get AWX admin password
+     shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+     register: awx_admin_password
+     changed_when: false
+     ignore_errors: true
+     tags: TC_005
+          
+   - name: Execute awx get inventory hosts command
+     command: "awx --conf.host http://{{ awx_cluster_ip.stdout }}:8052 --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ ib_inventory_name }} -f human --filter 'name'"
+     changed_when: true
+     register: infiniband_hosts
+     run_once: true
+     ignore_errors: true
+     tags: TC_005     
+     
+   - name: List of infiniband hosts
+     include_tasks: "{{ validation_script_path }}"  
+     with_items:
+      - "{{ infiniband_hosts.stdout_lines[2:] }}"
+     when: infiniband_hosts.stdout_lines | length > 2
+     ignore_errors: true
+     tags: TC_005
+     
+   - name: Empty infiniband hosts
+     debug:
+      msg: "{{ empty_host_err }}"
+     when: infiniband_hosts.stdout_lines | length < 3
+     failed_when: false
+     tags: TC_005 
+
+# Test case to validate ip of ethernet
+- name: OMNIA_1.1_AWX_TC_006    
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../input_params/base_vars.yml  
+  tasks:                 
+
+   - name: Execute get pods command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_006     
+     
+   - name: Get awx pod 
+     set_fact:
+      awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+     with_items: 
+       - "{{ k8s_pods.stdout_lines }}"
+     run_once: true
+     when: item | regex_search(awx_pod_item_regex)
+     failed_when: false
+     tags: TC_006
+
+   - name: Get awx cluster ip
+     shell: "kubectl get svc awx-ui -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+     register: awx_cluster_ip
+     changed_when: false
+     tags: TC_006
+
+   - name: Get AWX admin password
+     shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+     register: awx_admin_password
+     changed_when: false
+     ignore_errors: true
+     tags: TC_006
+          
+   - name: Execute awx get inventory hosts command
+     command: "awx --conf.host http://{{ awx_cluster_ip.stdout }}:8052 --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ ethernet_inventory_name }} -f human --filter 'name'"
+     changed_when: true
+     register: ethernet_hosts
+     run_once: true
+     ignore_errors: true
+     tags: TC_006     
+     
+   - name: List of ethernet hosts   
+     include_tasks: "{{ validation_script_path }}" 
+     with_items:
+      - "{{ ethernet_hosts.stdout_lines[2:] }}"
+     when: ethernet_hosts.stdout_lines | length > 2
+     ignore_errors: true
+     tags: TC_006
+     
+   - name: Empty ethernet hosts
+     debug:
+      msg: "{{ empty_host_err }}"
+     when: ethernet_hosts.stdout_lines | length < 3
+     failed_when: false
+     tags: TC_006
+      
+# Test case to validate ip of powervault      
+- name: OMNIA_1.1_AWX_TC_007    
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../input_params/base_vars.yml  
+  tasks:                 
+
+   - name: Execute get pods command
+     command: "kubectl get pods -n {{ awx_namespace }}"
+     changed_when: true
+     register: k8s_pods
+     run_once: true
+     ignore_errors: true
+     tags: TC_007     
+     
+   - name: Get awx pod 
+     set_fact:
+      awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+      idrac_status: true
+     with_items: 
+       - "{{ k8s_pods.stdout_lines }}"
+     run_once: true
+     when: item | regex_search(awx_pod_item_regex)
+     failed_when: false
+     tags: TC_007
+
+   - name: Get awx cluster ip
+     shell: "kubectl get svc awx-ui -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+     register: awx_cluster_ip
+     changed_when: false
+     tags: TC_007
+
+   - name: Get AWX admin password
+     shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+     register: awx_admin_password
+     changed_when: false
+     ignore_errors: true
+     tags: TC_007
+          
+   - name: Execute awx get inventory hosts command
+     command: "awx --conf.host http://{{ awx_cluster_ip.stdout }}:8052 --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ pv_inventory_name }} -f human --filter 'name'"
+     changed_when: true
+     register: powervault_hosts
+     run_once: true
+     ignore_errors: true
+     tags: TC_007     
+     
+   - name: List of powervault hosts
+     include_tasks: "{{ validation_script_path }}"  
+     with_items:
+      - "{{ powervault_hosts.stdout_lines[2:] }}"
+     when: powervault_hosts.stdout_lines | length > 2
+     ignore_errors: true
+     tags: TC_007
+     
+   - name: Empty powervault hosts
+     debug:
+      msg: "{{ empty_host_err }}"
+     when: powervault_hosts.stdout_lines | length < 3
+     failed_when: false
+     tags: TC_007
+
+# Test case to verify omnia inventory groups (manager, compute, login, nfs)                        
+- name: OMNIA_1.1_AWX_TC_008   
+  hosts: localhost
+  connection: local
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../roles/webui_awx/vars/main.yml
+    
+  tasks:                 
+
+    - name: Get awx-service Cluster-IP
+      command: "kubectl get svc awx-service -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+      register: awx_cluster_ip
+      changed_when: false
+      run_once: true
+      ignore_errors: true
+      tags: TC_008
+    
+    - name: Get AWX admin password
+      shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+      register: awx_admin_password
+      changed_when: false
+      run_once: true
+      ignore_errors: true
+      tags: TC_008
+         
+    - name: Set IP and password
+      set_fact:
+        awx_ip: 'http://{{ awx_cluster_ip.stdout }}'
+        admin_password: "{{ awx_admin_password.stdout }}"
+      run_once: true
+      failed_when: false
+      tags: TC_008
+       
+    - name: Get omnia inventory groups
+      awx.awx.tower_group:
+        name: "{{ item.name }}"
+        description: "{{ item.description }}"
+        inventory: "node_inventory"
+        state: present
+      loop: "{{ group_names }}"
+      register: awx_group
+      run_once: true
+      ignore_errors: true
+      tags: TC_008
+     
+    - name: Verify omnia inventory groups
+      assert:
+       that: 
+         - item.changed == false
+         - item.item.name == "{{ manager_group }}" or 
+           item.item.name =="{{ compute_group }}" or 
+           item.item.name == "{{ login_group }}" or 
+           item.item.name == "{{ nfs_group }}"
+       fail_msg: "{{ item .item.name }}{{ group_fail_msg }}"
+       success_msg: "{{ item .item.name }}{{ group_success_msg }}"
+      with_items:
+       - "{{ awx_group.results }}"
+      failed_when: false
+      tags: TC_008
+      
+# Test case to verify AWX configuration is done properly with job_templates, schedules in place      
+- name: OMNIA_1.1_AWX_TC_009   
+  hosts: localhost
+  connection: local
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../roles/webui_awx/vars/main.yml
+    
+  tasks:                 
+
+    - name: Get awx-service Cluster-IP
+      command: "kubectl get svc awx-service -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+      register: awx_cluster_ip
+      changed_when: false
+      ignore_errors: true
+      run_once: true
+      tags: TC_009
+    
+    - name: Get AWX admin password
+      shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+      register: awx_admin_password
+      changed_when: false
+      ignore_errors: true
+      run_once: true
+      tags: TC_009
+           
+    - name: Set IP and password
+      set_fact:
+        awx_ip: 'http://{{ awx_cluster_ip.stdout }}'
+        admin_password: "{{ awx_admin_password.stdout }}"
+      failed_when: false
+      run_once: true
+      tags: TC_009   
+      
+    - name: Get job template details
+      awx.awx.tower_job_template:
+        name: "{{ item.name }}"
+        job_type: "run"
+        organization: "{{ organization_name }}"
+        inventory: "{{ item.inventory }}"
+        project: "{{ project_name }}"
+        playbook: "{{ item.playbook }}"
+        credentials:
+          - "{{ item.credential }}"
+        state: present
+        tower_config_file: "{{ tower_config_file_path }}"
+      loop: "{{ job_template_details }}"
+      register: job_template
+      when: item.flag
+      ignore_errors: true
+      tags: TC_009  
+
+    - name: Validate job template 
+      assert:
+       that: 
+         - item.changed == false
+       fail_msg: "{{ item.item.name }}{{ job_template_fail_msg }}"
+       success_msg: " {{ item.item.name }} {{ job_template_success_msg }}"
+      with_items:
+        - "{{ job_template.results }}"
+      failed_when: false
+      when: item.item.flag
+      tags: TC_009  
+      
+    - name: Build a schedule for job template
+      awx.awx.tower_schedule:
+        name: "{{ item.name }}"
+        unified_job_template: "{{ item.template }}"
+        rrule: "{{ schedule_rule }}"
+        state: present
+        tower_config_file: "{{ tower_config_file_path }}"
+      register: schedule
+      loop: "{{ scheduled_templates }}"
+      failed_when: false
+      run_once: true
+      tags: TC_009
+      
+    - name: Validate schedule status
+      assert:
+       that: 
+         - schedule.changed == false
+       fail_msg: "{{ schedule_fail_msg }}"
+       success_msg: "{{ schedule_success_msg }}"
+      failed_when: false
+      tags: TC_009 
+
+
+# Test case to verify updation of new node in omnia inventory
+- name: OMNIA_1.1_AWX_TC_010   
+  hosts: localhost
+  connection: local
+  
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../input_params/base_vars.yml  
+  tasks:                 
+
+    - name: Execute get pods command
+      command: "kubectl get pods -n {{ awx_namespace }}"
+      changed_when: true
+      register: k8s_pods
+      run_once: true
+      ignore_errors: true
+      tags: TC_010
+          
+    - name: Get awx pod 
+      set_fact:
+       awx_pods: "{{ item | regex_search(awx_pod_regex) | trim  }}"
+      with_items: 
+        - "{{ k8s_pods.stdout_lines }}"
+      run_once: true
+      when: item | regex_search(awx_pod_item_regex)
+      failed_when: false
+      tags: TC_010
+
+    - name: Get AWX admin password
+      shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+      register: awx_admin_password
+      changed_when: false
+      ignore_errors: true
+      tags: TC_010
+          
+    - name: Execute awx get inventory hosts command
+      command: "awx --conf.host {{ awx_host }} --conf.username admin --conf.password {{ awx_admin_password.stdout }} --conf.insecure hosts list --inventory {{ node_inventory_name }} -f human --filter 'name'"
+      changed_when: true
+      register: node_hosts
+      run_once: true
+      failed_when: false
+      tags: TC_010
+         
+    - name: Get node_inventory hosts
+      command: ping -c1 {{ item }}
+      delegate_to: localhost
+      register: ping_result
+      ignore_errors: yes
+      changed_when: false
+      with_items:
+      - "{{ node_hosts.stdout_lines[2:] }}"
+      when: node_hosts.stdout_lines | length > 2
+      tags: TC_010
+            
+    - name: Verify updation of new node
+      assert:
+       that: 
+         - "'100% packet loss' not in item.stdout"
+       fail_msg: "{{ node_fail_msg }}"
+       success_msg: "{{ node_success_msg }}"
+      with_items:
+       - "{{ ping_result.results }}"
+      when: node_hosts.stdout_lines | length > 2
+      failed_when: false
+      tags: TC_010
+
+    - name: Empty node hosts
+      debug:
+       msg: "{{ empty_host_err }}"
+      when: node_hosts.stdout_lines | length < 3
+      tags: TC_010
+          
+# Test case to verify AWX configuration is done properly with all items in place      
+- name: OMNIA_1.1_AWX_TC_011   
+  hosts: localhost
+  connection: local
+  vars_files:
+   - test_vars/test_inventory_vars.yml
+   - ../roles/webui_awx/vars/main.yml
+    
+  tasks:                 
+
+    - name: Get awx-service Cluster-IP
+      command: "kubectl get svc awx-service -n {{ awx_namespace }} -o jsonpath='{.spec.clusterIP}'"
+      register: awx_cluster_ip
+      changed_when: false
+      ignore_errors: true
+      run_once: true
+      tags: TC_011
+    
+    - name: Get AWX admin password
+      shell: "kubectl get secret awx-admin-password -n {{ awx_namespace }} -o jsonpath='{.data.password}' | base64 --decode"
+      register: awx_admin_password
+      changed_when: false
+      ignore_errors: true
+      run_once: true
+      tags: TC_011
+           
+    - name: Set IP and password
+      set_fact:
+        awx_ip: 'http://{{ awx_cluster_ip.stdout }}'
+        admin_password: "{{ awx_admin_password.stdout }}"
+      run_once: true
+      tags: TC_011
+
+    - name: Get organization details
+      awx.awx.tower_organization:
+        name: "{{ organization_name }}"
+        description: "{{ org_description }}"
+        state: present
+      register: organization
+      ignore_errors: true
+      run_once: true
+      tags: TC_011
+      
+    - name: Validate an organization
+      assert:
+       that: 
+         - organization.changed == false
+       fail_msg: "{{ organization_fail_msg }}"
+       success_msg: "{{ organization_success_msg }}"
+      failed_when: false
+      tags: TC_011
+             
+    - name: Get tower inventory details
+      awx.awx.tower_inventory:
+        name: "{{ item.name }}"
+        description: "{{ item.description }}"
+        organization: "{{ organization_name }}"
+        state: present
+      loop: "{{ inventory_names }}"  
+      register: inventory 
+      when: item.flag
+      ignore_errors: true
+      run_once: true
+      tags: TC_011 
+
+    - name: Validate inventory status
+      assert:
+       that: 
+         - item.changed == false
+       fail_msg: "{{ inventory_fail_msg }}"
+       success_msg: "{{ inventory_success_msg }}"
+      with_items:
+       - "{{ inventory.results }}"
+      failed_when: false
+      tags: TC_011   
+      
+    - name: Get job template details
+      awx.awx.tower_job_template:
+        name: "{{ item.name }}"
+        job_type: "run"
+        organization: "{{ organization_name }}"
+        inventory: "{{ item.inventory }}"
+        project: "{{ project_name }}"
+        playbook: "{{ item.playbook }}"
+        credentials:
+          - "{{ item.credential }}"
+        state: present
+      loop: "{{ job_template_details }}"
+      register: job_template
+      when: item.flag
+      ignore_errors: true
+      run_once: true
+      tags: TC_011  
+
+    - name: Validate job template 
+      assert:
+       that: 
+         - item.changed == false
+       fail_msg: "{{ item.item.name }} {{ job_template_fail_msg }}"
+       success_msg: "{{ item.item.name }} {{ job_template_success_msg }}"
+      with_items:
+        - "{{ job_template.results }}"
+      failed_when: false
+      when: item.item.flag
+      tags: TC_011 
+      
+    - name: Get project details
+      awx.awx.tower_project:
+        name: "{{ project_name }}"
+        description: "{{ project_description }}"
+        organization: "{{ organization_name }}"
+        state: present
+      register: project
+      ignore_errors: true
+      run_once: true
+      tags: TC_011 
+            
+    - name: Verify project 
+      assert:
+       that: 
+         - project.changed == false
+       fail_msg: "{{ project_fail_msg }}"
+       success_msg: "{{ project_success_msg }}"
+      failed_when: false
+      tags: TC_011 
+      
+    - name: Build a schedule for job template
+      awx.awx.tower_schedule:
+        name: "{{ item.name }}"
+        unified_job_template: "{{ item.template }}"
+        rrule: "{{ schedule_rule }}"
+        state: present
+      register: schedule
+      loop: "{{ scheduled_templates }}"
+      failed_when: false
+      run_once: true
+      tags: TC_011
+      
+    - name: Validate schedule status
+      assert:
+       that: 
+         - schedule.changed == false
+       fail_msg: "{{ schedule_fail_msg }}"
+       success_msg: "{{ schedule_success_msg }}"
+      failed_when: false
+      tags: TC_011