22import socket
33import sys
44from typing import Literal
5+ from urllib .parse import urlparse
6+
7+ from .containers import PODMAN , get_container_client
58
6- import docker
79import dotenv
8- from nxtools import critical_error , logging
10+ from nxtools import critical_error , logging , log_traceback
911from pydantic import BaseModel , Field , ValidationError
1012
1113logging .user = "ash"
@@ -23,21 +25,41 @@ class Config(BaseModel):
2325
2426
2527def 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
4365def 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
0 commit comments