Skip to content

Commit

Permalink
feat: add build-time ConfigurationService implementation
Browse files Browse the repository at this point in the history
Signed-off-by: Chris Laprun <claprun@redhat.com>
  • Loading branch information
metacosm committed Sep 3, 2024
1 parent 7e44937 commit 8109ab8
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkiverse.operatorsdk.deployment;

import io.quarkiverse.operatorsdk.runtime.BuildTimeConfigurationService;
import io.quarkus.builder.item.SimpleBuildItem;

public final class BuildTimeConfigurationServiceBuildItem extends SimpleBuildItem {
private final BuildTimeConfigurationService service;

BuildTimeConfigurationServiceBuildItem(BuildTimeConfigurationService service) {
this.service = service;
}

public BuildTimeConfigurationService getConfigurationService() {
return service;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.quarkiverse.operatorsdk.deployment;

import io.quarkiverse.operatorsdk.runtime.BuildTimeConfigurationService;
import io.quarkiverse.operatorsdk.runtime.BuildTimeOperatorConfiguration;
import io.quarkus.deployment.annotations.BuildStep;

public class BuildTimeConfigurationServiceBuildStep {

@BuildStep
BuildTimeConfigurationServiceBuildItem createBuildTimeConfigurationService(VersionBuildItem versionBuildItem,
GeneratedCRDInfoBuildItem generatedCRDs, BuildTimeOperatorConfiguration buildTimeConfig) {
final var service = new BuildTimeConfigurationService(
versionBuildItem.getVersion(),
generatedCRDs.getCRDGenerationInfo(),
buildTimeConfig.startOperator(),
buildTimeConfig.closeClientOnStop(),
buildTimeConfig.stopOnInformerErrorDuringStartup(),
buildTimeConfig.enableSSA(),
buildTimeConfig.activateLeaderElectionForProfiles());
return new BuildTimeConfigurationServiceBuildItem(service);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,18 +121,15 @@ void addOperatorBoostrapIfNoApplicationClassExists(
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void updateControllerConfigurations(
BuildTimeConfigurationServiceBuildItem buildTimeConfigurationServiceBuildItem,
ConfigurationServiceRecorder recorder,
RunTimeOperatorConfiguration runTimeConfiguration,
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer,
GeneratedCRDInfoBuildItem generatedCRDs,
ControllerConfigurationsBuildItem serviceBuildItem,
VersionBuildItem versionBuildItem) {
ControllerConfigurationsBuildItem serviceBuildItem) {
final var supplier = recorder.configurationServiceSupplier(
versionBuildItem.getVersion(),
buildTimeConfigurationServiceBuildItem.getConfigurationService(),
serviceBuildItem.getControllerConfigs(),
generatedCRDs.getCRDGenerationInfo(),
runTimeConfiguration,
buildTimeConfiguration);
runTimeConfiguration);
syntheticBeanBuildItemBuildProducer.produce(
SyntheticBeanBuildItem.configure(QuarkusConfigurationService.class)
.scope(Singleton.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public KubernetesDependentResourceConfig configFrom(
@BuildStep
@SuppressWarnings("unused")
ControllerConfigurationsBuildItem createControllerConfigurations(
BuildTimeConfigurationServiceBuildItem buildTimeConfigurationServiceBuildItem,
ReconcilerInfosBuildItem reconcilers,
AnnotationConfigurablesBuildItem annotationConfigurables,
BuildTimeOperatorConfiguration buildTimeConfiguration,
Expand Down Expand Up @@ -119,6 +120,7 @@ ControllerConfigurationsBuildItem createControllerConfigurations(
if (configuration == null) {
configuration = createConfiguration(reconcilerInfo,
annotationConfigurables.getConfigurableInfos(),
buildTimeConfigurationServiceBuildItem.getConfigurationService(),
buildTimeConfiguration,
combinedIndexBuildItem.getIndex());
}
Expand All @@ -139,6 +141,7 @@ ControllerConfigurationsBuildItem createControllerConfigurations(
static QuarkusControllerConfiguration createConfiguration(
ReconcilerAugmentedClassInfo reconcilerInfo,
Map<String, AnnotationConfigurableAugmentedClassInfo> configurableInfos,
BuildTimeConfigurationService buildTimeConfigurationService,
BuildTimeOperatorConfiguration buildTimeConfiguration,
IndexView index) {

Expand Down Expand Up @@ -283,6 +286,9 @@ static QuarkusControllerConfiguration createConfiguration(
rateLimiterConfigurationClass, dependentResources, null, additionalRBACRules, additionalRBACRoleRefs,
fieldManager, itemStore);

// setting the configuration service with build-time known information for resolution of some information such as resource classes associated with dependent resources or whether SSA should be used for a given dependent
configuration.setParent(buildTimeConfigurationService);

if (hasDependents) {
dependentResourceInfos.forEach(dependent -> {
final var spec = createDependentResourceSpec(dependent, index, configuration);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package io.quarkiverse.operatorsdk.runtime;

import java.util.List;
import java.util.Set;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.quarkus.runtime.annotations.IgnoreProperty;

public class BuildTimeConfigurationService implements ConfigurationService {
private final Version version;
private final CRDGenerationInfo crdInfo;
private final boolean startOperator;
private final boolean closeClientOnStop;
private final boolean stopOnInformerErrorDuringStartup;
private final boolean enableSSA;
private final List<String> leaderElectionActivationProfiles;

public BuildTimeConfigurationService(Version version, CRDGenerationInfo crdInfo, boolean startOperator,
boolean closeClientOnStop, boolean stopOnInformerErrorDuringStartup, boolean enableSSA,
List<String> leaderElectionActivationProfiles) {
this.version = version;
this.crdInfo = crdInfo;
this.startOperator = startOperator;
this.closeClientOnStop = closeClientOnStop;
this.stopOnInformerErrorDuringStartup = stopOnInformerErrorDuringStartup;
this.enableSSA = enableSSA;
this.leaderElectionActivationProfiles = leaderElectionActivationProfiles;
}

@Override
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(Reconciler<R> reconciler) {
throw new UnsupportedOperationException();
}

@Override
@IgnoreProperty
public Set<String> getKnownReconcilerNames() {
throw new UnsupportedOperationException();
}

public Version getVersion() {
return version;
}

public CRDGenerationInfo getCrdInfo() {
return crdInfo;
}

public boolean isStartOperator() {
return startOperator;
}

public boolean isCloseClientOnStop() {
return closeClientOnStop;
}

public boolean isStopOnInformerErrorDuringStartup() {
return stopOnInformerErrorDuringStartup;
}

public boolean isEnableSSA() {
return enableSSA;
}

public boolean activateLeaderElection(List<String> activeProfiles) {
return activeProfiles.stream().anyMatch(leaderElectionActivationProfiles::contains);
}

public List<String> getLeaderElectionActivationProfiles() {
return leaderElectionActivationProfiles;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ public class ConfigurationServiceRecorder {

static final Logger log = Logger.getLogger(ConfigurationServiceRecorder.class.getName());

public Supplier<QuarkusConfigurationService> configurationServiceSupplier(Version version,
public Supplier<QuarkusConfigurationService> configurationServiceSupplier(
BuildTimeConfigurationService buildTimeConfigurationService,
Map<String, QuarkusControllerConfiguration<?>> configurations,
CRDGenerationInfo crdInfo, RunTimeOperatorConfiguration runTimeConfiguration,
BuildTimeOperatorConfiguration buildTimeConfiguration) {
RunTimeOperatorConfiguration runTimeConfiguration) {
final var maxThreads = runTimeConfiguration.concurrentReconciliationThreads()
.orElse(ConfigurationService.DEFAULT_RECONCILIATION_THREADS_NUMBER);
final var timeout = runTimeConfiguration.terminationTimeoutSeconds()
Expand Down Expand Up @@ -70,31 +70,30 @@ public Supplier<QuarkusConfigurationService> configurationServiceSupplier(Versio
// deactivate leader election in dev mode
LeaderElectionConfiguration leaderElectionConfiguration = null;
final var profiles = ConfigUtils.getProfiles();
final var leaderElectionActivationProfiles = buildTimeConfiguration.activateLeaderElectionForProfiles();
if (profiles.stream().anyMatch(leaderElectionActivationProfiles::contains)) {
if (buildTimeConfigurationService.activateLeaderElection(profiles)) {
leaderElectionConfiguration = container.instance(LeaderElectionConfiguration.class).get();
} else {
log.info("Leader election deactivated because it is only activated for "
+ leaderElectionActivationProfiles
+ buildTimeConfigurationService.getLeaderElectionActivationProfiles()
+ " profiles. Currently active profiles: " + profiles);
}

return new QuarkusConfigurationService(
version,
buildTimeConfigurationService.getVersion(),
configurations.values(),
container.instance(KubernetesClient.class).get(),
crdInfo,
buildTimeConfigurationService.getCrdInfo(),
maxThreads,
workflowThreads,
timeout,
cacheSyncTimeout,
container.instance(Metrics.class).get(),
buildTimeConfiguration.startOperator(),
buildTimeConfigurationService.isStartOperator(),
leaderElectionConfiguration,
container.instance(InformerStoppedHandler.class).orElse(null),
buildTimeConfiguration.closeClientOnStop(),
buildTimeConfiguration.stopOnInformerErrorDuringStartup(),
buildTimeConfiguration.enableSSA());
buildTimeConfigurationService.isCloseClientOnStop(),
buildTimeConfigurationService.isStopOnInformerErrorDuringStartup(),
buildTimeConfigurationService.isEnableSSA());
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public DefaultRateLimiter(Duration refreshPeriod, int limitForPeriod) {
private Retry retry;
private RateLimiter rateLimiter;
private ManagedWorkflow<R> workflow;
private QuarkusConfigurationService parent;
private ConfigurationService parent;

@RecordableConstructor
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -157,7 +157,7 @@ public ConfigurationService getConfigurationService() {
return parent;
}

public void setParent(QuarkusConfigurationService parent) {
public void setParent(ConfigurationService parent) {
this.parent = parent;
}

Expand Down

0 comments on commit 8109ab8

Please sign in to comment.