Skip to content

Commit 2095958

Browse files
committed
fix: inject DeserializedKubernetesResourcesBuildItem optionally
Signed-off-by: Chris Laprun <[email protected]>
1 parent 01fe99c commit 2095958

File tree

2 files changed

+68
-90
lines changed

2 files changed

+68
-90
lines changed

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

Lines changed: 28 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem;
4444
import io.quarkus.deployment.pkg.builditem.JarBuildItem;
4545
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
46-
import io.quarkus.kubernetes.deployment.KubernetesCommonHelper;
4746
import io.quarkus.kubernetes.deployment.KubernetesConfig;
4847
import io.quarkus.kubernetes.deployment.ResourceNameUtil;
4948

@@ -136,37 +135,6 @@ CSVMetadataBuildItem gatherCSVMetadata(KubernetesConfig kubernetesConfig,
136135
return new CSVMetadataBuildItem(csvGroups);
137136
}
138137

139-
private static String getDefaultProviderURLFromSCMInfo(ApplicationInfoBuildItem appConfiguration,
140-
JarBuildItem jarBuildItem) {
141-
final var maybeProject = KubernetesCommonHelper.createProject(appConfiguration, Optional.empty(),
142-
jarBuildItem.getPath());
143-
return maybeProject.map(project -> {
144-
final var scmInfo = project.getScmInfo();
145-
if (scmInfo != null) {
146-
var origin = scmInfo.getRemote().get("origin");
147-
if (origin != null) {
148-
try {
149-
int atSign = origin.indexOf('@');
150-
if (atSign > 0) {
151-
origin = origin.substring(atSign + 1);
152-
origin = origin.replaceFirst(":", "/");
153-
origin = "https://" + origin;
154-
}
155-
156-
int dotGit = origin.indexOf(".git");
157-
if (dotGit > 0 && dotGit < origin.length() - 1) {
158-
origin = origin.substring(0, dotGit);
159-
}
160-
return origin;
161-
} catch (Exception e) {
162-
log.warnv("Couldn't parse SCM information: {0}", origin);
163-
}
164-
}
165-
}
166-
return null;
167-
}).orElse(null);
168-
}
169-
170138
private static ReconcilerAugmentedClassInfo augmentReconcilerInfo(
171139
ReconcilerAugmentedClassInfo reconcilerInfo) {
172140
// if primary resource is a CR, check if it is annotated with CSVMetadata and augment it if it is
@@ -224,7 +192,7 @@ void generateBundle(ApplicationInfoBuildItem configuration,
224192
VersionBuildItem versionBuildItem,
225193
BuildProducer<GeneratedBundleBuildItem> doneGeneratingCSV,
226194
GeneratedCRDInfoBuildItem generatedCustomResourcesDefinitions,
227-
DeserializedKubernetesResourcesBuildItem generatedKubernetesResources,
195+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<DeserializedKubernetesResourcesBuildItem> maybeGeneratedKubeResources,
228196
BuildProducer<GeneratedFileSystemResourceBuildItem> generatedCSVs) {
229197
final var crds = generatedCustomResourcesDefinitions.getCRDGenerationInfo().getCrds()
230198
.values().stream()
@@ -238,36 +206,38 @@ void generateBundle(ApplicationInfoBuildItem configuration,
238206
final var roles = new LinkedList<Role>();
239207
final var deployments = new LinkedList<Deployment>();
240208

241-
final var resources = generatedKubernetesResources.getResources();
242-
resources.forEach(r -> {
243-
if (r instanceof ServiceAccount) {
244-
serviceAccounts.add((ServiceAccount) r);
245-
return;
246-
}
209+
maybeGeneratedKubeResources.ifPresent(generatedKubeResources -> {
210+
final var resources = generatedKubeResources.getResources();
211+
resources.forEach(r -> {
212+
if (r instanceof ServiceAccount) {
213+
serviceAccounts.add((ServiceAccount) r);
214+
return;
215+
}
247216

248-
if (r instanceof ClusterRoleBinding) {
249-
clusterRoleBindings.add((ClusterRoleBinding) r);
250-
return;
251-
}
217+
if (r instanceof ClusterRoleBinding) {
218+
clusterRoleBindings.add((ClusterRoleBinding) r);
219+
return;
220+
}
252221

253-
if (r instanceof ClusterRole) {
254-
clusterRoles.add((ClusterRole) r);
255-
return;
256-
}
222+
if (r instanceof ClusterRole) {
223+
clusterRoles.add((ClusterRole) r);
224+
return;
225+
}
257226

258-
if (r instanceof RoleBinding) {
259-
roleBindings.add((RoleBinding) r);
260-
return;
261-
}
227+
if (r instanceof RoleBinding) {
228+
roleBindings.add((RoleBinding) r);
229+
return;
230+
}
262231

263-
if (r instanceof Role) {
264-
roles.add((Role) r);
265-
return;
266-
}
232+
if (r instanceof Role) {
233+
roles.add((Role) r);
234+
return;
235+
}
267236

268-
if (r instanceof Deployment) {
269-
deployments.add((Deployment) r);
270-
}
237+
if (r instanceof Deployment) {
238+
deployments.add((Deployment) r);
239+
}
240+
});
271241
});
272242

273243
final var deploymentName = ResourceNameUtil.getResourceName(kubernetesConfig, configuration);

core/deployment/src/main/java/io/quarkiverse/operatorsdk/deployment/helm/HelmChartProcessor.java

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.nio.file.Path;
1111
import java.util.List;
1212
import java.util.Map;
13+
import java.util.Optional;
1314
import java.util.stream.Collectors;
1415

1516
import org.jboss.logging.Logger;
@@ -156,21 +157,24 @@ void addClusterRolesForReconcilers(HelmTargetDirectoryBuildItem helmTargetDirect
156157

157158
@BuildStep
158159
@Produce(ArtifactResultBuildItem.class)
159-
void addExplicitlyAddedKubernetesResources(DeserializedKubernetesResourcesBuildItem generatedKubernetesResources,
160+
void addExplicitlyAddedKubernetesResources(
161+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<DeserializedKubernetesResourcesBuildItem> maybedGeneratedKubeRes,
160162
HelmTargetDirectoryBuildItem helmDirBI,
161163
ApplicationInfoBuildItem appInfo, KubernetesConfig kubernetesConfig) {
162-
var resources = generatedKubernetesResources.getResources();
163-
resources = filterOutStandardResources(resources, ResourceNameUtil.getResourceName(kubernetesConfig, appInfo));
164-
if (!resources.isEmpty()) {
165-
final var kubernetesManifest = helmDirBI.getPathToTemplatesDir().resolve("kubernetes.yml");
166-
// Generate a possibly multi-document YAML
167-
String yaml = resources.stream().map(FileUtils::asYaml).collect(Collectors.joining());
168-
try {
169-
Files.writeString(kubernetesManifest, yaml);
170-
} catch (IOException e) {
171-
throw new IllegalStateException(e);
164+
maybedGeneratedKubeRes.ifPresent(generatedKubernetesResources -> {
165+
var resources = generatedKubernetesResources.getResources();
166+
resources = filterOutStandardResources(resources, ResourceNameUtil.getResourceName(kubernetesConfig, appInfo));
167+
if (!resources.isEmpty()) {
168+
final var kubernetesManifest = helmDirBI.getPathToTemplatesDir().resolve("kubernetes.yml");
169+
// Generate a possibly multi-document YAML
170+
String yaml = resources.stream().map(FileUtils::asYaml).collect(Collectors.joining());
171+
try {
172+
Files.writeString(kubernetesManifest, yaml);
173+
} catch (IOException e) {
174+
throw new IllegalStateException(e);
175+
}
172176
}
173-
}
177+
});
174178
}
175179

176180
private List<HasMetadata> filterOutStandardResources(List<HasMetadata> resources, String operatorName) {
@@ -202,29 +206,33 @@ private void addTemplateFiles(HelmTargetDirectoryBuildItem helmDirBI) {
202206
@BuildStep
203207
@Produce(ArtifactResultBuildItem.class)
204208
void addGeneratedDeployment(HelmTargetDirectoryBuildItem helmDirBI,
205-
DeserializedKubernetesResourcesBuildItem deserializedKubernetesResources,
209+
@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<DeserializedKubernetesResourcesBuildItem> maybeDeserializedKubeResources,
206210
ControllerConfigurationsBuildItem controllerConfigurations,
207211
ApplicationInfoBuildItem appInfo) {
208-
// add an env var for each reconciler's watch namespace in the operator's deployment
209-
var deployment = (Deployment) deserializedKubernetesResources.getResources().stream()
210-
.filter(Deployment.class::isInstance).findFirst()
211-
.orElseThrow();
212-
// copy the deployment so that changes are not propagated outside of this method
213-
final var firstContainer = deployment.edit().editSpec().editTemplate().editSpec().editFirstContainer();
214-
controllerConfigurations.getControllerConfigs()
215-
.forEach((name, unused) -> firstContainer.addNewEnv()
216-
.withName(ConfigurationUtils.getNamespacesPropertyName(name, true))
217-
.withValue("{watchNamespaces}").endEnv());
218-
deployment = firstContainer.endContainer().endSpec().endTemplate().endSpec().build();
212+
if (maybeDeserializedKubeResources.isEmpty()) {
213+
log.warn("No Kubernetes manifests were found, no Helm chart will be generated");
214+
} else {
215+
// add an env var for each reconciler's watch namespace in the operator's deployment
216+
var deployment = (Deployment) maybeDeserializedKubeResources.get().getResources().stream()
217+
.filter(Deployment.class::isInstance).findFirst()
218+
.orElseThrow();
219+
// copy the deployment so that changes are not propagated outside of this method
220+
final var firstContainer = deployment.edit().editSpec().editTemplate().editSpec().editFirstContainer();
221+
controllerConfigurations.getControllerConfigs()
222+
.forEach((name, unused) -> firstContainer.addNewEnv()
223+
.withName(ConfigurationUtils.getNamespacesPropertyName(name, true))
224+
.withValue("{watchNamespaces}").endEnv());
225+
deployment = firstContainer.endContainer().endSpec().endTemplate().endSpec().build();
219226

220-
// a bit hacky solution to get the exact placeholder without brackets
221-
final var template = FileUtils.asYaml(deployment);
222-
var res = template.replace("\"{watchNamespaces}\"", "{{ .Values.watchNamespaces }}");
223-
res = res.replaceAll(appInfo.getVersion(), "{{ .Chart.AppVersion }}");
224-
try {
225-
Files.writeString(helmDirBI.getPathToTemplatesDir().resolve("deployment.yaml"), res);
226-
} catch (IOException e) {
227-
throw new IllegalStateException(e);
227+
// a bit hacky solution to get the exact placeholder without brackets
228+
final var template = FileUtils.asYaml(deployment);
229+
var res = template.replace("\"{watchNamespaces}\"", "{{ .Values.watchNamespaces }}");
230+
res = res.replaceAll(appInfo.getVersion(), "{{ .Chart.AppVersion }}");
231+
try {
232+
Files.writeString(helmDirBI.getPathToTemplatesDir().resolve("deployment.yaml"), res);
233+
} catch (IOException e) {
234+
throw new IllegalStateException(e);
235+
}
228236
}
229237
}
230238

0 commit comments

Comments
 (0)