Skip to content

Commit e474b87

Browse files
authored
fix: Add a mechanism to override auth alongside the image override (#258)
When overriding the image to set up a mirror, the mirror may require different credentials and so we need a mechanism to override the auth credentials too
1 parent c757c2b commit e474b87

2 files changed

Lines changed: 29 additions & 15 deletions

File tree

tempest2-testing-docker/src/main/kotlin/app/cash/tempest2/testing/Containers.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.github.dockerjava.api.command.CreateContainerCmd
88
import com.github.dockerjava.api.command.PullImageResultCallback
99
import com.github.dockerjava.api.command.WaitContainerResultCallback
1010
import com.github.dockerjava.api.exception.NotFoundException
11+
import com.github.dockerjava.api.model.AuthConfig
1112
import com.github.dockerjava.api.model.Frame
1213
import com.github.dockerjava.core.DefaultDockerClientConfig
1314
import com.github.dockerjava.core.DockerClientImpl
@@ -30,9 +31,11 @@ import java.util.concurrent.atomic.AtomicBoolean
3031
*/
3132
data class Container(
3233
val createCmd: CreateContainerCmd.() -> Unit,
33-
val beforeStartHook: (docker: DockerClient, id: String) -> Unit
34+
val beforeStartHook: (docker: DockerClient, id: String) -> Unit,
35+
val authConfig: AuthConfig?
3436
) {
35-
constructor(createCmd: CreateContainerCmd.() -> Unit) : this(createCmd, { _, _ -> })
37+
constructor(createCmd: CreateContainerCmd.() -> Unit) : this(createCmd, { _, _ -> }, null)
38+
constructor(createCmd: CreateContainerCmd.() -> Unit, beforeStartHook: (docker: DockerClient, id: String) -> Unit) : this(createCmd, beforeStartHook, null)
3639
}
3740

3841
/**
@@ -107,6 +110,11 @@ class Composer(private val name: String, private vararg val containers: Containe
107110
val imageParts = image.split(":")
108111
docker.pullImageCmd(imageParts[0])
109112
.withTag(imageParts.getOrElse(1) { "latest" })
113+
.also { pullCmd ->
114+
container.authConfig?.let { authConfig ->
115+
pullCmd.withAuthConfig(authConfig)
116+
}
117+
}
110118
.exec(PullImageResultCallback()).awaitCompletion()
111119
}
112120

tempest2-testing-docker/src/main/kotlin/app/cash/tempest2/testing/DockerDynamoDbServer.kt

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package app.cash.tempest2.testing
1818

1919
import app.cash.tempest2.testing.internal.buildDynamoDb
2020
import app.cash.tempest2.testing.internal.hostName
21+
import com.github.dockerjava.api.model.AuthConfig
2122
import com.github.dockerjava.api.model.ExposedPort
2223
import com.github.dockerjava.api.model.Ports
2324
import com.google.common.util.concurrent.AbstractIdleService
@@ -27,7 +28,8 @@ import software.amazon.awssdk.services.dynamodb.model.DynamoDbException
2728
class DockerDynamoDbServer private constructor(
2829
override val port: Int,
2930
private val onBeforeStartup: () -> Unit,
30-
imageResolver: (String) -> String
31+
imageResolver: (String) -> String,
32+
authProvider: (() -> AuthConfig)?
3133
) : AbstractIdleService(), TestDynamoDbServer {
3234

3335
override val id = "tempest2-docker-dynamodb-local-$port"
@@ -60,17 +62,20 @@ class DockerDynamoDbServer private constructor(
6062

6163
private val composer = Composer(
6264
"e-$id",
63-
Container {
64-
// DynamoDB Local listens on port 8000 by default.
65-
val exposedClientPort = ExposedPort.tcp(8000)
66-
val portBindings = Ports()
67-
portBindings.bind(exposedClientPort, Ports.Binding.bindPort(port))
68-
withImage(resolvedImage)
69-
.withName(id)
70-
.withExposedPorts(exposedClientPort)
71-
.withCmd("-jar", "DynamoDBLocal.jar", "-sharedDb", "-disableTelemetry")
72-
.withPortBindings(portBindings)
73-
}
65+
Container(createCmd = {
66+
// DynamoDB Local listens on port 8000 by default.
67+
val exposedClientPort = ExposedPort.tcp(8000)
68+
val portBindings = Ports()
69+
portBindings.bind(exposedClientPort, Ports.Binding.bindPort(port))
70+
withImage(resolvedImage)
71+
.withName(id)
72+
.withExposedPorts(exposedClientPort)
73+
.withCmd("-jar", "DynamoDBLocal.jar", "-sharedDb", "-disableTelemetry")
74+
.withPortBindings(portBindings)
75+
},
76+
beforeStartHook = { _, _ -> },
77+
authConfig = authProvider?.let { it() },
78+
)
7479
)
7580

7681
object Factory : TestDynamoDbServer.Factory<DockerDynamoDbServer> {
@@ -84,10 +89,11 @@ class DockerDynamoDbServer private constructor(
8489
* ```
8590
*/
8691
var imageResolver: (String) -> String = { it }
92+
var authProvider: (() -> AuthConfig)? = null
8793

8894
override fun hostName(port: Int): String = app.cash.tempest2.testing.internal.hostName(port)
8995
override fun create(port: Int, onBeforeStartup: () -> Unit) =
90-
DockerDynamoDbServer(port, onBeforeStartup, imageResolver)
96+
DockerDynamoDbServer(port, onBeforeStartup, imageResolver, authProvider)
9197
}
9298

9399
companion object {

0 commit comments

Comments
 (0)