@@ -55,6 +55,7 @@ type TokenAuthServer struct {
5555func EnsureImages (base * testutil.Base ) {
5656 base .Cmd ("pull" , testutil .RegistryImage ).AssertOK ()
5757 base .Cmd ("pull" , testutil .DockerAuthImage ).AssertOK ()
58+ base .Cmd ("pull" , testutil .KuboImage ).AssertOK ()
5859}
5960
6061func NewAuthServer (base * testutil.Base , ca * testca.CA , port int , user , pass string , tls bool ) * TokenAuthServer {
112113 port , err = portlock .Acquire (port )
113114 assert .NilError (base .T , err , fmt .Errorf ("failed acquiring port: %w" , err ))
114115 containerName := fmt .Sprintf ("auth-%s-%d" , name , port )
116+ // Cleanup possible leftovers first
117+ base .Cmd ("rm" , "-f" , containerName ).Run ()
115118
116119 cleanup := func (err error ) {
117120 result := base .Cmd ("rm" , "-f" , containerName ).Run ()
@@ -232,7 +235,78 @@ func (ba *BasicAuth) Params(base *testutil.Base) []string {
232235 return ret
233236}
234237
238+ func NewIPFSRegistry (base * testutil.Base , ca * testca.CA , port int , auth Auth , boundCleanup func (error )) * RegistryServer {
239+ EnsureImages (base )
240+
241+ name := testutil .Identifier (base .T )
242+ // listen on 0.0.0.0 to enable 127.0.0.1
243+ listenIP := net .ParseIP ("0.0.0.0" )
244+ hostIP , err := nettestutil .NonLoopbackIPv4 ()
245+ assert .NilError (base .T , err , fmt .Errorf ("failed finding ipv4 non loopback interface: %w" , err ))
246+ port , err = portlock .Acquire (port )
247+ assert .NilError (base .T , err , fmt .Errorf ("failed acquiring port: %w" , err ))
248+
249+ containerName := fmt .Sprintf ("ipfs-registry-%s-%d" , name , port )
250+ // Cleanup possible leftovers first
251+ base .Cmd ("rm" , "-f" , containerName ).Run ()
252+
253+ args := []string {
254+ "run" ,
255+ "--pull=never" ,
256+ "-d" ,
257+ "-p" , fmt .Sprintf ("%s:%d:%d" , listenIP , port , port ),
258+ "--name" , containerName ,
259+ "--entrypoint=/bin/sh" ,
260+ testutil .KuboImage ,
261+ "-c" , "--" ,
262+ fmt .Sprintf ("ipfs init && ipfs config Addresses.API /ip4/0.0.0.0/tcp/%d && ipfs daemon --offline" , port ),
263+ }
264+
265+ cleanup := func (err error ) {
266+ result := base .Cmd ("rm" , "-f" , containerName ).Run ()
267+ errPortRelease := portlock .Release (port )
268+ if boundCleanup != nil {
269+ boundCleanup (err )
270+ }
271+ if err == nil {
272+ assert .NilError (base .T , result .Error , fmt .Errorf ("failed removing container: %w" , err ))
273+ assert .NilError (base .T , errPortRelease , fmt .Errorf ("failed releasing port: %w" , err ))
274+ }
275+ }
276+
277+ scheme := "http"
278+
279+ err = func () error {
280+ cmd := base .Cmd (args ... ).Run ()
281+ if cmd .Error != nil {
282+ base .T .Logf ("%s:\n %s\n %s\n -------\n %s" , containerName , cmd .Cmd , cmd .Stdout (), cmd .Stderr ())
283+ return cmd .Error
284+ }
285+
286+ if _ , err = nettestutil .HTTPGet (fmt .Sprintf ("%s://%s:%s/api/v0" , scheme , hostIP .String (), strconv .Itoa (port )), 30 , true ); err != nil {
287+ return err
288+ }
289+
290+ return nil
291+ }()
292+
293+ assert .NilError (base .T , err , fmt .Errorf ("failed starting IPFS registry container in a timely manner: %w" , err ))
294+
295+ return & RegistryServer {
296+ IP : hostIP ,
297+ Port : port ,
298+ Scheme : scheme ,
299+ ListenIP : listenIP ,
300+ Cleanup : cleanup ,
301+ Logs : func () {
302+ base .T .Logf ("%s: %q" , containerName , base .Cmd ("logs" , containerName ).Run ().String ())
303+ },
304+ }
305+ }
306+
235307func NewRegistry (base * testutil.Base , ca * testca.CA , port int , auth Auth , boundCleanup func (error )) * RegistryServer {
308+ EnsureImages (base )
309+
236310 name := testutil .Identifier (base .T )
237311 // listen on 0.0.0.0 to enable 127.0.0.1
238312 listenIP := net .ParseIP ("0.0.0.0" )
@@ -242,6 +316,9 @@ func NewRegistry(base *testutil.Base, ca *testca.CA, port int, auth Auth, boundC
242316 assert .NilError (base .T , err , fmt .Errorf ("failed acquiring port: %w" , err ))
243317
244318 containerName := fmt .Sprintf ("registry-%s-%d" , name , port )
319+ // Cleanup possible leftovers first
320+ base .Cmd ("rm" , "-f" , containerName ).Run ()
321+
245322 args := []string {
246323 "run" ,
247324 "--pull=never" ,
@@ -325,8 +402,6 @@ func NewRegistry(base *testutil.Base, ca *testca.CA, port int, auth Auth, boundC
325402 }()
326403
327404 if err != nil {
328- // cs := base.Cmd("inspect", containerName).Run()
329- // base.T.Logf("%s:\n%s\n%s\n=========================\n%s", containerName, cs.Cmd, cs.Stdout(), cs.Stderr())
330405 cl := base .Cmd ("logs" , containerName ).Run ()
331406 base .T .Logf ("%s:\n %s\n %s\n =========================\n %s" , containerName , cl .Cmd , cl .Stdout (), cl .Stderr ())
332407 cleanup (err )
@@ -357,8 +432,6 @@ func NewWithTokenAuth(base *testutil.Base, user, pass string, port int, tls bool
357432}
358433
359434func NewWithNoAuth (base * testutil.Base , port int , tls bool ) * RegistryServer {
360- EnsureImages (base )
361-
362435 var ca * testca.CA
363436 if tls {
364437 ca = testca .New (base .T )
0 commit comments