summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jvenstad@yahoo-inc.com>2019-06-20 09:55:23 +0200
committerJon Marius Venstad <jvenstad@yahoo-inc.com>2019-06-20 09:55:23 +0200
commit2245865a6fb46757ae5414205b9dbbb6fb05a0a5 (patch)
tree25547bb0766151658975e08283dd3740cbc16737
parenta22f03a4b4d054f12118c7c1d03ac8ec4ccfea56 (diff)
Add MavenRepositoryClient for fetching metadata from a remote
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClient.java56
-rw-r--r--controller-server/src/main/resources/configdefinitions/maven-repository.def8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClientTest.java22
3 files changed, 86 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClient.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClient.java
new file mode 100644
index 00000000000..35105cdcb2d
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClient.java
@@ -0,0 +1,56 @@
+package com.yahoo.vespa.hosted.controller.versions;
+
+import com.yahoo.vespa.hosted.controller.api.integration.maven.ArtifactId;
+import com.yahoo.vespa.hosted.controller.api.integration.maven.Metadata;
+import com.yahoo.vespa.hosted.controller.api.integration.maven.MavenRepository;
+import com.yahoo.vespa.hosted.controller.maven.repository.config.MavenRepositoryConfig;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class MavenRepositoryClient implements MavenRepository {
+
+ private static final String artifactoryApi = "https://edge.artifactory.ouroath.com:4443/artifactory/vespa-maven-libs-release-local/";
+
+ private final HttpClient client;
+ private final URI apiUrl;
+
+ public MavenRepositoryClient(MavenRepositoryConfig config) {
+ this.client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
+ this.apiUrl = URI.create(config.apiUrl() + "/").normalize();
+ }
+
+ @Override
+ public Metadata getMetadata(ArtifactId id) {
+ try {
+ HttpRequest request = HttpRequest.newBuilder(withArtifactPath(apiUrl, id)).build();
+ HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
+ if (response.statusCode() != 200)
+ throw new RuntimeException("Status code '" + response.statusCode() + "' and body\n'''\n" +
+ response.body() + "\n'''\nfor request " + request);
+
+ return Metadata.fromXml(response.body());
+ }
+ catch (IOException | InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ static URI withArtifactPath(URI baseUrl, ArtifactId id) {
+ List<String> parts = new ArrayList<>(List.of(id.groupId().split("\\.")));
+ parts.add(id.artifactId());
+ parts.add("maven-metadata.xml");
+ return baseUrl.resolve(String.join("/", parts));
+ }
+
+}
diff --git a/controller-server/src/main/resources/configdefinitions/maven-repository.def b/controller-server/src/main/resources/configdefinitions/maven-repository.def
new file mode 100644
index 00000000000..1072b14f7ab
--- /dev/null
+++ b/controller-server/src/main/resources/configdefinitions/maven-repository.def
@@ -0,0 +1,8 @@
+# Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.hosted.controller.maven.repository.config
+
+
+# URL to the Maven repository API that holds artifacts for tenants in the controller's system
+#
+apiUrl string default=https://repo.maven.apache.org/maven2/
+
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClientTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClientTest.java
new file mode 100644
index 00000000000..026d174cb73
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/MavenRepositoryClientTest.java
@@ -0,0 +1,22 @@
+package com.yahoo.vespa.hosted.controller.versions;
+
+import com.yahoo.vespa.hosted.controller.api.integration.maven.ArtifactId;
+import org.junit.Test;
+
+import java.net.URI;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author jonmv
+ */
+public class MavenRepositoryClientTest {
+
+ @Test
+ public void testUri() {
+ assertEquals(URI.create("https://domain:123/base/group/id/artifact-id/maven-metadata.xml"),
+ MavenRepositoryClient.withArtifactPath(URI.create("https://domain:123/base/"),
+ new ArtifactId("group.id", "artifact-id")));
+ }
+
+}