mirror of
https://github.com/ansible-collections/hetzner.hcloud.git
synced 2026-02-04 08:01:49 +00:00
Placement groups (#102)
* Add placement_groups * Create server with placement_group * Add/remove server to/from placement_group * Remove deprecated tmage test * Add changelogs * Add placement groups to hcloud_server_info * Deprecate force_upgrade flag
This commit is contained in:
parent
8cd7b9f997
commit
7d3828837c
9 changed files with 520 additions and 31 deletions
|
|
@ -81,10 +81,17 @@ options:
|
|||
default: no
|
||||
force_upgrade:
|
||||
description:
|
||||
- Deprecated
|
||||
- Force the upgrade of the server.
|
||||
- Power off the server if it is running on upgrade.
|
||||
type: bool
|
||||
default: no
|
||||
force:
|
||||
description:
|
||||
- Force the update of the server.
|
||||
- May power off the server if update.
|
||||
type: bool
|
||||
default: no
|
||||
allow_deprecated_image:
|
||||
description:
|
||||
- Allows the creation of servers with deprecated images.
|
||||
|
|
@ -113,6 +120,10 @@ options:
|
|||
- Protect the Server for rebuild.
|
||||
- Needs to be the same as I(delete_protection).
|
||||
type: bool
|
||||
placement_group:
|
||||
description:
|
||||
- Placement Group of the server.
|
||||
type: str
|
||||
state:
|
||||
description:
|
||||
- State of the server.
|
||||
|
|
@ -180,6 +191,19 @@ EXAMPLES = """
|
|||
name: my-server
|
||||
image: ubuntu-18.04
|
||||
state: rebuild
|
||||
|
||||
- name: Add server to placement group
|
||||
hcloud_server:
|
||||
name: my-server
|
||||
placement_group: my-placement-group
|
||||
force: True
|
||||
state: present
|
||||
|
||||
- name: Remove server from placement group
|
||||
hcloud_server:
|
||||
name: my-server
|
||||
placement_group: null
|
||||
state: present
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
|
|
@ -223,6 +247,12 @@ hcloud_server:
|
|||
returned: always
|
||||
type: str
|
||||
sample: fsn1
|
||||
placement_group:
|
||||
description: Placement Group of the server
|
||||
type: str
|
||||
returned: always
|
||||
sample: 4711
|
||||
version_added: "1.5.0"
|
||||
datacenter:
|
||||
description: Name of the datacenter of the server
|
||||
returned: always
|
||||
|
|
@ -283,6 +313,7 @@ class AnsibleHcloudServer(Hcloud):
|
|||
|
||||
def _prepare_result(self):
|
||||
image = None if self.hcloud_server.image is None else to_native(self.hcloud_server.image.name)
|
||||
placement_group = None if self.hcloud_server.placement_group is None else to_native(self.hcloud_server.placement_group.name)
|
||||
return {
|
||||
"id": to_native(self.hcloud_server.id),
|
||||
"name": to_native(self.hcloud_server.name),
|
||||
|
|
@ -292,6 +323,7 @@ class AnsibleHcloudServer(Hcloud):
|
|||
"server_type": to_native(self.hcloud_server.server_type.name),
|
||||
"datacenter": to_native(self.hcloud_server.datacenter.name),
|
||||
"location": to_native(self.hcloud_server.datacenter.location.name),
|
||||
"placement_group": placement_group,
|
||||
"rescue_enabled": self.hcloud_server.rescue_enabled,
|
||||
"backup_window": to_native(self.hcloud_server.backup_window),
|
||||
"labels": self.hcloud_server.labels,
|
||||
|
|
@ -323,7 +355,8 @@ class AnsibleHcloudServer(Hcloud):
|
|||
"server_type": self._get_server_type(),
|
||||
"user_data": self.module.params.get("user_data"),
|
||||
"labels": self.module.params.get("labels"),
|
||||
"image": self._get_image()
|
||||
"image": self._get_image(),
|
||||
"placement_group": self._get_placement_group(),
|
||||
}
|
||||
|
||||
if self.module.params.get("ssh_keys") is not None:
|
||||
|
|
@ -424,8 +457,27 @@ class AnsibleHcloudServer(Hcloud):
|
|||
|
||||
return server_type
|
||||
|
||||
def _get_placement_group(self):
|
||||
if self.module.params.get("placement_group") is None:
|
||||
return None
|
||||
|
||||
placement_group = self.client.placement_groups.get_by_name(
|
||||
self.module.params.get("placement_group")
|
||||
)
|
||||
if placement_group is None:
|
||||
try:
|
||||
placement_group = self.client.placement_groups.get_by_id(self.module.params.get("placement_group"))
|
||||
except Exception:
|
||||
self.module.fail_json(msg="placement_group %s was not found" % self.module.params.get("placement_group"))
|
||||
|
||||
return placement_group
|
||||
|
||||
def _update_server(self):
|
||||
self.module.warn("force_upgrade is deprecated, use force instead")
|
||||
|
||||
try:
|
||||
previous_server_status = self.hcloud_server.status
|
||||
|
||||
rescue_mode = self.module.params.get("rescue_mode")
|
||||
if rescue_mode and self.hcloud_server.rescue_enabled is False:
|
||||
if not self.module.check_mode:
|
||||
|
|
@ -482,19 +534,26 @@ class AnsibleHcloudServer(Hcloud):
|
|||
for a in actions:
|
||||
a.wait_until_finished()
|
||||
|
||||
if "placement_group" in self.module.params:
|
||||
if self.module.params["placement_group"] is None and self.hcloud_server.placement_group is not None:
|
||||
if not self.module.check_mode:
|
||||
self.hcloud_server.remove_from_placement_group().wait_until_finished()
|
||||
self._mark_as_changed()
|
||||
else:
|
||||
placement_group = self._get_placement_group()
|
||||
if (
|
||||
placement_group is not None and
|
||||
(self.hcloud_server.placement_group is None or self.hcloud_server.placement_group.id != placement_group.id)
|
||||
):
|
||||
self.stop_server_if_forced()
|
||||
if not self.module.check_mode:
|
||||
self.hcloud_server.add_to_placement_group(placement_group)
|
||||
self._mark_as_changed()
|
||||
|
||||
server_type = self.module.params.get("server_type")
|
||||
if server_type is not None and self.hcloud_server.server_type.name != server_type:
|
||||
previous_server_status = self.hcloud_server.status
|
||||
state = self.module.params.get("state")
|
||||
if previous_server_status == Server.STATUS_RUNNING:
|
||||
if not self.module.check_mode:
|
||||
if self.module.params.get("force_upgrade") or state == "stopped":
|
||||
self.stop_server() # Only stopped server can be upgraded
|
||||
else:
|
||||
self.module.warn(
|
||||
"You can not upgrade a running instance %s. You need to stop the instance or use force_upgrade=yes."
|
||||
% self.hcloud_server.name
|
||||
)
|
||||
self.stop_server_if_forced()
|
||||
|
||||
timeout = 100
|
||||
if self.module.params.get("upgrade_disk"):
|
||||
timeout = (
|
||||
|
|
@ -505,11 +564,17 @@ class AnsibleHcloudServer(Hcloud):
|
|||
server_type=self._get_server_type(),
|
||||
upgrade_disk=self.module.params.get("upgrade_disk"),
|
||||
).wait_until_finished(timeout)
|
||||
if state == "present" and previous_server_status == Server.STATUS_RUNNING or state == "started":
|
||||
self.start_server()
|
||||
|
||||
self._mark_as_changed()
|
||||
|
||||
if (
|
||||
not self.module.check_mode and
|
||||
(
|
||||
self.module.params.get("state") == "present" and previous_server_status == Server.STATUS_RUNNING or
|
||||
self.module.params.get("state") == "started"
|
||||
)
|
||||
):
|
||||
self.start_server()
|
||||
|
||||
delete_protection = self.module.params.get("delete_protection")
|
||||
rebuild_protection = self.module.params.get("rebuild_protection")
|
||||
if (delete_protection is not None and rebuild_protection is not None) and (
|
||||
|
|
@ -557,6 +622,24 @@ class AnsibleHcloudServer(Hcloud):
|
|||
except Exception as e:
|
||||
self.module.fail_json(msg=e.message)
|
||||
|
||||
def stop_server_if_forced(self):
|
||||
previous_server_status = self.hcloud_server.status
|
||||
if previous_server_status == Server.STATUS_RUNNING and not self.module.check_mode:
|
||||
if (
|
||||
self.module.params.get("force_upgrade") or
|
||||
self.module.params.get("force") or
|
||||
self.module.params.get("state") == "stopped"
|
||||
):
|
||||
self.stop_server() # Only stopped server can be upgraded
|
||||
return previous_server_status
|
||||
else:
|
||||
self.module.warn(
|
||||
"You can not upgrade a running instance %s. You need to stop the instance or use force=yes."
|
||||
% self.hcloud_server.name
|
||||
)
|
||||
|
||||
return None
|
||||
|
||||
def rebuild_server(self):
|
||||
self.module.fail_on_missing_params(
|
||||
required_params=["image"]
|
||||
|
|
@ -606,11 +689,13 @@ class AnsibleHcloudServer(Hcloud):
|
|||
labels={"type": "dict"},
|
||||
backups={"type": "bool"},
|
||||
upgrade_disk={"type": "bool", "default": False},
|
||||
force={"type": "bool", "default": False},
|
||||
force_upgrade={"type": "bool", "default": False},
|
||||
allow_deprecated_image={"type": "bool", "default": False},
|
||||
rescue_mode={"type": "str"},
|
||||
delete_protection={"type": "bool"},
|
||||
rebuild_protection={"type": "bool"},
|
||||
placement_group={"type": "str"},
|
||||
state={
|
||||
"choices": ["absent", "present", "restarted", "started", "stopped", "rebuild"],
|
||||
"default": "present",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue