1414import threading
1515import time
1616import uuid
17+ from encodings .aliases import aliases
18+
1719import python_on_whales
1820
1921import buildrunner .docker
@@ -66,6 +68,10 @@ 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 (
72+ names = [self .step_runner .network_name ]
73+ ):
74+ self ._docker_client .create_network (self .step_runner .network_name )
6975 self ._source_container = None
7076 self ._service_runners = OrderedDict ()
7177 self ._service_links = {}
@@ -74,6 +80,12 @@ def __init__(self, step_runner, step: StepRun):
7480 self .runner = None
7581 self .images_to_remove = []
7682
83+ def __del__ (self ):
84+ if self .step_runner .network_name and self ._docker_client .networks (
85+ names = [self .step_runner .network_name ]
86+ ):
87+ self ._docker_client .remove_network (self .step_runner .network_name )
88+
7789 def _get_source_container (self ):
7890 """
7991 Get (creating the container if necessary) the container id of the
@@ -84,6 +96,13 @@ def _get_source_container(self):
8496 self .step_runner .build_runner .get_source_image (),
8597 command = "/bin/sh" ,
8698 labels = self .step_runner .container_labels ,
99+ networking_config = self ._docker_client .create_networking_config (
100+ {
101+ self .step_runner .network_name : self ._docker_client .create_endpoint_config ()
102+ }
103+ )
104+ if self .step_runner .network_name
105+ else None ,
87106 )["Id" ]
88107 self ._docker_client .start (
89108 self ._source_container ,
@@ -504,7 +523,7 @@ def _start_service_container(self, name, service: Service):
504523 _user = service .user
505524
506525 # determine if a hostname is specified
507- _hostname = service .hostname
526+ _hostname = service .hostname or name
508527
509528 # determine if a dns host is specified
510529 _dns = None
@@ -618,6 +637,7 @@ def _start_service_container(self, name, service: Service):
618637 containers = _containers ,
619638 systemd = systemd ,
620639 systemd_cgroup2 = self .is_systemd_cgroup2 (systemd , service , _image ),
640+ network = self .step_runner .network_name ,
621641 )
622642 self ._service_links [cont_name ] = name
623643
@@ -658,9 +678,17 @@ def wait(self, name, wait_for_data):
658678 """
659679 Wait for listening port on named container
660680 """
661- ipaddr = self ._docker_client .inspect_container (name )["NetworkSettings" ][
662- "IPAddress"
663- ]
681+ network_settings = self ._docker_client .inspect_container (name ).get (
682+ "NetworkSettings" , {}
683+ )
684+ if self .step_runner .network_name :
685+ ipaddr = (
686+ network_settings .get ("Networks" , {})
687+ .get (self .step_runner .network_name , {})
688+ .get ("IPAddress" , None )
689+ )
690+ else :
691+ ipaddr = network_settings .get ("IPAddress" , None )
664692 socket_open = False
665693
666694 if isinstance (wait_for_data , dict ):
@@ -710,6 +738,7 @@ def wait(self, name, wait_for_data):
710738 nc_tester .start (
711739 # The shell is the command
712740 shell = f"-n -z { ipaddr } { port } " ,
741+ network = self .step_runner .network_name ,
713742 )
714743
715744 nc_tester .attach_until_finished ()
@@ -734,12 +763,14 @@ def wait(self, name, wait_for_data):
734763
735764 def _resolve_service_ip (self , service_name ):
736765 """
737- If service_name represents a running service, return it's IP address.
766+ If service_name represents a running service, return its IP address.
738767 Otherwise, return the service_name
739768 """
740769 rval = service_name
741770 if isinstance (service_name , str ) and service_name in self ._service_runners :
742- ipaddr = self ._service_runners [service_name ].get_ip ()
771+ ipaddr = self ._service_runners [service_name ].get_ip (
772+ self .step_runner .network_name
773+ )
743774 if ipaddr is not None :
744775 rval = ipaddr
745776 return rval
@@ -830,6 +861,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
830861 buildrunner_config .global_config .docker_registry ,
831862 self .step_runner .multi_platform ,
832863 self .step_runner .container_labels ,
864+ self .step_runner .network_name ,
833865 )
834866 self ._sshagent .start (
835867 buildrunner_config .get_ssh_keys_from_aliases (
@@ -843,6 +875,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
843875 self .step_runner .log ,
844876 buildrunner_config .global_config .docker_registry ,
845877 self .step_runner .container_labels ,
878+ self .step_runner .network_name ,
846879 )
847880 self ._dockerdaemonproxy .start ()
848881
@@ -1031,6 +1064,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
10311064 container_args ["systemd_cgroup2" ] = self .is_systemd_cgroup2 (
10321065 container_args ["systemd" ], self .step , _run_image
10331066 )
1067+ container_args ["network" ] = self .step_runner .network_name
10341068
10351069 container_id = self .runner .start (
10361070 links = self ._service_links , ** container_args
0 commit comments