1
1
use std:: { fmt, net:: IpAddr , pin:: Pin , str:: FromStr , sync:: Arc , time:: Duration } ;
2
2
3
+ use bollard:: models:: { EndpointSettings , NetworkConnectRequest , NetworkDisconnectRequest } ;
3
4
use tokio:: io:: { AsyncBufRead , AsyncReadExt } ;
4
5
use tokio_stream:: StreamExt ;
5
6
@@ -8,7 +9,7 @@ use crate::{
8
9
async_drop,
9
10
client:: Client ,
10
11
env,
11
- error:: { ContainerMissingInfo , ExecError , Result , TestcontainersError } ,
12
+ error:: { ClientError , ContainerMissingInfo , ExecError , Result , TestcontainersError } ,
12
13
network:: Network ,
13
14
ports:: Ports ,
14
15
wait:: WaitStrategy ,
59
60
network : Option < Arc < Network > > ,
60
61
) -> Result < ContainerAsync < I > > {
61
62
let ready_conditions = container_req. ready_conditions ( ) ;
62
- let container = Self :: construct ( id, docker_client, container_req, network) ;
63
+ let mut container = Self :: construct ( id, docker_client, container_req, network. clone ( ) ) ;
64
+ container. connect ( network) . await ?;
65
+
63
66
let state = ContainerState :: from_container ( & container) . await ?;
64
67
for cmd in container. image ( ) . exec_before_ready ( state) ? {
65
68
container. exec ( cmd) . await ?;
68
71
Ok ( container)
69
72
}
70
73
74
+ pub async fn connect ( & mut self , net : Option < Arc < Network > > ) -> Result < ( ) > {
75
+ let container_id = self . id ( ) . into ( ) ;
76
+ let net = if let Some ( net) = net {
77
+ net
78
+ } else {
79
+ return Ok ( ( ) ) ;
80
+ } ;
81
+
82
+ let net_aliases_vec = net. aliases . clone ( ) . into_iter ( ) . collect ( ) ;
83
+ let endpoint_settings = EndpointSettings {
84
+ aliases : Some ( net_aliases_vec) ,
85
+ ..Default :: default ( )
86
+ } ;
87
+
88
+ let bollard_netword_connect_request = NetworkConnectRequest {
89
+ container : Some ( container_id) ,
90
+ endpoint_config : Some ( endpoint_settings) ,
91
+ } ;
92
+ self . docker_client
93
+ . bollard
94
+ . connect_network ( & net. name , bollard_netword_connect_request)
95
+ . await
96
+ . map_err ( |err| TestcontainersError :: Client ( ClientError :: ConnectionError ( err) ) ) ?;
97
+
98
+ Ok ( ( ) )
99
+ }
100
+
101
+ pub async fn disconnect ( & mut self , name : & str ) -> Result < ( ) > {
102
+ let container_id = self . id ( ) . into ( ) ;
103
+ let network_disconnect_request = NetworkDisconnectRequest {
104
+ container : Some ( container_id) ,
105
+ force : Some ( false ) ,
106
+ } ;
107
+ self . docker_client
108
+ . bollard
109
+ . disconnect_network ( name, network_disconnect_request)
110
+ . await
111
+ . map_err ( |err| TestcontainersError :: Client ( ClientError :: DisconnectionError ( err) ) ) ?;
112
+
113
+ Ok ( ( ) )
114
+ }
115
+
116
+ pub async fn force_disconnect ( & mut self , name : & str ) -> Result < ( ) > {
117
+ let container_id = self . id ( ) . into ( ) ;
118
+ let network_disconnect_request = NetworkDisconnectRequest {
119
+ container : Some ( container_id) ,
120
+ force : Some ( true ) ,
121
+ } ;
122
+ self . docker_client
123
+ . bollard
124
+ . disconnect_network ( name, network_disconnect_request)
125
+ . await
126
+ . map_err ( |err| TestcontainersError :: Client ( ClientError :: DisconnectionError ( err) ) ) ?;
127
+
128
+ Ok ( ( ) )
129
+ }
130
+
71
131
pub ( crate ) fn construct (
72
132
id : String ,
73
133
docker_client : Arc < Client > ,
@@ -221,7 +281,7 @@ where
221
281
cmd_ready_condition,
222
282
} = cmd;
223
283
224
- log:: debug!( "Executing command {:?}" , cmd ) ;
284
+ log:: debug!( "Executing command {cmd :?}" , ) ;
225
285
226
286
let mut exec = self . docker_client . exec ( & self . id , cmd) . await ?;
227
287
self . block_until_ready ( container_ready_conditions) . await ?;
@@ -442,7 +502,7 @@ where
442
502
match command {
443
503
env:: Command :: Remove => {
444
504
if let Err ( e) = client. rm ( & id) . await {
445
- log:: error!( "Failed to remove container on drop: {}" , e ) ;
505
+ log:: error!( "Failed to remove container on drop: {e}" ) ;
446
506
}
447
507
}
448
508
env:: Command :: Keep => { }
@@ -573,7 +633,7 @@ mod tests {
573
633
while let Some ( result) = stderr_lines. next_line ( ) . await . transpose ( ) {
574
634
match result {
575
635
Ok ( line) => {
576
- log:: debug!( target: "container" , "[{container_id}]:{}" , line ) ;
636
+ log:: debug!( target: "container" , "[{container_id}]:{line}" ) ;
577
637
}
578
638
Err ( err) if err. kind ( ) == std:: io:: ErrorKind :: UnexpectedEof => {
579
639
log:: debug!( target: "container" , "[{container_id}] EOF" ) ;
0 commit comments