-
Notifications
You must be signed in to change notification settings - Fork 61
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Test: Adding integration tests for cv_device_v3 (#621)
* 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
1 parent
9820236
commit a24b03c
Showing
7 changed files
with
552 additions
and
23 deletions.
There are no files selected for viewing
12 changes: 12 additions & 0 deletions
12
ansible_collections/arista/cvp/molecule/cv_device_v3/converge.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
25
ansible_collections/arista/cvp/molecule/cv_device_v3/molecule.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
104 changes: 104 additions & 0 deletions
104
ansible_collections/arista/cvp/molecule/cv_device_v3/test_apply_detach_bundle.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}}" |
95 changes: 95 additions & 0 deletions
95
ansible_collections/arista/cvp/molecule/cv_device_v3/test_apply_detach_configlet.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
139 changes: 139 additions & 0 deletions
139
...s/arista/cvp/molecule/cv_device_v3/test_decommission_factory_reset_provisioning_reset.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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." |
Oops, something went wrong.