1
0
Fork 0
mirror of https://github.com/ansible-collections/hetzner.hcloud.git synced 2026-02-04 08:01:49 +00:00
hetzner.hcloud/plugins/module_utils/deprecation.py
Jonas L. 826e6a5309
feat: per location server types (#692)
[Server Types](https://docs.hetzner.cloud/reference/cloud#server-types)
now depend on
[Locations](https://docs.hetzner.cloud/reference/cloud#locations).

- We added a new `locations` property to the [Server
Types](https://docs.hetzner.cloud/reference/cloud#server-types)
resource. The new property defines a list of supported
[Locations](https://docs.hetzner.cloud/reference/cloud#locations) and
additional per
[Locations](https://docs.hetzner.cloud/reference/cloud#locations)
details such as deprecations information.

- We deprecated the `deprecation` property from the [Server
Types](https://docs.hetzner.cloud/reference/cloud#server-types)
resource. The property will gradually be phased out as per
[Locations](https://docs.hetzner.cloud/reference/cloud#locations)
deprecations are being announced. Please use the new per
[Locations](https://docs.hetzner.cloud/reference/cloud#locations)
deprecation information instead.

See our
[changelog](https://docs.hetzner.cloud/changelog#2025-09-24-per-location-server-types)
for more details.

**Upgrading**

```yaml
---
- name: Validate server type
  hosts: localhost
  connection: local
  tasks:
    - name: Fetch server type info
      hetzner.hcloud.server_type_info:
        name: cx22
      register: server_type

    - name: Ensure server type exists
      ansible.builtin.assert:
        fail_msg: server type does not exists
        that:
          - server_type.hcloud_server_type_info | count == 1

    - name: Ensure server type is not deprecated
      ansible.builtin.assert:
        fail_msg: server type is deprecated
        that:
          - server_type.hcloud_server_type_info[0].deprecation is none
```

```yaml
---
- name: Validate server type
  hosts: localhost
  connection: local
  tasks:
    - name: Fetch location info
      hetzner.hcloud.location_info:
        name: fsn1
      register: location

    - name: Fetch server type info
      hetzner.hcloud.server_type_info:
        name: cx22
      register: server_type

    - name: Ensure server type exists
      ansible.builtin.assert:
        fail_msg: server type does not exists
        that:
          - server_type.hcloud_server_type_info | count == 1

    - name: Extract server type location info
      ansible.builtin.set_fact:
        server_type_location: >
          {{
            server_type.hcloud_server_type_info[0].locations
            | selectattr("name", "eq", location.hcloud_location_info[0].name)
            | first
          }}

    - name: Ensure server type is not deprecated
      ansible.builtin.assert:
        fail_msg: server type is deprecated in location
        that:
          - server_type_location.deprecation is none
```
2025-09-26 11:50:05 +02:00

124 lines
4.9 KiB
Python

from __future__ import annotations
import warnings
from datetime import datetime, timezone
from ansible.module_utils.basic import AnsibleModule
from .vendor.hcloud.locations import BoundLocation
from .vendor.hcloud.server_types import BoundServerType, ServerTypeLocation
DEPRECATED_EXISTING_SERVERS = """
Existing servers of that type will continue to work as before and no action is \
required on your part.
""".strip()
def deprecated_server_type_warning(
module: AnsibleModule,
server_type: BoundServerType,
location: BoundLocation | None = None,
) -> None:
with warnings.catch_warnings():
warnings.simplefilter("ignore")
if server_type.deprecation is not None:
if server_type.deprecation.unavailable_after < datetime.now(timezone.utc):
module.warn(
str.format(
"Server type {server_type} is unavailable in all locations and can no longer be ordered. ",
server_type=server_type.name,
)
+ DEPRECATED_EXISTING_SERVERS,
)
else:
module.warn(
str.format(
"Server type {server_type} is deprecated in all locations and will no longer be available "
"for order as of {unavailable_after}. ",
server_type=server_type.name,
unavailable_after=server_type.deprecation.unavailable_after.strftime("%Y-%m-%d"),
)
+ DEPRECATED_EXISTING_SERVERS,
)
return
deprecated_locations: list[ServerTypeLocation] = []
unavailable_locations: list[ServerTypeLocation] = []
for o in server_type.locations or []:
if o.deprecation is not None:
deprecated_locations.append(o)
if o.deprecation.unavailable_after < datetime.now(timezone.utc):
unavailable_locations.append(o)
if not deprecated_locations:
return
# Warn when the server type is deprecated in the given location
if location:
found = [o for o in deprecated_locations if location.name == o.location.name]
if not found:
return
deprecated_location = found[0]
if deprecated_location in unavailable_locations:
module.warn(
str.format(
"Server type {server_type} is unavailable in {location} and can no longer be ordered. ",
server_type=server_type.name,
location=deprecated_location.location.name,
)
+ DEPRECATED_EXISTING_SERVERS,
)
else:
module.warn(
str.format(
"Server type {server_type} is deprecated in {location} and will no longer be available "
"for order as of {unavailable_after}. ",
server_type=server_type.name,
location=deprecated_location.location.name,
unavailable_after=deprecated_location.deprecation.unavailable_after.strftime("%Y-%m-%d"),
)
+ DEPRECATED_EXISTING_SERVERS,
)
return
# No location given, only warn when all locations are deprecated
if len(server_type.locations) != len(deprecated_locations):
return
if unavailable_locations:
if len(deprecated_locations) != len(unavailable_locations):
module.warn(
str.format(
"Server type {server_type} is deprecated in all locations ({deprecated_locations}) and can no "
"longer be ordered in some locations ({unavailable_locations}). ",
server_type=server_type.name,
deprecated_locations=",".join(o.location.name for o in deprecated_locations),
unavailable_locations=",".join(o.location.name for o in unavailable_locations),
)
+ DEPRECATED_EXISTING_SERVERS,
)
else:
module.warn(
str.format(
"Server type {server_type} is unavailable in all locations ({unavailable_locations}) and can no "
"longer be ordered. ",
server_type=server_type.name,
unavailable_locations=",".join(o.location.name for o in unavailable_locations),
)
+ DEPRECATED_EXISTING_SERVERS,
)
else:
module.warn(
str.format(
"Server type {server_type} is deprecated in all locations ({deprecated_locations}) and will no "
"longer be available for order. ",
server_type=server_type.name,
deprecated_locations=",".join(o.location.name for o in deprecated_locations),
)
+ DEPRECATED_EXISTING_SERVERS,
)