Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test: Adding integration tests for cv_device_v3 #621

Merged
merged 19 commits into from
Aug 15, 2023
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,124 @@
---
- name: Test cv_device_v3
hosts: CloudVision
connection: local
gather_facts: no
vars:
ansible_command_timeout: 1200
ansible_connect_timeout: 600

DEVICE_NAME: leaf1

CVP_CONFIGLETS:
configlet1: '! This is first configlet'

IMAGE_NAME: "vEOS-lab.swi"

BUNDLE_NAME: "Test_bundle"

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

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

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"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we testing push configlet here rather than in test_apply_detach_configlets.yaml ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we are not testing it here, just uploading it to be used while attaching/detaching bundle

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested it without configlets, removing configlet part.
Thanks!

arista.cvp.cv_configlet_v3:
configlets: "{{CVP_CONFIGLETS}}"
state: present

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

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need a Terminattr to be added to the bundle. Please add a terminattr to this bundle

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


- 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: "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}}"

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

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

- name: "Delete configlet"
arista.cvp.cv_configlet_v3:
configlets: "{{CVP_CONFIGLETS}}"
state: absent
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: 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 == ["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 == ["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,128 @@
---
- name: Test cv_device_v3
hosts: CloudVision
connection: local
gather_facts: no
vars:
DEVICE_NAME: leaf1

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 == ['leaf1_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

######################################
## STATE FACTORY RESET ##
######################################
- 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 == ['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

######################################
## 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 == 0
sugetha24 marked this conversation as resolved.
Show resolved Hide resolved
- DECOMMISSION_DEVICE.devices_decommissioned.devices_decommissioned_list == ['leaf1_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 ['leaf1'] 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