Skip to content

Commit

Permalink
Test: Adding integration tests for cv_device_v3 (#621)
Browse files Browse the repository at this point in the history
* Test: Adding integration test for cv_device_v3 (move_device)

* Adding tests for state absent (decommission_device)

* Addressing review comments

* Added tests for factory_reset and provisioning_reset

* Added tests for attach and detach bundle and fixed counters for bundle_attached/bundle_detached

* Added tests for apply/detach configlets

* Added test for deploy_device

* Fixing pylint issues

* added back inventory file; revert of d346824

* reapplying partial changes from d346824

* Separating files and fixing review comments

* Updating tests

Some minor fix

Updated tests

* Fixing to clean up lab

* Changing for dual_dc topology

* minor nit

* Adding terninattr for image bundle

* Minor fixes while testing PR

* Removing configlets from bundle playbook

* Added comments

---------

Co-authored-by: Shivani-chourasiya <[email protected]>
Co-authored-by: Sugetha Chandhrasekar <[email protected]>
  • Loading branch information
3 people authored Aug 15, 2023
1 parent 9820236 commit a24b03c
Show file tree
Hide file tree
Showing 7 changed files with 552 additions and 23 deletions.
12 changes: 12 additions & 0 deletions ansible_collections/arista/cvp/molecule/cv_device_v3/converge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
- name: Test cv_device_v3 module
import_playbook: test_move_and_deploy_device.yml

- name: Test cv_device_v3 module
import_playbook: test_apply_detach_configlet.yml

- name: Test cv_device_v3 module
import_playbook: test_apply_detach_bundle.yml

- name: Test cv_device_v3 module
import_playbook: test_decommission_factory_reset_provisioning_reset.yml
25 changes: 25 additions & 0 deletions ansible_collections/arista/cvp/molecule/cv_device_v3/molecule.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
scenario:
test_sequence:
- converge
driver:
name: delegated
platforms:
- name: dummy
managed: false
provisioner:
name: ansible
config_options:
defaults:
jinja2_extensions: 'jinja2.ext.loopcontrols,jinja2.ext.do,jinja2.ext.i18n'
gathering: explicit
command_warnings: False
remote_tmp: /tmp/.ansible-${USER}/tmp
stdout_callback: yaml
playbooks:
converge: converge.yml
ansible_args:
- --inventory
- ${MOLECULE_SCENARIO_DIRECTORY}/../../examples/inventory.yml
verifier:
name: ansible
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
---
- name: Test cv_device_v3
hosts: CloudVision
connection: local
gather_facts: no
vars:
ansible_command_timeout: 1200
ansible_connect_timeout: 600

DEVICE_NAME: s1-leaf1

IMAGE_NAME: "vEOS-lab.swi"

EXTENSION_NAME: "TerminAttr-1.25.1-1.swix"

BUNDLE_NAME: "Test_bundle"

CVP_DEVICES_BUNDLE_ATTACHED:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].parentContainerName}}"
imageBundle: Test_bundle

CVP_DEVICES_BUNDLE_DETACHED:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].parentContainerName}}"

tasks:
- name: Collect devices facts from {{inventory_hostname}}
arista.cvp.cv_facts_v3:
facts:
- devices
regexp_filter: "{{DEVICE_NAME}}"
register: CV_FACTS_V3_RESULT

- name: "Upload EOS image to {{inventory_hostname}}"
arista.cvp.cv_image_v3:
mode: image
action: add
image: "{{IMAGE_NAME}}"

- name: "Upload TerminAttr image to {{inventory_hostname}}"
arista.cvp.cv_image_v3:
mode: image
action: add
image: "{{EXTENSION_NAME}}"

- name: "Create bundle {{inventory_hostname}}"
arista.cvp.cv_image_v3:
mode: bundle
action: add
bundle_name: "{{BUNDLE_NAME}}"
image_list:
- "{{IMAGE_NAME}}"
- "{{EXTENSION_NAME}}"

- name: "Attach bundle on {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_BUNDLE_ATTACHED}}'
state: present
apply_mode: strict
register: ATTACH_BUNDLE

- name: "Check attach bundle"
assert:
that:
- ATTACH_BUNDLE.bundle_attached.changed == true
- ATTACH_BUNDLE.bundle_attached.bundle_attached_count == 1
- ATTACH_BUNDLE.bundle_attached.bundle_attached_list != []
- ATTACH_BUNDLE.bundle_attached.success == true
- ATTACH_BUNDLE.bundle_attached.taskIds != []

- name: Execute Task for attach_bundle
arista.cvp.cv_task_v3:
tasks:
- "{{item}}"
loop: "{{ATTACH_BUNDLE.taskIds}}"

- name: Pause for 20 seconds to Execute Task
ansible.builtin.pause:
seconds: 20

- name: "Detach bundle on {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_BUNDLE_DETACHED}}'
state: present
apply_mode: strict
register: DETACH_BUNDLE

- name: "Check detach bundle"
assert:
that:
- DETACH_BUNDLE.bundle_detached.changed == true
- DETACH_BUNDLE.bundle_detached.bundle_detached_count == 1
- DETACH_BUNDLE.bundle_detached.bundle_detached_list != []
- DETACH_BUNDLE.bundle_detached.success == true

- name: "Delete bundle {{inventory_hostname}}"
arista.cvp.cv_image_v3:
mode: bundle
action: remove
bundle_name: "{{BUNDLE_NAME}}"
image_list:
- "{{IMAGE_NAME}}"
- "{{EXTENSION_NAME}}"
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
- name: Test cv_device_v3
hosts: CloudVision
connection: local
gather_facts: no
vars:
DEVICE_NAME: s1-leaf1

CVP_CONFIGLETS:
configlet1: '! This is first configlet'
configlet2: '! This is second configlet'

CVP_DEVICES_APPLY_CONFIGLET:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].parentContainerName}}"
configlets:
- 'configlet1'
- 'configlet2'

CVP_DEVICES_DETACH_CONFIGLET:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].parentContainerName}}"
configlets: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].configlets}}"

tasks:
- name: Collect devices facts from {{inventory_hostname}}
arista.cvp.cv_facts_v3:
facts:
- devices
regexp_filter: "{{DEVICE_NAME}}"
register: CV_FACTS_V3_RESULT

- name: "Push config"
arista.cvp.cv_configlet_v3:
configlets: "{{CVP_CONFIGLETS}}"
state: present

- name: "Apply configlet on {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_APPLY_CONFIGLET}}'
state: present
register: CV_DEVICE_V3_RESULT

- name: "Check apply_configlet with apply_mode loose"
assert:
that:
- CV_DEVICE_V3_RESULT.changed == true
- CV_DEVICE_V3_RESULT.configlets_attached.changed == true
- CV_DEVICE_V3_RESULT.configlets_attached.configlets_attached_count == 2
- CV_DEVICE_V3_RESULT.configlets_attached.configlets_attached_list == ["s1-leaf1_configlet_attached"]
- CV_DEVICE_V3_RESULT.configlets_attached.success == true
- CV_DEVICE_V3_RESULT.configlets_attached.taskIds != []

- name: "Apply same configlet again on {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_APPLY_CONFIGLET}}'
state: present
register: CV_DEVICE_V3_RESULT

- name: "Check apply_configlet with same configlets"
assert:
that:
- CV_DEVICE_V3_RESULT.changed == false
- CV_DEVICE_V3_RESULT.configlets_attached.changed == false
- CV_DEVICE_V3_RESULT.configlets_attached.configlets_attached_count == 0
- CV_DEVICE_V3_RESULT.configlets_attached.configlets_attached_list == []
- CV_DEVICE_V3_RESULT.configlets_attached.success == false
- CV_DEVICE_V3_RESULT.configlets_attached.taskIds == []

- name: "Detach configlet from {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_DETACH_CONFIGLET}}'
state: present
apply_mode: strict
register: CV_DEVICE_V3_RESULT

- name: Execute Task for detach configlet
arista.cvp.cv_task_v3:
tasks:
- "{{CV_DEVICE_V3_RESULT.taskIds[0]}}"

- name: "Check detach_configlet with apply_mode strict"
assert:
that:
- CV_DEVICE_V3_RESULT.changed == true
- CV_DEVICE_V3_RESULT.configlets_detached.changed == true
- CV_DEVICE_V3_RESULT.configlets_detached.configlets_detached_count == 2
- CV_DEVICE_V3_RESULT.configlets_detached.configlets_detached_list == ["s1-leaf1_configlet_removed - configlet1 - configlet2"]
- CV_DEVICE_V3_RESULT.configlets_detached.success == true
- CV_DEVICE_V3_RESULT.configlets_detached.taskIds != []

- name: "Delete config"
arista.cvp.cv_configlet_v3:
configlets: "{{CVP_CONFIGLETS}}"
state: absent
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
---
- name: Test cv_device_v3
hosts: CloudVision
connection: local
gather_facts: no
vars:
DEVICE_NAME: s1-leaf2

CVP_DEVICES_STATE_ABSENT:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: ""

CVP_DEVICES_FACT0RY_RESET:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: ""

CVP_DEVICES_PROVISIONING_RESET:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: ""

CVP_DEVICES_VALIDATE_CONFIG:
- device_name: "{{DEVICE_NAME}}"
search_type: serialNumber
cvp_configlets: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].configlets}}"

CVP_DEVICES_DEPLOY:
- fqdn: "{{DEVICE_NAME}}"
parentContainerName: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].parentContainerName}}"
configlets: "{{CV_FACTS_V3_RESULT.data.cvp_devices[0].configlets}}"

tasks:
######################################
## STATE PROVISIONING RESET ##
######################################
- name: Collect devices facts from {{inventory_hostname}}
arista.cvp.cv_facts_v3:
facts:
- devices
regexp_filter: "{{DEVICE_NAME}}"
register: CV_FACTS_V3_RESULT

- name: Run CV_DEVICE_V3 With State Provisioning Reset
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_PROVISIONING_RESET}}'
state: provisioning_reset
register: PROVISIONING_RESET_RESULT

# if we try to delete the same device again(already in undefined container), it does not raise any error and gives the same result

- name: check provisioning reset
assert:
that:
- PROVISIONING_RESET_RESULT.devices_removed.changed == true
- PROVISIONING_RESET_RESULT.devices_removed.devices_removed_count == 1
- PROVISIONING_RESET_RESULT.devices_removed. devices_removed_list == ['s1-leaf2_delete']
- PROVISIONING_RESET_RESULT.devices_removed.success == true
- PROVISIONING_RESET_RESULT.devices_removed.taskIds is defined
- PROVISIONING_RESET_RESULT.failed == false
- PROVISIONING_RESET_RESULT.success == true

- name: Validate configurations
arista.cvp.cv_validate_v3:
devices: "{{CVP_DEVICES_VALIDATE_CONFIG}}"
validate_mode: stop_on_error
register: CVP_DEVICES_RESULTS

- name: "Deploy device on {{inventory_hostname}}"
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_DEPLOY}}'
state: present
register: CV_DEVICE_V3_RESULT

- name: Execute Task for deploy_Device
arista.cvp.cv_task_v3:
tasks:
- "{{CV_DEVICE_V3_RESULT.devices_deployed.taskIds[0]}}"
when: CVP_DEVICES_RESULTS.success is true

- name: Pause for 20 seconds to Execute Task
ansible.builtin.pause:
seconds: 20

######################################
## STATE FACTORY RESET ##
######################################
# XXX: This test will fail with cEOS devices. Uncomment if running on vEOS devices
# - name: Run CV_DEVICE_V3 With State Factory reset
# arista.cvp.cv_device_v3:
# devices: '{{CVP_DEVICES_FACT0RY_RESET}}'
# state: factory_reset
# register: FACTORY_RESET_RESULT
#
# # it does not move device to undefined container, just creates a task on CVP
#
# - name: Check State Factory reset
# assert:
# that:
# - FACTORY_RESET_RESULT.devices_reset.changed == true
# - FACTORY_RESET_RESULT.devices_reset.devices_reset_count == 1
# - FACTORY_RESET_RESULT.devices_reset.devices_reset_list == ['s1-leaf1_reset']
# - FACTORY_RESET_RESULT.devices_reset.success == true
# - FACTORY_RESET_RESULT.devices_reset.taskIds is defined
# - FACTORY_RESET_RESULT.failed == false
# - FACTORY_RESET_RESULT.success == true
#
# - name: Execute Task for deploy_Device
# arista.cvp.cv_task_v3:
# tasks:
# - "{{FACTORY_RESET_RESULT.taskIds[0]}}"
# state: cancelled

######################################
## STATE ABSENT (DECOMMISSION) ##
######################################
- name: Run CV_DEVICE_V3 With State Absent
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_STATE_ABSENT}}'
state: absent
register: DECOMMISSION_DEVICE
- assert:
that:
- DECOMMISSION_DEVICE.devices_decommissioned.changed == true
- DECOMMISSION_DEVICE.devices_decommissioned.devices_decommissioned_count == 1
- DECOMMISSION_DEVICE.devices_decommissioned.devices_decommissioned_list == ['s1-leaf2_delete']
- DECOMMISSION_DEVICE.devices_decommissioned.success == true
- DECOMMISSION_DEVICE.devices_decommissioned.taskIds == []
- DECOMMISSION_DEVICE.failed == false

- name: Run CV_DEVICE_V3 With State Absent # when device does not exist in CVP
arista.cvp.cv_device_v3:
devices: '{{CVP_DEVICES_STATE_ABSENT}}'
state: absent
ignore_errors: yes
register: DECOMMISSION_DEVICE_ABSENT
- assert:
that:
- DECOMMISSION_DEVICE_ABSENT.changed == false
- DECOMMISSION_DEVICE_ABSENT.failed == true
- DECOMMISSION_DEVICE_ABSENT.msg == "Error - the following devices do not exist in CVP ['s1-leaf2'] but are defined in the playbook. Make sure that the devices are provisioned and defined with the full fqdn name (including the domain name) if needed."
Loading

0 comments on commit a24b03c

Please sign in to comment.