Skip to content

Commit b9f9ccb

Browse files
authored
refactor: check version in a separate step, rename BI appropriately (#620)
1 parent 1ccf0bc commit b9f9ccb

File tree

3 files changed

+81
-68
lines changed

3 files changed

+81
-68
lines changed
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,19 @@
55
import java.util.Map;
66

77
import io.quarkiverse.operatorsdk.runtime.QuarkusControllerConfiguration;
8-
import io.quarkiverse.operatorsdk.runtime.Version;
98
import io.quarkus.builder.item.SimpleBuildItem;
109

1110
@SuppressWarnings("rawtypes")
12-
public final class ConfigurationServiceBuildItem extends SimpleBuildItem {
11+
public final class ControllerConfigurationsBuildItem extends SimpleBuildItem {
1312

14-
private final Version version;
1513
private final Map<String, QuarkusControllerConfiguration> controllerConfigs;
1614

17-
public ConfigurationServiceBuildItem(Version version, List<QuarkusControllerConfiguration> controllerConfigs) {
18-
this.version = version;
15+
public ControllerConfigurationsBuildItem(List<QuarkusControllerConfiguration> controllerConfigs) {
1916
this.controllerConfigs = new HashMap<>(controllerConfigs.size());
2017

2118
controllerConfigs.forEach(c -> this.controllerConfigs.put(c.getName(), c));
2219
}
2320

24-
public Version getVersion() {
25-
return version;
26-
}
27-
2821
public Map<String, QuarkusControllerConfiguration> getControllerConfigs() {
2922
return controllerConfigs;
3023
}

core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/OperatorSDKProcessor.java

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.Collections;
55
import java.util.HashSet;
66
import java.util.Map;
7-
import java.util.Objects;
87
import java.util.Optional;
98
import java.util.Set;
109
import java.util.function.BooleanSupplier;
@@ -15,8 +14,6 @@
1514

1615
import org.jboss.jandex.DotName;
1716
import org.jboss.logging.Logger;
18-
import org.semver4j.Semver;
19-
import org.semver4j.Semver.VersionDiff;
2017

2118
import com.fasterxml.jackson.databind.ObjectMapper;
2219

@@ -40,7 +37,6 @@
4037
import io.quarkiverse.operatorsdk.runtime.OperatorProducer;
4138
import io.quarkiverse.operatorsdk.runtime.QuarkusConfigurationService;
4239
import io.quarkiverse.operatorsdk.runtime.RunTimeOperatorConfiguration;
43-
import io.quarkiverse.operatorsdk.runtime.Version;
4440
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
4541
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
4642
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
@@ -118,10 +114,11 @@ void updateControllerConfigurations(
118114
RunTimeOperatorConfiguration runTimeConfiguration,
119115
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer,
120116
GeneratedCRDInfoBuildItem generatedCRDs,
121-
ConfigurationServiceBuildItem serviceBuildItem,
117+
ControllerConfigurationsBuildItem serviceBuildItem,
118+
VersionBuildItem versionBuildItem,
122119
LaunchModeBuildItem launchMode) {
123120
final var supplier = recorder
124-
.configurationServiceSupplier(serviceBuildItem.getVersion(),
121+
.configurationServiceSupplier(versionBuildItem.getVersion(),
125122
serviceBuildItem.getControllerConfigs(),
126123
generatedCRDs.getCRDGenerationInfo(),
127124
runTimeConfiguration, buildTimeConfiguration, launchMode.getLaunchMode());
@@ -135,68 +132,18 @@ void updateControllerConfigurations(
135132
.done());
136133
}
137134

138-
private void checkVersionCompatibility(String found, String expected, String name) {
139-
// optimize most common case
140-
if (Objects.equals(found, expected)) {
141-
return;
142-
}
143-
final var foundVersionOpt = getSemverFrom(found);
144-
final var expectedVersionOpt = getSemverFrom(expected);
145-
if (foundVersionOpt.isEmpty() || expectedVersionOpt.isEmpty()) {
146-
// abort version check if we couldn't parse the version for some reason as a version check should not prevent the rest of the processing to proceed
147-
return;
148-
}
149-
final var foundVersion = foundVersionOpt.get();
150-
final var expectedVersion = expectedVersionOpt.get();
151-
if (!expectedVersion.equals(foundVersion)) {
152-
String message = "Mismatched " + name + " version found: \"" + found + "\", expected: \"" + expected + "\"";
153-
if (buildTimeConfiguration.failOnVersionCheck) {
154-
throw new RuntimeException(message);
155-
} else {
156-
final var diff = expectedVersion.diff(foundVersion);
157-
if (diff.compareTo(VersionDiff.MINOR) >= 0) {
158-
log.warn(message
159-
+ " by at least a minor version and things might not work as expected.");
160-
} else {
161-
log.debug(message);
162-
}
163-
}
164-
}
165-
}
166-
167-
private static Optional<Semver> getSemverFrom(String version) {
168-
try {
169-
return Optional.of(Semver.coerce(version));
170-
} catch (Exception e) {
171-
log.warn("Couldn't convert version " + version);
172-
}
173-
return Optional.empty();
174-
}
175-
176135
@BuildStep
177-
ConfigurationServiceBuildItem createConfigurationServiceAndOperator(
136+
ControllerConfigurationsBuildItem createConfigurationServiceAndOperator(
178137
OutputTargetBuildItem outputTarget,
179138
CombinedIndexBuildItem combinedIndexBuildItem,
180139
KubernetesClientBuildItem kubernetesClientBuildItem,
181140
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
182141
BuildProducer<ReflectiveClassBuildItem> reflectionClasses,
183142
BuildProducer<ForceNonWeakReflectiveClassBuildItem> forcedReflectionClasses,
184143
BuildProducer<GeneratedCRDInfoBuildItem> generatedCRDInfo,
185-
BuildProducer<VersionBuildItem> versionBuildItemBuildProducer,
186144
LiveReloadBuildItem liveReload, LaunchModeBuildItem launchMode,
187145
BuildProducer<RunTimeConfigurationDefaultBuildItem> runtimeConfig) {
188146

189-
// check versions alignment
190-
final var version = Version.loadFromProperties();
191-
versionBuildItemBuildProducer.produce(new VersionBuildItem(version));
192-
final var runtimeQuarkusVersion = io.quarkus.builder.Version.getVersion();
193-
checkVersionCompatibility(runtimeQuarkusVersion, version.getQuarkusVersion(), "Quarkus");
194-
final var runtimeFabric8Version = io.fabric8.kubernetes.client.Version.clientVersion();
195-
checkVersionCompatibility(runtimeFabric8Version, version.getKubernetesClientVersion(),
196-
"JOSDK Fabric8 Kubernetes Client");
197-
String quarkusFabric8Version = io.quarkus.kubernetes.client.deployment.Versions.KUBERNETES_CLIENT;
198-
checkVersionCompatibility(runtimeFabric8Version, quarkusFabric8Version, "Quarkus-provided Fabric8 Kubernetes Client");
199-
200147
final CRDConfiguration crdConfig = buildTimeConfiguration.crd;
201148
final boolean validateCustomResources = ConfigurationUtils.shouldValidateCustomResources(
202149
buildTimeConfiguration.crd.validate);
@@ -307,7 +254,7 @@ ConfigurationServiceBuildItem createConfigurationServiceAndOperator(
307254

308255
generatedCRDInfo.produce(new GeneratedCRDInfoBuildItem(crdInfo));
309256

310-
return new ConfigurationServiceBuildItem(version, controllerConfigs);
257+
return new ControllerConfigurationsBuildItem(controllerConfigs);
311258
}
312259

313260
private void registerAssociatedClassesForReflection(BuildProducer<ReflectiveClassBuildItem> reflectionClasses,
@@ -333,7 +280,7 @@ public boolean getAsBoolean() {
333280

334281
@BuildStep(onlyIf = IsRBACEnabled.class)
335282
public void addRBACForResources(BuildProducer<DecoratorBuildItem> decorators,
336-
ConfigurationServiceBuildItem configurations) {
283+
ControllerConfigurationsBuildItem configurations) {
337284

338285
final var configs = configurations.getControllerConfigs();
339286
decorators.produce(new DecoratorBuildItem(
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.quarkiverse.operatorsdk.deployment;
2+
3+
import java.util.Objects;
4+
import java.util.Optional;
5+
6+
import org.jboss.logging.Logger;
7+
import org.semver4j.Semver;
8+
import org.semver4j.Semver.VersionDiff;
9+
10+
import io.quarkiverse.operatorsdk.runtime.BuildTimeOperatorConfiguration;
11+
import io.quarkiverse.operatorsdk.runtime.Version;
12+
import io.quarkus.deployment.annotations.BuildStep;
13+
14+
public class VersionAlignmentCheckingStep {
15+
16+
private static final Logger log = Logger.getLogger(VersionAlignmentCheckingStep.class);
17+
18+
@BuildStep
19+
VersionBuildItem checkVersionsAlignment(BuildTimeOperatorConfiguration buildTimeConfiguration) {
20+
final var version = Version.loadFromProperties();
21+
22+
final var runtimeQuarkusVersion = io.quarkus.builder.Version.getVersion();
23+
checkVersionCompatibility(buildTimeConfiguration, runtimeQuarkusVersion, version.getQuarkusVersion(), "Quarkus");
24+
final var runtimeFabric8Version = io.fabric8.kubernetes.client.Version.clientVersion();
25+
checkVersionCompatibility(buildTimeConfiguration, runtimeFabric8Version, version.getKubernetesClientVersion(),
26+
"JOSDK Fabric8 Kubernetes Client");
27+
String quarkusFabric8Version = io.quarkus.kubernetes.client.deployment.Versions.KUBERNETES_CLIENT;
28+
checkVersionCompatibility(buildTimeConfiguration, runtimeFabric8Version, quarkusFabric8Version,
29+
"Quarkus-provided Fabric8 Kubernetes Client");
30+
31+
return new VersionBuildItem(version);
32+
}
33+
34+
private void checkVersionCompatibility(BuildTimeOperatorConfiguration buildTimeConfiguration, String found, String expected,
35+
String name) {
36+
// optimize most common case
37+
if (Objects.equals(found, expected)) {
38+
return;
39+
}
40+
final var foundVersionOpt = getSemverFrom(found);
41+
final var expectedVersionOpt = getSemverFrom(expected);
42+
if (foundVersionOpt.isEmpty() || expectedVersionOpt.isEmpty()) {
43+
// abort version check if we couldn't parse the version for some reason as a version check should not prevent the rest of the processing to proceed
44+
return;
45+
}
46+
final var foundVersion = foundVersionOpt.get();
47+
final var expectedVersion = expectedVersionOpt.get();
48+
if (!expectedVersion.equals(foundVersion)) {
49+
String message = "Mismatched " + name + " version found: \"" + found + "\", expected: \"" + expected
50+
+ "\"";
51+
if (buildTimeConfiguration.failOnVersionCheck) {
52+
throw new RuntimeException(message);
53+
} else {
54+
final var diff = expectedVersion.diff(foundVersion);
55+
if (diff.compareTo(VersionDiff.MINOR) >= 0) {
56+
log.warn(message
57+
+ " by at least a minor version and things might not work as expected.");
58+
} else {
59+
log.debug(message);
60+
}
61+
}
62+
}
63+
}
64+
65+
private static Optional<Semver> getSemverFrom(String version) {
66+
try {
67+
return Optional.of(Semver.coerce(version));
68+
} catch (Exception e) {
69+
log.warn("Couldn't convert version " + version);
70+
}
71+
return Optional.empty();
72+
}
73+
}

0 commit comments

Comments
 (0)