summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2023-03-29 15:31:40 +0200
committerGitHub <noreply@github.com>2023-03-29 15:31:40 +0200
commit79798b43c050c325ad3e5295620d064d73bf95e2 (patch)
treee49247e71b72590378ac39e516bceca4d6710c3d
parent776950e8f3ff736195b8373ee992baf3189a0ec8 (diff)
parent7489d830e4bb488bfb0eefe9ea417c224ee7875b (diff)
Merge pull request #26633 from vespa-engine/freva/cloud-info
Add availability zone to /application/v4
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java10
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandler.java71
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandlerTest.java51
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/root.json7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/zones.json22
10 files changed, 19 insertions, 161 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
index b8538143316..fef29a99a47 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
@@ -227,7 +227,6 @@ enum PathGroup {
"/badge/v1/{*}", // Badges for deployment jobs.
"/zone/v1/{*}", // Lists environment and regions.
"/cli/v1/{*}", // Public information for Vespa CLI.
- "/cloudinfo/v1/{*}", // Public information about zones and flavors.
"/.well-known/{*}"),
/** Paths used for deploying system-wide feature flags. */
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index 6c614738ddf..8a0e2d01d8c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -27,6 +27,7 @@ import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.ZoneEndpoint.AllowedUrn;
import com.yahoo.config.provision.zone.RoutingMethod;
+import com.yahoo.config.provision.zone.ZoneApi;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.container.handler.metrics.JsonResponse;
import com.yahoo.container.jdisc.EmptyResponse;
@@ -1659,6 +1660,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
else {
deploymentObject.setString("environment", deployment.zone().environment().value());
deploymentObject.setString("region", deployment.zone().region().value());
+ addAvailabilityZone(deploymentObject, deployment.zone());
deploymentObject.setString("url", withPath(request.getUri().getPath() +
"/instance/" + instance.name().value() +
"/environment/" + deployment.zone().environment().value() +
@@ -1755,6 +1757,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
deploymentObject.setString("environment", deployment.zone().environment().value());
deploymentObject.setString("region", deployment.zone().region().value());
deploymentObject.setString("instance", instance.id().instance().value()); // pointless
+ addAvailabilityZone(deploymentObject, deployment.zone());
deploymentObject.setString("url", withPath(request.getUri().getPath() +
"/environment/" + deployment.zone().environment().value() +
"/region/" + deployment.zone().region().value(),
@@ -1837,6 +1840,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
response.setString("instance", deploymentId.applicationId().instance().value()); // pointless
response.setString("environment", deploymentId.zoneId().environment().value());
response.setString("region", deploymentId.zoneId().region().value());
+ addAvailabilityZone(response, deployment.zone());
var application = controller.applications().requireApplication(TenantAndApplicationId.from(deploymentId.applicationId()));
// Add zone endpoints
@@ -3020,6 +3024,12 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
return new MessageResponse("All deployments removed");
}
+ private void addAvailabilityZone(Cursor object, ZoneId zoneId) {
+ ZoneApi zone = controller.zoneRegistry().get(zoneId);
+ if (!zone.getCloudName().equals(CloudName.AWS)) return;
+ object.setString("availabilityZone", zone.getCloudNativeAvailabilityZone());
+ }
+
private ZoneId requireZone(String environment, String region) {
return requireZone(ZoneId.from(environment, region));
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandler.java
deleted file mode 100644
index 338bc29269a..00000000000
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.restapi.cloudinfo;
-
-import com.yahoo.container.jdisc.HttpRequest;
-import com.yahoo.container.jdisc.HttpResponse;
-import com.yahoo.container.jdisc.ThreadedHttpRequestHandler;
-import com.yahoo.restapi.ErrorResponse;
-import com.yahoo.restapi.Path;
-import com.yahoo.restapi.ResourceResponse;
-import com.yahoo.restapi.SlimeJsonResponse;
-import com.yahoo.slime.Cursor;
-import com.yahoo.slime.Slime;
-import com.yahoo.vespa.hosted.controller.api.integration.ServiceRegistry;
-import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry;
-import com.yahoo.vespa.hosted.controller.restapi.ErrorResponses;
-import com.yahoo.yolean.Exceptions;
-
-/**
- * Read-only REST API that provides information about cloud resources (e.g. zones and flavors).
- *
- * @author freva
- */
-@SuppressWarnings("unused")
-public class CloudInfoApiHandler extends ThreadedHttpRequestHandler {
-
- private final ZoneRegistry zoneRegistry;
-
- public CloudInfoApiHandler(Context parentCtx, ServiceRegistry serviceRegistry) {
- super(parentCtx);
- this.zoneRegistry = serviceRegistry.zoneRegistry();
- }
-
- @Override
- public HttpResponse handle(HttpRequest request) {
- try {
- return switch (request.getMethod()) {
- case GET -> get(request);
- default -> ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is unsupported");
- };
- } catch (IllegalArgumentException e) {
- return ErrorResponse.badRequest(Exceptions.toMessageString(e));
- } catch (RuntimeException e) {
- return ErrorResponses.logThrowing(request, log, e);
- }
- }
-
- private HttpResponse get(HttpRequest request) {
- Path path = new Path(request.getUri());
- if (path.matches("/cloudinfo/v1")) return new ResourceResponse(request, "zones");
- if (path.matches("/cloudinfo/v1/zones")) return zones(request);
- return notFound(path);
- }
-
- private HttpResponse zones(HttpRequest request) {
- Slime slime = new Slime();
- Cursor zones = slime.setObject().setArray("zones");
- zoneRegistry.zones().publiclyVisible().all().zones().forEach(zone -> {
- Cursor object = zones.addObject();
- object.setString("environment", zone.getEnvironment().value());
- object.setString("region", zone.getRegionName().value());
- object.setString("cloud", zone.getCloudName().value());
- object.setString("availabilityZone", zone.getCloudNativeAvailabilityZone());
- });
- return new SlimeJsonResponse(slime);
- }
-
- private HttpResponse notFound(Path path) {
- return ErrorResponse.notFoundError("Nothing at " + path);
- }
-
-}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java
index 8b279adc4fa..611f0bab904 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java
@@ -63,9 +63,9 @@ public class ZoneRegistryMock extends AbstractComponent implements ZoneRegistry
if (system.isPublic()) {
this.zones = List.of(ZoneApiMock.fromId("test.us-east-1"),
ZoneApiMock.fromId("staging.us-east-3"),
- ZoneApiMock.fromId("prod.aws-us-east-1c"),
- ZoneApiMock.fromId("prod.aws-eu-west-1a"),
- ZoneApiMock.fromId("dev.aws-us-east-1c"));
+ ZoneApiMock.newBuilder().withId("prod.aws-us-east-1c").withCloud("aws").withCloudNativeAvailabilityZone("use1-az2").build(),
+ ZoneApiMock.newBuilder().withId("prod.aws-eu-west-1a").withCloud("aws").withCloudNativeAvailabilityZone("euw1-az3").build(),
+ ZoneApiMock.newBuilder().withId("dev.aws-us-east-1c").withCloud("aws").withCloudNativeAvailabilityZone("use1-az2").build());
setRoutingMethod(this.zones, RoutingMethod.exclusive);
} else {
this.zones = List.of(ZoneApiMock.fromId("test.us-east-1"),
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java
index 0490a9bdcc5..fe14d696011 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveAccessMaintainerTest.java
@@ -43,10 +43,12 @@ public class ArchiveAccessMaintainerTest {
assertEquals(new ArchiveAccess().withAWSRole(tenant1role), archiveService.authorizeAccessByTenantName.get(tenant1));
assertEquals(new ArchiveAccess().withAWSRole(tenant2role), archiveService.authorizeAccessByTenantName.get(tenant2));
+ var zoneRegistry = tester.controller().zoneRegistry();
var expected = Map.of("archive.bucketCount",
- tester.controller().zoneRegistry().zonesIncludingSystem().all().ids().stream()
+ zoneRegistry.zonesIncludingSystem().all().ids().stream()
.collect(Collectors.toMap(
- zone -> Map.of("zone", zone.value(), "cloud", "default"),
+ zone -> Map.of("zone", zone.value(), "cloud",
+ zoneRegistry.hasZone(zone) ? zoneRegistry.get(zone).getCloudName().value() : "default"),
zone -> zone.equals(testZone) ? 1d : 0d)));
assertEquals(expected, metric.metrics());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
index 30f74f4bf70..7522f42f91b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
@@ -96,9 +96,6 @@ public class ControllerContainerTest {
<handler id='com.yahoo.vespa.hosted.controller.restapi.os.OsApiHandler'>
<binding>http://localhost/os/v1/*</binding>
</handler>
- <handler id='com.yahoo.vespa.hosted.controller.restapi.cloudinfo.CloudInfoApiHandler'>
- <binding>http://localhost/cloudinfo/v1/*</binding>
- </handler>
<handler id='com.yahoo.vespa.hosted.controller.restapi.zone.v2.ZoneApiHandler'>
<binding>http://localhost/zone/v2</binding>
<binding>http://localhost/zone/v2/*</binding>
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json
index 4d0f1259c07..bb4136ed0ba 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json
@@ -4,6 +4,7 @@
"instance": "default",
"environment": "prod",
"region": "aws-us-east-1c",
+ "availabilityZone": "use1-az2",
"endpoints": [
{
"cluster": "default",
@@ -30,7 +31,7 @@
},
"status": "complete",
"quota": 1.304,
- "activity": { },
+ "activity": {},
"metrics": {
"queriesPerSecond": 0.0,
"writesPerSecond": 0.0,
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandlerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandlerTest.java
deleted file mode 100644
index c4ce687504e..00000000000
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandlerTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.restapi.cloudinfo;
-
-import com.yahoo.config.provision.CloudName;
-import com.yahoo.config.provision.SystemName;
-import com.yahoo.config.provision.zone.ZoneApi;
-import com.yahoo.config.provision.zone.ZoneId;
-import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock;
-import com.yahoo.vespa.hosted.controller.restapi.ContainerTester;
-import com.yahoo.vespa.hosted.controller.restapi.ControllerContainerTest;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.io.File;
-
-/**
- * @author freva
- */
-class CloudInfoApiHandlerTest extends ControllerContainerTest {
- private static final String responses = "src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/";
-
- private ContainerTester tester;
-
- @Override
- protected SystemName system() {
- return SystemName.cd;
- }
-
- @BeforeEach
- public void before() {
- tester = new ContainerTester(container, responses);
- tester.serviceRegistry().zoneRegistry().setZones(
- zone(CloudName.AWS, "prod", "aws-us-east-1a", "use1-az1"),
- zone(CloudName.AWS, "prod", "aws-us-west-2c", "usw2-az4"),
- zone(CloudName.GCP, "prod", "gcp-us-east1-f", "us-east1-f"));
- }
-
- @Test
- void test_api() {
- tester.assertResponse(authenticatedRequest("http://localhost:8080/cloudinfo/v1/"), new File("root.json"));
- tester.assertResponse(authenticatedRequest("http://localhost:8080/cloudinfo/v1/zones"), new File("zones.json"));
- }
-
- private static ZoneApi zone(CloudName cloudName, String environment, String region, String availabilityZone) {
- return ZoneApiMock.newBuilder()
- .with(cloudName)
- .with(ZoneId.from(environment, region))
- .withCloudNativeAvailabilityZone(availabilityZone)
- .build();
- }
-}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/root.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/root.json
deleted file mode 100644
index a733018428e..00000000000
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/root.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "resources": [
- {
- "url": "http://localhost:8080/cloudinfo/v1/zones/"
- }
- ]
-}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/zones.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/zones.json
deleted file mode 100644
index d884b2c06a3..00000000000
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/zones.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "zones": [
- {
- "environment": "prod",
- "region": "aws-us-east-1a",
- "cloud": "aws",
- "availabilityZone": "use1-az1"
- },
- {
- "environment": "prod",
- "region": "aws-us-west-2c",
- "cloud": "aws",
- "availabilityZone": "usw2-az4"
- },
- {
- "environment": "prod",
- "region": "gcp-us-east1-f",
- "cloud": "gcp",
- "availabilityZone": "us-east1-f"
- }
- ]
-}