Serdar Gökay created CAMEL-26673:
------------------------------------
Summary: camel-jbang - camel run and camel export ask the Quarkus
Extension Registry for runtimes that do not use Quarkus, and stop when it
cannot be reached
Key: CAMEL-26673
URL: https://issues.apache.org/jira/browse/CAMEL-26673
Project: Camel
Issue Type: Bug
Components: camel-jbang
Affects Versions: 4.23.0
Reporter: Serdar Gökay
Since 4.21.0 (CAMEL-23560) the Camel CLI finds the Quarkus Platform by asking
the Quarkus Extension Registry. {{camel run}} and {{camel export}} ask also
when the runtime is not Quarkus, as one of their first steps, and the command
stops when the registry cannot be reached. On a machine that cannot reach
registry.quarkus.io, an integration that uses nothing from Quarkus then does
not start, and a Camel Main or Spring Boot project is not exported.
h3. Observed
Camel CLI 4.23.0 and 4.24.0-SNAPSHOT (nightly 20261105.143830), Java 25. The
registry is replaced by a closed local port for which no cached answer exists,
so the cache under {{~/.camel/quarkus-extension-registries}} plays no part.
||Command||4.23.0||main||
|camel run, default runtime (in process)|stops, no route is loaded|stops, no
route is loaded|
|camel run, runtime camel-main|starts|stops|
|camel export, runtime camel-main|stops, no project is written|stops, no
project is written|
|camel export, runtime spring-boot|stops, no project is written|stops, no
project is written|
|camel run, default runtime, with a Quarkus version given|starts|starts|
|camel export, runtime camel-main, with a Quarkus version given|project is
written|project is written|
h3. Reproduce
hello.yaml:
{noformat}
- route:
id: hello
from:
uri: timer:tick
parameters:
period: 1000
steps:
- log: "ROUTE-RUNNING"
{noformat}
{noformat}
camel run hello.yaml --quarkus-ext-registry=http://127.0.0.1:9
camel run hello.yaml --runtime=camel-main
--quarkus-ext-registry=http://127.0.0.1:9
camel export hello.yaml --runtime=camel-main --gav=com.example:demo:1.0
--dir=out --quarkus-ext-registry=http://127.0.0.1:9
camel export hello.yaml --runtime=spring-boot --gav=com.example:demo:1.0
--dir=out --quarkus-ext-registry=http://127.0.0.1:9
{noformat}
The first command on 4.23.0:
{noformat}
java.lang.RuntimeException: Could not fetch from
http://127.0.0.1:9/client/platforms/all
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.fetchPlatformStreams(QuarkusHelper.java:369)
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:196)
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:159)
at
org.apache.camel.dsl.jbang.core.commands.QuarkusPlatformMixin.resolve(QuarkusPlatformMixin.java:76)
at org.apache.camel.dsl.jbang.core.commands.Run.run(Run.java:987)
{noformat}
The Spring Boot export on 4.23.0:
{noformat}
Generating fresh run data
java.lang.RuntimeException: Could not fetch from
http://127.0.0.1:9/client/platforms/all
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.fetchPlatformStreams(QuarkusHelper.java:369)
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:196)
at
org.apache.camel.dsl.jbang.core.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:159)
at
org.apache.camel.dsl.jbang.core.commands.QuarkusPlatformMixin.resolve(QuarkusPlatformMixin.java:76)
at org.apache.camel.dsl.jbang.core.commands.Run.run(Run.java:987)
at org.apache.camel.dsl.jbang.core.commands.Run.runExport(Run.java:632)
at
org.apache.camel.dsl.jbang.core.commands.ExportBaseCommand.runSilently(ExportBaseCommand.java:615)
at
org.apache.camel.dsl.jbang.core.commands.ExportSpringBoot.export(ExportSpringBoot.java:87)
{noformat}
h3. What the answer is used for
With a runtime other than Quarkus the resolved version goes to two places: the
run settings ({{camel.jbang.quarkusVersion}}, with the group id and the
registry URI), and {{KnownDependenciesResolver}}, which puts it into the 12
entries of {{camel-main-known-dependencies.properties}} that end in the
quarkus-version placeholder, for example:
{noformat}
quarkus.datasource.db-kind\=postgresql =
io.quarkus:quarkus-jdbc-postgresql:${quarkus-version}
jakarta.inject.Inject = io.quarkus:quarkus-core:${quarkus-version}
{noformat}
A route that needs none of these entries does not use the answer.
h3. Earlier behaviour and discussion
* In 4.18.5 {{QuarkusHelper.fetchPlatformStreams}} returns null when the
registry does not answer within 2 seconds, and its callers fall back to the
build-time version.
* CAMEL-23560 removed the build-time version, and the fallback went with it.
The Javadoc of {{fetchPlatformStreams}} still says that null is returned when
the registry is unreachable.
* Users without internet access came up on CAMEL-23353 and again in the review
of [PR #23333|https://github.com/apache/camel/pull/23333]. In that review a
given Quarkus version and the local cache were named as the way for such
environments. As I read them, both discussions were about commands that need a
Quarkus Platform version. The 4.21 and 4.23 upgrade guides and CAMEL-24761
describe the lookup for those commands too. I did not find a place in JIRA or
the pull requests that says the other runtimes should depend on the registry.
h3. On main
On 4.23.0 {{camel run}} with the camel-main runtime did not ask:
{{Run.runCamelMain}} created the exporter without a Quarkus platform, so the
silent run skipped the lookup. On main the export request always has one
({{ExportRequest.quarkusPlatform}} is initialised, and
{{SilentRunDependencyResolver}} passes it to the run request), so this command
now stops too:
{noformat}
Running using Camel Main (preparing and downloading files)
ERROR: Could not fetch from http://127.0.0.1:9/client/platforms/all
java.lang.RuntimeException: Could not fetch from
http://127.0.0.1:9/client/platforms/all
at
org.apache.camel.dsl.jbang.run.common.QuarkusHelper.fetchPlatformStreams(QuarkusHelper.java:370)
at
org.apache.camel.dsl.jbang.run.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:197)
at
org.apache.camel.dsl.jbang.run.common.QuarkusHelper.findQuarkusPlatformBom(QuarkusHelper.java:160)
at
org.apache.camel.dsl.jbang.run.common.QuarkusPlatform.resolve(QuarkusPlatform.java:79)
at
org.apache.camel.dsl.jbang.run.RunPipeline.configure(RunPipeline.java:486)
at
org.apache.camel.dsl.jbang.run.SilentRunDependencyResolver.resolve(SilentRunDependencyResolver.java:86)
at
org.apache.camel.dsl.jbang.run.export.Exporter.runSilently(Exporter.java:223)
at
org.apache.camel.dsl.jbang.run.export.CamelMainExporter.export(CamelMainExporter.java:81)
at
org.apache.camel.dsl.jbang.run.export.ProjectExporter.export(ProjectExporter.java:187)
at
org.apache.camel.dsl.jbang.run.CamelMainRunner.start(CamelMainRunner.java:125)
at
org.apache.camel.dsl.jbang.run.ProjectRunner.start(ProjectRunner.java:80)
at
org.apache.camel.dsl.jbang.core.commands.Run.runWithMaven(Run.java:917)
at
org.apache.camel.dsl.jbang.core.commands.Run.runCamelMain(Run.java:908)
{noformat}
h3. Proposed change
Make the command independent of the registry for runtimes other than Quarkus.
Two ways I can see:
# resolve the platform only when a dependency with the quarkus-version
placeholder is needed, or
# keep the lookup, and when it fails log it and continue without a Quarkus
version, so that only a dependency that needs the version fails.
Nothing changes for the Quarkus runtime. I can prepare a pull request; please
say which way you prefer.
h3. Workaround
Give the Quarkus version. With the quarkus-version option the registry is not
asked (4.23.0 and main); {{camel.jbang.quarkusVersion}} in
application.properties does the same (checked on 4.23.0).
{noformat}
camel run hello.yaml --quarkus-version=3.40.1.1
--quarkus-ext-registry=http://127.0.0.1:9
{noformat}
Filed as Bug because of the change on main for the camel-main runtime. The part
that exists since 4.21.0 may fit Improvement better; please reclassify as you
see fit.
_Claude Code on behalf of etzel-mes_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)