mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-06 05:12:45 +00:00
Add hcloud server module (#53062)
This commit is contained in:
committed by
René Moser
parent
bdfa99af9f
commit
66beeaf032
12
test/integration/cloud-config-hcloud.ini.template
Normal file
12
test/integration/cloud-config-hcloud.ini.template
Normal file
@@ -0,0 +1,12 @@
|
||||
# This is the configuration template for ansible-test Hetzner Cloud integration tests.
|
||||
#
|
||||
# You do not need this template if you are:
|
||||
#
|
||||
# 1) Running integration tests without using ansible-test.
|
||||
#
|
||||
# If you want to test against the Hetzner Cloud public API,
|
||||
# fill in the values below and save this file without the .template extension.
|
||||
# This will cause ansible-test to use the given configuration.
|
||||
|
||||
[default]
|
||||
hcloud_api_token= @TOKEN
|
||||
2
test/integration/targets/hcloud_server/aliases
Normal file
2
test/integration/targets/hcloud_server/aliases
Normal file
@@ -0,0 +1,2 @@
|
||||
cloud/hcloud
|
||||
unsupported
|
||||
5
test/integration/targets/hcloud_server/defaults/main.yml
Normal file
5
test/integration/targets/hcloud_server/defaults/main.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
---
|
||||
hcloud_prefix: "tests"
|
||||
hcloud_server_name: "{{hcloud_prefix}}-integration"
|
||||
275
test/integration/targets/hcloud_server/tasks/main.yml
Normal file
275
test/integration/targets/hcloud_server/tasks/main.yml
Normal file
@@ -0,0 +1,275 @@
|
||||
# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
---
|
||||
- name: setup
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: absent
|
||||
register: result
|
||||
- name: verify setup
|
||||
assert:
|
||||
that:
|
||||
- result is success
|
||||
- name: test missing required parameters on create server
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
register: result
|
||||
ignore_errors: yes
|
||||
- name: verify fail test missing required parameters on create server
|
||||
assert:
|
||||
that:
|
||||
- result is failed
|
||||
- 'result.msg == "missing required arguments: server_type, image"'
|
||||
|
||||
- name: test create server with check mode
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: cx11
|
||||
image: ubuntu-18.04
|
||||
state: present
|
||||
register: result
|
||||
check_mode: yes
|
||||
- name: test create server server
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
|
||||
- name: test create server
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name}}"
|
||||
server_type: cx11
|
||||
image: ubuntu-18.04
|
||||
state: started
|
||||
register: main_server
|
||||
- name: verify create server
|
||||
assert:
|
||||
that:
|
||||
- main_server is changed
|
||||
- main_server.hcloud_server.name == "{{ hcloud_server_name }}"
|
||||
- main_server.hcloud_server.server_type == "cx11"
|
||||
- main_server.hcloud_server.status == "running"
|
||||
- main_server.root_password != ""
|
||||
|
||||
- name: test create server idempotence
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: started
|
||||
register: result
|
||||
- name: verify create server idempotence
|
||||
assert:
|
||||
that:
|
||||
- result is not changed
|
||||
|
||||
- name: test stop server with check mode
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: stopped
|
||||
register: result
|
||||
check_mode: yes
|
||||
- name: verify stop server with check mode
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.status == "running"
|
||||
|
||||
- name: test stop server
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify stop server
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.status == "off"
|
||||
|
||||
- name: test start server with check mode
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: started
|
||||
register: result
|
||||
check_mode: true
|
||||
- name: verify start server with check mode
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
|
||||
- name: test start server
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: started
|
||||
register: result
|
||||
- name: verify start server
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.status == "running"
|
||||
|
||||
- name: test start server idempotence
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: started
|
||||
register: result
|
||||
- name: verify start server idempotence
|
||||
assert:
|
||||
that:
|
||||
- result is not changed
|
||||
- result.hcloud_server.status == "running"
|
||||
|
||||
- name: test stop server by its id
|
||||
hcloud_server:
|
||||
id: "{{ main_server.hcloud_server.id }}"
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify stop server by its id
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.status == "off"
|
||||
|
||||
- name: test resize server running without force
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx21"
|
||||
state: present
|
||||
register: result
|
||||
check_mode: true
|
||||
- name: verify test resize server running without force
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.server_type == "cx11"
|
||||
|
||||
- name: test resize server with check mode
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx21"
|
||||
state: stopped
|
||||
register: result
|
||||
check_mode: true
|
||||
- name: verify resize server with check mode
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
|
||||
- name: test resize server without disk
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx21"
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify resize server without disk
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.server_type == "cx21"
|
||||
|
||||
- name: test resize server idempotence
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx21"
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify resize server idempotence
|
||||
assert:
|
||||
that:
|
||||
- result is not changed
|
||||
|
||||
- name: test resize server to smaller plan
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx11"
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify resize server to smaller plan
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.server_type == "cx11"
|
||||
|
||||
- name: test resize server with disk
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
server_type: "cx21"
|
||||
upgrade_disk: true
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify resize server with disk
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.server_type == "cx21"
|
||||
|
||||
- name: test enable backups with check mode
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
backups: true
|
||||
state: stopped
|
||||
register: result
|
||||
check_mode: true
|
||||
- name: verify enable backups with check mode
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
|
||||
- name: test enable backups
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
backups: true
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify enable backups
|
||||
assert:
|
||||
that:
|
||||
- result is changed
|
||||
- result.hcloud_server.backup_window != ""
|
||||
|
||||
- name: test enable backups idempotence
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
backups: true
|
||||
state: stopped
|
||||
register: result
|
||||
- name: verify enable backups idempotence
|
||||
assert:
|
||||
that:
|
||||
- result is not changed
|
||||
- result.hcloud_server.backup_window != ""
|
||||
|
||||
- name: absent server
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: absent
|
||||
register: result
|
||||
- name: verify absent server
|
||||
assert:
|
||||
that:
|
||||
- result is success
|
||||
|
||||
- name: test create server with ssh key
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name}}"
|
||||
server_type: cx11
|
||||
image: "ubuntu-18.04"
|
||||
ssh_keys:
|
||||
- ci@ansible.hetzner.cloud
|
||||
state: started
|
||||
register: main_server
|
||||
- name: verify create server
|
||||
assert:
|
||||
that:
|
||||
- main_server is changed
|
||||
- main_server.hcloud_server.name == "{{ hcloud_server_name }}"
|
||||
- main_server.hcloud_server.server_type == "cx11"
|
||||
- main_server.hcloud_server.status == "running"
|
||||
- main_server.root_password != ""
|
||||
|
||||
- name: cleanup
|
||||
hcloud_server:
|
||||
name: "{{ hcloud_server_name }}"
|
||||
state: absent
|
||||
register: result
|
||||
- name: verify cleanup
|
||||
assert:
|
||||
that:
|
||||
- result is success
|
||||
69
test/runner/lib/cloud/hcloud.py
Normal file
69
test/runner/lib/cloud/hcloud.py
Normal file
@@ -0,0 +1,69 @@
|
||||
"""Hetzner Cloud plugin for integration tests."""
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
from os.path import isfile
|
||||
|
||||
from lib.cloud import (
|
||||
CloudProvider,
|
||||
CloudEnvironment,
|
||||
CloudEnvironmentConfig,
|
||||
)
|
||||
|
||||
from lib.util import ConfigParser, display
|
||||
|
||||
|
||||
class HcloudCloudProvider(CloudProvider):
|
||||
"""Hetzner Cloud provider plugin. Sets up cloud resources before
|
||||
delegation.
|
||||
"""
|
||||
|
||||
def __init__(self, args):
|
||||
"""
|
||||
:type args: TestConfig
|
||||
"""
|
||||
super(HcloudCloudProvider, self).__init__(args)
|
||||
|
||||
def filter(self, targets, exclude):
|
||||
"""Filter out the cloud tests when the necessary config and resources are not available.
|
||||
:type targets: tuple[TestTarget]
|
||||
:type exclude: list[str]
|
||||
"""
|
||||
if isfile(self.config_static_path):
|
||||
return
|
||||
|
||||
super(HcloudCloudProvider, self).filter(targets, exclude)
|
||||
|
||||
def setup(self):
|
||||
"""Setup the cloud resource before delegation and register a cleanup callback."""
|
||||
super(HcloudCloudProvider, self).setup()
|
||||
|
||||
if isfile(self.config_static_path):
|
||||
self.config_path = self.config_static_path
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class HcloudCloudEnvironment(CloudEnvironment):
|
||||
"""Hetzner Cloud cloud environment plugin. Updates integration test environment
|
||||
after delegation.
|
||||
"""
|
||||
|
||||
def get_environment_config(self):
|
||||
parser = ConfigParser()
|
||||
parser.read(self.config_path)
|
||||
|
||||
env_vars = dict(
|
||||
HCLOUD_TOKEN=parser.get('default', 'hcloud_api_token'),
|
||||
)
|
||||
|
||||
ansible_vars = dict(
|
||||
hcloud_prefix=self.resource_prefix,
|
||||
)
|
||||
|
||||
ansible_vars.update(dict((key.lower(), value) for key, value in env_vars.items()))
|
||||
|
||||
return CloudEnvironmentConfig(
|
||||
env_vars=env_vars,
|
||||
ansible_vars=ansible_vars,
|
||||
)
|
||||
Reference in New Issue
Block a user