1414import threading
1515import time
1616import uuid
17+
1718import python_on_whales
1819
1920import buildrunner .docker
@@ -66,6 +67,10 @@ def __init__(self, step_runner, step: StepRun):
6667 self ._docker_client = buildrunner .docker .new_client (
6768 timeout = step_runner .build_runner .docker_timeout ,
6869 )
70+ if self .step_runner .network_name and not self ._docker_client .networks (
71+ names = [self .step_runner .network_name ]
72+ ):
73+ self ._docker_client .create_network (self .step_runner .network_name )
6974 self ._source_container = None
7075 self ._service_runners = OrderedDict ()
7176 self ._service_links = {}
@@ -74,6 +79,12 @@ def __init__(self, step_runner, step: StepRun):
7479 self .runner = None
7580 self .images_to_remove = []
7681
82+ def __del__ (self ):
83+ if self .step_runner .network_name and self ._docker_client .networks (
84+ names = [self .step_runner .network_name ]
85+ ):
86+ self ._docker_client .remove_network (self .step_runner .network_name )
87+
7788 def _get_source_container (self ):
7889 """
7990 Get (creating the container if necessary) the container id of the
@@ -84,6 +95,13 @@ def _get_source_container(self):
8495 self .step_runner .build_runner .get_source_image (),
8596 command = "/bin/sh" ,
8697 labels = self .step_runner .container_labels ,
98+ networking_config = self ._docker_client .create_networking_config (
99+ {
100+ self .step_runner .network_name : self ._docker_client .create_endpoint_config ()
101+ }
102+ )
103+ if self .step_runner .network_name
104+ else None ,
87105 )["Id" ]
88106 self ._docker_client .start (
89107 self ._source_container ,
@@ -504,7 +522,7 @@ def _start_service_container(self, name, service: Service):
504522 _user = service .user
505523
506524 # determine if a hostname is specified
507- _hostname = service .hostname
525+ _hostname = service .hostname or name
508526
509527 # determine if a dns host is specified
510528 _dns = None
@@ -618,6 +636,7 @@ def _start_service_container(self, name, service: Service):
618636 containers = _containers ,
619637 systemd = systemd ,
620638 systemd_cgroup2 = self .is_systemd_cgroup2 (systemd , service , _image ),
639+ network = self .step_runner .network_name ,
621640 )
622641 self ._service_links [cont_name ] = name
623642
@@ -658,9 +677,17 @@ def wait(self, name, wait_for_data):
658677 """
659678 Wait for listening port on named container
660679 """
661- ipaddr = self ._docker_client .inspect_container (name )["NetworkSettings" ][
662- "IPAddress"
663- ]
680+ network_settings = self ._docker_client .inspect_container (name ).get (
681+ "NetworkSettings" , {}
682+ )
683+ if self .step_runner .network_name :
684+ ipaddr = (
685+ network_settings .get ("Networks" , {})
686+ .get (self .step_runner .network_name , {})
687+ .get ("IPAddress" , None )
688+ )
689+ else :
690+ ipaddr = network_settings .get ("IPAddress" , None )
664691 socket_open = False
665692
666693 if isinstance (wait_for_data , dict ):
@@ -710,6 +737,7 @@ def wait(self, name, wait_for_data):
710737 nc_tester .start (
711738 # The shell is the command
712739 shell = f"-n -z { ipaddr } { port } " ,
740+ network = self .step_runner .network_name ,
713741 )
714742
715743 nc_tester .attach_until_finished ()
@@ -734,12 +762,14 @@ def wait(self, name, wait_for_data):
734762
735763 def _resolve_service_ip (self , service_name ):
736764 """
737- If service_name represents a running service, return it's IP address.
765+ If service_name represents a running service, return its IP address.
738766 Otherwise, return the service_name
739767 """
740768 rval = service_name
741769 if isinstance (service_name , str ) and service_name in self ._service_runners :
742- ipaddr = self ._service_runners [service_name ].get_ip ()
770+ ipaddr = self ._service_runners [service_name ].get_ip (
771+ self .step_runner .network_name
772+ )
743773 if ipaddr is not None :
744774 rval = ipaddr
745775 return rval
@@ -830,6 +860,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
830860 buildrunner_config .global_config .docker_registry ,
831861 self .step_runner .multi_platform ,
832862 self .step_runner .container_labels ,
863+ self .step_runner .network_name ,
833864 )
834865 self ._sshagent .start (
835866 buildrunner_config .get_ssh_keys_from_aliases (
@@ -843,6 +874,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
843874 self .step_runner .log ,
844875 buildrunner_config .global_config .docker_registry ,
845876 self .step_runner .container_labels ,
877+ self .step_runner .network_name ,
846878 )
847879 self ._dockerdaemonproxy .start ()
848880
@@ -1031,6 +1063,7 @@ def run(self, context: dict): # pylint: disable=too-many-statements,too-many-br
10311063 container_args ["systemd_cgroup2" ] = self .is_systemd_cgroup2 (
10321064 container_args ["systemd" ], self .step , _run_image
10331065 )
1066+ container_args ["network" ] = self .step_runner .network_name
10341067
10351068 container_id = self .runner .start (
10361069 links = self ._service_links , ** container_args
0 commit comments