Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(instance): add possibility to choose serverState to list #43

Merged
merged 12 commits into from
Feb 4, 2025
48 changes: 28 additions & 20 deletions plugins/inventory/scaleway.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@
type: list
elements: str
default: []
state:
description:
- Instance server status
type: list
elements: str
default: [running]
hostnames:
description: List of preference about what to use as an hostname.
type: list
Expand Down Expand Up @@ -89,6 +95,8 @@
- nl-ams-1
tags:
- dev
state:
- stopped
variables:
ansible_host: public_ipv4
"""
Expand All @@ -104,16 +112,14 @@

try:
from scaleway_core.bridge import Zone

from scaleway import Client, ScalewayException
from scaleway.applesilicon.v1alpha1 import ApplesiliconV1Alpha1API
from scaleway.applesilicon.v1alpha1 import Server as ApplesiliconServer
from scaleway.baremetal.v1 import BaremetalV1API, IPVersion
from scaleway.baremetal.v1 import Server as BaremetalServer
from scaleway.instance.v1 import InstanceV1API
from scaleway.instance.v1 import InstanceV1API, ServerState
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 DediboxV1API, IPVersion
from scaleway.dedibox.v1 import ServerSummary as DediboxServer

HAS_SCALEWAY_SDK = True
Expand All @@ -132,14 +138,15 @@
class _Filters:
zones: List[str] = field(default_factory=list)
tags: List[str] = field(default_factory=list)
state: List[str] = field(default_factory=list)


@dataclass
class _Host:
id: str
tags: List[str]
zone: "Zone"
state: str
state: "ServerState"

hostname: str
public_ipv4: Optional[str]
Expand Down Expand Up @@ -242,26 +249,24 @@ def get_inventory(self):
client = self._get_client()
filters = self._get_filters()

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)
instances: List[InstanceServer] = self._get_instances(client, filters)
elastic_metals: List[BaremetalServer] = self._get_elastic_metal(client, filters)
apple_silicon: List[ApplesiliconServer] = self._get_apple_sillicon(client, filters)

return instances + elastic_metals + apple_silicon + dedibox_servers
return instances + elastic_metals + apple_silicon

def _get_instances(self, client: "Client", filters: _Filters) -> List[_Host]:
api = InstanceV1API(client)

servers: List[InstanceServer] = []

for zone in filters.zones:
servers.extend(
api.list_servers_all(
for state in filters.state:
servers.extend(api.list_servers_all(
zone=zone,
tags=filters.tags if filters.tags else None,
state=ServerState.RUNNING,
)
)
state=ServerState(state),
))

results: List[_Host] = []
for server in servers:
Expand All @@ -272,12 +277,11 @@ def _get_instances(self, client: "Client", filters: _Filters) -> List[_Host]:
state=str(server.state),
hostname=server.hostname,
public_ipv4=server.public_ip.address if server.public_ip else None,
private_ipv4=server.private_ip,
public_ipv6=server.ipv6.address if server.ipv6 else None,
private_ipv4=server.private_ip if server.private_ip else None,
public_ipv6=server.ipv6 if server.ipv6 else None,
public_dns=f"{server.id}.pub.instances.scw.cloud",
private_dns=f"{server.id}.priv.instances.scw.cloud",
)

results.append(host)

return results
Expand Down Expand Up @@ -340,7 +344,7 @@ def _get_apple_sillicon(self, client: "Client", filters: _Filters) -> List[_Host
for server in servers:
host = _Host(
id=server.id,
tags=["apple_sillicon"],
tags=["apple_sillicon", *server.tags],
zone=server.zone,
state=str(server.status),
hostname=server.name,
Expand All @@ -360,7 +364,7 @@ def _get_dedibox(self, client: "Client", filters: _Filters) -> List[_Host]:

for zone in filters.zones:
try:
found = api.list_servers_all(
found = api.list_servers(
zone=zone,
)
servers.extend(found)
Expand Down Expand Up @@ -442,6 +446,7 @@ def _get_client(self):
def _get_filters(self):
zones = self.get_option("zones")
tags = self.get_option("tags")
state = self.get_option("state")

filters = _Filters()

Expand All @@ -451,4 +456,7 @@ def _get_filters(self):
if tags:
filters.tags = tags

if state:
filters.state = state

return filters