Skip to content

Commit 55d9d4f

Browse files
committed
Fix #35098: support imagePullPolicy in Docker
1 parent 3526698 commit 55d9d4f

14 files changed

Lines changed: 47 additions & 23 deletions

File tree

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/CaddyConfig.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class CaddyConfig(private val dockerClient: DockerClient, mainDataDir: Path, con
5252
private val dataDir: Path = mainDataDir.resolve(containerName)
5353
private val shinyProxies = mutableMapOf<String, Pair<ShinyProxy, ShinyProxyInstance>>()
5454
private val craneServers = hashMapOf<String, CraneServer>()
55-
private val dockerActions = DockerActions(dockerClient)
55+
private val dockerActions = DockerActions(dockerClient, config)
5656
private val logger = KotlinLogging.logger {}
5757
private val objectMapper = ObjectMapper()
5858
private val yamlMapper = ObjectMapper(YAMLFactory())
@@ -275,7 +275,7 @@ class CaddyConfig(private val dockerClient: DockerClient, mainDataDir: Path, con
275275
var containerId = dockerActions.getContainerByName(containerName)?.id()
276276
if (containerId == null) {
277277
logger.info { "[Caddy] Pulling image" }
278-
dockerClient.pull(caddyImage)
278+
dockerActions.pullImage(caddyImage)
279279

280280
val ports = if (enableTls) listOf("80", "443") else listOf("80")
281281
val hostConfig = HostConfig.builder()

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/CraneConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class CraneConfig(private val dockerClient: DockerClient,
9191
if (containerId == null) {
9292
logger.info { "${logPrefix(shinyProxyInstance)} [Crane] Pulling image" }
9393
val image = getImage(spec)
94-
dockerClient.pull(image)
94+
dockerActions.pullImage(image)
9595

9696
val suffix = RandomStringUtils.randomAlphanumeric(10)
9797
val containerName = "sp-crane-${shinyProxyInstance.realmId}-${hash}-${suffix}"

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/DockerActions.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
package eu.openanalytics.shinyproxyoperator.impl.docker
2222

23+
import eu.openanalytics.shinyproxyoperator.Config
2324
import eu.openanalytics.shinyproxyoperator.LabelFactory
2425
import eu.openanalytics.shinyproxyoperator.LabelFactory.APP_LABEL
2526
import eu.openanalytics.shinyproxyoperator.LabelFactory.REALM_ID_LABEL
@@ -31,12 +32,14 @@ import io.github.oshai.kotlinlogging.KotlinLogging
3132
import org.mandas.docker.client.DockerClient
3233
import org.mandas.docker.client.exceptions.ContainerNotFoundException
3334
import org.mandas.docker.client.exceptions.NetworkNotFoundException
35+
import org.mandas.docker.client.exceptions.NotFoundException
3436
import org.mandas.docker.client.messages.Container
3537
import org.mandas.docker.client.messages.NetworkConfig
3638

37-
class DockerActions(private val dockerClient: DockerClient) {
39+
class DockerActions(private val dockerClient: DockerClient, config: Config) {
3840

3941
private val logger = KotlinLogging.logger {}
42+
private val imagePullPolicy = config.readConfigValue("Always", "SPO_IMAGE_PULL_POLICY") { it }
4043

4144
fun networkExists(name: String): Boolean {
4245
try {
@@ -181,4 +184,26 @@ class DockerActions(private val dockerClient: DockerClient) {
181184
return labels
182185
}
183186

187+
/**
188+
* Pulls a docker image, respecting the given pull policy.
189+
*/
190+
fun pullImage(image: String, imagePullPolicy: String) {
191+
if (imagePullPolicy.equals("Always", true) || (imagePullPolicy.equals("IfNotPresent", true) && !isImagePresent(image))) {
192+
dockerClient.pull(image)
193+
}
194+
}
195+
196+
fun pullImage(image: String) {
197+
pullImage(image, imagePullPolicy)
198+
}
199+
200+
fun isImagePresent(image: String): Boolean {
201+
try {
202+
dockerClient.inspectImage(image)
203+
return true
204+
} catch (_: NotFoundException) {
205+
return false
206+
}
207+
}
208+
184209
}

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/DockerOrchestrator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
102102
.build()
103103
dataDirUid = getDatadirUId()
104104
caddyConfig = CaddyConfig(dockerClient, dataDir, config)
105-
dockerActions = DockerActions(dockerClient)
105+
dockerActions = DockerActions(dockerClient, config)
106106
shinyProxyReadyChecker = ShinyProxyReadyChecker(channel, dockerActions, dockerClient, dataDir)
107107
redisConfig = RedisConfig(dockerClient, dockerActions, persistentState, dataDir, dataDirUid, config)
108108
craneConfig = CraneConfig(dockerClient, dockerActions, dataDir, inputDir, redisConfig, caddyConfig, persistentState, dataDirUid)
@@ -177,7 +177,7 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
177177
}
178178

179179
logger.info { "${logPrefix(shinyProxyInstance)} [Docker] Pulling image" }
180-
dockerClient.pull(shinyProxy.image)
180+
dockerActions.pullImage(shinyProxy.image, shinyProxy.imagePullPolicy)
181181

182182
val version = if (shinyProxyInstance.hashOfSpec == shinyProxy.hashOfCurrentSpec) {
183183
System.currentTimeMillis()

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/RedisConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class RedisConfig(private val dockerClient: DockerClient,
7676
fileManager.createDirectories(dataDir.resolve("data"))
7777
}
7878
logger.info { "[Redis] Pulling image" }
79-
dockerClient.pull(redisImage)
79+
dockerActions.pullImage(redisImage)
8080

8181
withContext(Dispatchers.IO) {
8282
fileManager.writeFile(dataDir.resolve("redis.conf"),

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/CAdvisorConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CAdvisorConfig(private val dockerClient: DockerClient, private val dockerA
4343
logger.info { "[cAdvisor] Reconciling" }
4444
dockerActions.stopAndRemoveContainer(containerName)
4545
logger.info { "[cAdvisor] Pulling image" }
46-
dockerClient.pull(cAdvisorImage)
46+
dockerActions.pullImage(cAdvisorImage)
4747

4848
val hostConfig = HostConfig.builder()
4949
.networkMode(DockerOrchestrator.SHARED_NETWORK_NAME)

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/GrafanaConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class GrafanaConfig(private val dockerClient: DockerClient, private val dockerAc
8181
logger.info { "[Grafana] Reconciling" }
8282
dockerActions.stopAndRemoveContainer(containerName)
8383
logger.info { "${logPrefix(shinyProxy)} [Grafana] Pulling image" }
84-
dockerClient.pull(grafanaImage)
84+
dockerActions.pullImage(grafanaImage)
8585

8686
val hostConfig = HostConfig.builder()
8787
.networkMode(DockerOrchestrator.SHARED_NETWORK_NAME)

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/GrafanaLokiConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class GrafanaLokiConfig(private val dockerClient: DockerClient,
5757
logger.info { "[Grafana Loki] Reconciling" }
5858
dockerActions.stopAndRemoveContainer(containerName)
5959
logger.info { "[Grafana Loki] Pulling image" }
60-
dockerClient.pull(lokiImage)
60+
dockerActions.pullImage(lokiImage)
6161

6262
val hostConfig = HostConfig.builder()
6363
.networkMode(DockerOrchestrator.SHARED_NETWORK_NAME)

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/PrometheusConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class PrometheusConfig(private val dockerClient: DockerClient,
5858
logger.info { "[Prometheus] Reconciling" }
5959
dockerActions.stopAndRemoveContainer(containerName)
6060
logger.info { "[Prometheus] Pulling image" }
61-
dockerClient.pull(prometheusImage)
61+
dockerActions.pullImage(prometheusImage)
6262

6363
val hostConfig = HostConfig.builder()
6464
.networkMode(DockerOrchestrator.SHARED_NETWORK_NAME)

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/kubernetes/ShinyProxy.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,6 @@ fun ShinyProxy.getAntiAffinityTopologyKey(): String {
5959
return "kubernetes.io/hostname"
6060
}
6161

62-
fun ShinyProxy.getImagePullPolicy(): String {
63-
if (getSpec().get("imagePullPolicy")?.isTextual == true) {
64-
return getSpec().get("imagePullPolicy").textValue()
65-
}
66-
return "Always"
67-
}
68-
6962
fun ShinyProxy.getParsedServicePatches(): JsonPatch? {
7063
if (getSpec().get("kubernetesServicePatches")?.isTextual == true) {
7164
try {

0 commit comments

Comments
 (0)