From 468844f6de586f30aa468ee6596f201fe61e63d6 Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Wed, 29 Mar 2023 14:15:51 +0200 Subject: Revert "Add API to list zones" This reverts commit 538f72529022e703aea37c3baec7eba5403aedfd. --- .../hosted/controller/api/role/PathGroup.java | 1 - .../restapi/cloudinfo/CloudInfoApiHandler.java | 71 ---------------------- .../restapi/ControllerContainerTest.java | 3 - .../restapi/cloudinfo/CloudInfoApiHandlerTest.java | 51 ---------------- .../restapi/cloudinfo/responses/root.json | 7 --- .../restapi/cloudinfo/responses/zones.json | 22 ------- 6 files changed, 155 deletions(-) delete mode 100644 controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandler.java delete mode 100644 controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/CloudInfoApiHandlerTest.java delete mode 100644 controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/root.json delete mode 100644 controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/cloudinfo/responses/zones.json 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/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/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 { http://localhost/os/v1/* - - http://localhost/cloudinfo/v1/* - http://localhost/zone/v2 http://localhost/zone/v2/* 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" - } - ] -} -- cgit v1.2.3 From 954c8eb9d03e092669ccc10354ef0e96799071d6 Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Wed, 29 Mar 2023 14:35:32 +0200 Subject: Add availabilityZone to deployment object in /application/v4 --- .../controller/restapi/application/ApplicationApiHandler.java | 10 ++++++++++ .../vespa/hosted/controller/integration/ZoneRegistryMock.java | 6 +++--- .../restapi/application/responses/deployment-cloud.json | 3 ++- 3 files changed, 15 insertions(+), 4 deletions(-) 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/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/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, -- cgit v1.2.3 From 7489d830e4bb488bfb0eefe9ea417c224ee7875b Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Wed, 29 Mar 2023 14:58:40 +0200 Subject: Fix unit test --- .../hosted/controller/maintenance/ArchiveAccessMaintainerTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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()); -- cgit v1.2.3