diff options
| author | omnom62 <75066712+omnom62@users.noreply.github.com> | 2026-08-19 22:21:24 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-19 15:21:24 +0300 |
| commit | a6adced609472d88cb525f2ef1a4054b52692f76 (patch) | |
| tree | de206d2bbc56c970c2db3162cdee3d78b341c811 /tests | |
| parent | b6b58bc747c4ea59371253c5541cde92b922c173 (diff) | |
| download | vyos.vyos-a6adced609472d88cb525f2ef1a4054b52692f76.tar.gz vyos.vyos-a6adced609472d88cb525f2ef1a4054b52692f76.zip | |
T6820: HA/VRRP module (#438)
* Init VRRP
* RM Templates
* rm_templates for global_parameters
* virtual servers rm_templates
* update
* sync-group rm_tempalte
* VRRP GP GARP template rework
* RM template and new facts logic
* vrrp argspec
* Suppressing backup versions of files
* Facts for vrrp
* VRRP facts updates
* Facts almost done
* Argspec vrrp
* Argspec completed
* Argspec and facts for VRRP finished
* Documentation for VRRP module
* Sanity tests fixes and documentation
* VRRP config started
* Doc fixes
* Doc fixes
* Doc fixes
* Configuration for VRRP
* wip
* Updates to facts, config, templates in VRRP
* VRRP groups templates, facts and config
* VRRP works - templates for groups and virtual_servers
* Mid-result
* VRRP VS prototype
* Groups processor update
* Reworked vrrp.group and vrrp.group.garp processors
* VRRP grp recursive
* VRRP groups and vserver contd
* Update to VRRP want processing
* Updates to VRRP funcs
* VRRP VS RS config
* Sanity test fixes midway
* VRRP Real server fixes
* VRRP sync_group
* Latest fixes to etire VRRP config parsing
* Midway compare function
* update to vrrp group processing
* Mid results for merge parsers / compare
* Working merge for vrrp and virtserv
* Final merge / compare
* WIP replaced / Delete
* Updates to state processing
* Mid-result for virtual_servers
* Mid result commit
* Testing high-availability vrrp processing
* Retesting vrrp stanza
* Mid results
* Real server parsing
* SNMP vrrp fixed
* Sanity fixes
* Purged, rendered, gathered, parsed action states for VRRP
* VRRP integration and unit tests; code fixes midway results
* Sanity check fixes
* Merged integration test case for VRRP
* VRRP rendered integration test case
* Sanity tests fixes
* VRRP unit tests - merged and purged
* Mid-way replaced, deleted and overriden work. Description string fix
* Updates to integration and unit tests for VRRP
* Mid-result for deleted state VRRP
* Mid-results for VRRP deleted
* Deleted vrrp midway results
* Deleted state function for VRRP
* Deleted state VRRP, sanity checks fix
* Deleted integration tests
* Deleted_all unit and integration tests
* Deleted_all unit and integration tests
* Sanity check fixes
* Mid-results overridden VRRP
* WIP vrrp overridden sit and uat
* VRRP overridden sanity test
* UAT overriden vrrp
* UAT deleted for vrrp
* VRRP replaced UAT and SIT
* VRRP RTT SIT
* VRRP SIT suite ready
* Finals for VRRP module - clean-up and fixed UAT
* VRRP module doc examples updated
* VRRP sanity tests fixes
* VRRP disbale default fix
* Misc lint fixes
* Misc Lint fixes
* remove old files
* Rename vyos_vrrp -> vyos_ha
* Rename vyos_vrrp to vyos_ha
* doc fixes
* Changes to HA module
* HA module fixes
* Sanity test fixes
* changelog
* ignore for HA/VRRP and 2.22
* AI-generated comments and fixes
* Fixes after review
* Misc fixes
* Misc fixes
* Misc fixes
* Misc fixes
* Sanity fixes
* Sanity fixes
* Misc changes
* T6820: code refactor to address valid AI comments
* T6820: Optimising facts, config and rm_templates
* T6820: UAT fixes
* T6820: docstring for utils/combine()
* T6820 Misc fixes to changelog
---------
Co-authored-by: Gaige B Paulsen <gaige@cluetrust.com>
Diffstat (limited to 'tests')
30 files changed, 2839 insertions, 0 deletions
diff --git a/tests/integration/targets/vyos_ha/defaults/main.yaml b/tests/integration/targets/vyos_ha/defaults/main.yaml new file mode 100644 index 00000000..164afead --- /dev/null +++ b/tests/integration/targets/vyos_ha/defaults/main.yaml @@ -0,0 +1,3 @@ +--- +testcase: "[^_].*" +test_items: [] diff --git a/tests/integration/targets/vyos_ha/tasks/cli.yaml b/tests/integration/targets/vyos_ha/tasks/cli.yaml new file mode 100644 index 00000000..daccf720 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tasks/cli.yaml @@ -0,0 +1,20 @@ +--- +- name: Collect all cli test cases + ansible.builtin.find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + use_regex: true + register: test_cases + delegate_to: localhost + +- name: Set test_items + ansible.builtin.set_fact: + test_items: "{{ test_cases.files | map(attribute='path') | list }}" + +- name: Run test case (connection=ansible.netcommon.network_cli) + ansible.builtin.include_tasks: "{{ test_case_to_run }}" + vars: + ansible_connection: ansible.netcommon.network_cli + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/tests/integration/targets/vyos_ha/tasks/main.yaml b/tests/integration/targets/vyos_ha/tasks/main.yaml new file mode 100644 index 00000000..e6378581 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tasks/main.yaml @@ -0,0 +1,5 @@ +--- +- name: Run CLI tests + ansible.builtin.include_tasks: cli.yaml + tags: + - network_cli diff --git a/tests/integration/targets/vyos_ha/tests/cli/_add_dummy_scripts.yaml b/tests/integration/targets/vyos_ha/tests/cli/_add_dummy_scripts.yaml new file mode 100644 index 00000000..60a44758 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/_add_dummy_scripts.yaml @@ -0,0 +1,6 @@ +--- +- name: Create dummy scripts for HA tests + vyos.vyos.vyos_command: + commands: touch /var/tmp/script.sh && chmod +x /var/tmp/script.sh + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/tests/integration/targets/vyos_ha/tests/cli/_parsed.cfg b/tests/integration/targets/vyos_ha/tests/cli/_parsed.cfg new file mode 100644 index 00000000..d003d106 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/_parsed.cfg @@ -0,0 +1,69 @@ +set high-availability virtual-server s1 address 10.10.10.1 +set high-availability virtual-server s1 algorithm round-robin +set high-availability virtual-server s1 delay-loop 60 +set high-availability virtual-server s1 forward-method direct +set high-availability virtual-server s1 fwmark 10 +set high-availability virtual-server s1 persistence-timeout 30 +set high-availability virtual-server s1 protocol tcp +set high-availability virtual-server s1 real-server 10.10.50.1 health-check script /var/tmp/script.sh +set high-availability virtual-server s1 real-server 10.10.50.1 port 443 +set high-availability virtual-server s2 address 10.10.10.2 +set high-availability virtual-server s2 port 81 +set high-availability virtual-server s2 real-server real1 connection-timeout 5 +set high-availability virtual-server s2 real-server real1 port 8081 +set high-availability virtual-server s2 real-server real2 port 8080 +set high-availability vrrp global-parameters startup-delay 31 +set high-availability vrrp global-parameters version 3 +set high-availability vrrp global-parameters garp interval 30 +set high-availability vrrp global-parameters garp master-delay 10 +set high-availability vrrp global-parameters garp master-refresh 100 +set high-availability vrrp global-parameters garp master-refresh-repeat 200 +set high-availability vrrp global-parameters garp master-repeat 5 +set high-availability vrrp group g1 address 1.1.1.1 +set high-availability vrrp group g1 address 5.5.5.5 +set high-availability vrrp group g1 address 8.8.8.8 interface eth2 +set high-availability vrrp group g1 advertise-interval 10 +set high-availability vrrp group g1 description 'Group_1' +set high-availability vrrp group g1 disable +set high-availability vrrp group g1 interface eth2 +set high-availability vrrp group g1 no-preempt +set high-availability vrrp group g1 peer-address 192.168.1.3 +set high-availability vrrp group g1 preempt-delay 15 +set high-availability vrrp group g1 priority 100 +set high-availability vrrp group g1 rfc3768-compatibility +set high-availability vrrp group g1 vrid 20 +set high-availability vrrp group g1 authentication password testpass +set high-availability vrrp group g1 authentication type plaintext-password +set high-availability vrrp group g1 excluded-address 192.168.1.7 interface eth3 +set high-availability vrrp group g1 excluded-address 192.168.1.8 +set high-availability vrrp group g1 garp interval 20 +set high-availability vrrp group g1 garp master-delay 5 +set high-availability vrrp group g1 garp master-refresh 50 +set high-availability vrrp group g1 garp master-refresh-repeat 100 +set high-availability vrrp group g1 garp master-repeat 3 +set high-availability vrrp group g1 track exclude-vrrp-interface +set high-availability vrrp group g1 track interface eth0 +set high-availability vrrp group g1 track interface eth1 +set high-availability vrrp group g1 transition-script backup /var/tmp/script.sh +set high-availability vrrp group g1 transition-script fault /var/tmp/script.sh +set high-availability vrrp group g1 transition-script master /var/tmp/script.sh +set high-availability vrrp group g1 transition-script stop /var/tmp/script.sh +set high-availability vrrp group g2 address 2.2.2.2 +set high-availability vrrp group g2 description 'Group_2' +set high-availability vrrp group g2 interface eth1 +set high-availability vrrp group g2 vrid 11 +set high-availability vrrp group g2 health-check failure-count 5 +set high-availability vrrp group g2 health-check interval 15 +set high-availability vrrp group g2 health-check ping 192.168.1.100 +set high-availability vrrp group g2 health-check script /var/tmp/script.sh +set high-availability vrrp group g2 hello-source-address 2.2.2.2 +set high-availability vrrp sync-group sg1 health-check failure-count 3 +set high-availability vrrp sync-group sg1 health-check interval 10 +set high-availability vrrp sync-group sg1 health-check ping 192.168.2.100 +set high-availability vrrp sync-group sg1 health-check script /var/tmp/script.sh +set high-availability vrrp sync-group sg1 member g1 +set high-availability vrrp sync-group sg1 member g2 +set high-availability vrrp sync-group sg1 transition-script backup /var/tmp/script.sh +set high-availability vrrp sync-group sg1 transition-script fault /var/tmp/script.sh +set high-availability vrrp sync-group sg1 transition-script master /var/tmp/script.sh +set high-availability vrrp sync-group sg1 transition-script stop /var/tmp/script.sh diff --git a/tests/integration/targets/vyos_ha/tests/cli/_populate_config.yaml b/tests/integration/targets/vyos_ha/tests/cli/_populate_config.yaml new file mode 100644 index 00000000..95e81752 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/_populate_config.yaml @@ -0,0 +1,8 @@ +--- +- ansible.builtin.include_tasks: _add_dummy_scripts.yaml + +- name: Setup initial HA configuration + vyos.vyos.vyos_config: + lines: "{{ populate_commands}}" + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/tests/integration/targets/vyos_ha/tests/cli/_remove_config.yaml b/tests/integration/targets/vyos_ha/tests/cli/_remove_config.yaml new file mode 100644 index 00000000..416e5c4d --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/_remove_config.yaml @@ -0,0 +1,15 @@ +--- +- name: Remove pre-existing HA config + vyos.vyos.vyos_ha: + config: + state: purged + ignore_errors: true + vars: + ansible_connection: ansible.netcommon.network_cli + +- name: Remove dummy scripts for HA tests + vyos.vyos.vyos_command: + commands: + - rm -f /var/tmp/script.sh + vars: + ansible_connection: ansible.netcommon.network_cli diff --git a/tests/integration/targets/vyos_ha/tests/cli/deleted_all.yaml b/tests/integration/targets/vyos_ha/tests/cli/deleted_all.yaml new file mode 100644 index 00000000..f97e8802 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/deleted_all.yaml @@ -0,0 +1,44 @@ +--- +- debug: + msg: Start vyos_ha purged / deleted_all integration tests ansible_connection={{ ansible_connection }} + +- include_tasks: _populate_config.yaml + +- block: + - name: Purge all the HA configuration. + register: result + vyos.vyos.vyos_ha: &id001 + config: + state: deleted + + - name: Assert that the before dicts were correctly generated + assert: + that: + - "merged.before == result['before']" + + - name: Assert that the correct set of commands were generated + assert: + that: + - "{{ purged.commands | symmetric_difference(result['commands']) | length == 0 }}" + + - name: Assert that the after dicts were correctly generated + assert: + that: + - "purged.after == result['after']" + + - name: Purge all the HA configuration. (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result.changed == false + - result.commands | length == 0 + + - name: Assert that the before dicts were correctly generated + assert: + that: + - "purged.after == result['before']" + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/deleted_bulk.yaml b/tests/integration/targets/vyos_ha/tests/cli/deleted_bulk.yaml new file mode 100644 index 00000000..52a6477b --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/deleted_bulk.yaml @@ -0,0 +1,50 @@ +--- +- debug: + msg: Start vyos_ha deleted integration tests ansible_connection={{ ansible_connection }} + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete stub objects. + register: result + vyos.vyos.vyos_ha: &id001 + config: + disable: false + vrrp: + global_parameters: + startup_delay: 32 + garp: {} + groups: + - name: g1 + sync_groups: [] + virtual_servers: [] + state: deleted + + - name: Assert that the before dicts were correctly generated + assert: + that: + # - "{{ merged.before | symmetric_difference(result['before']) | length == 0 }}" + - "merged.before == result['before']" + + - name: Assert that the correct set of commands were generated + assert: + that: + - "{{ deleted_bulk['commands'] | symmetric_difference(result['commands']) | length == 0 }}" + + - name: Assert that the after dicts were correctly generated + assert: + that: + - "{{ deleted_bulk['after'] | symmetric_difference(result['after']) | length == 0 }}" + + - name: Delete stub objects (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result.changed == false + - result.commands | length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/deleted_vrrp_groups.yaml b/tests/integration/targets/vyos_ha/tests/cli/deleted_vrrp_groups.yaml new file mode 100644 index 00000000..b84b6905 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/deleted_vrrp_groups.yaml @@ -0,0 +1,45 @@ +--- +- debug: + msg: Start vyos_ha deleted integration tests ansible_connection={{ ansible_connection }} + +- include_tasks: _populate_config.yaml + +- block: + - name: Delete a vrrp group and sync_group based on its name. + register: result + vyos.vyos.vyos_ha: &id001 + config: + vrrp: + groups: + - name: "g1" + sync_groups: + - name: "sg1" + state: deleted + + - name: Assert that the before dicts were correctly generated + assert: + that: + - "merged.before == result['before']" + + - name: Assert that the correct set of commands were generated + assert: + that: + - "{{ deleted_vrrp_groups['commands'] | symmetric_difference(result['commands']) |length == 0 }}" + + - name: Assert that the after dicts were correctly generated + assert: + that: + - "deleted_vrrp_groups['after'] == result['after']" + + - name: Delete attributes of group (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result.changed == false + - result.commands|length == 0 + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_ha/tests/cli/empty_config.yaml new file mode 100644 index 00000000..676d2c66 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/empty_config.yaml @@ -0,0 +1,58 @@ +--- +- debug: + msg: START vyos_ha empty_config integration tests on connection={{ ansible_connection }} + +- name: Merged with empty config should give appropriate error message + register: result + ignore_errors: true + vyos.vyos.vyos_ha: + config: + state: merged + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state merged' + +- name: Replaced with empty config should give appropriate error message + register: result + ignore_errors: true + vyos.vyos.vyos_ha: + config: + state: replaced + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Overridden with empty config should give appropriate error message + register: result + ignore_errors: true + vyos.vyos.vyos_ha: + config: + state: overridden + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state overridden' + +- name: Parsed with empty running_config should give appropriate error message + register: result + ignore_errors: true + vyos.vyos.vyos_ha: + running_config: + state: parsed + +- assert: + that: + - result.msg == 'value of running_config parameter must not be empty for state parsed' + +- name: Rendered with empty config should give appropriate error message + register: result + ignore_errors: true + vyos.vyos.vyos_ha: + config: + state: rendered + +- assert: + that: + - result.msg == 'value of config parameter must not be empty for state rendered' diff --git a/tests/integration/targets/vyos_ha/tests/cli/gathered.yaml b/tests/integration/targets/vyos_ha/tests/cli/gathered.yaml new file mode 100644 index 00000000..da39727a --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/gathered.yaml @@ -0,0 +1,25 @@ +--- +- debug: + msg: START vyos_ha gathered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Gather config from the device in structured format. + register: result + vyos.vyos.vyos_ha: + state: gathered + + - vyos.vyos.vyos_facts: + gather_network_resources: ha + + - name: Assert that facts are correctly generated + assert: + that: + - result.changed == false + - "result.gathered == ansible_facts['network_resources']['ha']" + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/merged.yaml b/tests/integration/targets/vyos_ha/tests/cli/merged.yaml new file mode 100644 index 00000000..cb870d01 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/merged.yaml @@ -0,0 +1,42 @@ +--- +- debug: + msg: START vyos_ha merged integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Merge the provided configuration with the existing running configuration + register: result + vyos.vyos.vyos_ha: &id001 + config: "{{ merged.config }}" + state: merged + + - vyos.vyos.vyos_facts: + gather_network_resources: ha + + - assert: + that: + - result.changed == true + - result.commands | symmetric_difference(merged.commands) == [] + - "result.after == ansible_facts['network_resources']['ha']" + + - name: Assert that before dicts were correctly generated + assert: + that: + - "merged.before == result.before" + + - name: Merge the provided configuration with the existing running configuration (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result['commands'] == [] + - "result['before'] == ansible_facts['network_resources']['ha']" + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/overridden.yaml b/tests/integration/targets/vyos_ha/tests/cli/overridden.yaml new file mode 100644 index 00000000..44a85b76 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/overridden.yaml @@ -0,0 +1,35 @@ +--- +- debug: + msg: START vyos_ha overridden integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Override the existing configuration with the provided running configuration + register: result + vyos.vyos.vyos_ha: &id001 + config: "{{ overridden.config }}" + state: overridden + + - vyos.vyos.vyos_facts: + gather_network_resources: ha + + - name: Verify that the configuration was correctly overridden + assert: + that: + - result.changed == true + - result.after == ansible_facts['network_resources']['ha'] + + - name: Override the existing configuration with the provided running configuration (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/parsed.yaml b/tests/integration/targets/vyos_ha/tests/cli/parsed.yaml new file mode 100644 index 00000000..c7134d6c --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/parsed.yaml @@ -0,0 +1,15 @@ +--- +- debug: + msg: START vyos_ha parsed integration tests on connection={{ ansible_connection }} + +- name: Provide the running configuration for parsing (config to be parsed) + register: result + vyos.vyos.vyos_ha: + running_config: "{{ lookup('file', '_parsed.cfg') }}" + state: parsed + +- name: Assert that config was correctly parsed + assert: + that: + - result.changed == false + - "result.parsed == merged.before" diff --git a/tests/integration/targets/vyos_ha/tests/cli/purged.yaml b/tests/integration/targets/vyos_ha/tests/cli/purged.yaml new file mode 100644 index 00000000..ffc00d64 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/purged.yaml @@ -0,0 +1,44 @@ +--- +- debug: + msg: Start vyos_ha purged / deleted_all integration tests ansible_connection={{ ansible_connection }} + +- include_tasks: _populate_config.yaml + +- block: + - name: Purge all the HA configuration. + register: result + vyos.vyos.vyos_ha: &id001 + config: + state: purged + + - name: Assert that the before dicts were correctly generated + assert: + that: + - "merged.before == result['before']" + + - name: Assert that the correct set of commands were generated + assert: + that: + - "{{ purged.commands | symmetric_difference(result['commands']) |length == 0 }}" + + - name: Assert that the after dicts were correctly generated + assert: + that: + - "purged.after == result['after']" + + - name: Purge all the HA configuration (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result.changed == false + - result.commands | length == 0 + + - name: Assert that the before dicts were correctly generated + assert: + that: + - "purged.after == result['before']" + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/rendered.yaml b/tests/integration/targets/vyos_ha/tests/cli/rendered.yaml new file mode 100644 index 00000000..efece2c6 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/rendered.yaml @@ -0,0 +1,15 @@ +--- +- debug: + msg: START vyos_ha rendered integration tests on connection={{ ansible_connection }} + +- block: + - name: Structure provided configuration into device specific commands + register: result + vyos.vyos.vyos_ha: + config: "{{ rendered.config }}" + state: rendered + + - assert: + that: + - result.changed == false + - "result.rendered | sort == rendered.commands | sort" diff --git a/tests/integration/targets/vyos_ha/tests/cli/replaced.yaml b/tests/integration/targets/vyos_ha/tests/cli/replaced.yaml new file mode 100644 index 00000000..d35f3345 --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/replaced.yaml @@ -0,0 +1,37 @@ +--- +- debug: + msg: START vyos_ha replaced integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate_config.yaml + +- block: + - name: Replace the provided configuration with the existing running configuration + register: result + vyos.vyos.vyos_ha: &id001 + config: "{{ merged.config }}" + state: replaced + + - vyos.vyos.vyos_facts: + gather_network_resources: ha + + - assert: + that: + - result.changed == true + - result.commands | symmetric_difference(replaced.commands) == [] + - "result.after == ansible_facts['network_resources']['ha']" + + - name: Replace the provided configuration with the existing running configuration (IDEMPOTENT) + register: result + vyos.vyos.vyos_ha: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + - result['commands'] == [] + - "result['before'] == ansible_facts['network_resources']['ha']" + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/tests/cli/rtt.yaml b/tests/integration/targets/vyos_ha/tests/cli/rtt.yaml new file mode 100644 index 00000000..06e017be --- /dev/null +++ b/tests/integration/targets/vyos_ha/tests/cli/rtt.yaml @@ -0,0 +1,39 @@ +--- +- debug: + msg: START vyos_ha rtt integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: RTT Merge the provided configuration with the existing running configuration + register: baseconfig + vyos.vyos.vyos_ha: + config: "{{ merged.config }}" + state: merged + + - vyos.vyos.vyos_facts: + gather_network_resources: ha + + - assert: + that: + - baseconfig.changed == true + - baseconfig.commands|symmetric_difference(rtt.commands) == [] + - "baseconfig.after == ansible_facts['network_resources']['ha']" + + - name: RTT Merge the existing configuration with the provided running configuration + register: result + vyos.vyos.vyos_ha: + config: "{{ rtt.config }}" + + - name: RTT Revert back to base config using facts round trip + register: revert + vyos.vyos.vyos_ha: + config: "{{ ansible_facts['network_resources']['ha'] }}" + state: overridden + + - name: RTT Assert that config was reverted + assert: + that: baseconfig.after == revert.after + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_ha/vars/main.yaml b/tests/integration/targets/vyos_ha/vars/main.yaml new file mode 100644 index 00000000..6cf70f2e --- /dev/null +++ b/tests/integration/targets/vyos_ha/vars/main.yaml @@ -0,0 +1,787 @@ +--- +merged: + before: + disable: false + virtual_servers: + - name: s1 + address: 10.10.10.1 + algorithm: "round-robin" + delay_loop: 60 + forward_method: direct + fwmark: 10 + persistence_timeout: 30 + protocol: tcp + real_server: + - address: 10.10.50.1 + health_check_script: "/var/tmp/script.sh" + port: 443 + - name: s2 + address: 10.10.10.2 + port: 81 + real_server: + - address: real1 + connection_timeout: 5 + port: 8081 + - address: real2 + port: 8080 + vrrp: + global_parameters: + startup_delay: 31 + version: "3" + garp: + interval: 30 + master_delay: 10 + master_refresh: 100 + master_refresh_repeat: 200 + master_repeat: 5 + groups: + - name: "g1" + description: "Group_1" + interface: "eth2" + address: + - "1.1.1.1" + - "5.5.5.5" + - "8.8.8.8 interface eth2" + advertise_interval: 10 + peer_address: 192.168.1.3 + preempt_delay: 15 + priority: 100 + disable: true + no_preempt: true + rfc3768_compatibility: true + vrid: 20 + excluded_address: + - "192.168.1.7 interface eth3" + - "192.168.1.8" + garp: + interval: 20 + master_delay: 5 + master_refresh: 50 + master_refresh_repeat: 100 + master_repeat: 3 + authentication: + type: "plaintext-password" + password: "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + track: + exclude_vrrp_interface: true + interface: + - eth0 + - eth1 + - name: "g2" + description: "Group_2" + interface: "eth1" + address: + - "2.2.2.2" + disable: false + no_preempt: false + rfc3768_compatibility: false + vrid: 11 + health_check: + failure_count: 5 + interval: 15 + ping: "192.168.1.100" + script: "/var/tmp/script.sh" + hello_source_address: "2.2.2.2" + sync_groups: + - name: "sg1" + member: + - "g1" + - "g2" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + health_check: + failure_count: 3 + interval: 10 + ping: "192.168.2.100" + script: "/var/tmp/script.sh" + config: + disable: true + virtual_servers: + - name: s1 + address: 10.10.10.5 + algorithm: round-robin + real_server: + - address: 10.10.50.2 + port: 8443 + - name: s2 + address: 10.10.10.2 + persistence_timeout: 30 + port: 81 + protocol: tcp + - name: s3 + address: 10.10.10.3 + port: 88 + protocol: udp + vrrp: + snmp: enabled + global_parameters: + startup_delay: 30 + garp: + master_repeat: 6 + groups: + - name: "g1" + peer_address: 192.168.1.3 + priority: 100 + disable: false + no_preempt: false + vrid: 20 + - name: "g2" + address: + - "4.4.4.4" + - "6.6.6.6 interface eth3" + sync_groups: + - name: "sg1" + health_check: + failure_count: 5 + commands: + - delete high-availability vrrp group g1 disable + - delete high-availability vrrp group g1 no-preempt + - delete high-availability vrrp group g1 rfc3768-compatibility + - set high-availability disable + - set high-availability virtual-server s1 address 10.10.10.5 + - set high-availability virtual-server s1 real-server 10.10.50.2 port 8443 + - set high-availability virtual-server s2 persistence-timeout 30 + - set high-availability virtual-server s2 protocol tcp + - set high-availability virtual-server s3 address 10.10.10.3 + - set high-availability virtual-server s3 port 88 + - set high-availability virtual-server s3 protocol udp + - set high-availability vrrp global-parameters garp master-repeat 6 + - set high-availability vrrp global-parameters startup-delay 30 + - set high-availability vrrp group g2 address 2.2.2.2 + - set high-availability vrrp group g2 address 4.4.4.4 + - set high-availability vrrp group g2 address 6.6.6.6 interface eth3 + - set high-availability vrrp snmp + - set high-availability vrrp sync-group sg1 health-check failure-count 5 + +populate_commands: + - set high-availability virtual-server s1 address 10.10.10.1 + - set high-availability virtual-server s1 algorithm round-robin + - set high-availability virtual-server s1 delay-loop 60 + - set high-availability virtual-server s1 forward-method direct + - set high-availability virtual-server s1 fwmark 10 + - set high-availability virtual-server s1 persistence-timeout 30 + - set high-availability virtual-server s1 protocol tcp + - set high-availability virtual-server s1 real-server 10.10.50.1 health-check script /var/tmp/script.sh + - set high-availability virtual-server s1 real-server 10.10.50.1 port 443 + - set high-availability virtual-server s2 address 10.10.10.2 + - set high-availability virtual-server s2 port 81 + - set high-availability virtual-server s2 real-server real1 connection-timeout 5 + - set high-availability virtual-server s2 real-server real1 port 8081 + - set high-availability virtual-server s2 real-server real2 port 8080 + - set high-availability vrrp global-parameters startup-delay 31 + - set high-availability vrrp global-parameters version 3 + - set high-availability vrrp global-parameters garp interval 30 + - set high-availability vrrp global-parameters garp master-delay 10 + - set high-availability vrrp global-parameters garp master-refresh 100 + - set high-availability vrrp global-parameters garp master-refresh-repeat 200 + - set high-availability vrrp global-parameters garp master-repeat 5 + - set high-availability vrrp group g1 address 1.1.1.1 + - set high-availability vrrp group g1 address 5.5.5.5 + - set high-availability vrrp group g1 address 8.8.8.8 interface eth2 + - set high-availability vrrp group g1 advertise-interval 10 + - set high-availability vrrp group g1 description 'Group_1' + - set high-availability vrrp group g1 disable + - set high-availability vrrp group g1 interface eth2 + - set high-availability vrrp group g1 no-preempt + - set high-availability vrrp group g1 peer-address 192.168.1.3 + - set high-availability vrrp group g1 preempt-delay 15 + - set high-availability vrrp group g1 priority 100 + - set high-availability vrrp group g1 rfc3768-compatibility + - set high-availability vrrp group g1 vrid 20 + - set high-availability vrrp group g1 authentication password testpass + - set high-availability vrrp group g1 authentication type plaintext-password + - set high-availability vrrp group g1 excluded-address 192.168.1.7 interface eth3 + - set high-availability vrrp group g1 excluded-address 192.168.1.8 + - set high-availability vrrp group g1 garp interval 20 + - set high-availability vrrp group g1 garp master-delay 5 + - set high-availability vrrp group g1 garp master-refresh 50 + - set high-availability vrrp group g1 garp master-refresh-repeat 100 + - set high-availability vrrp group g1 garp master-repeat 3 + - set high-availability vrrp group g1 track exclude-vrrp-interface + - set high-availability vrrp group g1 track interface eth0 + - set high-availability vrrp group g1 track interface eth1 + - set high-availability vrrp group g1 transition-script backup /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script fault /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script master /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script stop /var/tmp/script.sh + - set high-availability vrrp group g2 address 2.2.2.2 + - set high-availability vrrp group g2 description 'Group_2' + - set high-availability vrrp group g2 interface eth1 + - set high-availability vrrp group g2 vrid 11 + - set high-availability vrrp group g2 health-check failure-count 5 + - set high-availability vrrp group g2 health-check interval 15 + - set high-availability vrrp group g2 health-check ping 192.168.1.100 + - set high-availability vrrp group g2 health-check script /var/tmp/script.sh + - set high-availability vrrp group g2 hello-source-address 2.2.2.2 + - set high-availability vrrp sync-group sg1 health-check failure-count 3 + - set high-availability vrrp sync-group sg1 health-check interval 10 + - set high-availability vrrp sync-group sg1 health-check ping 192.168.2.100 + - set high-availability vrrp sync-group sg1 health-check script /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 member g1 + - set high-availability vrrp sync-group sg1 member g2 + - set high-availability vrrp sync-group sg1 transition-script backup /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script fault /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script master /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script stop /var/tmp/script.sh + +rendered: + config: + virtual_servers: + - name: s1 + address: 10.10.10.1 + algorithm: round-robin + delay_loop: 60 + forward_method: direct + fwmark: 10 + persistence_timeout: 30 + protocol: tcp + real_server: + - address: 10.10.50.1 + health_check_script: /var/tmp/script.sh + port: 443 + - name: s2 + address: 10.10.10.2 + port: 81 + real_server: + - address: real1 + connection_timeout: 5 + port: 8081 + - address: real2 + port: 8080 + vrrp: + snmp: enabled + global_parameters: + startup_delay: 31 + version: "3" + garp: + interval: 30 + master_delay: 10 + master_refresh: 100 + master_refresh_repeat: 200 + master_repeat: 5 + groups: + - name: "g1" + description: "Group_1" + interface: "eth2" + address: + - "1.1.1.1" + - "2.2.2.2" + - "3.3.3.3 interface eth2" + advertise_interval: 10 + peer_address: 192.168.1.3 + preempt_delay: 15 + priority: 100 + disable: true + no_preempt: true + rfc3768_compatibility: true + vrid: 20 + excluded_address: + - "192.168.1.7 interface eth3" + garp: + interval: 20 + master_delay: 5 + master_refresh: 50 + master_refresh_repeat: 100 + master_repeat: 3 + authentication: + type: "plaintext-password" + password: "test123" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + track: + exclude_vrrp_interface: true + interface: + - eth0 + - name: "g2" + description: "Group_2" + interface: "eth1" + address: "2.2.2.2" + disable: false + no_preempt: false + rfc3768_compatibility: false + vrid: 11 + health_check: + failure_count: 5 + interval: 15 + ping: "192.168.1.100" + script: "/var/tmp/script.sh" + hello_source_address: "2.2.2.2" + sync_groups: + - name: "sg1" + member: + - "g1" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + health_check: + failure_count: 3 + interval: 10 + ping: "192.168.2.100" + script: "/var/tmp/script.sh" + commands: + - set high-availability virtual-server s1 address 10.10.10.1 + - set high-availability virtual-server s1 algorithm round-robin + - set high-availability virtual-server s1 delay-loop 60 + - set high-availability virtual-server s1 forward-method direct + - set high-availability virtual-server s1 fwmark 10 + - set high-availability virtual-server s1 persistence-timeout 30 + - set high-availability virtual-server s1 protocol tcp + - set high-availability virtual-server s1 real-server 10.10.50.1 health-check script /var/tmp/script.sh + - set high-availability virtual-server s1 real-server 10.10.50.1 port 443 + - set high-availability virtual-server s2 address 10.10.10.2 + - set high-availability virtual-server s2 port 81 + - set high-availability virtual-server s2 real-server real1 connection-timeout 5 + - set high-availability virtual-server s2 real-server real1 port 8081 + - set high-availability virtual-server s2 real-server real2 port 8080 + - set high-availability vrrp global-parameters garp interval 30 + - set high-availability vrrp global-parameters garp master-delay 10 + - set high-availability vrrp global-parameters garp master-refresh 100 + - set high-availability vrrp global-parameters garp master-refresh-repeat 200 + - set high-availability vrrp global-parameters garp master-repeat 5 + - set high-availability vrrp global-parameters startup-delay 31 + - set high-availability vrrp global-parameters version 3 + - set high-availability vrrp group g1 address 1.1.1.1 + - set high-availability vrrp group g1 address 2.2.2.2 + - set high-availability vrrp group g1 address 3.3.3.3 interface eth2 + - set high-availability vrrp group g1 advertise-interval 10 + - set high-availability vrrp group g1 authentication password ******** + - set high-availability vrrp group g1 authentication type plaintext-password + - set high-availability vrrp group g1 description 'Group_1' + - set high-availability vrrp group g1 disable + - set high-availability vrrp group g1 excluded-address 192.168.1.7 interface eth3 + - set high-availability vrrp group g1 garp interval 20 + - set high-availability vrrp group g1 garp master-delay 5 + - set high-availability vrrp group g1 garp master-refresh 50 + - set high-availability vrrp group g1 garp master-refresh-repeat 100 + - set high-availability vrrp group g1 garp master-repeat 3 + - set high-availability vrrp group g1 interface eth2 + - set high-availability vrrp group g1 no-preempt + - set high-availability vrrp group g1 peer-address 192.168.1.3 + - set high-availability vrrp group g1 preempt-delay 15 + - set high-availability vrrp group g1 priority 100 + - set high-availability vrrp group g1 rfc3768-compatibility + - set high-availability vrrp group g1 track exclude-vrrp-interface + - set high-availability vrrp group g1 track interface eth0 + - set high-availability vrrp group g1 transition-script backup /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script fault /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script master /var/tmp/script.sh + - set high-availability vrrp group g1 transition-script stop /var/tmp/script.sh + - set high-availability vrrp group g1 vrid 20 + - set high-availability vrrp group g2 address 2.2.2.2 + - set high-availability vrrp group g2 description 'Group_2' + - set high-availability vrrp group g2 health-check failure-count 5 + - set high-availability vrrp group g2 health-check interval 15 + - set high-availability vrrp group g2 health-check ping 192.168.1.100 + - set high-availability vrrp group g2 health-check script /var/tmp/script.sh + - set high-availability vrrp group g2 hello-source-address 2.2.2.2 + - set high-availability vrrp group g2 interface eth1 + - set high-availability vrrp group g2 vrid 11 + - set high-availability vrrp snmp + - set high-availability vrrp sync-group sg1 health-check failure-count 3 + - set high-availability vrrp sync-group sg1 health-check interval 10 + - set high-availability vrrp sync-group sg1 health-check ping 192.168.2.100 + - set high-availability vrrp sync-group sg1 health-check script /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 member g1 + - set high-availability vrrp sync-group sg1 transition-script backup /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script fault /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script master /var/tmp/script.sh + - set high-availability vrrp sync-group sg1 transition-script stop /var/tmp/script.sh + +purged: + commands: + - delete high-availability + after: + disable: false + +deleted_vrrp_groups: + commands: + - delete high-availability vrrp group g1 + - delete high-availability vrrp sync-group sg1 + after: + disable: false + virtual_servers: + - name: s1 + address: 10.10.10.1 + algorithm: round-robin + delay_loop: 60 + forward_method: direct + fwmark: 10 + persistence_timeout: 30 + protocol: tcp + real_server: + - address: 10.10.50.1 + port: 443 + health_check_script: /var/tmp/script.sh + - name: s2 + address: 10.10.10.2 + port: 81 + real_server: + - address: real1 + port: 8081 + connection_timeout: 5 + - address: real2 + port: 8080 + vrrp: + global_parameters: + startup_delay: 31 + version: "3" + garp: + interval: 30 + master_delay: 10 + master_refresh: 100 + master_refresh_repeat: 200 + master_repeat: 5 + groups: + - name: g2 + address: + - "2.2.2.2" + description: Group_2 + disable: false + interface: eth1 + vrid: 11 + hello_source_address: 2.2.2.2 + no_preempt: false + rfc3768_compatibility: false + health_check: + failure_count: 5 + interval: 15 + ping: 192.168.1.100 + script: /var/tmp/script.sh + +deleted_bulk: + commands: + - delete high-availability virtual-server + - delete high-availability vrrp global-parameters garp + - delete high-availability vrrp global-parameters startup-delay + - delete high-availability vrrp group g1 + - delete high-availability vrrp sync-group + after: + disable: false + vrrp: + global_parameters: + version: "3" + groups: + - name: g2 + address: + - "2.2.2.2" + description: Group_2 + disable: false + hello_source_address: 2.2.2.2 + interface: eth1 + vrid: 11 + no_preempt: false + rfc3768_compatibility: false + health_check: + failure_count: 5 + interval: 15 + ping: 192.168.1.100 + script: /var/tmp/script.sh + +overridden: + config: + disable: false + vrrp: + snmp: disabled + global_parameters: + startup_delay: 32 + version: 3 + garp: + interval: 30 + master_delay: 11 + master_refresh: 100 + master_refresh_repeat: 200 + master_repeat: 6 + groups: + - name: "g1" + description: "Group_1" + interface: "eth2" + address: + - "1.1.1.1" + - "3.3.3.3 interface eth3" + disable: true + no_preempt: true + rfc3768_compatibility: true + vrid: 20 + peer_address: "192.168.1.3" + advertise_interval: 10 + priority: 100 + garp: + interval: 20 + master_delay: 5 + master_refresh: 50 + master_refresh_repeat: 100 + master_repeat: 3 + authentication: + type: "plaintext-password" + password: "test123" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + track: + exclude_vrrp_interface: true + sync_groups: + - name: "sg1" + member: + - "g1" + - "g2" + transition_script: + master: "/var/tmp/script.sh" + backup: "/var/tmp/script.sh" + fault: "/var/tmp/script.sh" + stop: "/var/tmp/script.sh" + health_check: + failure_count: 4 + interval: 10 + ping: "192.168.1.100" + script: "/var/tmp/script.sh" + virtual_servers: + - name: "s1" + address: "10.10.10.15" + algorithm: "round-robin" + delay_loop: 60 + fwmark: 12 + forward_method: "direct" + persistence_timeout: 30 + protocol: "tcp" + real_server: + - address: "10.10.10.1" + connection_timeout: 61 + port: 443 + after: + disable: false + virtual_servers: + - address: "10.10.10.15" + algorithm: round-robin + delay_loop: 60 + forward_method: direct + fwmark: 12 + name: s1 + persistence_timeout: 30 + protocol: tcp + real_server: + - address: "10.10.10.1" + connection_timeout: 61 + port: 443 + - address: "10.10.10.2" + name: s2 + port: 81 + real_server: + - address: real1 + connection_timeout: 5 + port: 8081 + - address: real2 + port: 8080 + vrrp: + global_parameters: + garp: + interval: 30 + master_delay: 11 + master_refresh: 100 + master_refresh_repeat: 200 + master_repeat: 6 + startup_delay: 32 + version: "3" + groups: + - address: "1.1.1.1" + advertise_interval: 10 + authentication: + password: VALUE_SPECIFIED_IN_NO_LOG_PARAMETER + type: plaintext-password + description: Group_1 + disable: true + garp: + interval: 20 + master_delay: 5 + master_refresh: 50 + master_refresh_repeat: 100 + master_repeat: 3 + interface: eth2 + name: g1 + no_preempt: true + peer_address: "192.168.1.3" + priority: 100 + rfc3768_compatibility: true + track: + exclude_vrrp_interface: true + transition_script: + backup: /var/tmp/script.sh + fault: /var/tmp/script.sh + master: /var/tmp/script.sh + stop: /var/tmp/script.sh + vrid: 20 + - address: "2.2.2.2" + description: Group_2 + disable: false + health_check: + failure_count: 5 + interval: 15 + ping: "192.168.1.100" + script: /var/tmp/script.sh + hello_source_address: "2.2.2.2" + interface: eth1 + name: g2 + no_preempt: false + rfc3768_compatibility: false + vrid: 11 + sync_groups: + - health_check: + failure_count: 4 + interval: 10 + ping: "192.168.1.100" + script: /var/tmp/script.sh + member: + - g1 + - g2 + name: sg1 + transition_script: + backup: /var/tmp/script.sh + fault: /var/tmp/script.sh + master: /var/tmp/script.sh + stop: /var/tmp/script.sh + +replaced: + commands: + - delete high-availability vrrp global-parameters garp master-repeat 5 + - delete high-availability vrrp global-parameters startup-delay 31 + - delete high-availability vrrp group g1 disable + - delete high-availability vrrp group g1 no-preempt + - delete high-availability vrrp group g1 rfc3768-compatibility + - delete high-availability vrrp group g2 address 2.2.2.2 + - delete high-availability vrrp sync-group sg1 health-check failure-count 3 + - set high-availability disable + - set high-availability virtual-server s1 address 10.10.10.5 + - set high-availability virtual-server s1 real-server 10.10.50.2 port 8443 + - set high-availability virtual-server s2 persistence-timeout 30 + - set high-availability virtual-server s2 protocol tcp + - set high-availability virtual-server s3 address 10.10.10.3 + - set high-availability virtual-server s3 port 88 + - set high-availability virtual-server s3 protocol udp + - set high-availability vrrp global-parameters garp master-repeat 6 + - set high-availability vrrp global-parameters startup-delay 30 + - set high-availability vrrp group g2 address 4.4.4.4 + - set high-availability vrrp group g2 address 6.6.6.6 interface eth3 + - set high-availability vrrp snmp + - set high-availability vrrp sync-group sg1 health-check failure-count 5 + +rtt: + commands: + - set high-availability disable + - set high-availability virtual-server s1 address 10.10.10.5 + - set high-availability virtual-server s1 algorithm round-robin + - set high-availability virtual-server s1 real-server 10.10.50.2 port 8443 + - set high-availability virtual-server s2 address 10.10.10.2 + - set high-availability virtual-server s2 persistence-timeout 30 + - set high-availability virtual-server s2 port 81 + - set high-availability virtual-server s2 protocol tcp + - set high-availability virtual-server s3 address 10.10.10.3 + - set high-availability virtual-server s3 port 88 + - set high-availability virtual-server s3 protocol udp + - set high-availability vrrp global-parameters garp master-repeat 6 + - set high-availability vrrp global-parameters startup-delay 30 + - set high-availability vrrp group g1 peer-address 192.168.1.3 + - set high-availability vrrp group g1 priority 100 + - set high-availability vrrp group g1 vrid 20 + - set high-availability vrrp group g2 address 4.4.4.4 + - set high-availability vrrp group g2 address 6.6.6.6 interface eth3 + - set high-availability vrrp snmp + - set high-availability vrrp sync-group sg1 health-check failure-count 5 + config: + disable: false + virtual_servers: + - name: s1 + address: 10.10.10.5 + fwmark: 10 + algorithm: least-connection + real_server: + - address: 10.10.50.2 + port: 8443 + - name: s2 + address: 10.10.10.2 + persistence_timeout: 36 + port: 443 + protocol: tcp + real_server: + - address: 10.10.50.3 + port: 8443 + - name: s3 + address: 10.10.10.3 + port: 80 + protocol: udp + real_server: + - address: 10.10.50.4 + port: 8443 + vrrp: + snmp: disabled + global_parameters: + startup_delay: 36 + garp: + master_repeat: 6 + groups: + - name: "g1" + peer_address: 192.168.1.3 + address: "1.1.1.1" + priority: 100 + disable: true + no_preempt: false + interface: eth2 + vrid: 20 + - name: "g2" + address: + - "2.2.2.2" + interface: eth1 + vrid: 11 + sync_groups: + - name: "sg1" + health_check: + failure_count: 10 + after: + disable: true + virtual_servers: + - address: "10.10.10.5" + algorithm: "round-robin" + name: "s1" + real_server: + - address: "10.10.50.2" + port: 8443 + - address: "10.10.10.2" + name: "s2" + persistence_timeout: 30 + port: 81 + protocol: "tcp" + - address: "10.10.10.3" + name: "s3" + port: 88 + protocol: "udp" + vrrp: + global_parameters: + garp: + master_repeat: 6 + startup_delay: 30 + groups: + - disable: false + name: "g1" + no_preempt: false + peer_address: "192.168.1.3" + priority: 100 + rfc3768_compatibility: false + vrid: 20 + snmp: "enabled" + sync_groups: + - health_check: + failure_count: 5 + name: "sg1" diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.17.txt b/tests/sanity/ignore-2.17.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.17.txt +++ b/tests/sanity/ignore-2.17.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.18.txt b/tests/sanity/ignore-2.18.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.18.txt +++ b/tests/sanity/ignore-2.18.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.19.txt b/tests/sanity/ignore-2.19.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.19.txt +++ b/tests/sanity/ignore-2.19.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.20.txt b/tests/sanity/ignore-2.20.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.20.txt +++ b/tests/sanity/ignore-2.20.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.21.txt b/tests/sanity/ignore-2.21.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.21.txt +++ b/tests/sanity/ignore-2.21.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/sanity/ignore-2.22.txt b/tests/sanity/ignore-2.22.txt index bae35e38..255b0a87 100644 --- a/tests/sanity/ignore-2.22.txt +++ b/tests/sanity/ignore-2.22.txt @@ -8,6 +8,7 @@ plugins/action/facts.py action-plugin-docs plugins/action/firewall_global.py action-plugin-docs plugins/action/firewall_interfaces.py action-plugin-docs plugins/action/firewall_rules.py action-plugin-docs +plugins/action/ha.py action-plugin-docs plugins/action/hostname.py action-plugin-docs plugins/action/interface.py action-plugin-docs plugins/action/interfaces.py action-plugin-docs diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_ha_config.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_ha_config.cfg new file mode 100644 index 00000000..ee69c65d --- /dev/null +++ b/tests/unit/modules/network/vyos/fixtures/vyos_ha_config.cfg @@ -0,0 +1,64 @@ +set high-availability disable +set high-availability virtual-server s1 address 10.10.10.1 +set high-availability virtual-server s1 algorithm round-robin +set high-availability virtual-server s1 delay-loop 60 +set high-availability virtual-server s1 forward-method direct +set high-availability virtual-server s1 fwmark 10 +set high-availability virtual-server s1 persistence-timeout 30 +set high-availability virtual-server s1 protocol tcp +set high-availability virtual-server s1 real-server 10.10.50.1 health-check script '/var/tmp/script.sh' +set high-availability virtual-server s1 real-server 10.10.50.1 port 443 +set high-availability virtual-server s2 address 10.10.10.2 +set high-availability virtual-server s2 port 81 +set high-availability virtual-server s2 real-server real1 connection-timeout 5 +set high-availability virtual-server s2 real-server real1 port 8081 +set high-availability virtual-server s2 real-server real2 port 8080 +set high-availability vrrp global-parameters garp interval 30 +set high-availability vrrp global-parameters garp master-delay 10 +set high-availability vrrp global-parameters garp master-refresh 100 +set high-availability vrrp global-parameters garp master-refresh-repeat 200 +set high-availability vrrp global-parameters garp master-repeat 5 +set high-availability vrrp global-parameters startup-delay 30 +set high-availability vrrp global-parameters version 3 +set high-availability vrrp group g1 address '1.1.1.1' +set high-availability vrrp group g1 address '3.3.3.3' +set high-availability vrrp group g1 address '5.5.5.5' interface 'eth2' +set high-availability vrrp group g1 advertise-interval 10 +set high-availability vrrp group g1 authentication password 'testpass' +set high-availability vrrp group g1 authentication type 'plaintext-password' +set high-availability vrrp group g1 description 'Group_1' +set high-availability vrrp group g1 disable +set high-availability vrrp group g1 excluded-address '192.168.1.7' interface 'eth3' +set high-availability vrrp group g1 excluded-address '192.168.1.8' +set high-availability vrrp group g1 garp interval 20 +set high-availability vrrp group g1 garp master-delay 5 +set high-availability vrrp group g1 garp master-refresh 50 +set high-availability vrrp group g1 garp master-refresh-repeat 100 +set high-availability vrrp group g1 garp master-repeat 3 +set high-availability vrrp group g1 health-check failure-count 3 +set high-availability vrrp group g1 health-check interval 10 +set high-availability vrrp group g1 health-check ping '192.168.1.5' +set high-availability vrrp group g1 health-check script 'script.sh' +set high-availability vrrp group g1 hello-source-address '192.168.1.2' +set high-availability vrrp group g1 interface 'eth2' +set high-availability vrrp group g1 no-preempt +set high-availability vrrp group g1 peer-address '192.168.1.3' +set high-availability vrrp group g1 priority 100 +set high-availability vrrp group g1 rfc3768-compatibility +set high-availability vrrp group g1 track exclude-vrrp-interface +set high-availability vrrp group g1 track interface 'eth1' +set high-availability vrrp group g1 transition-script backup '/var/tmp/script.sh' +set high-availability vrrp group g1 transition-script fault '/var/tmp/script.sh' +set high-availability vrrp group g1 transition-script master '/var/tmp/script.sh' +set high-availability vrrp group g1 transition-script stop '/var/tmp/script.sh' +set high-availability vrrp group g1 vrid 20 +set high-availability vrrp snmp +set high-availability vrrp sync-group sg1 health-check failure-count 3 +set high-availability vrrp sync-group sg1 health-check interval 10 +set high-availability vrrp sync-group sg1 health-check ping '192.168.1.1' +set high-availability vrrp sync-group sg1 health-check script '/var/tmp/script.sh' +set high-availability vrrp sync-group sg1 member 'g1' +set high-availability vrrp sync-group sg1 transition-script backup '/var/tmp/script.sh' +set high-availability vrrp sync-group sg1 transition-script fault '/var/tmp/script.sh' +set high-availability vrrp sync-group sg1 transition-script master '/var/tmp/script.sh' +set high-availability vrrp sync-group sg1 transition-script stop '/var/tmp/script.sh' diff --git a/tests/unit/modules/network/vyos/test_vyos_ha.py b/tests/unit/modules/network/vyos/test_vyos_ha.py new file mode 100644 index 00000000..54833a36 --- /dev/null +++ b/tests/unit/modules/network/vyos/test_vyos_ha.py @@ -0,0 +1,1405 @@ +# (c) 2021 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see <http://www.gnu.org/licenses/>. + +# Make coding more python3-ish +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from unittest.mock import patch + +from ansible_collections.vyos.vyos.plugins.modules import vyos_ha +from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args + +from .vyos_module import TestVyosModule, load_fixture + + +class TestVyosHaModule(TestVyosModule): + module = vyos_ha + + def setUp(self): + super(TestVyosHaModule, self).setUp() + + self.mock_get_resource_connection_config = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection", + ) + self.get_resource_connection_config = self.mock_get_resource_connection_config.start() + + self.mock_get_resource_connection_facts = patch( + "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection", + ) + self.get_resource_connection_facts = self.mock_get_resource_connection_facts.start() + + self.mock_execute_show_command = patch( + "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.ha.ha.HaFacts.get_config", + ) + + self.execute_show_command = self.mock_execute_show_command.start() + + self.mock_get_os_version = patch( + "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.ha.ha.get_os_version", + ) + self.get_os_version = self.mock_get_os_version.start() + self.get_os_version.return_value = "1.5" + self.maxDiff = None + + def tearDown(self): + super(TestVyosHaModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_execute_show_command.stop() + self.mock_get_os_version.stop() + + def load_fixtures(self, commands=None, filename=None): + if filename is None: + filename = "vyos_ha_config.cfg" + + def load_from_file(*args, **kwargs): + output = load_fixture(filename) + return output + + self.execute_show_command.side_effect = load_from_file + + def test_vrrp_merged_idempotent(self): + set_module_args( + dict( + config=dict( + disable=True, + virtual_servers=[ + dict( + address="10.10.10.1", + algorithm="round-robin", + delay_loop=60, + forward_method="direct", + fwmark=10, + name="s1", + persistence_timeout="30", + protocol="tcp", + real_server=[ + dict( + address="10.10.50.1", + port=443, + health_check_script="/var/tmp/script.sh", + ), + ], + ), + dict( + address="10.10.10.2", + name="s2", + port=81, + real_server=[ + dict( + address="real1", + port=8081, + connection_timeout=5, + ), + dict( + address="real2", + port=8080, + ), + ], + ), + ], + vrrp=dict( + global_parameters=dict( + garp=dict( + master_refresh=100, + ), + version="3", + ), + groups=[ + dict( + authentication=dict( + password="testpass", + type="plaintext-password", + ), + address=[ + "1.1.1.1", + "3.3.3.3", + "5.5.5.5 interface eth2", + ], + advertise_interval=10, + description="Group_1", + disable=True, + excluded_address=[ + "192.168.1.8", + "192.168.1.7 interface eth3", + ], + garp=dict( + interval=20, + master_delay=5, + master_refresh_repeat=100, + master_repeat=3, + ), + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.1.5", + script="script.sh", + ), + hello_source_address="192.168.1.2", + interface="eth2", + name="g1", + no_preempt=True, + peer_address="192.168.1.3", + priority=100, + rfc3768_compatibility=True, + track=dict( + exclude_vrrp_interface=True, + interface=["eth1"], + ), + transition_script=dict( + backup="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + vrid=20, + ), + ], + snmp="enabled", + sync_groups=[ + dict( + health_check=dict( + failure_count=3, + interval=10, + ), + member=["g1"], + name="sg1", + transition_script=dict( + backup="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + ), + ], + ), + ), + state="merged", + ), + ) + self.execute_module(changed=False, commands=[]) + + def test_vrrp_merged(self): + set_module_args( + dict( + config=dict( + disable=True, + virtual_servers=[ + dict( + name="s1", + address="10.10.10.5", + algorithm="round-robin", + real_server=[ + dict( + address="10.10.50.2", + port=8443, + ), + ], + ), + dict( + name="s2", + address="10.10.10.2", + persistence_timeout=30, + port=81, + protocol="tcp", + ), + dict( + name="s3", + address="10.10.10.3", + port=88, + protocol="udp", + ), + ], + vrrp=dict( + snmp="disabled", + global_parameters=dict( + startup_delay=35, + garp=dict( + master_repeat=6, + ), + ), + groups=[ + dict( + name="g1", + peer_address="192.168.1.3", + priority=100, + disable=False, + no_preempt=False, + ), + dict( + name="g2", + address=[ + "192.168.3.3", + "192.168.4.4 interface eth3", + ], + preempt_delay=15, + ), + ], + sync_groups=[ + dict( + name="sg1", + health_check=dict( + failure_count=5, + ), + ), + ], + ), + ), + state="merged", + ), + ) + commands = [ + "delete high-availability vrrp group g1 no-preempt", + "delete high-availability vrrp group g1 disable", + "delete high-availability vrrp group g1 rfc3768-compatibility", + "set high-availability vrrp group g2 address 192.168.3.3", + "set high-availability vrrp group g2 address 192.168.4.4 interface eth3", + "set high-availability vrrp group g2 preempt-delay 15", + "delete high-availability vrrp snmp", + "set high-availability virtual-server s1 address 10.10.10.5", + "set high-availability virtual-server s1 real-server 10.10.50.2 port 8443", + "set high-availability virtual-server s2 persistence-timeout 30", + "set high-availability virtual-server s2 protocol tcp", + "set high-availability virtual-server s3 address 10.10.10.3", + "set high-availability virtual-server s3 port 88", + "set high-availability virtual-server s3 protocol udp", + "set high-availability vrrp global-parameters garp master-repeat 6", + "set high-availability vrrp global-parameters startup-delay 35", + "set high-availability vrrp sync-group sg1 health-check failure-count 5", + ] + + self.execute_module(changed=True, commands=commands) + + def test_vrrp_replaced(self): + set_module_args( + dict( + config=dict( + disable=False, + virtual_servers=[ + dict( + name="s1", + address="10.10.10.5", + algorithm="round-robin", + real_server=[ + dict( + address="10.10.50.2", + port=8443, + ), + ], + ), + dict( + name="s2", + address="10.10.10.2", + persistence_timeout=30, + port=81, + protocol="tcp", + ), + dict( + name="s3", + address="10.10.10.3", + port=88, + protocol="udp", + ), + ], + vrrp=dict( + snmp="disabled", + global_parameters=dict( + startup_delay=32, + garp=dict( + master_repeat=6, + ), + ), + groups=[ + dict( + name="g1", + peer_address="192.168.1.3", + priority=100, + disable=False, + no_preempt=False, + vrid=20, + ), + dict( + name="g2", + address=[ + "192.168.3.3", + "192.168.4.4 interface eth3", + ], + ), + ], + sync_groups=[ + dict( + name="sg1", + health_check=dict( + failure_count=5, + ), + ), + ], + ), + ), + state="replaced", + ), + ) + commands = [ + "delete high-availability vrrp global-parameters garp master-repeat 5", + "delete high-availability vrrp global-parameters startup-delay 30", + "delete high-availability vrrp group g1 disable", + "delete high-availability vrrp group g1 no-preempt", + "delete high-availability vrrp group g1 rfc3768-compatibility", + "delete high-availability vrrp sync-group sg1 health-check failure-count 3", + "set high-availability vrrp group g2 address 192.168.3.3", + "set high-availability vrrp group g2 address 192.168.4.4 interface eth3", + "delete high-availability disable", + "delete high-availability vrrp snmp", + "set high-availability virtual-server s1 address 10.10.10.5", + "set high-availability virtual-server s1 real-server 10.10.50.2 port 8443", + "set high-availability virtual-server s2 persistence-timeout 30", + "set high-availability virtual-server s2 protocol tcp", + "set high-availability virtual-server s3 address 10.10.10.3", + "set high-availability virtual-server s3 port 88", + "set high-availability virtual-server s3 protocol udp", + "set high-availability vrrp global-parameters garp master-repeat 6", + "set high-availability vrrp global-parameters startup-delay 32", + "set high-availability vrrp sync-group sg1 health-check failure-count 5", + ] + self.execute_module(changed=True, commands=commands) + + def test_vrrp_replaced_idempotent(self): + set_module_args( + dict( + config=dict( + disable=True, + virtual_servers=[ + dict( + address="10.10.10.1", + algorithm="round-robin", + delay_loop=60, + forward_method="direct", + fwmark=10, + name="s1", + persistence_timeout="30", + protocol="tcp", + real_server=[ + dict( + address="10.10.50.1", + port=443, + health_check_script="/var/tmp/script.sh", + ), + ], + ), + dict( + address="10.10.10.2", + name="s2", + port=81, + real_server=[ + dict( + address="real1", + port=8081, + connection_timeout=5, + ), + dict( + address="real2", + port=8080, + ), + ], + ), + ], + vrrp=dict( + global_parameters=dict( + garp=dict( + interval=30, + master_delay=10, + master_refresh=100, + master_refresh_repeat=200, + master_repeat=5, + ), + version="3", + startup_delay=30, + ), + groups=[ + dict( + authentication=dict( + password="testpass", + type="plaintext-password", + ), + address=[ + "1.1.1.1", + "3.3.3.3", + "5.5.5.5 interface eth2", + ], + advertise_interval=10, + description="Group_1", + disable=True, + excluded_address=[ + "192.168.1.8", + "192.168.1.7 interface eth3", + ], + garp=dict( + interval=20, + master_delay=5, + master_refresh=50, + master_refresh_repeat=100, + master_repeat=3, + ), + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.1.5", + script="script.sh", + ), + hello_source_address="192.168.1.2", + interface="eth2", + name="g1", + no_preempt=True, + peer_address="192.168.1.3", + priority=100, + rfc3768_compatibility=True, + track=dict( + exclude_vrrp_interface=True, + interface=["eth1"], + ), + transition_script=dict( + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + vrid=20, + ), + ], + snmp="enabled", + sync_groups=[ + dict( + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.1.1", + script="/var/tmp/script.sh", + ), + member=["g1"], + name="sg1", + transition_script=dict( + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + ), + ], + ), + ), + state="replaced", + ), + ) + self.execute_module(changed=False, commands=[]) + + def test_vrrp_overridden(self): + set_module_args( + dict( + config=dict( + disable=False, + vrrp=dict( + snmp="disabled", + global_parameters=dict( + startup_delay=32, + version=3, + garp=dict( + interval=30, + master_delay=11, + master_refresh=100, + master_refresh_repeat=200, + master_repeat=6, + ), + ), + groups=[ + dict( + name="g1", + description="Group_1", + interface="eth2", + address="1.1.1.1", + disable=True, + no_preempt=True, + rfc3768_compatibility=True, + vrid=20, + peer_address="192.168.1.3", + advertise_interval=10, + priority=100, + garp=dict( + interval=20, + master_delay=5, + master_refresh=50, + master_refresh_repeat=100, + master_repeat=3, + ), + authentication=dict( + type="plaintext-password", + password="testpass", + ), + transition_script=dict( + master="/var/tmp/script.sh", + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + track=dict( + exclude_vrrp_interface=True, + ), + ), + dict( + name="g2", + address=[ + "192.168.3.3", + "192.168.4.4 interface eth3", + ], + ), + ], + sync_groups=[ + dict( + name="sg1", + member=["g1", "g2"], + transition_script=dict( + master="/var/tmp/script.sh", + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + health_check=dict( + failure_count=4, + interval=10, + ping="192.168.1.100", + script="/var/tmp/script.sh", + ), + ), + ], + ), + virtual_servers=[ + dict( + name="s1", + address="10.10.10.15", + algorithm="round-robin", + delay_loop=60, + fwmark=12, + forward_method="direct", + persistence_timeout=30, + protocol="tcp", + real_server=[ + dict( + address="10.10.10.1", + connection_timeout=61, + port=443, + ), + ], + ), + ], + ), + state="overridden", + ), + ) + commands = [ + "delete high-availability disable", + "delete high-availability virtual-server s1", + "delete high-availability vrrp global-parameters garp", + "delete high-availability vrrp group g1", + "delete high-availability vrrp sync-group sg1", + "set high-availability virtual-server s1 address 10.10.10.15", + "set high-availability virtual-server s1 algorithm round-robin", + "set high-availability virtual-server s1 delay-loop 60", + "set high-availability virtual-server s1 forward-method direct", + "set high-availability virtual-server s1 fwmark 12", + "set high-availability virtual-server s1 persistence-timeout 30", + "set high-availability virtual-server s1 protocol tcp", + "set high-availability virtual-server s1 real-server 10.10.10.1 connection-timeout 61", + "set high-availability virtual-server s1 real-server 10.10.10.1 port 443", + "set high-availability vrrp global-parameters garp interval 30", + "set high-availability vrrp global-parameters garp master-delay 11", + "set high-availability vrrp global-parameters garp master-refresh 100", + "set high-availability vrrp global-parameters garp master-refresh-repeat 200", + "set high-availability vrrp global-parameters garp master-repeat 6", + "set high-availability vrrp global-parameters startup-delay 32", + "set high-availability vrrp group g1 address 1.1.1.1", + "set high-availability vrrp group g1 advertise-interval 10", + "set high-availability vrrp group g1 authentication password testpass", + "set high-availability vrrp group g1 authentication type plaintext-password", + "set high-availability vrrp group g1 description 'Group_1'", + "set high-availability vrrp group g1 disable", + "set high-availability vrrp group g1 garp interval 20", + "set high-availability vrrp group g1 garp master-delay 5", + "set high-availability vrrp group g1 garp master-refresh 50", + "set high-availability vrrp group g1 garp master-refresh-repeat 100", + "set high-availability vrrp group g1 garp master-repeat 3", + "set high-availability vrrp group g1 interface eth2", + "set high-availability vrrp group g1 no-preempt", + "set high-availability vrrp group g1 peer-address 192.168.1.3", + "set high-availability vrrp group g1 priority 100", + "set high-availability vrrp group g1 rfc3768-compatibility", + "set high-availability vrrp group g1 track exclude-vrrp-interface", + "set high-availability vrrp group g1 transition-script backup /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script fault /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script master /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script stop /var/tmp/script.sh", + "set high-availability vrrp group g1 vrid 20", + "set high-availability vrrp group g2 address 192.168.3.3", + "set high-availability vrrp group g2 address 192.168.4.4 interface eth3", + "set high-availability vrrp sync-group sg1 health-check failure-count 4", + "set high-availability vrrp sync-group sg1 health-check interval 10", + "set high-availability vrrp sync-group sg1 health-check ping 192.168.1.100", + "set high-availability vrrp sync-group sg1 health-check script /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 member g1", + "set high-availability vrrp sync-group sg1 member g2", + "set high-availability vrrp sync-group sg1 transition-script backup /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script fault /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script master /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script stop /var/tmp/script.sh", + ] + self.execute_module(changed=True, commands=commands) + + def test_vrrp_overridden_idempotent(self): + set_module_args( + dict( + config=dict( + disable=True, + virtual_servers=[ + dict( + address="10.10.10.1", + algorithm="round-robin", + delay_loop=60, + forward_method="direct", + fwmark=10, + name="s1", + persistence_timeout="30", + protocol="tcp", + real_server=[ + dict( + address="10.10.50.1", + port=443, + health_check_script="/var/tmp/script.sh", + ), + ], + ), + dict( + address="10.10.10.2", + name="s2", + port=81, + real_server=[ + dict( + address="real1", + port=8081, + connection_timeout=5, + ), + dict( + address="real2", + port=8080, + ), + ], + ), + ], + vrrp=dict( + global_parameters=dict( + garp=dict( + interval=30, + master_delay=10, + master_refresh=100, + master_refresh_repeat=200, + master_repeat=5, + ), + version="3", + startup_delay=30, + ), + groups=[ + dict( + authentication=dict( + password="testpass", + type="plaintext-password", + ), + address=[ + "1.1.1.1", + "3.3.3.3", + "5.5.5.5 interface eth2", + ], + advertise_interval=10, + description="Group_1", + disable=True, + excluded_address=[ + "192.168.1.8", + "192.168.1.7 interface eth3", + ], + garp=dict( + interval=20, + master_delay=5, + master_refresh=50, + master_refresh_repeat=100, + master_repeat=3, + ), + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.1.5", + script="script.sh", + ), + hello_source_address="192.168.1.2", + interface="eth2", + name="g1", + no_preempt=True, + peer_address="192.168.1.3", + priority=100, + rfc3768_compatibility=True, + track=dict( + exclude_vrrp_interface=True, + interface=["eth1"], + ), + transition_script=dict( + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + vrid=20, + ), + ], + snmp="enabled", + sync_groups=[ + dict( + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.1.1", + script="/var/tmp/script.sh", + ), + member=["g1"], + name="sg1", + transition_script=dict( + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + master="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + ), + ], + ), + ), + state="overridden", + ), + ) + self.execute_module(changed=False, commands=[]) + + def test_vrrp_rendered(self): + set_module_args( + dict( + config=dict( + virtual_servers=[ + dict( + name="s1", + address="10.10.10.1", + algorithm="round-robin", + delay_loop=60, + forward_method="direct", + fwmark=10, + persistence_timeout=30, + protocol="tcp", + real_server=[ + dict( + address="10.10.50.1", + health_check_script="/var/tmp/script.sh", + port=443, + ), + ], + ), + dict( + name="s2", + address="10.10.10.2", + port=81, + real_server=[ + dict( + address="real1", + connection_timeout=5, + port=8081, + ), + dict( + address="real2", + port=8080, + ), + ], + ), + ], + vrrp=dict( + snmp="enabled", + global_parameters=dict( + startup_delay=31, + version="3", + garp=dict( + interval=30, + master_delay=10, + master_refresh=100, + master_refresh_repeat=200, + master_repeat=5, + ), + ), + groups=[ + dict( + name="g1", + description="Group_1", + interface="eth2", + address="1.1.1.1", + advertise_interval=10, + peer_address="192.168.1.3", + priority=100, + disable=True, + no_preempt=True, + rfc3768_compatibility=True, + vrid=20, + excluded_address=[ + "192.168.1.7 interface eth3", + ], + garp=dict( + interval=20, + master_delay=5, + master_refresh=50, + master_refresh_repeat=100, + master_repeat=3, + ), + authentication=dict( + type="plaintext-password", + password="testpass", + ), + transition_script=dict( + master="/var/tmp/script.sh", + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + track=dict( + exclude_vrrp_interface=True, + interface=[ + "eth0", + ], + ), + ), + dict( + name="g2", + description="Group_2", + interface="eth1", + address=[ + "2.2.2.2", + "2.2.2.3 interface eth3", + ], + disable=False, + no_preempt=False, + rfc3768_compatibility=False, + vrid=11, + health_check=dict( + failure_count=5, + interval=15, + ping="192.168.1.100", + script="/var/tmp/script.sh", + ), + hello_source_address="2.2.2.2", + ), + ], + sync_groups=[ + dict( + name="sg1", + member=[ + "g1", + ], + transition_script=dict( + master="/var/tmp/script.sh", + backup="/var/tmp/script.sh", + fault="/var/tmp/script.sh", + stop="/var/tmp/script.sh", + ), + health_check=dict( + failure_count=3, + interval=10, + ping="192.168.2.100", + script="/var/tmp/script.sh", + ), + ), + ], + ), + ), + state="rendered", + ), + ) + rendered_commands = [ + "set high-availability virtual-server s1 address 10.10.10.1", + "set high-availability virtual-server s1 algorithm round-robin", + "set high-availability virtual-server s1 delay-loop 60", + "set high-availability virtual-server s1 forward-method direct", + "set high-availability virtual-server s1 fwmark 10", + "set high-availability virtual-server s1 persistence-timeout 30", + "set high-availability virtual-server s1 protocol tcp", + "set high-availability virtual-server s1 real-server 10.10.50.1 health-check script /var/tmp/script.sh", + "set high-availability virtual-server s1 real-server 10.10.50.1 port 443", + "set high-availability virtual-server s2 address 10.10.10.2", + "set high-availability virtual-server s2 port 81", + "set high-availability virtual-server s2 real-server real1 connection-timeout 5", + "set high-availability virtual-server s2 real-server real1 port 8081", + "set high-availability virtual-server s2 real-server real2 port 8080", + "set high-availability vrrp global-parameters garp interval 30", + "set high-availability vrrp global-parameters garp master-delay 10", + "set high-availability vrrp global-parameters garp master-refresh 100", + "set high-availability vrrp global-parameters garp master-refresh-repeat 200", + "set high-availability vrrp global-parameters garp master-repeat 5", + "set high-availability vrrp global-parameters startup-delay 31", + "set high-availability vrrp global-parameters version 3", + "set high-availability vrrp group g1 address 1.1.1.1", + "set high-availability vrrp group g1 advertise-interval 10", + "set high-availability vrrp group g1 authentication password testpass", + "set high-availability vrrp group g1 authentication type plaintext-password", + "set high-availability vrrp group g1 description 'Group_1'", + "set high-availability vrrp group g1 disable", + "set high-availability vrrp group g1 excluded-address 192.168.1.7 interface eth3", + "set high-availability vrrp group g1 garp interval 20", + "set high-availability vrrp group g1 garp master-delay 5", + "set high-availability vrrp group g1 garp master-refresh 50", + "set high-availability vrrp group g1 garp master-refresh-repeat 100", + "set high-availability vrrp group g1 garp master-repeat 3", + "set high-availability vrrp group g1 interface eth2", + "set high-availability vrrp group g1 no-preempt", + "set high-availability vrrp group g1 peer-address 192.168.1.3", + "set high-availability vrrp group g1 priority 100", + "set high-availability vrrp group g1 rfc3768-compatibility", + "set high-availability vrrp group g1 track exclude-vrrp-interface", + "set high-availability vrrp group g1 track interface eth0", + "set high-availability vrrp group g1 transition-script backup /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script fault /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script master /var/tmp/script.sh", + "set high-availability vrrp group g1 transition-script stop /var/tmp/script.sh", + "set high-availability vrrp group g1 vrid 20", + "set high-availability vrrp group g2 address 2.2.2.2", + "set high-availability vrrp group g2 address 2.2.2.3 interface eth3", + "set high-availability vrrp group g2 description 'Group_2'", + "set high-availability vrrp group g2 health-check failure-count 5", + "set high-availability vrrp group g2 health-check interval 15", + "set high-availability vrrp group g2 health-check ping 192.168.1.100", + "set high-availability vrrp group g2 health-check script /var/tmp/script.sh", + "set high-availability vrrp group g2 hello-source-address 2.2.2.2", + "set high-availability vrrp group g2 interface eth1", + "set high-availability vrrp group g2 vrid 11", + "set high-availability vrrp snmp", + "set high-availability vrrp sync-group sg1 health-check failure-count 3", + "set high-availability vrrp sync-group sg1 health-check interval 10", + "set high-availability vrrp sync-group sg1 health-check ping 192.168.2.100", + "set high-availability vrrp sync-group sg1 health-check script /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 member g1", + "set high-availability vrrp sync-group sg1 transition-script backup /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script fault /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script master /var/tmp/script.sh", + "set high-availability vrrp sync-group sg1 transition-script stop /var/tmp/script.sh", + ] + result = self.execute_module(changed=False) + # rendered output order is not significant — use sorted comparison + self.assertEqual( + sorted(result["rendered"]), + sorted(rendered_commands), + result["rendered"], + ) + + def test_vrrp_parsed(self): + commands = ( + "set high-availability disable", + "set high-availability virtual-server s1 address 10.10.10.1", + "set high-availability virtual-server s1 algorithm round-robin", + "set high-availability virtual-server s1 delay-loop 60", + "set high-availability virtual-server s1 forward-method direct", + "set high-availability virtual-server s1 fwmark 10", + "set high-availability virtual-server s1 persistence-timeout 30", + "set high-availability virtual-server s1 protocol tcp", + "set high-availability virtual-server s1 real-server 10.10.50.1 health-check script '/var/tmp/script.sh'", + "set high-availability virtual-server s1 real-server 10.10.50.1 port 443", + "set high-availability virtual-server s2 address 10.10.10.2", + "set high-availability virtual-server s2 port 81", + "set high-availability virtual-server s2 real-server real1 connection-timeout 5", + "set high-availability virtual-server s2 real-server real1 port 8081", + "set high-availability virtual-server s2 real-server real2 port 8080", + "set high-availability vrrp global-parameters garp interval 30", + "set high-availability vrrp global-parameters garp master-delay 10", + "set high-availability vrrp global-parameters garp master-refresh 100", + "set high-availability vrrp global-parameters garp master-refresh-repeat 200", + "set high-availability vrrp global-parameters garp master-repeat 5", + "set high-availability vrrp global-parameters startup-delay 30", + "set high-availability vrrp global-parameters version 3", + "set high-availability vrrp group g1 address '1.1.1.1'", + "set high-availability vrrp group g1 address '3.3.3.3'", + "set high-availability vrrp group g1 address '5.5.5.5' interface 'eth2'", + "set high-availability vrrp group g1 advertise-interval 10", + "set high-availability vrrp group g1 authentication password 'testpass'", + "set high-availability vrrp group g1 authentication type 'plaintext-password'", + "set high-availability vrrp group g1 description 'Group_1'", + "set high-availability vrrp group g1 disable", + "set high-availability vrrp group g1 excluded-address '192.168.1.7' interface 'eth3'", + "set high-availability vrrp group g1 excluded-address '192.168.1.8'", + "set high-availability vrrp group g1 garp interval 20", + "set high-availability vrrp group g1 garp master-delay 5", + "set high-availability vrrp group g1 garp master-refresh 50", + "set high-availability vrrp group g1 garp master-refresh-repeat 100", + "set high-availability vrrp group g1 garp master-repeat 3", + "set high-availability vrrp group g1 health-check failure-count 3", + "set high-availability vrrp group g1 health-check interval 10", + "set high-availability vrrp group g1 health-check ping '192.168.1.5'", + "set high-availability vrrp group g1 health-check script 'script.sh'", + "set high-availability vrrp group g1 hello-source-address '192.168.1.2'", + "set high-availability vrrp group g1 interface 'eth2'", + "set high-availability vrrp group g1 no-preempt", + "set high-availability vrrp group g1 peer-address '192.168.1.3'", + "set high-availability vrrp group g1 priority 100", + "set high-availability vrrp group g1 rfc3768-compatibility", + "set high-availability vrrp group g1 track exclude-vrrp-interface", + "set high-availability vrrp group g1 track interface 'eth1'", + "set high-availability vrrp group g1 transition-script backup '/var/tmp/script.sh'", + "set high-availability vrrp group g1 transition-script fault '/var/tmp/script.sh'", + "set high-availability vrrp group g1 transition-script master '/var/tmp/script.sh'", + "set high-availability vrrp group g1 transition-script stop '/var/tmp/script.sh'", + "set high-availability vrrp group g1 vrid 20", + "set high-availability vrrp group g2 address '192.168.3.3'", + "set high-availability vrrp group g2 address '192.168.4.4' interface 'eth3'", + "set high-availability vrrp snmp", + "set high-availability vrrp sync-group sg1 health-check failure-count 3", + "set high-availability vrrp sync-group sg1 health-check interval 10", + "set high-availability vrrp sync-group sg1 health-check ping '192.168.1.1'", + "set high-availability vrrp sync-group sg1 health-check script '/var/tmp/script.sh'", + "set high-availability vrrp sync-group sg1 member 'g1'", + "set high-availability vrrp sync-group sg1 transition-script backup '/var/tmp/script.sh'", + "set high-availability vrrp sync-group sg1 transition-script fault '/var/tmp/script.sh'", + "set high-availability vrrp sync-group sg1 transition-script master '/var/tmp/script.sh'", + "set high-availability vrrp sync-group sg1 transition-script stop '/var/tmp/script.sh'", + ) + parsed_str = "\n".join(commands) + set_module_args(dict(running_config=parsed_str, state="parsed")) + result = self.execute_module(changed=False) + parsed_list = { + "disable": True, + "virtual_servers": [ + { + "name": "s1", + "address": "10.10.10.1", + "algorithm": "round-robin", + "delay_loop": 60, + "forward_method": "direct", + "fwmark": 10, + "persistence_timeout": 30, + "protocol": "tcp", + "real_server": [ + { + "address": "10.10.50.1", + "health_check_script": "/var/tmp/script.sh", + "port": 443, + }, + ], + }, + { + "name": "s2", + "address": "10.10.10.2", + "port": 81, + "real_server": [ + { + "address": "real1", + "connection_timeout": 5, + "port": 8081, + }, + { + "address": "real2", + "port": 8080, + }, + ], + }, + ], + "vrrp": { + "snmp": "enabled", + "global_parameters": { + "startup_delay": 30, + "version": "3", + "garp": { + "interval": 30, + "master_delay": 10, + "master_refresh": 100, + "master_refresh_repeat": 200, + "master_repeat": 5, + }, + }, + "groups": [ + { + "name": "g1", + "description": "Group_1", + "disable": True, + "no_preempt": True, + "rfc3768_compatibility": True, + "interface": "eth2", + "address": ["1.1.1.1", "3.3.3.3", "5.5.5.5 interface eth2"], + "advertise_interval": 10, + "peer_address": "192.168.1.3", + "priority": 100, + "vrid": 20, + "garp": { + "interval": 20, + "master_delay": 5, + "master_refresh": 50, + "master_refresh_repeat": 100, + "master_repeat": 3, + }, + "authentication": { + "type": "plaintext-password", + "password": "testpass", + }, + "transition_script": { + "master": "/var/tmp/script.sh", + "backup": "/var/tmp/script.sh", + "fault": "/var/tmp/script.sh", + "stop": "/var/tmp/script.sh", + }, + "health_check": { + "failure_count": 3, + "interval": 10, + "ping": "192.168.1.5", + "script": "script.sh", + }, + "track": { + "exclude_vrrp_interface": True, + "interface": ["eth1"], + }, + "excluded_address": [ + "192.168.1.7 interface eth3", + "192.168.1.8", + ], + "hello_source_address": "192.168.1.2", + }, + { + "name": "g2", + "address": ["192.168.3.3", "192.168.4.4 interface eth3"], + "disable": False, + "no_preempt": False, + "rfc3768_compatibility": False, + }, + ], + "sync_groups": [ + { + "name": "sg1", + "member": ["g1"], + "transition_script": { + "master": "/var/tmp/script.sh", + "backup": "/var/tmp/script.sh", + "fault": "/var/tmp/script.sh", + "stop": "/var/tmp/script.sh", + }, + "health_check": { + "failure_count": 3, + "interval": 10, + "ping": "192.168.1.1", + "script": "/var/tmp/script.sh", + }, + }, + ], + }, + } + self.assertEqual(parsed_list, result["parsed"]) + + def test_vrrp_gathered(self): + set_module_args(dict(state="gathered")) + result = self.execute_module(changed=False) + gathered_list = { + "disable": True, + "virtual_servers": [ + { + "name": "s1", + "address": "10.10.10.1", + "algorithm": "round-robin", + "delay_loop": 60, + "forward_method": "direct", + "fwmark": 10, + "persistence_timeout": 30, + "protocol": "tcp", + "real_server": [ + { + "address": "10.10.50.1", + "health_check_script": "/var/tmp/script.sh", + "port": 443, + }, + ], + }, + { + "name": "s2", + "address": "10.10.10.2", + "port": 81, + "real_server": [ + { + "address": "real1", + "connection_timeout": 5, + "port": 8081, + }, + { + "address": "real2", + "port": 8080, + }, + ], + }, + ], + "vrrp": { + "snmp": "enabled", + "global_parameters": { + "startup_delay": 30, + "version": "3", + "garp": { + "interval": 30, + "master_delay": 10, + "master_refresh": 100, + "master_refresh_repeat": 200, + "master_repeat": 5, + }, + }, + "groups": [ + { + "name": "g1", + "description": "Group_1", + "disable": True, + "no_preempt": True, + "rfc3768_compatibility": True, + "interface": "eth2", + "address": ["1.1.1.1", "3.3.3.3", "5.5.5.5 interface eth2"], + "advertise_interval": 10, + "peer_address": "192.168.1.3", + "priority": 100, + "vrid": 20, + "garp": { + "interval": 20, + "master_delay": 5, + "master_refresh": 50, + "master_refresh_repeat": 100, + "master_repeat": 3, + }, + "authentication": { + "type": "plaintext-password", + "password": "testpass", + }, + "transition_script": { + "master": "/var/tmp/script.sh", + "backup": "/var/tmp/script.sh", + "fault": "/var/tmp/script.sh", + "stop": "/var/tmp/script.sh", + }, + "health_check": { + "failure_count": 3, + "interval": 10, + "ping": "192.168.1.5", + "script": "script.sh", + }, + "track": { + "exclude_vrrp_interface": True, + "interface": ["eth1"], + }, + "excluded_address": [ + "192.168.1.7 interface eth3", + "192.168.1.8", + ], + "hello_source_address": "192.168.1.2", + }, + ], + "sync_groups": [ + { + "name": "sg1", + "member": ["g1"], + "transition_script": { + "master": "/var/tmp/script.sh", + "backup": "/var/tmp/script.sh", + "fault": "/var/tmp/script.sh", + "stop": "/var/tmp/script.sh", + }, + "health_check": { + "failure_count": 3, + "interval": 10, + "ping": "192.168.1.1", + "script": "/var/tmp/script.sh", + }, + }, + ], + }, + } + self.assertEqual(gathered_list, result["gathered"]) + + def test_vrrp_groups_deleted(self): + set_module_args( + dict( + config=dict( + vrrp=dict( + groups=[ + dict(name="g1"), + ], + sync_groups=[ + dict(name="sg1"), + ], + ), + ), + state="deleted", + ), + ) + commands = [ + "delete high-availability vrrp group g1", + "delete high-availability vrrp sync-group sg1", + ] + self.execute_module(changed=True, commands=commands) + + def test_vrrp_objs_deleted(self): + set_module_args( + dict( + config=dict( + disable=False, + vrrp=dict( + global_parameters=dict( + startup_delay=32, + garp=dict(), + ), + groups=[ + dict(name="g1"), + ], + sync_groups=[], + ), + virtual_servers=[], + ), + state="deleted", + ), + ) + commands = [ + "delete high-availability virtual-server", + "delete high-availability vrrp global-parameters garp", + "delete high-availability vrrp global-parameters startup-delay", + "delete high-availability vrrp group g1", + "delete high-availability vrrp sync-group", + ] + self.execute_module(changed=True, commands=commands) + + def test_vrrp_deleted_all(self): + set_module_args( + dict( + config=dict(), + state="deleted", + ), + ) + commands = [ + "delete high-availability", + ] + self.execute_module(changed=True, commands=commands) + + def test_vrrp_purged(self): + set_module_args( + dict( + config=dict(), + state="purged", + ), + ) + commands = [ + "delete high-availability", + ] + self.execute_module(changed=True, commands=commands) |
