Skip to content

Commit 474f2e1

Browse files
committed
fixup 2
1 parent bbc793c commit 474f2e1

File tree

2 files changed

+53
-29
lines changed

2 files changed

+53
-29
lines changed

ash/config.py

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
import socket
33
import sys
44
from typing import Literal
5+
from urllib.parse import urlparse
6+
7+
from .containers import PODMAN, get_container_client
58

6-
import docker
79
import dotenv
8-
from nxtools import critical_error, logging
10+
from nxtools import critical_error, logging, log_traceback
911
from pydantic import BaseModel, Field, ValidationError
1012

1113
logging.user = "ash"
@@ -23,21 +25,41 @@ class Config(BaseModel):
2325

2426

2527
def get_local_info():
26-
client = docker.DockerClient(base_url="unix://var/run/docker.sock")
27-
api = docker.APIClient(base_url="unix://var/run/docker.sock")
28+
"""Infer info from ASH's container.
29+
30+
We get the "network" and "network_mode" from the current running
31+
ASH (what runs this code) container.
32+
33+
These two can be provided via `AYON_NETWORK` and `AYON_NETWORK_MODE`.
34+
"""
35+
client, api = get_container_client()
36+
37+
logging.info("Querying existing containers...")
2838
for container in client.containers.list():
29-
insp = api.inspect_container(container.id)
39+
if PODMAN:
40+
insp = container.inspect()
41+
else:
42+
insp = api.inspect_container(container.id)
3043
if insp["Config"]["Hostname"] != socket.gethostname():
44+
logging.debug(
45+
f"Hostname for container {insp['Name']} doesn't match ash's, ignoring."
46+
)
3147
continue
32-
# print(json.dumps(insp, indent=4))
3348
break
3449
else:
3550
logging.error("Weird, no container found for this host")
3651
sys.exit(1)
3752

38-
networks = insp["NetworkSettings"]["Networks"]
53+
try:
54+
network = next(iter(insp["NetworkSettings"]["Networks"].keys()), None)
55+
network_mode = insp["HostConfig"]["NetworkMode"]
56+
except Exceptions as e:
57+
logging.error(
58+
"ASH is not running in a defined network... make sure it's in"
59+
"the same network as ayon-docker containers.")
60+
log_traceback(e)
3961

40-
return {"networks": list(networks.keys())}
62+
return {"network": network, "network_mode": network_mode}
4163

4264

4365
def get_config() -> Config:
@@ -46,6 +68,21 @@ def get_config() -> Config:
4668
key = key.lower()
4769
if not key.startswith("ayon_"):
4870
continue
71+
if key == "ayon_server_url":
72+
# We won't be able to connect if we receive an `AYON_SERVER_URL`
73+
# such as `http://localhost:5000` or `http://ayon-docker_server_1`
74+
# So here we try to resolve it to an actual IP. If we fail, means
75+
# we can't reach the backend at all.
76+
try:
77+
original_value = val
78+
server_hostname = urlparse(val).hostname
79+
server_ip = socket.gethostbyname(server_hostname)
80+
val = val.replace(server_hostname, server_ip)
81+
except Exception as e:
82+
critical_error(
83+
"Unable to resolve `AYON_SERVER_URL` {original_value}"
84+
)
85+
4986
data[key.replace("ayon_", "", 1)] = val
5087
try:
5188
config = Config(**data)
@@ -57,11 +94,12 @@ def get_config() -> Config:
5794

5895
critical_error("Unable to configure API")
5996

60-
local_info = get_local_info()
61-
6297
if config.network is None and config.network_mode is None:
63-
config.network = local_info["networks"][0]
98+
local_info = get_local_info()
99+
config.network = local_info["network"]
100+
config.network_mode = local_info["network_mode"]
64101

102+
logging.debug(f"ASH Config is: {config}")
65103
return config
66104

67105

ash/services.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,23 @@
11
import os
22
import socket
33

4-
PODMAN = os.getenv("AYON_USE_PODMAN")
5-
if PODMAN:
6-
import podman
7-
else:
8-
import docker
94

105
from nxtools import logging, slugify
116

127
from .config import config
8+
from .containers import PODMAN, get_container_client
139
from .models import ServiceConfigModel
1410
from .service_logging import ServiceLogger
1511

1612

1713
class Services:
18-
if PODMAN:
19-
client: podman.PodmanClient | None = None
20-
else:
21-
client: docker.DockerClient | None = None
22-
14+
client = None
2315
prefix: str = "io.ayon.service"
2416

2517
@classmethod
2618
def connect(cls):
27-
if PODMAN:
28-
logging.info("Using container client: 'Podman'")
29-
cls.client = podman.PodmanClient(base_url="unix:///run/user/1000/podman/podman.sock")
30-
logging.info("Done with client")
31-
else:
32-
logging.info("Using container client: 'Docker'")
33-
cls.client = docker.DockerClient(base_url="unix://var/run/docker.sock")
19+
client, _ = get_container_client()
20+
cls.client = client
3421

3522
@classmethod
3623
def get_running_services(cls) -> list[str]:
@@ -154,5 +141,4 @@ def ensure_running(
154141

155142
container = cls.spawn(image, hostname, environment, labels)
156143

157-
# Ensure container logger is running
158144
ServiceLogger.add(service_name, container)

0 commit comments

Comments
 (0)