From b5c42c72e364ad69494dde9f70d75f1f9737cb6a Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Tue, 10 Dec 2024 19:47:17 +0100 Subject: [PATCH] feat(dedibox): add inventory (#19) * feat(dedibox): add inventory * fix sanity * fix sanity * fix sanity * fix sanity * remove inventory --- plugins/inventory/scaleway.py | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/plugins/inventory/scaleway.py b/plugins/inventory/scaleway.py index c7be446..97740d7 100644 --- a/plugins/inventory/scaleway.py +++ b/plugins/inventory/scaleway.py @@ -113,6 +113,8 @@ from scaleway.instance.v1 import InstanceV1API from scaleway.instance.v1 import Server as InstanceServer from scaleway.instance.v1 import ServerState + from scaleway.dedibox.v1 import DediboxV1API + from scaleway.dedibox.v1 import ServerSummary as DediboxServer HAS_SCALEWAY_SDK = True except ImportError: @@ -243,8 +245,9 @@ def get_inventory(self): instances = self._get_instances(client, filters) elastic_metals = self._get_elastic_metal(client, filters) apple_silicon = self._get_apple_sillicon(client, filters) + dedibox_servers = self._get_dedibox(client, filters) - return instances + elastic_metals + apple_silicon + return instances + elastic_metals + apple_silicon + dedibox_servers def _get_instances(self, client: "Client", filters: _Filters) -> List[_Host]: api = InstanceV1API(client) @@ -350,6 +353,41 @@ def _get_apple_sillicon(self, client: "Client", filters: _Filters) -> List[_Host return results + def _get_dedibox(self, client: "Client", filters: _Filters) -> List[_Host]: + api = DediboxV1API(client) + + servers: List[DediboxServer] = [] + + for zone in filters.zones: + try: + found = api.list_servers_all( + zone=zone, + ) + servers.extend(found) + except ScalewayException: + pass + + results: List[_Host] = [] + for server in servers: + public_ipv4 = filter(lambda ip: ip.version == IPVersion.IPV4, server.interfaces.ips) + public_ipv6 = filter(lambda ip: ip.version == IPVersion.IPV6, server.interfaces.ips) + public_ipv4 = next(public_ipv4, None) + public_ipv6 = next(public_ipv6, None) + + host = _Host( + id=server.id, + tags=["dedibox", *server.tags], + zone=server.zone, + state=str(server.status), + hostname=server.name, + public_ipv4=public_ipv4.address if public_ipv4 else None, + private_ipv4=None, + public_ipv6=public_ipv6.address if public_ipv6 else None, + ) + results.append(host) + + return results + def _get_hostname(self, host: _Host, hostnames: List[str]) -> str: as_dict = host.__dict__