Skip to content

Commit

Permalink
Merge pull request #18420 from aloubyansky/registry-client-testing
Browse files Browse the repository at this point in the history
Basic registry client config builder for testing purposes
  • Loading branch information
aloubyansky authored Jul 5, 2021
2 parents d5ad3b7 + 220f598 commit 5bd6f46
Show file tree
Hide file tree
Showing 8 changed files with 564 additions and 116 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,10 @@
package io.quarkus.devtools.testing;

import io.quarkus.devtools.testing.registry.client.TestRegistryClientBuilder;
import io.quarkus.maven.ArtifactCoords;
import io.quarkus.registry.Constants;
import io.quarkus.registry.catalog.json.JsonCatalogMapperHelper;
import io.quarkus.registry.catalog.json.JsonPlatform;
import io.quarkus.registry.catalog.json.JsonPlatformCatalog;
import io.quarkus.registry.catalog.json.JsonPlatformRelease;
import io.quarkus.registry.catalog.json.JsonPlatformStream;
import io.quarkus.registry.config.RegistriesConfigLocator;
import io.quarkus.registry.config.json.JsonRegistriesConfig;
import io.quarkus.registry.config.json.JsonRegistryConfig;
import io.quarkus.registry.config.json.JsonRegistryMavenConfig;
import io.quarkus.registry.config.json.JsonRegistryMavenRepoConfig;
import io.quarkus.registry.config.json.JsonRegistryNonPlatformExtensionsConfig;
import io.quarkus.registry.config.json.JsonRegistryPlatformsConfig;
import io.quarkus.registry.config.json.RegistriesConfigMapperHelper;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Collections;
import java.util.Properties;

public class RegistryClientTestHelper {
Expand All @@ -36,112 +19,37 @@ public static void enableRegistryClientTestConfig(Properties properties) {
}

public static void enableRegistryClientTestConfig(Path outputDir, Properties properties) {
final Path toolsConfigPath = outputDir.resolve(RegistriesConfigLocator.CONFIG_RELATIVE_PATH);
final Path registryRepoPath = outputDir.resolve("test-registry-repo");
final Path groupIdDir = registryRepoPath.resolve("io/quarkus/registry/test");

generateToolsConfig(toolsConfigPath, registryRepoPath);
generateRegistryDescriptor(groupIdDir);
generatePlatformCatalog(groupIdDir);

properties.setProperty("io.quarkus.maven.secondary-local-repo", registryRepoPath.toString());
properties.setProperty(RegistriesConfigLocator.CONFIG_FILE_PATH_PROPERTY, toolsConfigPath.toString());
properties.setProperty("quarkusRegistryClient", "true");
}

private static void generatePlatformCatalog(final Path groupIdDir) {
final String projectVersion = System.getProperty("project.version");
if (projectVersion == null) {
throw new IllegalStateException("System property project.version isn't set");
}
final Path platformsPath = groupIdDir.resolve(Constants.DEFAULT_REGISTRY_PLATFORMS_CATALOG_ARTIFACT_ID)
.resolve(Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION)
.resolve(Constants.DEFAULT_REGISTRY_PLATFORMS_CATALOG_ARTIFACT_ID + "-"
+ Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION + ".json");
final Path versionedPlatformsPath = groupIdDir.resolve(Constants.DEFAULT_REGISTRY_PLATFORMS_CATALOG_ARTIFACT_ID)
.resolve(Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION)
.resolve(Constants.DEFAULT_REGISTRY_PLATFORMS_CATALOG_ARTIFACT_ID + "-"
+ Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION + "-" + projectVersion + ".json");
if (Files.exists(platformsPath) && Files.exists(versionedPlatformsPath)) {
return;
}
final ArtifactCoords bom = new ArtifactCoords("io.quarkus", "quarkus-bom", null, "pom", projectVersion);
final JsonPlatformCatalog platforms = new JsonPlatformCatalog();
final JsonPlatform platform = new JsonPlatform();
platforms.addPlatform(platform);
platform.setPlatformKey(bom.getGroupId());
final JsonPlatformStream stream = new JsonPlatformStream();
platform.setStreams(Collections.singletonList(stream));
stream.setId(projectVersion);
final JsonPlatformRelease release = new JsonPlatformRelease();
stream.setReleases(Collections.singletonList(release));
release.setMemberBoms(Collections.singletonList(bom));
release.setQuarkusCoreVersion(projectVersion);
try {
JsonCatalogMapperHelper.serialize(platforms, platformsPath);
Files.copy(platformsPath, versionedPlatformsPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
throw new IllegalStateException("Failed to persist registry platforms config", e);
}
}

private static void generateRegistryDescriptor(Path repoGroupIdDir) {
final Path descriptorPath = repoGroupIdDir.resolve(Constants.DEFAULT_REGISTRY_DESCRIPTOR_ARTIFACT_ID)
.resolve(Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION).resolve(Constants.DEFAULT_REGISTRY_DESCRIPTOR_ARTIFACT_ID
+ "-" + Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION + ".json");
if (Files.exists(descriptorPath)) {
return;
}
final JsonRegistryConfig descriptor = new JsonRegistryConfig();
final JsonRegistryPlatformsConfig platformsConfig = new JsonRegistryPlatformsConfig();
descriptor.setPlatforms(platformsConfig);
platformsConfig.setArtifact(
new ArtifactCoords("io.quarkus.registry.test", Constants.DEFAULT_REGISTRY_PLATFORMS_CATALOG_ARTIFACT_ID, null,
"json", Constants.DEFAULT_REGISTRY_ARTIFACT_VERSION));
final JsonRegistryNonPlatformExtensionsConfig nonPlatformsConfig = new JsonRegistryNonPlatformExtensionsConfig();
descriptor.setNonPlatformExtensions(nonPlatformsConfig);
nonPlatformsConfig.setDisabled(true);
try {
RegistriesConfigMapperHelper.serialize(descriptor, descriptorPath);
} catch (IOException e) {
throw new IllegalStateException("Failed to persist the registry descriptor", e);
}
}
final Path toolsConfigPath = outputDir.resolve(RegistriesConfigLocator.CONFIG_RELATIVE_PATH);

private static void generateToolsConfig(Path toolsConfigPath, Path registryRepoPath) {
if (Files.exists(toolsConfigPath)) {
return;
}
final JsonRegistryConfig registryConfig = new JsonRegistryConfig();
registryConfig.setId("test.registry.quarkus.io");
final JsonRegistryMavenConfig mavenConfig = new JsonRegistryMavenConfig();
registryConfig.setMaven(mavenConfig);
final JsonRegistryMavenRepoConfig repoConfig = new JsonRegistryMavenRepoConfig();
mavenConfig.setRepository(repoConfig);
try {
repoConfig.setUrl(registryRepoPath.toUri().toURL().toString());
} catch (MalformedURLException e) {
throw new IllegalStateException("Failed to translate a path to url", e);
}
final ArtifactCoords bom = new ArtifactCoords("io.quarkus", "quarkus-bom", null, "pom", projectVersion);

final JsonRegistriesConfig toolsConfig = new JsonRegistriesConfig();
toolsConfig.addRegistry(registryConfig);
toolsConfig.setDebug(false);
TestRegistryClientBuilder.newInstance()
.baseDir(toolsConfigPath.getParent())
//.debug()
.newRegistry("test.quarkus.registry")
.newPlatform(bom.getGroupId())
.newStream(projectVersion)
.newRelease(projectVersion)
.quarkusVersion(projectVersion)
.addMemberBom(bom)
.registry()
.clientBuilder()
.build();

try {
RegistriesConfigMapperHelper.serialize(toolsConfig,
toolsConfigPath);
} catch (IOException e) {
throw new IllegalStateException("Failed to persist the tools config", e);
}
properties.setProperty(RegistriesConfigLocator.CONFIG_FILE_PATH_PROPERTY, toolsConfigPath.toString());
properties.setProperty("quarkusRegistryClient", "true");
}

public static void disableRegistryClientTestConfig() {
disableRegistryClientTestConfig(System.getProperties());
}

public static void disableRegistryClientTestConfig(Properties properties) {
properties.remove("io.quarkus.maven.secondary-local-repo");
properties.remove(RegistriesConfigLocator.CONFIG_FILE_PATH_PROPERTY);
properties.remove("quarkusRegistryClient");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package io.quarkus.devtools.testing.registry.client;

import io.quarkus.bootstrap.resolver.maven.BootstrapMavenException;
import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver;
import io.quarkus.devtools.messagewriter.MessageWriter;
import io.quarkus.maven.ArtifactCoords;
import io.quarkus.registry.RegistryResolutionException;
import io.quarkus.registry.catalog.ExtensionCatalog;
import io.quarkus.registry.catalog.PlatformCatalog;
import io.quarkus.registry.catalog.json.JsonCatalogMapperHelper;
import io.quarkus.registry.catalog.json.JsonExtensionCatalog;
import io.quarkus.registry.catalog.json.JsonPlatformCatalog;
import io.quarkus.registry.client.RegistryClient;
import io.quarkus.registry.client.spi.RegistryClientEnvironment;
import io.quarkus.registry.config.RegistriesConfigLocator;
import io.quarkus.registry.config.RegistryConfig;
import io.quarkus.registry.config.json.JsonRegistryConfig;
import io.quarkus.registry.config.json.RegistriesConfigMapperHelper;
import io.quarkus.registry.util.PlatformArtifacts;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.eclipse.aether.artifact.DefaultArtifact;

public class TestRegistryClient implements RegistryClient {

private final MavenArtifactResolver resolver;
private final MessageWriter log;
private final RegistryConfig config;
private final Path registryDir;

public TestRegistryClient(RegistryClientEnvironment env, RegistryConfig clientConfig) {
this.resolver = env.resolver();
this.log = env.log();
final Path configYaml = RegistriesConfigLocator.locateConfigYaml();
if (configYaml == null) {
throw new IllegalStateException(
"Failed to locate the dev tools config file (" + RegistriesConfigLocator.CONFIG_RELATIVE_PATH + ")");
}
registryDir = TestRegistryClientBuilder.getRegistryDir(configYaml.getParent(), clientConfig.getId());
if (!Files.exists(registryDir)) {
throw new IllegalStateException("The test registry directory " + registryDir + " does not exist");
}

final Path configPath = TestRegistryClientBuilder.getRegistryDescriptorPath(registryDir);
final JsonRegistryConfig registryConfig;
try {
registryConfig = RegistriesConfigMapperHelper.deserialize(configPath, JsonRegistryConfig.class);
} catch (IOException e) {
throw new IllegalStateException("Failed to deserialize registry configuration from " + configPath, e);
}
registryConfig.setId(clientConfig.getId());
if (clientConfig.getNonPlatformExtensions() != null) {
registryConfig.setNonPlatformExtensions(clientConfig.getNonPlatformExtensions());
}

if (clientConfig.getPlatforms() != null) {
registryConfig.setPlatforms(clientConfig.getPlatforms());
}
if (clientConfig.getDescriptor() != null) {
registryConfig.setDescriptor(clientConfig.getDescriptor());
}
if (clientConfig.getQuarkusVersions() != null) {
registryConfig.setQuarkusVersions(clientConfig.getQuarkusVersions());
}
this.config = registryConfig;
}

@Override
public ExtensionCatalog resolveNonPlatformExtensions(String quarkusVersion) throws RegistryResolutionException {
if (config.getNonPlatformExtensions() == null || config.getNonPlatformExtensions().isDisabled()) {
return null;
}
log.info("%s resolveNonPlatformExtensions %s", config.getId(), quarkusVersion);
return null;
}

@Override
public ExtensionCatalog resolvePlatformExtensions(ArtifactCoords platformCoords)
throws RegistryResolutionException {
final ArtifactCoords coords = PlatformArtifacts.ensureCatalogArtifact(platformCoords);
log.debug("%s resolvePlatformExtensions %s", config.getId(), coords);
final Path p;
try {
p = resolver.resolve(new DefaultArtifact(coords.getGroupId(), coords.getArtifactId(), coords.getClassifier(),
coords.getType(), coords.getVersion())).getArtifact().getFile().toPath();
} catch (BootstrapMavenException e) {
throw new RegistryResolutionException("Failed to resolve " + coords, e);
}
try {
return JsonCatalogMapperHelper.deserialize(p, JsonExtensionCatalog.class);
} catch (IOException e) {
throw new RegistryResolutionException("Failed to deserialize " + p, e);
}
}

@Override
public PlatformCatalog resolvePlatforms(String quarkusVersion) throws RegistryResolutionException {
final Path json = TestRegistryClientBuilder.getRegistryPlatformsCatalogPath(registryDir, quarkusVersion);
log.debug("%s resolvePlatforms %s", config.getId(), json);
try {
return JsonCatalogMapperHelper.deserialize(json, JsonPlatformCatalog.class);
} catch (IOException e) {
throw new RegistryResolutionException("Failed to deserialize " + json, e);
}
}

@Override
public RegistryConfig resolveRegistryConfig() throws RegistryResolutionException {
return config;
}

public static RegistryConfig getDefaultConfig() {

final JsonRegistryConfig config = new JsonRegistryConfig();
config.setId("test.quarkus.registry");
config.setAny("client-factory-url",
TestRegistryClient.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm());
return config;
}
}
Loading

0 comments on commit 5bd6f46

Please sign in to comment.