Skip to content

Commit e16f208

Browse files
authored
review(crd-generator): process generated CRDs before they are written out
Signed-off-by: Marc Nuri <[email protected]>
1 parent e85a808 commit e16f208

File tree

4 files changed

+29
-57
lines changed

4 files changed

+29
-57
lines changed

CHANGELOG.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
* Fix #6892: rolling().restart() doesn't remove preexistent pod template annotations
77

88
#### Improvements
9-
109
* Fix #6863: ensuring SerialExecutor does not throw RejectedExecutionException to prevent unnecessary error logs
1110
* Fix #6763: (crd-generator) YAML output customization
1211

1312
#### Dependency Upgrade
1413

1514
#### New Features
16-
17-
* Fix #6827: Add CRDPostProcessor to process generated CRDs before they are written out
15+
* Fix #6827: (crd-generator) Add CRDPostProcessor to process generated CRDs before they are written out
1816

1917
#### _**Note**_: Breaking changes
2018

crd-generator/api-v2/src/main/java/io/fabric8/crdv2/generator/CRDGenerator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848
public class CRDGenerator {
4949

5050
private static final Logger LOGGER = LoggerFactory.getLogger(CRDGenerator.class);
51-
private static final CRDPostProcessor nullProcessor = new CRDPostProcessor() {
52-
};
5351
private final Map<String, AbstractCustomResourceHandler> handlers = new HashMap<>(2);
5452
private CRDOutput<? extends OutputStream> output;
5553
private boolean parallel;
@@ -58,7 +56,7 @@ public class CRDGenerator {
5856
private KubernetesSerialization kubernetesSerialization;
5957
private Map<String, CustomResourceInfo> infos;
6058
private boolean minQuotes = false;
61-
private CRDPostProcessor postProcessor = nullProcessor;
59+
private CRDPostProcessor postProcessor = CRDPostProcessor.nullProcessor;
6260

6361
public CRDGenerator inOutputDir(File outputDir) {
6462
return withOutput(new DirCRDOutput(outputDir));

crd-generator/api-v2/src/main/java/io/fabric8/crdv2/generator/CRDPostProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919

2020
public interface CRDPostProcessor {
2121

22+
CRDPostProcessor nullProcessor = new CRDPostProcessor() {
23+
};
24+
2225
/**
2326
* Processes the specified CRD (passed as {@link HasMetadata} to be able to handle multiple versions of the CRD spec) after
2427
* they are generated but before they are written out

crd-generator/api-v2/src/test/java/io/fabric8/crdv2/generator/CRDGeneratorTest.java

Lines changed: 24 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,20 @@
4141
import io.fabric8.kubernetes.client.utils.KubernetesSerialization;
4242
import io.fabric8.kubernetes.client.utils.Serialization;
4343
import io.fabric8.kubernetes.model.Scope;
44+
import org.junit.jupiter.api.BeforeEach;
4445
import org.junit.jupiter.api.RepeatedTest;
4546
import org.junit.jupiter.api.Test;
47+
import org.junit.jupiter.api.io.TempDir;
4648
import org.opentest4j.AssertionFailedError;
4749
import org.slf4j.Logger;
4850
import org.slf4j.LoggerFactory;
4951

5052
import java.io.ByteArrayInputStream;
5153
import java.io.ByteArrayOutputStream;
5254
import java.io.File;
53-
import java.io.FileInputStream;
5455
import java.net.URL;
5556
import java.nio.file.Files;
57+
import java.nio.file.Path;
5658
import java.util.ArrayList;
5759
import java.util.Collection;
5860
import java.util.List;
@@ -61,6 +63,7 @@
6163
import java.util.concurrent.ConcurrentHashMap;
6264

6365
import static io.fabric8.crdv2.generator.CRDGeneratorAssertions.assertFileEquals;
66+
import static org.assertj.core.api.Assertions.assertThat;
6467
import static org.junit.jupiter.api.Assertions.assertEquals;
6568
import static org.junit.jupiter.api.Assertions.assertFalse;
6669
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -70,8 +73,15 @@
7073

7174
class CRDGeneratorTest {
7275

73-
private final TestCRDOutput output = new TestCRDOutput();
7476
protected boolean parallelCRDGeneration;
77+
@TempDir
78+
private File tempDir;
79+
private TestCRDOutput output;
80+
81+
@BeforeEach
82+
void setUp() {
83+
output = new TestCRDOutput();
84+
}
7585

7686
@Test
7787
void choosingCRDVersionsShouldWork() {
@@ -458,12 +468,11 @@ void checkCRDGenerator() {
458468
}
459469

460470
@Test
461-
void checkGenerationIsDeterministic() throws Exception {
471+
void checkGenerationIsDeterministic() {
462472
// generated CRD
463-
final File outputDir = Files.createTempDirectory("crd-").toFile();
464473
final String crdName = CustomResourceInfo.fromClass(Complex.class).crdName();
465474
final CRDGenerationInfo crdInfo = newCRDGenerator()
466-
.inOutputDir(outputDir)
475+
.inOutputDir(tempDir)
467476
.forCRDVersions("v1")
468477
.customResourceClasses(Complex.class)
469478
.detailedGenerate();
@@ -475,37 +484,27 @@ void checkGenerationIsDeterministic() throws Exception {
475484
assertNotNull(crdResource);
476485
final File expectedCrdFile = new File(crdResource.getFile());
477486
assertFileEquals(expectedCrdFile, crdFile);
478-
479-
// only delete the generated files if the test is successful
480-
assertTrue(crdFile.delete());
481-
assertTrue(outputDir.delete());
482487
}
483488

484489
@Test
485490
void checkMinQuotesDefault() throws Exception {
486-
final File outputDir = Files.createTempDirectory("crd-").toFile();
487491
final String crdName = CustomResourceInfo.fromClass(Complex.class).crdName();
488492
CRDGenerationInfo crdInfo = newCRDGenerator()
489-
.inOutputDir(outputDir)
493+
.inOutputDir(tempDir)
490494
.forCRDVersions("v1")
491495
.customResourceClasses(Complex.class)
492496
.detailedGenerate();
493497

494498
File crdFile = new File(crdInfo.getCRDInfos(crdName).get("v1").getFilePath());
495499
String crd = Files.readString(crdFile.toPath());
496500
assertTrue(crd.contains("\"complexkinds.example.com\""));
497-
498-
// only delete the generated files if the test is successful
499-
assertTrue(crdFile.delete());
500-
assertTrue(outputDir.delete());
501501
}
502502

503503
@Test
504504
void checkMinQuotesFalse() throws Exception {
505-
final File outputDir = Files.createTempDirectory("crd-").toFile();
506505
final String crdName = CustomResourceInfo.fromClass(Complex.class).crdName();
507506
CRDGenerationInfo crdInfo = newCRDGenerator()
508-
.inOutputDir(outputDir)
507+
.inOutputDir(tempDir)
509508
.forCRDVersions("v1")
510509
.customResourceClasses(Complex.class)
511510
.withMinQuotes(false)
@@ -514,18 +513,13 @@ void checkMinQuotesFalse() throws Exception {
514513
File crdFile = new File(crdInfo.getCRDInfos(crdName).get("v1").getFilePath());
515514
String crd = Files.readString(crdFile.toPath());
516515
assertTrue(crd.contains("\"complexkinds.example.com\""));
517-
518-
// only delete the generated files if the test is successful
519-
assertTrue(crdFile.delete());
520-
assertTrue(outputDir.delete());
521516
}
522517

523518
@Test
524519
void checkMinQuotesTrue() throws Exception {
525-
final File outputDir = Files.createTempDirectory("crd-").toFile();
526520
final String crdName = CustomResourceInfo.fromClass(Complex.class).crdName();
527521
CRDGenerationInfo crdInfo = newCRDGenerator()
528-
.inOutputDir(outputDir)
522+
.inOutputDir(tempDir)
529523
.forCRDVersions("v1")
530524
.customResourceClasses(Complex.class)
531525
.withMinQuotes(true)
@@ -535,23 +529,18 @@ void checkMinQuotesTrue() throws Exception {
535529
String crd = Files.readString(crdFile.toPath());
536530
assertTrue(crd.contains("complexkinds.example.com"));
537531
assertFalse(crd.contains("\"complexkinds.example.com\""));
538-
539-
// only delete the generated files if the test is successful
540-
assertTrue(crdFile.delete());
541-
assertTrue(outputDir.delete());
542532
}
543533

544534
@RepeatedTest(value = 10)
545535
void checkGenerationMultipleVersionsOfCRDsIsDeterministic() throws Exception {
546536
// generated CRD
547-
final File outputDir = Files.createTempDirectory("crd-").toFile();
548537
final CustomResourceInfo infoV1 = CustomResourceInfo.fromClass(Multiple.class);
549538
final CustomResourceInfo infoV2 = CustomResourceInfo.fromClass(io.fabric8.crdv2.example.multiple.v2.Multiple.class);
550539
assertEquals(infoV1.crdName(), infoV2.crdName());
551540
final String crdName = infoV1.crdName();
552541

553542
final CRDGenerationInfo crdInfo = newCRDGenerator()
554-
.inOutputDir(outputDir)
543+
.inOutputDir(tempDir)
555544
.customResourceClasses(Multiple.class,
556545
io.fabric8.crdv2.example.multiple.v2.Multiple.class)
557546
.forCRDVersions("v1")
@@ -565,20 +554,15 @@ void checkGenerationMultipleVersionsOfCRDsIsDeterministic() throws Exception {
565554

566555
final File expectedCrdFile = new File(crdResource.getFile());
567556
assertFileEquals(expectedCrdFile, crdFile);
568-
569-
// only delete the generated files if the test is successful
570-
assertTrue(crdFile.delete());
571-
assertTrue(outputDir.delete());
572557
}
573558

574559
@Test
575560
void checkK8sValidationRules() throws Exception {
576561
// generated CRD
577-
final File outputDir = Files.createTempDirectory("crd-").toFile();
578562
final String crdName = CustomResourceInfo.fromClass(K8sValidation.class).crdName();
579563

580564
final CRDGenerationInfo crdInfo = newCRDGenerator()
581-
.inOutputDir(outputDir)
565+
.inOutputDir(tempDir)
582566
.customResourceClasses(K8sValidation.class)
583567
.forCRDVersions("v1")
584568
.detailedGenerate();
@@ -591,20 +575,15 @@ void checkK8sValidationRules() throws Exception {
591575

592576
final File expectedCrdFile = new File(crdResource.getFile());
593577
assertFileEquals(expectedCrdFile, crdFile);
594-
595-
// only delete the generated files if the test is successful
596-
assertTrue(crdFile.delete());
597-
assertTrue(outputDir.delete());
598578
}
599579

600580
@Test
601581
void checkPostProcessing() throws Exception {
602582
// generated CRD
603-
final File outputDir = Files.createTempDirectory("crd-").toFile();
604583
final String crdName = CustomResourceInfo.fromClass(Simplest.class).crdName();
605584

606585
final CRDGenerationInfo crdInfo = newCRDGenerator()
607-
.inOutputDir(outputDir)
586+
.inOutputDir(tempDir)
608587
.customResourceClasses(Simplest.class)
609588
.forCRDVersions("v1")
610589
.withPostProcessor(new CRDPostProcessor() {
@@ -617,16 +596,10 @@ public HasMetadata process(HasMetadata crd, String crdSpecVersion) {
617596
})
618597
.detailedGenerate();
619598

620-
final File crdFile = new File(crdInfo.getCRDInfos(crdName).get("v1").getFilePath());
621-
final var serialization = new KubernetesSerialization();
622-
final var crd = serialization.unmarshal(new FileInputStream(crdFile), HasMetadata.class);
623-
assertNotNull(crd);
624-
assertEquals(crdName, crd.getMetadata().getName());
625-
assertEquals("bar", crd.getMetadata().getLabels().get("foo"));
626-
627-
// only delete the generated files if the test is successful
628-
assertTrue(crdFile.delete());
629-
assertTrue(outputDir.delete());
599+
assertThat(new KubernetesSerialization().unmarshal(
600+
Files.newInputStream(Path.of(crdInfo.getCRDInfos(crdName).get("v1").getFilePath())), HasMetadata.class))
601+
.hasFieldOrPropertyWithValue("metadata.name", crdName)
602+
.hasFieldOrPropertyWithValue("metadata.labels.foo", "bar");
630603
}
631604

632605
private CustomResourceDefinitionVersion checkCRD(Class<? extends CustomResource<?, ?>> customResource, String kind,

0 commit comments

Comments
 (0)