Skip to content

Commit f45b978

Browse files
committed
fix: add proper default install mode derived from watched namespaces
Fixes #839 Signed-off-by: Chris Laprun <[email protected]>
1 parent bbae7f9 commit f45b978

File tree

5 files changed

+55
-19
lines changed

5 files changed

+55
-19
lines changed

bundle-generator/deployment/src/main/java/io/quarkiverse/operatorsdk/bundle/deployment/BundleGenerator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.quarkiverse.operatorsdk.common.ReconcilerAugmentedClassInfo;
1616
import io.quarkiverse.operatorsdk.runtime.BuildTimeOperatorConfiguration;
1717
import io.quarkiverse.operatorsdk.runtime.CRDInfo;
18+
import io.quarkiverse.operatorsdk.runtime.QuarkusControllerConfiguration;
1819
import io.quarkiverse.operatorsdk.runtime.Version;
1920
import io.quarkus.container.util.PathsUtil;
2021

@@ -46,18 +47,19 @@ public class BundleGenerator {
4647
private BundleGenerator() {
4748
}
4849

50+
@SuppressWarnings("rawtypes")
4951
public static List<ManifestsBuilder> prepareGeneration(BundleGenerationConfiguration bundleConfiguration,
5052
BuildTimeOperatorConfiguration operatorConfiguration, Version version,
5153
Map<CSVMetadataHolder, List<ReconcilerAugmentedClassInfo>> csvGroups, Map<String, CRDInfo> crds,
52-
Path outputDirectory, String deploymentName) {
54+
Path outputDirectory, String deploymentName, Map<String, QuarkusControllerConfiguration> controllerConfigs) {
5355
List<ManifestsBuilder> builders = new ArrayList<>();
5456
for (Map.Entry<CSVMetadataHolder, List<ReconcilerAugmentedClassInfo>> entry : csvGroups.entrySet()) {
5557
final var csvMetadata = entry.getKey();
5658
final var labels = generateBundleLabels(csvMetadata, bundleConfiguration, version);
5759

5860
final var mainSourcesRoot = PathsUtil.findMainSourcesRoot(outputDirectory);
5961
final var csvBuilder = new CsvManifestsBuilder(csvMetadata, operatorConfiguration, entry.getValue(),
60-
mainSourcesRoot != null ? mainSourcesRoot.getKey() : null, deploymentName);
62+
mainSourcesRoot != null ? mainSourcesRoot.getKey() : null, deploymentName, controllerConfigs);
6163
builders.add(csvBuilder);
6264
builders.add(new AnnotationsManifestsBuilder(csvMetadata, labels));
6365
builders.add(new BundleDockerfileManifestsBuilder(csvMetadata, labels));

bundle-generator/deployment/src/main/java/io/quarkiverse/operatorsdk/bundle/deployment/BundleProcessor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.quarkiverse.operatorsdk.bundle.runtime.BundleGenerationConfiguration;
3333
import io.quarkiverse.operatorsdk.bundle.runtime.CSVMetadataHolder;
3434
import io.quarkiverse.operatorsdk.common.*;
35+
import io.quarkiverse.operatorsdk.deployment.ControllerConfigurationsBuildItem;
3536
import io.quarkiverse.operatorsdk.deployment.GeneratedCRDInfoBuildItem;
3637
import io.quarkiverse.operatorsdk.deployment.VersionBuildItem;
3738
import io.quarkiverse.operatorsdk.runtime.BuildTimeOperatorConfiguration;
@@ -185,7 +186,8 @@ void generateBundle(ApplicationInfoBuildItem configuration,
185186
BuildProducer<GeneratedBundleBuildItem> doneGeneratingCSV,
186187
GeneratedCRDInfoBuildItem generatedCustomResourcesDefinitions,
187188
DeserializedKubernetesResourcesBuildItem generatedKubernetesResources,
188-
BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs) {
189+
BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs,
190+
ControllerConfigurationsBuildItem controllerConfigurationsBuildItem) {
189191
final var crds = generatedCustomResourcesDefinitions.getCRDGenerationInfo().getCrds()
190192
.values().stream()
191193
.flatMap(entry -> entry.values().stream())
@@ -233,7 +235,8 @@ void generateBundle(ApplicationInfoBuildItem configuration,
233235
final var deploymentName = ResourceNameUtil.getResourceName(kubernetesConfig, configuration);
234236
final var generated = BundleGenerator.prepareGeneration(bundleConfiguration, operatorConfiguration,
235237
versionBuildItem.getVersion(),
236-
csvMetadata.getCsvGroups(), crds, outputTarget.getOutputDirectory(), deploymentName);
238+
csvMetadata.getCsvGroups(), crds, outputTarget.getOutputDirectory(), deploymentName,
239+
controllerConfigurationsBuildItem.getControllerConfigs());
237240
generated.forEach(manifestBuilder -> {
238241
final var fileName = manifestBuilder.getFileName();
239242
try {

bundle-generator/deployment/src/main/java/io/quarkiverse/operatorsdk/bundle/deployment/builders/CsvManifestsBuilder.java

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@
2323
import io.quarkiverse.operatorsdk.bundle.runtime.CSVMetadataHolder.RequiredCRD;
2424
import io.quarkiverse.operatorsdk.common.*;
2525
import io.quarkiverse.operatorsdk.runtime.BuildTimeOperatorConfiguration;
26+
import io.quarkiverse.operatorsdk.runtime.QuarkusControllerConfiguration;
2627

2728
public class CsvManifestsBuilder extends ManifestsBuilder {
2829

2930
private static final Logger log = Logger.getLogger(CsvManifestsBuilder.class);
3031

31-
private static final String DEFAULT_INSTALL_MODE = "AllNamespaces";
32+
private static final String ALL_NAMESPACES = "AllNamespaces";
3233
private static final String DEPLOYMENT = "deployment";
3334
private static final String SERVICE_ACCOUNT_KIND = "ServiceAccount";
3435
private static final String CLUSTER_ROLE_KIND = "ClusterRole";
@@ -37,24 +38,29 @@ public class CsvManifestsBuilder extends ManifestsBuilder {
3738
private static final Logger LOGGER = Logger.getLogger(CsvManifestsBuilder.class.getName());
3839
private static final String IMAGE_PNG = "image/png";
3940
public static final String OLM_TARGET_NAMESPACES = "metadata.annotations['olm.targetNamespaces']";
41+
public static final String OWN_NAMESPACE = "OwnNamespace";
42+
public static final String SINGLE_NAMESPACE = "SingleNamespace";
43+
public static final String MULTI_NAMESPACE = "MultiNamespace";
4044
private ClusterServiceVersionBuilder csvBuilder;
4145
private final Set<CRDDescription> ownedCRs = new HashSet<>();
4246
private final Set<CRDDescription> requiredCRs = new HashSet<>();
4347
private final Path kubernetesResources;
4448
private final String deploymentName;
4549
private final List<ReconcilerAugmentedClassInfo> controllers;
4650

51+
@SuppressWarnings("rawtypes")
4752
public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfiguration operatorConfiguration,
4853
List<ReconcilerAugmentedClassInfo> controllers,
49-
Path mainSourcesRoot, String deploymentName) {
54+
Path mainSourcesRoot, String deploymentName, Map<String, QuarkusControllerConfiguration> controllerConfigs) {
5055
super(metadata);
5156
this.deploymentName = deploymentName;
5257
this.controllers = controllers;
5358
this.kubernetesResources = mainSourcesRoot != null ? mainSourcesRoot.resolve("kubernetes") : null;
5459

5560
csvBuilder = new ClusterServiceVersionBuilder();
5661

57-
final var metadataBuilder = csvBuilder.withNewMetadata().withName(getName());
62+
final var name = getName();
63+
final var metadataBuilder = csvBuilder.withNewMetadata().withName(name);
5864
if (metadata.annotations != null) {
5965
metadataBuilder.addToAnnotations("olm.skipRange", metadata.annotations.skipRange);
6066
metadataBuilder.addToAnnotations("containerImage", metadata.annotations.containerImage);
@@ -72,7 +78,7 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfigur
7278
final var csvSpecBuilder = csvBuilder
7379
.editOrNewSpec()
7480
.withDescription(metadata.description)
75-
.withDisplayName(defaultIfEmpty(metadata.displayName, getName()))
81+
.withDisplayName(defaultIfEmpty(metadata.displayName, name))
7682
.withKeywords(metadata.keywords)
7783
.withReplaces(metadata.replaces)
7884
.withVersion(metadata.version)
@@ -135,14 +141,6 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfigur
135141
}
136142
}
137143

138-
if (metadata.installModes == null || metadata.installModes.length == 0) {
139-
csvSpecBuilder.addNewInstallMode(true, DEFAULT_INSTALL_MODE);
140-
} else {
141-
for (CSVMetadataHolder.InstallMode installMode : metadata.installModes) {
142-
csvSpecBuilder.addNewInstallMode(installMode.supported, installMode.type);
143-
}
144-
}
145-
146144
// add owned and required CRD, also collect them
147145
final var nativeApis = new ArrayList<GroupVersionKind>();
148146
controllers.forEach(raci -> {
@@ -181,6 +179,29 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfigur
181179
}
182180
});
183181
}
182+
183+
// deal with install modes
184+
// use watched namespaces information for default install mode
185+
// fixme: multiple, incompatible controller configurations in the same bundle will result in inconsistent runs
186+
final var config = controllerConfigs.get(raci.nameOrFailIfUnset());
187+
if (config.watchAllNamespaces()) {
188+
csvSpecBuilder.withInstallModes(new InstallMode(true, ALL_NAMESPACES));
189+
} else if (config.watchCurrentNamespace()) {
190+
csvSpecBuilder.withInstallModes(new InstallMode(true, OWN_NAMESPACE));
191+
} else {
192+
final var namespaces = config.getNamespaces();
193+
if (namespaces.size() == 1) {
194+
csvSpecBuilder.withInstallModes(new InstallMode(true, SINGLE_NAMESPACE));
195+
} else {
196+
csvSpecBuilder.withInstallModes(new InstallMode(true, MULTI_NAMESPACE));
197+
}
198+
}
199+
// then process metadata
200+
if (metadata.installModes != null) {
201+
for (CSVMetadataHolder.InstallMode installMode : metadata.installModes) {
202+
csvSpecBuilder.addNewInstallMode(installMode.supported, installMode.type);
203+
}
204+
}
184205
});
185206

186207
// add required CRDs from CSV metadata

bundle-generator/deployment/src/test/java/io/quarkiverse/operatorsdk/bundle/MultipleOperatorsBundleTest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package io.quarkiverse.operatorsdk.bundle;
22

33
import static io.quarkiverse.operatorsdk.bundle.Utils.*;
4-
import static org.junit.jupiter.api.Assertions.assertEquals;
5-
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
import static org.junit.jupiter.api.Assertions.*;
65

76
import java.io.IOException;
87

@@ -49,6 +48,13 @@ public void shouldWriteBundleForTheOperators() throws IOException {
4948
assertEquals(FirstReconciler.REPLACES, csv.getSpec().getReplaces());
5049
var bundleMeta = getAnnotationsFor(bundle, "first-operator");
5150
assertEquals(BUNDLE_PACKAGE, bundleMeta.getAnnotations().get("operators.operatorframework.io.bundle.package.v1"));
51+
assertEquals(2, csv.getSpec().getInstallModes().size());
52+
var installMode = csv.getSpec().getInstallModes().get(0);
53+
assertEquals("AllNamespaces", installMode.getType());
54+
assertTrue(installMode.getSupported());
55+
installMode = csv.getSpec().getInstallModes().get(1);
56+
assertEquals("MultiNamespace", installMode.getType());
57+
assertFalse(installMode.getSupported());
5258

5359
checkBundleFor(bundle, "second-operator", Second.class);
5460
csv = getCSVFor(bundle, "second-operator");
@@ -59,6 +65,10 @@ public void shouldWriteBundleForTheOperators() throws IOException {
5965
.addToResources(SecondReconciler.RBAC_RULE_RES)
6066
.addToVerbs(SecondReconciler.RBAC_RULE_VERBS)
6167
.build()));
68+
assertEquals(1, csv.getSpec().getInstallModes().size());
69+
installMode = csv.getSpec().getInstallModes().get(0);
70+
assertEquals("SingleNamespace", installMode.getType());
71+
assertTrue(installMode.getSupported());
6272

6373
checkBundleFor(bundle, "third-operator", Third.class);
6474
// also check that external CRD is present

bundle-generator/deployment/src/test/java/io/quarkiverse/operatorsdk/bundle/sources/FirstReconciler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
66
import io.quarkiverse.operatorsdk.annotations.CSVMetadata;
77

8-
@CSVMetadata(name = "first-operator", version = FirstReconciler.VERSION)
8+
@CSVMetadata(name = "first-operator", version = FirstReconciler.VERSION, installModes = @CSVMetadata.InstallMode(type = "MultiNamespace", supported = false))
99
public class FirstReconciler implements Reconciler<First> {
1010

1111
public static final String VERSION = "first-version";

0 commit comments

Comments
 (0)