From 4bde207f4dd4ec39db0f9b443c4156bbfaf30853 Mon Sep 17 00:00:00 2001 From: jonmv Date: Sat, 3 Dec 2022 08:36:36 +0100 Subject: Store and share private service names --- .../restapi/application/ApplicationApiHandler.java | 18 ++++++++++++++++++ .../controller/integration/ConfigServerMock.java | 4 +++- .../restapi/application/ApplicationApiTest.java | 4 ++++ .../hosted/controller/routing/RoutingPoliciesTest.java | 16 +++++++++------- 4 files changed, 34 insertions(+), 8 deletions(-) (limited to 'controller-server') 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 afd44c8e3a4..a76c5c18f9a 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 @@ -63,6 +63,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.DeploymentResult; import com.yahoo.vespa.hosted.controller.api.integration.configserver.DeploymentResult.LogEntry; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.LoadBalancer; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; @@ -287,6 +288,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}")) return deployment(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/suspended")) return suspended(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/service/{service}/{host}/status/{*}")) return status(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), path.get("service"), path.get("host"), path.getRest(), request); + if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/private-service")) return getPrivateServiceInfo(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/nodes")) return nodes(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/clusters")) return clusters(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request.propertyMap()); @@ -1960,6 +1962,22 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { instance.id().toShortString(), zone, inService ? "in" : "out of")); } + private HttpResponse getPrivateServiceInfo(String tenantName, String applicationName, String instanceName, String environment, String region) { + List lbs = controller.serviceRegistry().configServer().getLoadBalancers(ApplicationId.from(tenantName, applicationName, instanceName), + ZoneId.from(environment, region)); + Slime slime = new Slime(); + Cursor lbArray = slime.setObject().setArray("load-balancers"); + for (LoadBalancer lb : lbs) { + Cursor lbObject = lbArray.addObject(); + lbObject.setString("cluster", lb.cluster().value()); + lb.service().ifPresent(service -> { + lbObject.setString("serviceId", service.id()); + service.allowedUrns().forEach(lbObject.setArray("allowed-urns")::addString); + }); + } + return new SlimeJsonResponse(slime); + } + private HttpResponse getGlobalRotationOverride(String tenantName, String applicationName, String instanceName, String environment, String region) { DeploymentId deploymentId = new DeploymentId(ApplicationId.from(tenantName, applicationName, instanceName), requireZone(environment, region)); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java index c0f0b67926a..642397cbe1e 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java @@ -31,6 +31,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ContainerEndpoint; import com.yahoo.vespa.hosted.controller.api.integration.configserver.DeploymentResult; import com.yahoo.vespa.hosted.controller.api.integration.configserver.LoadBalancer; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.LoadBalancer.PrivateServiceInfo; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ProxyResponse; @@ -410,7 +411,8 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer Optional.of(HostName.of("lb-0--" + id.applicationId().toFullString() + "--" + id.zoneId().toString())), Optional.empty(), LoadBalancer.State.active, - Optional.of("dns-zone-1")))); + Optional.of("dns-zone-1"), + Optional.of(new PrivateServiceInfo("service", List.of("arne")))))); } Application application = applications.get(id); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index ee1094ac32e..2e73b3fc5fb 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -697,6 +697,10 @@ public class ApplicationApiTest extends ControllerContainerTest { .userIdentity(USER_ID), new File("suspended.json")); + // GET private service info + tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/us-central-1/instance/instance1/private-service", GET) + .userIdentity(USER_ID), + "{\"load-balancers\":[{\"cluster\":\"default\",\"serviceId\":\"service\",\"allowed-urns\":[\"arne\"]}]}"); // GET service/state/v1 tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/environment/prod/region/us-central-1/service/storagenode/host.com/state/v1/?foo=bar", GET) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java index fb85b876adf..2d903dad503 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java @@ -494,12 +494,13 @@ public class RoutingPoliciesTest { // Load balancer for the same application is provisioned again, but with a different hostname var newHostname = HostName.of("new-hostname"); var loadBalancer = new LoadBalancer("LB-0-Z-" + zone1.value(), - context.instanceId(), - ClusterSpec.Id.from("c0"), - Optional.of(newHostname), - Optional.empty(), - LoadBalancer.State.active, - Optional.of("dns-zone-1")); + context.instanceId(), + ClusterSpec.Id.from("c0"), + Optional.of(newHostname), + Optional.empty(), + LoadBalancer.State.active, + Optional.of("dns-zone-1"), + Optional.empty()); tester.controllerTester().configServer().putLoadBalancers(zone1, List.of(loadBalancer)); // Application redeployment preserves DNS record @@ -955,7 +956,8 @@ public class RoutingPoliciesTest { lbHostname, ipAddress, LoadBalancer.State.active, - Optional.of("dns-zone-1").filter(__ -> lbHostname.isPresent()))); + Optional.of("dns-zone-1").filter(__ -> lbHostname.isPresent()), + Optional.empty())); } return loadBalancers; } -- cgit v1.2.3 From bd9f4f3f3cab33596aad75d4fb37ad29799277ce Mon Sep 17 00:00:00 2001 From: jonmv Date: Mon, 5 Dec 2022 15:14:20 +0100 Subject: Use camel-case in API response --- .../hosted/controller/restapi/application/ApplicationApiHandler.java | 4 ++-- .../hosted/controller/restapi/application/ApplicationApiTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'controller-server') 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 a76c5c18f9a..5f57e17a1b2 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 @@ -1966,13 +1966,13 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { List lbs = controller.serviceRegistry().configServer().getLoadBalancers(ApplicationId.from(tenantName, applicationName, instanceName), ZoneId.from(environment, region)); Slime slime = new Slime(); - Cursor lbArray = slime.setObject().setArray("load-balancers"); + Cursor lbArray = slime.setObject().setArray("loadBalancers"); for (LoadBalancer lb : lbs) { Cursor lbObject = lbArray.addObject(); lbObject.setString("cluster", lb.cluster().value()); lb.service().ifPresent(service -> { lbObject.setString("serviceId", service.id()); - service.allowedUrns().forEach(lbObject.setArray("allowed-urns")::addString); + service.allowedUrns().forEach(lbObject.setArray("allowedUrns")::addString); }); } return new SlimeJsonResponse(slime); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index 2e73b3fc5fb..678e659fd1f 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -700,7 +700,7 @@ public class ApplicationApiTest extends ControllerContainerTest { // GET private service info tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/us-central-1/instance/instance1/private-service", GET) .userIdentity(USER_ID), - "{\"load-balancers\":[{\"cluster\":\"default\",\"serviceId\":\"service\",\"allowed-urns\":[\"arne\"]}]}"); + "{\"loadBalancers\":[{\"cluster\":\"default\",\"serviceId\":\"service\",\"allowedUrns\":[\"arne\"]}]}"); // GET service/state/v1 tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/environment/prod/region/us-central-1/service/storagenode/host.com/state/v1/?foo=bar", GET) -- cgit v1.2.3