Skip to content

Commit 547badd

Browse files
authored
Merge pull request #10370 from iocanel/dekorate-bump
Knative manifest now uses valid port names
2 parents c84c6fc + 065959f commit 547badd

File tree

7 files changed

+113
-16
lines changed

7 files changed

+113
-16
lines changed

bom/runtime/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
<aws-alexa-sdk.version>2.30.0</aws-alexa-sdk.version>
145145
<azure-functions-java-library.version>1.3.0</azure-functions-java-library.version>
146146
<kotlin.version>1.3.72</kotlin.version>
147-
<dekorate.version>0.12.1</dekorate.version>
147+
<dekorate.version>0.12.3</dekorate.version>
148148
<maven-artifact-transfer.version>0.10.0</maven-artifact-transfer.version>
149149
<jline.version>2.14.6</jline.version>
150150
<maven-invoker.version>3.0.1</maven-invoker.version>

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesProcessor.java

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,49 @@
11
package io.quarkus.kubernetes.deployment;
22

3-
import static io.quarkus.kubernetes.deployment.Constants.*;
4-
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.*;
3+
import static io.quarkus.kubernetes.deployment.Constants.DEFAULT_HTTP_PORT;
4+
import static io.quarkus.kubernetes.deployment.Constants.DEFAULT_S2I_IMAGE_NAME;
5+
import static io.quarkus.kubernetes.deployment.Constants.DEPLOYMENT;
6+
import static io.quarkus.kubernetes.deployment.Constants.DEPLOYMENT_CONFIG;
7+
import static io.quarkus.kubernetes.deployment.Constants.HTTP_PORT;
8+
import static io.quarkus.kubernetes.deployment.Constants.KNATIVE;
9+
import static io.quarkus.kubernetes.deployment.Constants.KUBERNETES;
10+
import static io.quarkus.kubernetes.deployment.Constants.MAX_NODE_PORT_VALUE;
11+
import static io.quarkus.kubernetes.deployment.Constants.MAX_PORT_NUMBER;
12+
import static io.quarkus.kubernetes.deployment.Constants.MINIKUBE;
13+
import static io.quarkus.kubernetes.deployment.Constants.MIN_NODE_PORT_VALUE;
14+
import static io.quarkus.kubernetes.deployment.Constants.MIN_PORT_NUMBER;
15+
import static io.quarkus.kubernetes.deployment.Constants.OPENSHIFT;
16+
import static io.quarkus.kubernetes.deployment.Constants.OPENSHIFT_APP_RUNTIME;
17+
import static io.quarkus.kubernetes.deployment.Constants.QUARKUS;
18+
import static io.quarkus.kubernetes.deployment.Constants.QUARKUS_ANNOTATIONS_BUILD_TIMESTAMP;
19+
import static io.quarkus.kubernetes.deployment.Constants.QUARKUS_ANNOTATIONS_COMMIT_ID;
20+
import static io.quarkus.kubernetes.deployment.Constants.QUARKUS_ANNOTATIONS_VCS_URL;
21+
import static io.quarkus.kubernetes.deployment.Constants.SERVICE;
22+
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.DEFAULT_PRIORITY;
23+
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.VANILLA_KUBERNETES_PRIORITY;
24+
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.mergeList;
525

626
import java.io.File;
727
import java.io.IOException;
828
import java.math.BigInteger;
929
import java.nio.charset.StandardCharsets;
1030
import java.nio.file.Files;
1131
import java.nio.file.Path;
32+
import java.nio.file.Paths;
1233
import java.security.MessageDigest;
1334
import java.time.ZoneOffset;
1435
import java.time.ZonedDateTime;
1536
import java.time.format.DateTimeFormatter;
16-
import java.util.*;
37+
import java.util.ArrayList;
38+
import java.util.Collection;
39+
import java.util.Collections;
40+
import java.util.HashMap;
41+
import java.util.HashSet;
42+
import java.util.LinkedList;
43+
import java.util.List;
44+
import java.util.Map;
45+
import java.util.Optional;
46+
import java.util.Set;
1747
import java.util.stream.Collectors;
1848

1949
import org.jboss.logging.Logger;
@@ -28,7 +58,29 @@
2858
import io.dekorate.kubernetes.config.Label;
2959
import io.dekorate.kubernetes.config.PortBuilder;
3060
import io.dekorate.kubernetes.configurator.AddPort;
31-
import io.dekorate.kubernetes.decorator.*;
61+
import io.dekorate.kubernetes.decorator.AddAnnotationDecorator;
62+
import io.dekorate.kubernetes.decorator.AddAwsElasticBlockStoreVolumeDecorator;
63+
import io.dekorate.kubernetes.decorator.AddAzureDiskVolumeDecorator;
64+
import io.dekorate.kubernetes.decorator.AddAzureFileVolumeDecorator;
65+
import io.dekorate.kubernetes.decorator.AddConfigMapVolumeDecorator;
66+
import io.dekorate.kubernetes.decorator.AddEnvVarDecorator;
67+
import io.dekorate.kubernetes.decorator.AddImagePullSecretDecorator;
68+
import io.dekorate.kubernetes.decorator.AddInitContainerDecorator;
69+
import io.dekorate.kubernetes.decorator.AddLabelDecorator;
70+
import io.dekorate.kubernetes.decorator.AddLivenessProbeDecorator;
71+
import io.dekorate.kubernetes.decorator.AddMountDecorator;
72+
import io.dekorate.kubernetes.decorator.AddPvcVolumeDecorator;
73+
import io.dekorate.kubernetes.decorator.AddReadinessProbeDecorator;
74+
import io.dekorate.kubernetes.decorator.AddRoleBindingResourceDecorator;
75+
import io.dekorate.kubernetes.decorator.AddSecretVolumeDecorator;
76+
import io.dekorate.kubernetes.decorator.AddServiceAccountResourceDecorator;
77+
import io.dekorate.kubernetes.decorator.ApplyArgsDecorator;
78+
import io.dekorate.kubernetes.decorator.ApplyCommandDecorator;
79+
import io.dekorate.kubernetes.decorator.ApplyImagePullPolicyDecorator;
80+
import io.dekorate.kubernetes.decorator.ApplyServiceAccountNamedDecorator;
81+
import io.dekorate.kubernetes.decorator.ApplyWorkingDirDecorator;
82+
import io.dekorate.kubernetes.decorator.RemoveAnnotationDecorator;
83+
import io.dekorate.logger.NoopLogger;
3284
import io.dekorate.processor.SimpleFileReader;
3385
import io.dekorate.processor.SimpleFileWriter;
3486
import io.dekorate.project.BuildInfo;
@@ -224,13 +276,13 @@ public void build(ApplicationInfoBuildItem applicationInfo,
224276
final Map<String, String> generatedResourcesMap;
225277
// by passing false to SimpleFileWriter, we ensure that no files are actually written during this phase
226278
Project project = createProject(applicationInfo, artifactPath);
227-
final SessionWriter sessionWriter = new SimpleFileWriter(root, false);
279+
final SessionWriter sessionWriter = new SimpleFileWriter(project, false);
228280
final SessionReader sessionReader = new SimpleFileReader(
229281
project.getRoot().resolve("src").resolve("main").resolve("kubernetes"), kubernetesDeploymentTargets
230282
.getEntriesSortedByPriority().stream()
231283
.map(EnabledKubernetesDeploymentTargetsBuildItem.Entry::getName).collect(Collectors.toSet()));
232284
sessionWriter.setProject(project);
233-
final Session session = Session.getSession(new io.dekorate.logger.NoopLogger());
285+
final Session session = Session.getSession(new NoopLogger());
234286
session.setWriter(sessionWriter);
235287
session.setReader(sessionReader);
236288

@@ -275,21 +327,24 @@ public void build(ApplicationInfoBuildItem applicationInfo,
275327

276328
List<String> generatedFileNames = new ArrayList<>(generatedResourcesMap.size());
277329
for (Map.Entry<String, String> resourceEntry : generatedResourcesMap.entrySet()) {
278-
String fileName = resourceEntry.getKey().replace(root.toAbsolutePath().toString(), "");
279-
String relativePath = resourceEntry.getKey().replace(root.toAbsolutePath().toString(), KUBERNETES);
330+
Path path = Paths.get(resourceEntry.getKey());
331+
//We need to ignore the config yml
332+
if (!path.toFile().getParentFile().getName().equals("dekorate")) {
333+
continue;
334+
}
335+
String fileName = path.toFile().getName();
336+
Path targetPath = outputTarget.getOutputDirectory().resolve(KUBERNETES).resolve(fileName);
337+
String relativePath = targetPath.toAbsolutePath().toString().replace(root.toAbsolutePath().toString(), "");
280338

339+
resourceEntry.getKey().replace(root.toAbsolutePath().toString(), KUBERNETES);
281340
if (fileName.endsWith(".yml") || fileName.endsWith(".json")) {
282341
String target = fileName.substring(0, fileName.lastIndexOf("."));
283-
if (target.startsWith(File.separator)) {
284-
target = target.substring(1);
285-
}
286-
287342
if (!deploymentTargets.contains(target)) {
288343
continue;
289344
}
290345
}
291346

292-
generatedFileNames.add(fileName.replace("/", ""));
347+
generatedFileNames.add(fileName);
293348
generatedResourceProducer.produce(
294349
new GeneratedFileSystemResourceBuildItem(
295350
// we need to make sure we are only passing the relative path to the build item

integration-tests/kubernetes/quarkus-standard-way/src/test/java/io/quarkus/it/kubernetes/KnativeTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

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

5+
import java.io.IOException;
56
import java.nio.file.Path;
7+
import java.util.List;
68

79
import org.jboss.shrinkwrap.api.ShrinkWrap;
810
import org.jboss.shrinkwrap.api.spec.JavaArchive;
911
import org.junit.jupiter.api.Test;
1012
import org.junit.jupiter.api.extension.RegisterExtension;
1113

14+
import io.fabric8.knative.serving.v1.Service;
15+
import io.fabric8.kubernetes.api.model.HasMetadata;
1216
import io.quarkus.test.ProdBuildResults;
1317
import io.quarkus.test.ProdModeTestResults;
1418
import io.quarkus.test.QuarkusProdModeTest;
@@ -26,11 +30,30 @@ public class KnativeTest {
2630
private ProdModeTestResults prodModeTestResults;
2731

2832
@Test
29-
public void assertGeneratedResources() {
33+
public void assertGeneratedResources() throws IOException {
3034
Path kubernetesDir = prodModeTestResults.getBuildDir().resolve("kubernetes");
3135
assertThat(kubernetesDir)
3236
.isDirectoryContaining(p -> p.getFileName().endsWith("knative.json"))
3337
.isDirectoryContaining(p -> p.getFileName().endsWith("knative.yml"))
3438
.satisfies(p -> assertThat(p.toFile().listFiles()).hasSize(2));
39+
40+
List<HasMetadata> kubernetesList = DeserializationUtil
41+
.deserializeAsList(kubernetesDir.resolve("knative.yml"));
42+
43+
assertThat(kubernetesList).filteredOn(i -> "Service".equals(i.getKind())).hasOnlyOneElementSatisfying(i -> {
44+
assertThat(i).isInstanceOfSatisfying(Service.class, s -> {
45+
assertThat(s.getSpec()).satisfies(spec -> {
46+
assertThat(spec.getTemplate()).satisfies(template -> {
47+
assertThat(template.getSpec()).satisfies(templateSpec -> {
48+
assertThat(templateSpec.getContainers()).hasSize(1).hasOnlyOneElementSatisfying(c -> {
49+
assertThat(c.getPorts()).hasSize(1).hasOnlyOneElementSatisfying(p -> {
50+
assertThat(p.getName()).isEqualTo("http1");
51+
});
52+
});
53+
});
54+
});
55+
});
56+
});
57+
});
3558
}
3659
}

integration-tests/kubernetes/quarkus-standard-way/src/test/java/io/quarkus/it/kubernetes/KubernetesWithApplicationPropertiesTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ public void assertGeneratedResources() throws IOException {
9696

9797
assertThat(kubernetesList).filteredOn(i -> "Ingress".equals(i.getKind())).hasOnlyOneElementSatisfying(i -> {
9898
assertThat(i).isInstanceOfSatisfying(Ingress.class, in -> {
99+
//Check that lables and annotations are also applied to Ingresses (#10260)
100+
assertThat(i.getMetadata()).satisfies(m -> {
101+
assertThat(m.getName()).isEqualTo("test-it");
102+
assertThat(m.getLabels()).contains(entry("foo", "bar"));
103+
assertThat(m.getAnnotations()).contains(entry("bar", "baz"));
104+
});
105+
99106
assertThat(in.getSpec().getRules()).hasOnlyOneElementSatisfying(r -> {
100107
assertThat(r.getHost()).isEqualTo("example.com");
101108
});

integration-tests/kubernetes/quarkus-standard-way/src/test/java/io/quarkus/it/kubernetes/OpenshiftWithApplicationPropertiesTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.fabric8.kubernetes.api.model.HasMetadata;
1717
import io.fabric8.kubernetes.api.model.PodSpec;
1818
import io.fabric8.kubernetes.api.model.Service;
19+
import io.fabric8.openshift.api.model.Route;
1920
import io.quarkus.test.ProdBuildResults;
2021
import io.quarkus.test.ProdModeTestResults;
2122
import io.quarkus.test.QuarkusProdModeTest;
@@ -66,6 +67,15 @@ public void assertGeneratedResources() throws IOException {
6667
});
6768
});
6869

69-
assertThat(openshiftList).filteredOn(h -> "Route".equals(h.getKind())).hasSize(1);
70+
assertThat(openshiftList).filteredOn(i -> "Route".equals(i.getKind())).hasOnlyOneElementSatisfying(i -> {
71+
assertThat(i).isInstanceOfSatisfying(Route.class, in -> {
72+
//Check that lables and annotations are also applied to Routes (#10260)
73+
assertThat(i.getMetadata()).satisfies(m -> {
74+
assertThat(m.getName()).isEqualTo("test-it");
75+
assertThat(m.getLabels()).contains(entry("foo", "bar"));
76+
assertThat(m.getAnnotations()).contains(entry("bar", "baz"));
77+
});
78+
});
79+
});
7080
}
7181
}

integration-tests/kubernetes/quarkus-standard-way/src/test/resources/kubernetes-with-application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
quarkus.http.port=9090
22
quarkus.kubernetes.name=test-it
33
quarkus.kubernetes.labels.foo=bar
4+
quarkus.kubernetes.annotations.bar=baz
45
quarkus.kubernetes.env-vars.my-env-var.value=SOMEVALUE
56
quarkus.kubernetes.env-vars.my-name.field=metadata.name
67
quarkus.container-image.group=grp

integration-tests/kubernetes/quarkus-standard-way/src/test/resources/openshift-with-application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ quarkus.http.port=9090
22
quarkus.kubernetes.deployment-target=openshift
33
quarkus.openshift.name=test-it
44
quarkus.openshift.labels.foo=bar
5+
quarkus.openshift.annotations.bar=baz
56
quarkus.openshift.env-vars.my-env-var.value=SOMEVALUE
67
quarkus.openshift.group=grp
78
quarkus.openshift.expose=true

0 commit comments

Comments
 (0)