diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2020-06-10 14:44:16 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2020-06-10 15:06:09 +0200 |
commit | e0f58988817a64aa549e36bff2b4c89f191e20ee (patch) | |
tree | 3273e6f23866911ee8e2492b06fd02b9db6ca7c0 /hosted-zone-api | |
parent | 3d1b445b10f70771cf7a4bce1ba2d285c553f930 (diff) |
Move Zone API to separate bundle
Diffstat (limited to 'hosted-zone-api')
-rw-r--r-- | hosted-zone-api/CMakeLists.txt | 2 | ||||
-rw-r--r-- | hosted-zone-api/README.md | 4 | ||||
-rw-r--r-- | hosted-zone-api/abi-spec.json | 51 | ||||
-rw-r--r-- | hosted-zone-api/pom.xml | 55 | ||||
-rw-r--r-- | hosted-zone-api/src/main/java/ai/vespa/cloud/Environment.java | 13 | ||||
-rw-r--r-- | hosted-zone-api/src/main/java/ai/vespa/cloud/SystemInfo.java | 21 | ||||
-rw-r--r-- | hosted-zone-api/src/main/java/ai/vespa/cloud/Zone.java | 61 | ||||
-rw-r--r-- | hosted-zone-api/src/main/java/ai/vespa/cloud/package-info.java | 10 | ||||
-rw-r--r-- | hosted-zone-api/src/test/java/ai/vespa/cloud/SystemInfoTest.java | 49 |
9 files changed, 266 insertions, 0 deletions
diff --git a/hosted-zone-api/CMakeLists.txt b/hosted-zone-api/CMakeLists.txt new file mode 100644 index 00000000000..cc6b2953759 --- /dev/null +++ b/hosted-zone-api/CMakeLists.txt @@ -0,0 +1,2 @@ +# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +install_fat_java_artifact(hosted-zone-api) diff --git a/hosted-zone-api/README.md b/hosted-zone-api/README.md new file mode 100644 index 00000000000..8f44632dde1 --- /dev/null +++ b/hosted-zone-api/README.md @@ -0,0 +1,4 @@ +<!-- Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> +# hosted-zone-api + +Contains hosted Zone API for user facing Vespa Java APIs diff --git a/hosted-zone-api/abi-spec.json b/hosted-zone-api/abi-spec.json new file mode 100644 index 00000000000..e5d1db476c2 --- /dev/null +++ b/hosted-zone-api/abi-spec.json @@ -0,0 +1,51 @@ +{ + "ai.vespa.cloud.Environment": { + "superClass": "java.lang.Enum", + "interfaces": [], + "attributes": [ + "public", + "final", + "enum" + ], + "methods": [ + "public static ai.vespa.cloud.Environment[] values()", + "public static ai.vespa.cloud.Environment valueOf(java.lang.String)" + ], + "fields": [ + "public static final enum ai.vespa.cloud.Environment dev", + "public static final enum ai.vespa.cloud.Environment perf", + "public static final enum ai.vespa.cloud.Environment test", + "public static final enum ai.vespa.cloud.Environment staging", + "public static final enum ai.vespa.cloud.Environment prod" + ] + }, + "ai.vespa.cloud.SystemInfo": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>(ai.vespa.cloud.Zone)", + "public ai.vespa.cloud.Zone zone()" + ], + "fields": [] + }, + "ai.vespa.cloud.Zone": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>(ai.vespa.cloud.Environment, java.lang.String)", + "public ai.vespa.cloud.Environment environment()", + "public java.lang.String region()", + "public java.lang.String toString()", + "public int hashCode()", + "public boolean equals(java.lang.Object)", + "public static ai.vespa.cloud.Zone from(java.lang.String)" + ], + "fields": [] + } +}
\ No newline at end of file diff --git a/hosted-zone-api/pom.xml b/hosted-zone-api/pom.xml new file mode 100644 index 00000000000..05a291c52bf --- /dev/null +++ b/hosted-zone-api/pom.xml @@ -0,0 +1,55 @@ +<?xml version="1.0"?> +<!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.yahoo.vespa</groupId> + <artifactId>parent</artifactId> + <version>7-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> + </parent> + <artifactId>hosted-zone-api</artifactId> + <packaging>container-plugin</packaging> + <version>7-SNAPSHOT</version> + + <dependencies> + <!-- provided --> + <dependency> + <groupId>com.yahoo.vespa</groupId> + <artifactId>annotations</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <!-- required for bundle-plugin to generate import-package statements for Java's standard library --> + <groupId>com.yahoo.vespa</groupId> + <artifactId>jdisc_core</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + + <!-- test --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>com.yahoo.vespa</groupId> + <artifactId>bundle-plugin</artifactId> + <extensions>true</extensions> + </plugin> + <plugin> + <groupId>com.yahoo.vespa</groupId> + <artifactId>abi-check-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + </plugins> + </build> +</project> diff --git a/hosted-zone-api/src/main/java/ai/vespa/cloud/Environment.java b/hosted-zone-api/src/main/java/ai/vespa/cloud/Environment.java new file mode 100644 index 00000000000..8f1d9fc962a --- /dev/null +++ b/hosted-zone-api/src/main/java/ai/vespa/cloud/Environment.java @@ -0,0 +1,13 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.cloud; + +/** + * The environments of a Vespa cloud instance + * + * @author bratseth + */ +public enum Environment { + + dev, perf, test, staging, prod + +} diff --git a/hosted-zone-api/src/main/java/ai/vespa/cloud/SystemInfo.java b/hosted-zone-api/src/main/java/ai/vespa/cloud/SystemInfo.java new file mode 100644 index 00000000000..0ac93861275 --- /dev/null +++ b/hosted-zone-api/src/main/java/ai/vespa/cloud/SystemInfo.java @@ -0,0 +1,21 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.cloud; + +/** + * Provides information about the system in which this container is running. + * This is available and can be injected when running in a cloud environment. + * + * @author bratseth + */ +public class SystemInfo { + + private final Zone zone; + + public SystemInfo(Zone zone) { + this.zone = zone; + } + + /** Returns the zone this is running in */ + public Zone zone() { return zone; } + +} diff --git a/hosted-zone-api/src/main/java/ai/vespa/cloud/Zone.java b/hosted-zone-api/src/main/java/ai/vespa/cloud/Zone.java new file mode 100644 index 00000000000..48293aa7908 --- /dev/null +++ b/hosted-zone-api/src/main/java/ai/vespa/cloud/Zone.java @@ -0,0 +1,61 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.cloud; + +import java.util.Objects; + +/** + * The zone in which a cloud deployment may be running. + * A zone is a combination of an environment and a region. + * + * @author bratseth + */ +public class Zone { + + private final Environment environment; + + private final String region; + + public Zone(Environment environment, String region) { + this.environment = environment; + this.region = region; + } + + public Environment environment() { return environment; } + public String region() { return region; } + + /** Returns the string environment.region */ + @Override + public String toString() { return environment + "." + region; } + + @Override + public int hashCode() { return Objects.hash(environment, region); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if ( ! (o instanceof Zone)) return false; + Zone other = (Zone)o; + return this.environment.equals(other.environment) && this.region.equals(other.region); + } + + /** + * Creates a zone from a string on the form environment.region + * + * @throws IllegalArgumentException if the given string is not a valid zone + */ + public static Zone from(String zoneString) { + String[] parts = zoneString.split("\\."); + if (parts.length != 2) + throw new IllegalArgumentException("A zone string must be on the form [environment].[region], but was '" + zoneString + "'"); + + Environment environment; + try { + environment = Environment.valueOf(parts[0]); + } + catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid zone '" + zoneString + "': No environment named '" + parts[0] + "'"); + } + return new Zone(environment, parts[1]); + } + +} diff --git a/hosted-zone-api/src/main/java/ai/vespa/cloud/package-info.java b/hosted-zone-api/src/main/java/ai/vespa/cloud/package-info.java new file mode 100644 index 00000000000..259a2bda258 --- /dev/null +++ b/hosted-zone-api/src/main/java/ai/vespa/cloud/package-info.java @@ -0,0 +1,10 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +/** + * Public API to the Vespa cloud, available when this container runs in a cloud. + */ +@ExportPackage +@PublicApi +package ai.vespa.cloud; + +import com.yahoo.api.annotations.PublicApi; +import com.yahoo.osgi.annotation.ExportPackage; diff --git a/hosted-zone-api/src/test/java/ai/vespa/cloud/SystemInfoTest.java b/hosted-zone-api/src/test/java/ai/vespa/cloud/SystemInfoTest.java new file mode 100644 index 00000000000..6bc8b395e00 --- /dev/null +++ b/hosted-zone-api/src/test/java/ai/vespa/cloud/SystemInfoTest.java @@ -0,0 +1,49 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.cloud; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * @author bratseth + */ +public class SystemInfoTest { + + @Test + public void testSystemInfo() { + Zone zone = new Zone(Environment.dev, "us-west-1"); + SystemInfo info = new SystemInfo(zone); + assertEquals(zone, info.zone()); + } + + @Test + public void testZone() { + Zone zone = Zone.from("dev.us-west-1"); + zone = Zone.from(zone.toString()); + assertEquals(Environment.dev, zone.environment()); + assertEquals("us-west-1", zone.region()); + Zone sameZone = Zone.from("dev.us-west-1"); + assertEquals(sameZone.hashCode(), zone.hashCode()); + assertEquals(sameZone, zone); + + try { + Zone.from("invalid"); + fail("Expected exception"); + } + catch (IllegalArgumentException e) { + assertEquals("A zone string must be on the form [environment].[region], but was 'invalid'", + e.getMessage()); + } + + try { + Zone.from("invalid.us-west-1"); + fail("Expected exception"); + } + catch (IllegalArgumentException e) { + assertEquals("Invalid zone 'invalid.us-west-1': No environment named 'invalid'", e.getMessage()); + } + } + +} |