Skip to content

Commit

Permalink
kubernetes/openshift/knative specified container name support;fix#108…
Browse files Browse the repository at this point in the history
…75 returned;
  • Loading branch information
Yelzhasdev committed Apr 2, 2022
1 parent e30c14f commit ad4d825
Show file tree
Hide file tree
Showing 13 changed files with 277 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.quarkus.kubernetes.deployment;

import io.dekorate.kubernetes.decorator.AddInitContainerDecorator;
import io.dekorate.kubernetes.decorator.AddSidecarDecorator;
import io.dekorate.kubernetes.decorator.ApplicationContainerDecorator;
import io.dekorate.kubernetes.decorator.ApplyImageDecorator;
import io.dekorate.kubernetes.decorator.Decorator;
import io.dekorate.kubernetes.decorator.ResourceProvidingDecorator;
import io.fabric8.kubernetes.api.model.ContainerFluent;

public class ChangeContainerNameDecorator extends ApplicationContainerDecorator<ContainerFluent<?>> {

private final String name;

public ChangeContainerNameDecorator(String name) {
this.name = name;
}

@Override
public void andThenVisit(ContainerFluent<?> containerFluent) {
containerFluent.withName(name);
}

@Override
public Class<? extends Decorator>[] after() {
return new Class[] { ResourceProvidingDecorator.class, AddSidecarDecorator.class, AddInitContainerDecorator.class,
ApplyImageDecorator.class };
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.quarkus.kubernetes.deployment;

import io.dekorate.kubernetes.decorator.*;
import io.dekorate.kubernetes.decorator.AddSidecarDecorator;
import io.dekorate.openshift.decorator.ApplyDeploymentTriggerDecorator;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.openshift.api.model.DeploymentConfigSpecFluent;

public class ChangeContainerNameInDeploymentTriggerDecorator extends NamedResourceDecorator<DeploymentConfigSpecFluent<?>> {

private final String containerName;

public ChangeContainerNameInDeploymentTriggerDecorator(String containerName) {
this.containerName = containerName;
}

@Override
public void andThenVisit(DeploymentConfigSpecFluent<?> deploymentConfigSpecFluent, ObjectMeta objectMeta) {
if (deploymentConfigSpecFluent.hasTriggers()) {
deploymentConfigSpecFluent
.editFirstTrigger()
.editImageChangeParams()
.withContainerNames(containerName)
.endImageChangeParams()
.endTrigger()
.buildTriggers();
}
}

@Override
public Class<? extends Decorator>[] after() {
return new Class[] { ApplyDeploymentTriggerDecorator.class, AddEnvVarDecorator.class, AddPortDecorator.class,
AddMountDecorator.class, AddPvcVolumeDecorator.class, AddAwsElasticBlockStoreVolumeDecorator.class,
AddAzureDiskVolumeDecorator.class, AddAwsElasticBlockStoreVolumeDecorator.class, ApplyImageDecorator.class,
ApplyImagePullPolicyDecorator.class, ApplyWorkingDirDecorator.class, ApplyCommandDecorator.class,
ApplyArgsDecorator.class, ApplyServiceAccountNamedDecorator.class, AddReadinessProbeDecorator.class,
AddLivenessProbeDecorator.class, ApplyApplicationContainerDecorator.class, AddSidecarDecorator.class,
AddInitContainerDecorator.class };
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,12 @@ public class KnativeConfig implements PlatformConfiguration {
@ConfigItem
Map<String, AzureDiskVolumeConfig> azureDiskVolumes;

/**
* If set, it will change the name of the container according to the configuration
*/
@ConfigItem
Optional<String> containerName;

/**
* Init containers
*/
Expand Down Expand Up @@ -264,6 +270,11 @@ public Optional<String> getHost() {
return host;
}

@Override
public Optional<String> getContainerName() {
return containerName;
}

public Map<String, PortConfig> getPorts() {
return ports;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.quarkus.kubernetes.deployment;

import static io.quarkus.kubernetes.deployment.Constants.KNATIVE;
import static io.quarkus.kubernetes.deployment.Constants.KNATIVE_SERVICE;
import static io.quarkus.kubernetes.deployment.Constants.KNATIVE_SERVICE_GROUP;
import static io.quarkus.kubernetes.deployment.Constants.KNATIVE_SERVICE_VERSION;
import static io.quarkus.kubernetes.deployment.Constants.*;
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.DEFAULT_PRIORITY;

import java.util.ArrayList;
Expand Down Expand Up @@ -152,6 +149,9 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
result.add(new DecoratorBuildItem(KNATIVE, new ApplyContainerImageDecorator(name, i.getImage())));
});

config.getContainerName().ifPresent(containerName -> result
.add(new DecoratorBuildItem(KNATIVE, new ChangeContainerNameDecorator(containerName))));

Stream.concat(config.convertToBuildItems().stream(),
envs.stream().filter(e -> e.getTarget() == null || KNATIVE.equals(e.getTarget()))).forEach(e -> {
result.add(new DecoratorBuildItem(KNATIVE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,12 @@ public enum DeploymentResourceKind {
@ConfigItem
SecurityContextConfig securityContext;

/**
* If set, it will change the name of the container according to the configuration
*/
@ConfigItem
Optional<String> containerName;

/**
* Debug configuration to be set in pods.
*/
Expand Down Expand Up @@ -395,6 +401,11 @@ public Optional<String> getHost() {
return host;
}

@Override
public Optional<String> getContainerName() {
return containerName;
}

public Map<String, PortConfig> getPorts() {
return ports;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,12 @@ public static enum DeploymentResourceKind {
@ConfigItem
ResourcesConfig resources;

/**
* If set, it will change the name of the container according to the configuration
*/
@ConfigItem
Optional<String> containerName;

/**
* If true, an Openshift Route will be created
*
Expand Down Expand Up @@ -351,6 +357,11 @@ public Optional<String> getHost() {
return host;
}

@Override
public Optional<String> getContainerName() {
return containerName;
}

public Integer getReplicas() {
return replicas;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@

package io.quarkus.kubernetes.deployment;

import static io.quarkus.kubernetes.deployment.Constants.DEFAULT_HTTP_PORT;
import static io.quarkus.kubernetes.deployment.Constants.DEFAULT_S2I_IMAGE_NAME;
import static io.quarkus.kubernetes.deployment.Constants.HTTP_PORT;
import static io.quarkus.kubernetes.deployment.Constants.OPENSHIFT;
import static io.quarkus.kubernetes.deployment.Constants.OPENSHIFT_APP_RUNTIME;
import static io.quarkus.kubernetes.deployment.Constants.QUARKUS;
import static io.quarkus.kubernetes.deployment.Constants.*;
import static io.quarkus.kubernetes.deployment.OpenshiftConfig.OpenshiftFlavor.v3;
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.DEFAULT_PRIORITY;

Expand Down Expand Up @@ -151,6 +146,7 @@ public List<ConfiguratorBuildItem> createConfigurators(ApplicationInfoBuildItem
image.map(ContainerImageInfoBuildItem::getGroup).ifPresent(g -> {
result.add(new ConfiguratorBuildItem(new ApplyImageGroupConfigurator(g)));
});

}
return result;
}
Expand Down Expand Up @@ -226,6 +222,16 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
image.ifPresent(i -> {
result.add(new DecoratorBuildItem(OPENSHIFT, new ApplyContainerImageDecorator(name, i.getImage())));
});

if (!capabilities.isPresent(Capability.CONTAINER_IMAGE_S2I)) {
result.add(new DecoratorBuildItem(OPENSHIFT, new RemoveDeploymentTriggerDecorator()));
}

config.getContainerName().ifPresent(containerName -> {
result.add(new DecoratorBuildItem(OPENSHIFT, new ChangeContainerNameDecorator(containerName)));
result.add(new DecoratorBuildItem(OPENSHIFT, new ChangeContainerNameInDeploymentTriggerDecorator(containerName)));
});

result.add(new DecoratorBuildItem(OPENSHIFT, new ApplyImagePullPolicyDecorator(name, config.getImagePullPolicy())));
result.add(new DecoratorBuildItem(OPENSHIFT, new AddLabelDecorator(name, OPENSHIFT_APP_RUNTIME, QUARKUS)));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public interface PlatformConfiguration extends EnvVarHolder {

Optional<String> getHost();

Optional<String> getContainerName();

Map<String, PortConfig> getPorts();

ServiceType getServiceType();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,9 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
result.add(new DecoratorBuildItem(KUBERNETES, new RemoveFromMatchingLabelsDecorator(name, Labels.VERSION)));
}

config.getContainerName().ifPresent(containerName -> result
.add(new DecoratorBuildItem(KUBERNETES, new ChangeContainerNameDecorator(containerName))));

// Service handling
result.add(new DecoratorBuildItem(KUBERNETES, new ApplyServiceTypeDecorator(name, config.getServiceType().name())));
if ((config.getServiceType() == ServiceType.NodePort)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.quarkus.it.kubernetes;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.nio.file.Path;
import java.util.List;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.fabric8.knative.serving.v1.Service;
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.quarkus.test.ProdBuildResults;
import io.quarkus.test.ProdModeTestResults;
import io.quarkus.test.QuarkusProdModeTest;

public class KnativeWithSpecifiedContainerNameTest {

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
.withApplicationRoot((jar) -> jar.addClasses(GreetingResource.class))
.setApplicationName("knative-with-specified-container-name")
.setApplicationVersion("0.1-SNAPSHOT")
.withConfigurationResource("knative-with-specified-container-name.properties");

@ProdBuildResults
private ProdModeTestResults prodModeTestResults;

@Test
public void assertGeneratedResources() throws IOException {
Path kubernetesDir = prodModeTestResults.getBuildDir().resolve("kubernetes");
assertThat(kubernetesDir)
.isDirectoryContaining(p -> p.getFileName().endsWith("knative.json"))
.isDirectoryContaining(p -> p.getFileName().endsWith("knative.yml"))
.satisfies(p -> assertThat(p.toFile().listFiles()).hasSize(2));

List<HasMetadata> kubernetesList = DeserializationUtil
.deserializeAsList(kubernetesDir.resolve("knative.yml"));

assertThat(kubernetesList).filteredOn(i -> "Service".equals(i.getKind())).singleElement().satisfies(i -> {
assertThat(i).isInstanceOfSatisfying(Service.class, s -> {
assertThat(s.getSpec()).satisfies(spec -> {
assertThat(s.getMetadata()).satisfies(m -> {
assertThat(m.getName()).isEqualTo("kfoo");
});

assertThat(spec.getTemplate().getSpec().getContainers()).singleElement().satisfies(container -> {
assertThat(container.getName()).isEqualTo("kbar");
});
});
});
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package io.quarkus.it.kubernetes;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;

import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.assertj.core.api.AbstractObjectAssert;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.fabric8.kubernetes.api.model.*;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.openshift.api.model.DeploymentTriggerPolicy;
import io.quarkus.bootstrap.model.AppArtifact;
import io.quarkus.builder.Version;
import io.quarkus.test.ProdBuildResults;
import io.quarkus.test.ProdModeTestResults;
import io.quarkus.test.QuarkusProdModeTest;

public class KubernetesWithSpecifiedContainerNameTest {

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
.withApplicationRoot((jar) -> jar.addClasses(GreetingResource.class))
.setApplicationName("kubernetes-with-specified-container-name")
.setApplicationVersion("0.1-SNAPSHOT")
.withConfigurationResource("kubernetes-with-specified-container-name.properties")
.setForcedDependencies(
Arrays.asList(
new AppArtifact("io.quarkus", "quarkus-kubernetes", Version.getVersion()),
new AppArtifact("io.quarkus", "quarkus-container-image-s2i", Version.getVersion())));

@ProdBuildResults
private ProdModeTestResults prodModeTestResults;

@Test
public void assertGeneratedResources() throws IOException {
Path kubernetesDir = prodModeTestResults.getBuildDir().resolve("kubernetes");
assertThat(kubernetesDir)
.isDirectoryContaining(p -> p.getFileName().endsWith("kubernetes.json"))
.isDirectoryContaining(p -> p.getFileName().endsWith("kubernetes.yml"));

List<HasMetadata> kubernetesList = DeserializationUtil
.deserializeAsList(kubernetesDir.resolve("kubernetes.yml"));
assertThat(kubernetesList.get(0)).isInstanceOfSatisfying(Deployment.class, d -> {
assertThat(d.getMetadata()).satisfies(m -> {
assertThat(m.getName()).isEqualTo("foo");
assertThat(m.getLabels()).contains(entry("app.kubernetes.io/name", "foo"));
});

assertThat(d.getSpec().getTemplate().getSpec().getContainers().get(0))
.satisfies(c -> assertThat(c.getName()).isEqualTo("bar"));
});

List<HasMetadata> openshiftList = DeserializationUtil
.deserializeAsList(kubernetesDir.resolve("openshift.yml"));
assertThat(openshiftList).filteredOn(h -> "DeploymentConfig".equals(h.getKind())).singleElement().satisfies(h -> {
AbstractObjectAssert<?, ?> specAssert = assertThat(h).extracting("spec");
specAssert.extracting("template").extracting("spec").isInstanceOfSatisfying(PodSpec.class,
podSpec -> {
assertThat(podSpec.getContainers()).singleElement().satisfies(container -> {
assertThat(container)
.satisfies(c -> assertThat(c.getName()).isEqualTo("obar"));
});
});

specAssert.extracting("triggers").isInstanceOfSatisfying(Collection.class, c -> {
assertThat(c).singleElement().satisfies(trigger -> {
assertThat(((DeploymentTriggerPolicy) trigger).getImageChangeParams().getContainerNames())
.contains("obar");
});
});

assertThat(h.getMetadata().getName()).isIn("ofoo", "foo", "openjdk-11");
assertThat(h.getMetadata().getLabels()).contains(entry("app.kubernetes.io/name", "ofoo"));
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Configuration file
quarkus.kubernetes.deployment-target=knative
quarkus.knative.name=kfoo
quarkus.knative.container-name=kbar
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
quarkus.kubernetes.deployment-target=kubernetes,openshift

quarkus.application.name=test
quarkus.kubernetes.name=foo
quarkus.kubernetes.container-name=bar

quarkus.openshift.name=ofoo
quarkus.openshift.container-name=obar

quarkus.s2i.name=s2ifoo

0 comments on commit ad4d825

Please sign in to comment.