Skip to content

Commit 1f36645

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

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

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

Lines changed: 3 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

@@ -49,15 +50,15 @@ private BundleGenerator() {
4950
public static List<ManifestsBuilder> prepareGeneration(BundleGenerationConfiguration bundleConfiguration,
5051
BuildTimeOperatorConfiguration operatorConfiguration, Version version,
5152
Map<CSVMetadataHolder, List<ReconcilerAugmentedClassInfo>> csvGroups, Map<String, CRDInfo> crds,
52-
Path outputDirectory, String deploymentName) {
53+
Path outputDirectory, String deploymentName, Map<String, QuarkusControllerConfiguration<?>> controllerConfigs) {
5354
List<ManifestsBuilder> builders = new ArrayList<>();
5455
for (Map.Entry<CSVMetadataHolder, List<ReconcilerAugmentedClassInfo>> entry : csvGroups.entrySet()) {
5556
final var csvMetadata = entry.getKey();
5657
final var labels = generateBundleLabels(csvMetadata, bundleConfiguration, version);
5758

5859
final var mainSourcesRoot = PathsUtil.findMainSourcesRoot(outputDirectory);
5960
final var csvBuilder = new CsvManifestsBuilder(csvMetadata, operatorConfiguration, entry.getValue(),
60-
mainSourcesRoot != null ? mainSourcesRoot.getKey() : null, deploymentName);
61+
mainSourcesRoot != null ? mainSourcesRoot.getKey() : null, deploymentName, controllerConfigs);
6162
builders.add(csvBuilder);
6263
builders.add(new AnnotationsManifestsBuilder(csvMetadata, labels));
6364
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;
@@ -193,7 +194,8 @@ void generateBundle(ApplicationInfoBuildItem configuration,
193194
BuildProducer<GeneratedBundleBuildItem> doneGeneratingCSV,
194195
GeneratedCRDInfoBuildItem generatedCustomResourcesDefinitions,
195196
@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<DeserializedKubernetesResourcesBuildItem> maybeGeneratedKubeResources,
196-
BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs) {
197+
BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs,
198+
ControllerConfigurationsBuildItem controllerConfigurationsBuildItem) {
197199
final var crds = generatedCustomResourcesDefinitions.getCRDGenerationInfo().getCrds()
198200
.values().stream()
199201
.flatMap(entry -> entry.values().stream())
@@ -243,7 +245,8 @@ void generateBundle(ApplicationInfoBuildItem configuration,
243245
final var deploymentName = ResourceNameUtil.getResourceName(kubernetesConfig, configuration);
244246
final var generated = BundleGenerator.prepareGeneration(bundleConfiguration, operatorConfiguration,
245247
versionBuildItem.getVersion(),
246-
csvMetadata.getCsvGroups(), crds, outputTarget.getOutputDirectory(), deploymentName);
248+
csvMetadata.getCsvGroups(), crds, outputTarget.getOutputDirectory(), deploymentName,
249+
controllerConfigurationsBuildItem.getControllerConfigs());
247250
generated.forEach(manifestBuilder -> {
248251
final var fileName = manifestBuilder.getFileName();
249252
try {

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

Lines changed: 29 additions & 10 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,6 +38,9 @@ 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<>();
@@ -46,7 +50,7 @@ public class CsvManifestsBuilder extends ManifestsBuilder {
4650

4751
public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfiguration operatorConfiguration,
4852
List<ReconcilerAugmentedClassInfo> controllers,
49-
Path mainSourcesRoot, String deploymentName) {
53+
Path mainSourcesRoot, String deploymentName, Map<String, QuarkusControllerConfiguration<?>> controllerConfigs) {
5054
super(metadata);
5155
this.deploymentName = deploymentName;
5256
this.controllers = controllers;
@@ -135,14 +139,6 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfigur
135139
}
136140
}
137141

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-
146142
// add owned and required CRD, also collect them
147143
final var nativeApis = new ArrayList<GroupVersionKind>();
148144
controllers.forEach(raci -> {
@@ -181,6 +177,29 @@ public CsvManifestsBuilder(CSVMetadataHolder metadata, BuildTimeOperatorConfigur
181177
}
182178
});
183179
}
180+
181+
// deal with install modes
182+
// use watched namespaces information for default install mode
183+
// fixme: multiple, incompatible controller configurations in the same bundle will result in inconsistent runs
184+
final var config = controllerConfigs.get(raci.nameOrFailIfUnset());
185+
if (config.watchAllNamespaces()) {
186+
csvSpecBuilder.withInstallModes(new InstallMode(true, ALL_NAMESPACES));
187+
} else if (config.watchCurrentNamespace()) {
188+
csvSpecBuilder.withInstallModes(new InstallMode(true, OWN_NAMESPACE));
189+
} else {
190+
final var namespaces = config.getNamespaces();
191+
if (namespaces.size() == 1) {
192+
csvSpecBuilder.withInstallModes(new InstallMode(true, SINGLE_NAMESPACE));
193+
} else {
194+
csvSpecBuilder.withInstallModes(new InstallMode(true, MULTI_NAMESPACE));
195+
}
196+
}
197+
// then process metadata
198+
if (metadata.installModes != null) {
199+
for (CSVMetadataHolder.InstallMode installMode : metadata.installModes) {
200+
csvSpecBuilder.addNewInstallMode(installMode.supported, installMode.type);
201+
}
202+
}
184203
});
185204

186205
// 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(bundleName = "first-operator", version = FirstReconciler.VERSION)
8+
@CSVMetadata(bundleName = "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)