1414import threading
1515import time
1616import uuid
17+ from encodings .aliases import aliases
18+
1719import python_on_whales
1820
1921import buildrunner .docker
@@ -66,6 +68,8 @@ def __init__(self, step_runner, step: StepRun):
6668 self ._docker_client = buildrunner .docker .new_client (
6769 timeout = step_runner .build_runner .docker_timeout ,
6870 )
71+ if self .step_runner .network_name and not self ._docker_client .networks (names = [self .step_runner .network_name ]):
72+ self ._docker_client .create_network (self .step_runner .network_name )
6973 self ._source_container = None
7074 self ._service_runners = OrderedDict ()
7175 self ._service_links = {}
@@ -74,6 +78,10 @@ def __init__(self, step_runner, step: StepRun):
7478 self .runner = None
7579 self .images_to_remove = []
7680
81+ def __del__ (self ):
82+ if self .step_runner .network_name and self ._docker_client .networks (names = [self .step_runner .network_name ]):
83+ self ._docker_client .remove_network (self .step_runner .network_name )
84+
7785 def _get_source_container (self ):
7886 """
7987 Get (creating the container if necessary) the container id of the
@@ -84,6 +92,11 @@ def _get_source_container(self):
8492 self .step_runner .build_runner .get_source_image (),
8593 command = "/bin/sh" ,
8694 labels = self .step_runner .container_labels ,
95+ networking_config = self ._docker_client .create_networking_config (
96+ {
97+ self .step_runner .network_name : self ._docker_client .create_endpoint_config ()
98+ }
99+ ) if self .step_runner .network_name else None ,
87100 )["Id" ]
88101 self ._docker_client .start (
89102 self ._source_container ,
@@ -504,7 +517,7 @@ def _start_service_container(self, name, service: Service):
504517 _user = service .user
505518
506519 # determine if a hostname is specified
507- _hostname = service .hostname
520+ _hostname = service .hostname or name
508521
509522 # determine if a dns host is specified
510523 _dns = None
@@ -618,6 +631,7 @@ def _start_service_container(self, name, service: Service):
618631 containers = _containers ,
619632 systemd = systemd ,
620633 systemd_cgroup2 = self .is_systemd_cgroup2 (systemd , service , _image ),
634+ network = self .step_runner .network_name ,
621635 )
622636 self ._service_links [cont_name ] = name
623637
@@ -658,9 +672,17 @@ def wait(self, name, wait_for_data):
658672 """
659673 Wait for listening port on named container
660674 """
661- ipaddr = self ._docker_client .inspect_container (name )["NetworkSettings" ][
662- "IPAddress"
663- ]
675+ network_settings = self ._docker_client .inspect_container (name ).get (
676+ "NetworkSettings" , {}
677+ )
678+ if self .step_runner .network_name :
679+ ipaddr = (
680+ network_settings .get ("Networks" , {})
681+ .get (self .step_runner .network_name , {})
682+ .get ("IPAddress" , None )
683+ )
684+ else :
685+ ipaddr = network_settings .get ("IPAddress" , None )
664686 socket_open = False
665687
666688 if isinstance (wait_for_data , dict ):
@@ -710,6 +732,7 @@ def wait(self, name, wait_for_data):
710732 nc_tester .start (
711733 # The shell is the command
712734 shell = f"-n -z { ipaddr } { port } " ,
735+ network = self .step_runner .network_name ,
713736 )
714737
715738 nc_tester .attach_until_finished ()
@@ -734,12 +757,14 @@ def wait(self, name, wait_for_data):
734757
735758 def _resolve_service_ip (self , service_name ):
736759 """
737- If service_name represents a running service, return it's IP address.
760+ If service_name represents a running service, return its IP address.
738761 Otherwise, return the service_name
739762 """
740763 rval = service_name
741764 if isinstance (service_name , str ) and service_name in self ._service_runners :
742- ipaddr = self ._service_runners [service_name ].get_ip ()
765+ ipaddr = self ._service_runners [service_name ].get_ip (
766+ self .step_runner .network_name
767+ )
743768 if ipaddr is not None :
744769 rval = ipaddr
745770 return rval
@@ -830,6 +855,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
830855 buildrunner_config .global_config .docker_registry ,
831856 self .step_runner .multi_platform ,
832857 self .step_runner .container_labels ,
858+ self .step_runner .network_name ,
833859 )
834860 self ._sshagent .start (
835861 buildrunner_config .get_ssh_keys_from_aliases (
@@ -843,6 +869,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
843869 self .step_runner .log ,
844870 buildrunner_config .global_config .docker_registry ,
845871 self .step_runner .container_labels ,
872+ self .step_runner .network_name ,
846873 )
847874 self ._dockerdaemonproxy .start ()
848875
@@ -1031,6 +1058,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
10311058 container_args ["systemd_cgroup2" ] = self .is_systemd_cgroup2 (
10321059 container_args ["systemd" ], self .step , _run_image
10331060 )
1061+ container_args ["network" ] = self .step_runner .network_name
10341062
10351063 container_id = self .runner .start (
10361064 links = self ._service_links , ** container_args
0 commit comments