This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 00ce3f22c84 camel-jbang - Auto detect vault dependencies (#16293) 00ce3f22c84 is described below commit 00ce3f22c843f218aae2c6d30a0608b8f0e929e1 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Nov 16 20:17:14 2024 +0100 camel-jbang - Auto detect vault dependencies (#16293) * camel-jbang - Auto detect vault dependencies * camel-jbang - Auto detect vault dependencies * camel-jbang - Auto detect vault dependencies --- .../java/org/apache/camel/main/KameletMain.java | 14 +-- .../DependencyDownloaderPeriodTaskResolver.java | 113 +++++++++++++++++++++ .../main/download/ExportPeriodTaskResolver.java | 51 ---------- 3 files changed, 120 insertions(+), 58 deletions(-) diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java index c61362bf779..a9b00b55ffe 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java @@ -48,6 +48,7 @@ import org.apache.camel.main.download.DependencyDownloaderComponentResolver; import org.apache.camel.main.download.DependencyDownloaderDataFormatResolver; import org.apache.camel.main.download.DependencyDownloaderKamelet; import org.apache.camel.main.download.DependencyDownloaderLanguageResolver; +import org.apache.camel.main.download.DependencyDownloaderPeriodTaskResolver; import org.apache.camel.main.download.DependencyDownloaderPropertiesComponent; import org.apache.camel.main.download.DependencyDownloaderPropertiesFunctionResolver; import org.apache.camel.main.download.DependencyDownloaderPropertyBindingListener; @@ -58,7 +59,6 @@ import org.apache.camel.main.download.DependencyDownloaderTransformerResolver; import org.apache.camel.main.download.DependencyDownloaderUriFactoryResolver; import org.apache.camel.main.download.DownloadListener; import org.apache.camel.main.download.DownloadModelineParser; -import org.apache.camel.main.download.ExportPeriodTaskResolver; import org.apache.camel.main.download.ExportPropertiesParser; import org.apache.camel.main.download.ExportTypeConverter; import org.apache.camel.main.download.KameletAutowiredLifecycleStrategy; @@ -612,6 +612,12 @@ public class KameletMain extends MainCommandLineSupport { ff = ffr.resolveDefaultFactoryFinder(classResolver); answer.getCamelContextExtension().setDefaultFactoryFinder(ff); + // period task resolver that can download needed dependencies + Object camelVersion = getInitialProperties().get(getInstanceType() + ".camelVersion"); + PeriodTaskResolver ptr = new DependencyDownloaderPeriodTaskResolver( + ff, answer, Optional.ofNullable(camelVersion).map(Object::toString).orElse(null), export); + answer.getCamelContextExtension().addContextPlugin(PeriodTaskResolver.class, ptr); + answer.getCamelContextExtension().addContextPlugin(ComponentResolver.class, new DependencyDownloaderComponentResolver(answer, stubPattern, silent)); answer.getCamelContextExtension().addContextPlugin(DataFormatResolver.class, @@ -732,12 +738,6 @@ public class KameletMain extends MainCommandLineSupport { answer.getTypeConverterRegistry().addTypeConverter(Byte.class, String.class, ec); answer.getTypeConverterRegistry().addTypeConverter(Boolean.class, String.class, ec); answer.getTypeConverterRegistry().addFallbackTypeConverter(ec, false); - - // override default period task with our export that does not run tasks - FactoryFinder finder = PluginHelper.getFactoryFinderResolver(answer) - .resolveBootstrapFactoryFinder(answer.getClassResolver(), PeriodTaskResolver.RESOURCE_PATH); - ExportPeriodTaskResolver eptr = new ExportPeriodTaskResolver(finder); - answer.getCamelContextExtension().addContextPlugin(PeriodTaskResolver.class, eptr); } private String getInstanceType() { diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java new file mode 100644 index 00000000000..1c4cf307605 --- /dev/null +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.main.download; + +import java.util.Optional; + +import org.apache.camel.CamelContext; +import org.apache.camel.impl.engine.DefaultPeriodTaskResolver; +import org.apache.camel.spi.FactoryFinder; +import org.apache.camel.spi.PeriodTaskResolver; +import org.apache.camel.support.ResolverHelper; +import org.apache.camel.util.ObjectHelper; + +public class DependencyDownloaderPeriodTaskResolver extends DefaultPeriodTaskResolver { + + private final DependencyDownloader downloader; + private final CamelContext camelContext; + private final String camelVersion; + private final boolean export; + + public DependencyDownloaderPeriodTaskResolver(FactoryFinder finder, CamelContext camelContext, String camelVersion, + boolean export) { + super(finder); + this.camelContext = camelContext; + this.camelVersion = camelVersion; + this.downloader = camelContext.hasService(DependencyDownloader.class); + this.export = export; + } + + @Override + public Optional<Object> newInstance(String key) { + maybeDownload(key); + + if (export && skip(key)) { + return Optional.empty(); + } + + Optional<Object> answer = super.newInstance(key); + if (answer.isEmpty()) { + // need to use regular factory finder as bootstrap has already marked as a miss + final FactoryFinder finder + = camelContext.getCamelContextExtension().getFactoryFinder(PeriodTaskResolver.RESOURCE_PATH); + Object obj = ResolverHelper.resolveService(camelContext, finder, key, Object.class).orElse(null); + return Optional.ofNullable(obj); + } + return answer; + } + + @Override + public <T> Optional<T> newInstance(String key, Class<T> type) { + maybeDownload(key); + + if (export && skip(key)) { + return Optional.empty(); + } + + Optional<T> answer = super.newInstance(key, type); + if (answer.isEmpty()) { + // need to use regular factory finder as bootstrap has already marked as a miss + final FactoryFinder finder + = camelContext.getCamelContextExtension().getFactoryFinder(PeriodTaskResolver.RESOURCE_PATH); + T obj = ResolverHelper.resolveService(camelContext, finder, key, type).orElse(null); + return Optional.ofNullable(obj); + } + return answer; + } + + private void maybeDownload(String key) { + if ("aws-secret-refresh".equals(key)) { + downloadLoader("camel-aws-secrets-manager"); + } else if ("gcp-secret-refresh".equals(key)) { + downloadLoader("camel-google-secret-manager"); + } else if ("azure-secret-refresh".equals(key)) { + downloadLoader("camel-azure-key-vault"); + } else if ("kubernetes-secret-refresh".equals(key)) { + downloadLoader("camel-kubernetes"); + } else if ("kubernetes-configmaps-refresh".equals(key)) { + downloadLoader("camel-kubernetes"); + } + } + + private void downloadLoader(String artifactId) { + String resolvedCamelVersion = camelContext.getVersion(); + if (ObjectHelper.isEmpty(resolvedCamelVersion)) { + resolvedCamelVersion = camelVersion; + } + + if (!downloader.alreadyOnClasspath("org.apache.camel", artifactId, resolvedCamelVersion)) { + downloader.downloadDependency("org.apache.camel", artifactId, resolvedCamelVersion); + } + } + + private boolean skip(String key) { + // skip all vault refresh during export as they will attempt to connect to remote system + return "aws-secret-refresh".equals(key) || "gcp-secret-refresh".equals(key) || "azure-secret-refresh".equals(key) + || "kubernetes-secret-refresh".equals(key) || "kubernetes-configmaps-refresh".equals(key); + } + +} diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/ExportPeriodTaskResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/ExportPeriodTaskResolver.java deleted file mode 100644 index 8fbc2e8ec93..00000000000 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/ExportPeriodTaskResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.main.download; - -import java.util.Optional; - -import org.apache.camel.impl.engine.DefaultPeriodTaskResolver; -import org.apache.camel.spi.FactoryFinder; - -public class ExportPeriodTaskResolver extends DefaultPeriodTaskResolver { - - public ExportPeriodTaskResolver(FactoryFinder finder) { - super(finder); - } - - @Override - public Optional<Object> newInstance(String key) { - if (skip(key)) { - return Optional.empty(); - } - return super.newInstance(key); - } - - @Override - public <T> Optional<T> newInstance(String key, Class<T> type) { - if (skip(key)) { - return Optional.empty(); - } - return super.newInstance(key, type); - } - - private boolean skip(String key) { - // skip all vault refresh during export as they will attempt to connect to remote system - return "aws-secret-refresh".equals(key) || "gcp-secret-refresh".equals(key) || "azure-secret-refresh".equals(key) - || "kubernetes-secret-refresh".equals(key) || "kubernetes-configmaps-refresh".equals(key); - } -}