Skip to content

Commit f53fdcc

Browse files
authored
Merge pull request quarkusio#53191 from chrisruffalo/openshift-image-name-conformity
OpenShift Internal Registry Container Image Name
2 parents 46a255c + eee0a42 commit f53fdcc

4 files changed

Lines changed: 66 additions & 1 deletion

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.quarkus.container.image.openshift.deployment;
2+
3+
import io.dekorate.kubernetes.decorator.NamedResourceDecorator;
4+
import io.fabric8.kubernetes.api.model.ObjectMeta;
5+
import io.fabric8.kubernetes.api.model.ObjectMetaFluent;
6+
7+
/**
8+
* Responsible for finding an ImageStream with the given name and renaming it. This allows
9+
* changing the name of the output image when saving to the internal registry.
10+
*/
11+
public class ApplyImageNameDecorator extends NamedResourceDecorator<ObjectMetaFluent<?>> {
12+
13+
private final String newName;
14+
15+
public ApplyImageNameDecorator(String currentName, String newName) {
16+
super("ImageStream", currentName);
17+
this.newName = newName;
18+
}
19+
20+
@Override
21+
public void andThenVisit(ObjectMetaFluent<?> meta, ObjectMeta resourceMeta) {
22+
meta.withName(newName);
23+
}
24+
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.container.image.openshift.deployment;
2+
3+
import io.dekorate.kubernetes.decorator.NamedResourceDecorator;
4+
import io.fabric8.kubernetes.api.model.ObjectMeta;
5+
import io.fabric8.openshift.api.model.BuildOutputFluent;
6+
7+
/**
8+
* Allows conformity between the configuration and output resources when it comes to the name of the image stream and
9+
* the image stream tag for local openshift builds.
10+
*/
11+
public class ApplyImageStreamNameToBuildConfigDecorator extends NamedResourceDecorator<BuildOutputFluent<?>> {
12+
13+
final String imageStreamName;
14+
final String imageStreamTag;
15+
16+
public ApplyImageStreamNameToBuildConfigDecorator(String buildConfigName, String imageStreamName, String imageStreamTag) {
17+
super(buildConfigName);
18+
this.imageStreamName = imageStreamName;
19+
this.imageStreamTag = imageStreamTag;
20+
}
21+
22+
public void andThenVisit(BuildOutputFluent<?> output, ObjectMeta objectMeta) {
23+
output.withNewTo()
24+
.withKind("ImageStreamTag")
25+
.withName(String.format("%s:%s", imageStreamName, imageStreamTag))
26+
.endTo();
27+
}
28+
}

extensions/container-image/container-image-openshift/deployment/src/main/java/io/quarkus/container/image/openshift/deployment/OpenshiftProcessor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ public void configureExternalRegistry(ApplicationInfoBuildItem applicationInfo,
210210
BuildProducer<DecoratorBuildItem> decorator) {
211211
containerImageInfo.registry.ifPresent(registry -> {
212212
final String name = applicationInfo.getName();
213+
final String imageStreamName = Optional.ofNullable(containerImageInfo.getName()).orElse(name);
213214
final String serviceAccountName = applicationInfo.getName();
214215
String repositoryWithRegistry = registry + "/" + containerImageInfo.getRepository();
215216

@@ -219,7 +220,11 @@ public void configureExternalRegistry(ApplicationInfoBuildItem applicationInfo,
219220
decorator.produce(new DecoratorBuildItem(OPENSHIFT, new ApplyDockerImageOutputToBuildConfigDecorator(
220221
applicationInfo.getName(), containerImageInfo.getImage(), imagePushSecret)));
221222
} else if (registry.contains(OPENSHIFT_INTERNAL_REGISTRY)) {
222-
//no special handling of secrets is really needed.
223+
// when using an internal registry ensure that the build config and image stream
224+
// are in sync with the configuration given in `quarkus.container-image.image` or `quarkus.container-image.name`
225+
decorator.produce(new DecoratorBuildItem(OPENSHIFT, new ApplyImageNameDecorator(name, imageStreamName)));
226+
decorator.produce(new DecoratorBuildItem(OPENSHIFT,
227+
new ApplyImageStreamNameToBuildConfigDecorator(name, imageStreamName, containerImageInfo.getTag())));
223228
} else if (containerImageInfo.username.isPresent() && containerImageInfo.password.isPresent()) {
224229
String imagePushSecret = applicationInfo.getName() + "-push-secret";
225230
decorator.produce(new DecoratorBuildItem(OPENSHIFT,

extensions/container-image/spi/src/main/java/io/quarkus/container/spi/ContainerImageInfoBuildItem.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public final class ContainerImageInfoBuildItem extends SimpleBuildItem {
2323

2424
private final String imagePrefix;
2525
private final String repository;
26+
private final String name;
2627

2728
private final String tag;
2829

@@ -34,6 +35,7 @@ public ContainerImageInfoBuildItem(Optional<String> registry, Optional<String> u
3435
this.username = username;
3536
this.password = password;
3637
this.repository = repository;
38+
this.name = repository.contains(SLASH) ? repository.substring(repository.lastIndexOf(SLASH) + 1) : repository;
3739

3840
StringBuilder sb = new StringBuilder();
3941
registry.ifPresent(r -> sb.append(r).append(SLASH));
@@ -49,6 +51,7 @@ public ContainerImageInfoBuildItem(Optional<String> registry, Optional<String> u
4951
this.registry = registry;
5052
this.username = username;
5153
this.password = password;
54+
this.name = name;
5255

5356
StringBuilder imagePrefixSB = new StringBuilder();
5457
StringBuilder repositorySB = new StringBuilder();
@@ -95,4 +98,8 @@ public String getRepository() {
9598
public String getGroup() {
9699
return repository == null ? null : repository.split("/")[0];
97100
}
101+
102+
public String getName() {
103+
return name;
104+
}
98105
}

0 commit comments

Comments
 (0)