diff --git a/tests/integration/targets/server_volume/aliases b/tests/integration/targets/server_volume/aliases new file mode 100644 index 0000000..18b1111 --- /dev/null +++ b/tests/integration/targets/server_volume/aliases @@ -0,0 +1,3 @@ +cloud/hcloud +gather_facts/no +azp/group2 diff --git a/tests/integration/targets/server_volume/defaults/main/common.yml b/tests/integration/targets/server_volume/defaults/main/common.yml new file mode 100644 index 0000000..0b15142 --- /dev/null +++ b/tests/integration/targets/server_volume/defaults/main/common.yml @@ -0,0 +1,29 @@ +# +# DO NOT EDIT THIS FILE! Please edit the files in tests/integration/common instead. +# +--- +# Azure Pipelines will configure this value to something similar to +# "azp-84824-1-hetzner-2-13-test-2-13-hcloud-3-9-1-default-i" +hcloud_prefix: "tests" + +# Used to namespace resources created by concurrent test pipelines/targets +hcloud_run_ns: "{{ hcloud_prefix | md5 }}" +hcloud_role_ns: "{{ role_name | split('_') | map('batch', 2) | map('first') | flatten() | join() }}" +hcloud_ns: "ansible-{{ hcloud_run_ns }}-{{ hcloud_role_ns }}" + +# Used to easily update the server types and images across all our tests. +hcloud_server_type_name: cax11 +hcloud_server_type_id: 45 + +hcloud_server_type_upgrade_name: cax21 +hcloud_server_type_upgrade_id: 93 + +hcloud_image_name: debian-12 +hcloud_image_id: 114690389 # architecture=arm + +hcloud_location_name: hel1 +hcloud_location_id: 3 +hcloud_datacenter_name: hel1-dc2 +hcloud_datacenter_id: 3 + +hcloud_network_zone_name: eu-central diff --git a/tests/integration/targets/server_volume/defaults/main/main.yml b/tests/integration/targets/server_volume/defaults/main/main.yml new file mode 100644 index 0000000..bff41f6 --- /dev/null +++ b/tests/integration/targets/server_volume/defaults/main/main.yml @@ -0,0 +1,5 @@ +# Copyright: (c) 2025, Hetzner Cloud GmbH +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +hcloud_volume_name: "{{ hcloud_ns }}" +hcloud_server_name: "{{ hcloud_ns }}" diff --git a/tests/integration/targets/server_volume/tasks/cleanup.yml b/tests/integration/targets/server_volume/tasks/cleanup.yml new file mode 100644 index 0000000..5f91342 --- /dev/null +++ b/tests/integration/targets/server_volume/tasks/cleanup.yml @@ -0,0 +1,10 @@ +--- +- name: Cleanup test_server + hetzner.hcloud.server: + name: "{{ hcloud_server_name }}" + state: absent + +- name: Cleanup test_volume + hetzner.hcloud.volume: + name: "{{ hcloud_volume_name }}" + state: absent diff --git a/tests/integration/targets/server_volume/tasks/main.yml b/tests/integration/targets/server_volume/tasks/main.yml new file mode 100644 index 0000000..767fc46 --- /dev/null +++ b/tests/integration/targets/server_volume/tasks/main.yml @@ -0,0 +1,31 @@ +# +# DO NOT EDIT THIS FILE! Please edit the files in tests/integration/common instead. +# +--- +- name: Check if cleanup.yml exists + ansible.builtin.stat: + path: "{{ role_path }}/tasks/cleanup.yml" + register: cleanup_file + +- name: Check if prepare.yml exists + ansible.builtin.stat: + path: "{{ role_path }}/tasks/prepare.yml" + register: prepare_file + +- name: Include cleanup tasks + ansible.builtin.include_tasks: "{{ role_path }}/tasks/cleanup.yml" + when: cleanup_file.stat.exists + +- name: Include prepare tasks + ansible.builtin.include_tasks: "{{ role_path }}/tasks/prepare.yml" + when: prepare_file.stat.exists + +- name: Run tests + block: + - name: Include test tasks + ansible.builtin.include_tasks: "{{ role_path }}/tasks/test.yml" + + always: + - name: Include cleanup tasks + ansible.builtin.include_tasks: "{{ role_path }}/tasks/cleanup.yml" + when: cleanup_file.stat.exists diff --git a/tests/integration/targets/server_volume/tasks/test.yml b/tests/integration/targets/server_volume/tasks/test.yml new file mode 100644 index 0000000..16f80ef --- /dev/null +++ b/tests/integration/targets/server_volume/tasks/test.yml @@ -0,0 +1,188 @@ +# Copyright: (c) 2025, Hetzner Cloud GmbH +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: Setup server + hetzner.hcloud.server: + name: "{{ hcloud_server_name }}" + server_type: "{{ hcloud_server_type_name }}" + image: "{{ hcloud_image_name }}" + state: created + location: "{{ hcloud_location_name }}" + register: vol_server +- name: Verify setup server + ansible.builtin.assert: + that: + - vol_server is changed + +- name: Setup volume + hetzner.hcloud.volume: + name: "{{ hcloud_volume_name }}" + size: 10 + location: "{{ hcloud_location_name }}" + register: vol_volume +- name: Verify setup volume + ansible.builtin.assert: + that: + - vol_volume is changed + +- name: Test missing volume name or id # noqa: args[module] + hetzner.hcloud.server_volume: + server: "{{ hcloud_server_name }}" + register: result + ignore_errors: true +- name: Verify fail test volume name or id + ansible.builtin.assert: + that: + - result is failed + - 'result.msg == "one of the following is required: id, volume"' + +- name: Test missing server name # noqa: args[module] + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + register: result + ignore_errors: true +- name: Verify fail test server name + ansible.builtin.assert: + that: + - result is failed + - 'result.msg == "missing required arguments: server"' + +- name: Test attach Volume with check mode (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + register: result + check_mode: true +- name: Verify attach Volume with check mode result (Volume) + ansible.builtin.assert: + that: + - result is changed + +- name: Test attach Volume (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + register: volume +- name: Verify test attach Volume (Volume) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.volume == hcloud_volume_name + - volume.hcloud_server_volume.server == hcloud_server_name + - volume.hcloud_server_volume.id is defined + +- name: Test attach Volume idempotence (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + register: volume +- name: Verify test create Volume (Volume) + ansible.builtin.assert: + that: + - volume is not changed + +- name: Test detach Volume with checkmode (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + state: "detached" + check_mode: true + register: volume +- name: Verify detach Volume with checkmode (Volume) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.server == hcloud_server_name + +- name: Test detach Volume (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + state: "detached" + register: volume +- name: Verify detach volume (Volume) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.server == hcloud_server_name + +- name: Test detach Volume idempotency (Volume) + hetzner.hcloud.server_volume: + volume: "{{ hcloud_volume_name }}" + server: "{{ hcloud_server_name }}" + state: "detached" + register: volume +- name: Verify detach volume idempotency (Volume) + ansible.builtin.assert: + that: + - volume is not changed + +- name: Test attach Volume with check mode (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + register: result + check_mode: true +- name: Verify attach Volume with check mode result (ID) + ansible.builtin.assert: + that: + - result is changed + +- name: Test attach Volume (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + register: volume +- name: Verify test attach Volume (ID) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.volume == hcloud_volume_name + - volume.hcloud_server_volume.server == hcloud_server_name + - volume.hcloud_server_volume.id is defined + +- name: Test attach Volume idempotence (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + register: volume +- name: Verify test create Volume (ID) + ansible.builtin.assert: + that: + - volume is not changed + +- name: Test detach Volume with checkmode (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + state: "detached" + check_mode: true + register: volume +- name: Verify detach Volume with checkmode (ID) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.server == hcloud_server_name + +- name: Test detach Volume (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + state: "detached" + register: volume +- name: Verify detach volume (ID) + ansible.builtin.assert: + that: + - volume is changed + - volume.hcloud_server_volume.server == hcloud_server_name + +- name: Test detach Volume idempotency (ID) + hetzner.hcloud.server_volume: + id: "{{ vol_volume.hcloud_volume.id }}" + server: "{{ hcloud_server_name }}" + state: "detached" + register: volume +- name: Verify detach volume idempotency (ID) + ansible.builtin.assert: + that: + - volume is not changed