summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authoromnom62 <75066712+omnom62@users.noreply.github.com>2026-08-19 22:21:24 +1000
committerGitHub <noreply@github.com>2026-08-19 15:21:24 +0300
commita6adced609472d88cb525f2ef1a4054b52692f76 (patch)
treede206d2bbc56c970c2db3162cdee3d78b341c811 /tests
parentb6b58bc747c4ea59371253c5541cde92b922c173 (diff)
downloadvyos.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')
-rw-r--r--tests/integration/targets/vyos_ha/defaults/main.yaml3
-rw-r--r--tests/integration/targets/vyos_ha/tasks/cli.yaml20
-rw-r--r--tests/integration/targets/vyos_ha/tasks/main.yaml5
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/_add_dummy_scripts.yaml6
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/_parsed.cfg69
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/_populate_config.yaml8
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/_remove_config.yaml15
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/deleted_all.yaml44
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/deleted_bulk.yaml50
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/deleted_vrrp_groups.yaml45
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/empty_config.yaml58
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/gathered.yaml25
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/merged.yaml42
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/overridden.yaml35
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/parsed.yaml15
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/purged.yaml44
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/rendered.yaml15
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/replaced.yaml37
-rw-r--r--tests/integration/targets/vyos_ha/tests/cli/rtt.yaml39
-rw-r--r--tests/integration/targets/vyos_ha/vars/main.yaml787
-rw-r--r--tests/sanity/ignore-2.15.txt1
-rw-r--r--tests/sanity/ignore-2.16.txt1
-rw-r--r--tests/sanity/ignore-2.17.txt1
-rw-r--r--tests/sanity/ignore-2.18.txt1
-rw-r--r--tests/sanity/ignore-2.19.txt1
-rw-r--r--tests/sanity/ignore-2.20.txt1
-rw-r--r--tests/sanity/ignore-2.21.txt1
-rw-r--r--tests/sanity/ignore-2.22.txt1
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_ha_config.cfg64
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_ha.py1405
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)