Skip to content

Commit 70b4e71

Browse files
aloubyanskyjmartisk
authored andcommitted
Allow registry offering configuration with an environment variable
(cherry picked from commit 2c3f9ad)
1 parent 9ac1fe4 commit 70b4e71

File tree

4 files changed

+67
-11
lines changed

4 files changed

+67
-11
lines changed

docs/src/main/asciidoc/extension-registry-user.adoc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,26 @@ image:registry-nexus-repository.png[Nexus Repository Proxy]
214214
- Set the `Remote Storage` URL to `https://registry.quarkus.io/maven`
215215

216216
image:registry-nexus3-repository.png[Nexus Repository Proxy]
217+
218+
==== Environment Variables
219+
220+
Applications using a registry client can be configured using environment variables.
221+
222+
`QUARKUS_REGISTRIES` environment variable can be used to specify which registries should be enabled as a comma-separated list of registry IDs.
223+
For example
224+
```
225+
QUARKUS_REGISTRIES=registry.acme.org,registry.quarkus.io
226+
```
227+
That alone will be enough to initialize a registry client to pull extension catalogs from two registries using their default configurations.
228+
229+
Certain registry options could be initialized with their specific environment variables. Each such option will have the following environment variable prefix:
230+
```
231+
QUARKUS_REGISTRY_<UPPERCASED_AND_UNDERSCORED_REGISTRY_ID>_
232+
```
233+
where `<UPPERCASED_AND_UNDERSCORED_REGISTRY_ID>` is a registry ID with each character converted to uppercase and a `.` replaced with `_`. For example, `REGISTRY_ACME_ORG`.
234+
235+
The following options can be configured with this approach:
236+
237+
- Repository URL, for example `QUARKUS_REGISTRY_REGISTRY_ACME_ORG_REPO_URL=https://internal.registry.acme.org/maven`
238+
- Update policy, for example `QUARKUS_REGISTRY_REGISTRY_ACME_ORG_UPDATE_POLICY=always`
239+
- Offering, for example `QUARKUS_REGISTRY_REGISTRY_ACME_ORG_OFFERING=acme-magic`

independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/client/maven/MavenRegistryClientFactory.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,7 @@ public MavenRegistryClientFactory(MavenArtifactResolver resolver, MessageWriter
5757
public RegistryClient buildRegistryClient(RegistryConfig config) throws RegistryResolutionException {
5858
Objects.requireNonNull(config, "The registry config is null");
5959

60-
final RegistryDescriptorConfig descriptorConfig = config.getDescriptor();
61-
if (descriptorConfig == null) {
62-
throw new IllegalArgumentException("The registry descriptor configuration is missing for " + config.getId());
63-
}
64-
65-
final ArtifactCoords originalDescrCoords = descriptorConfig.getArtifact();
66-
final Artifact registryDescriptorCoords = new DefaultArtifact(originalDescrCoords.getGroupId(),
67-
originalDescrCoords.getArtifactId(), originalDescrCoords.getClassifier(), originalDescrCoords.getType(),
68-
originalDescrCoords.getVersion());
60+
final Artifact registryDescriptorCoords = getDescriptorCoords(config);
6961

7062
final boolean cleanupTimestampedArtifacts = isCleanupTimestampedArtifacts(config);
7163

@@ -172,6 +164,17 @@ public RegistryClient buildRegistryClient(RegistryConfig config) throws Registry
172164
new MavenRegistryCache(config, defaultResolver, log));
173165
}
174166

167+
private static Artifact getDescriptorCoords(RegistryConfig config) {
168+
final RegistryDescriptorConfig descriptorConfig = config.getDescriptor();
169+
if (descriptorConfig == null) {
170+
throw new IllegalArgumentException("The registry descriptor configuration is missing for " + config.getId());
171+
}
172+
final ArtifactCoords originalDescrCoords = descriptorConfig.getArtifact();
173+
return new DefaultArtifact(originalDescrCoords.getGroupId(),
174+
originalDescrCoords.getArtifactId(), originalDescrCoords.getClassifier(), originalDescrCoords.getType(),
175+
originalDescrCoords.getVersion());
176+
}
177+
175178
private static boolean isCleanupTimestampedArtifacts(RegistryConfig config) {
176179
final Object o = config.getExtra().get(CLEANUP_TIMESTAMPED_ARTIFACTS);
177180
return o == null || Boolean.parseBoolean(o.toString());

independent-projects/tools/registry-client/src/main/java/io/quarkus/registry/config/RegistriesConfigLocator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.nio.file.Paths;
99
import java.util.Map;
1010

11+
import io.quarkus.registry.Constants;
12+
1113
/**
1214
* A helper class set utility methods to locate the registry client configuration file
1315
* in the default locations (e.g. user home <code>.quarkus</code> dir, or the project dir) or in
@@ -188,6 +190,8 @@ static RegistriesConfig initFromEnvironmentOrNull(Map<String, String> map) {
188190
.setUrl(var.getValue())
189191
.build())
190192
.build());
193+
} else if (isEnvVarOption(var.getKey(), envvarPrefix, "OFFERING")) {
194+
builder.setExtra(Map.of(Constants.OFFERING, var.getValue()));
191195
}
192196
}
193197

independent-projects/tools/registry-client/src/test/java/io/quarkus/registry/config/RegistriesConfigLocatorTest.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
import java.io.StringReader;
66
import java.io.StringWriter;
7-
import java.util.Collections;
87
import java.util.HashMap;
98
import java.util.Map;
109

1110
import org.junit.jupiter.api.Test;
1211

1312
import io.quarkus.maven.dependency.ArtifactCoords;
13+
import io.quarkus.registry.Constants;
1414

1515
public class RegistriesConfigLocatorTest {
1616

@@ -36,7 +36,7 @@ void configCompletion() throws Exception {
3636

3737
@Test
3838
void testSimpleRegistryListFromEnvironment() throws Exception {
39-
final Map<String, String> env = Collections.singletonMap(RegistriesConfigLocator.QUARKUS_REGISTRIES,
39+
final Map<String, String> env = Map.of(RegistriesConfigLocator.QUARKUS_REGISTRIES,
4040
"registry.acme.org,registry.other.io");
4141

4242
final RegistriesConfig actualConfig = RegistriesConfigLocator.initFromEnvironmentOrNull(env);
@@ -135,6 +135,32 @@ void testRegistryRepositoryURLFromEnvironment() throws Exception {
135135
assertThat(completeConfig).isEqualTo(expectedConfig);
136136
}
137137

138+
@Test
139+
void testRegistryOfferingFromEnvironment() throws Exception {
140+
final Map<String, String> env = new HashMap<>();
141+
env.put(RegistriesConfigLocator.QUARKUS_REGISTRIES, "registry.acme.org,registry.other.io");
142+
env.put(RegistriesConfigLocator.QUARKUS_REGISTRY_ENV_VAR_PREFIX + "REGISTRY_ACME_ORG_OFFERING", "acme-magic");
143+
env.put(RegistriesConfigLocator.QUARKUS_REGISTRY_ENV_VAR_PREFIX + "REGISTRY_OTHER_IO_OFFERING", "other-cloud");
144+
145+
final RegistriesConfig actualConfig = RegistriesConfigLocator.initFromEnvironmentOrNull(env);
146+
147+
final RegistriesConfig expectedConfig = RegistriesConfig.builder()
148+
.setRegistry(RegistryConfig.builder()
149+
.setId("registry.acme.org")
150+
.setExtra(Constants.OFFERING, "acme-magic")
151+
.build())
152+
.setRegistry(RegistryConfig.builder()
153+
.setId("registry.other.io")
154+
.setExtra(Constants.OFFERING, "other-cloud")
155+
.build())
156+
.build();
157+
158+
assertThat(actualConfig).isEqualTo(expectedConfig);
159+
160+
final RegistriesConfig completeConfig = serializeDeserialize(actualConfig);
161+
assertThat(completeConfig).isEqualTo(expectedConfig);
162+
}
163+
138164
private static RegistriesConfig serializeDeserialize(RegistriesConfig config) throws Exception {
139165
final StringWriter buf = new StringWriter();
140166
RegistriesConfigMapperHelper.toYaml(config, buf);

0 commit comments

Comments
 (0)