diff options
author | Torbjørn Smørgrav <smorgrav@users.noreply.github.com> | 2020-11-03 17:25:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-03 17:25:15 +0100 |
commit | 0257c2fe0b871d73197be67cc845de4986ed00bd (patch) | |
tree | b0d96e4ad1b7e4d6ea3959a09ad33836bdcc086d /controller-server | |
parent | b58c9ff4b588f0d19ace4c0a1641f3213fd014a5 (diff) | |
parent | 17319b95b70ded3f0437bff2dc9396df5c7c715f (diff) |
Merge pull request #15140 from vespa-engine/smorgrav/tenantinfo_get_api
Smorgrav/tenantinfo get api
Diffstat (limited to 'controller-server')
3 files changed, 61 insertions, 2 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java index 9e54d887952..b998ed29b71 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java @@ -134,6 +134,9 @@ public abstract class LockedTenant { return new Cloud(name, creator, keys, info); } + public Cloud withInfo(TenantInfo newInfo) { + return new Cloud(name, creator, developerKeys, newInfo); + } } } 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 3856beb65bf..0541cc91159 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 @@ -91,6 +91,9 @@ import com.yahoo.vespa.hosted.controller.security.Credentials; import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.Tenant; +import com.yahoo.vespa.hosted.controller.tenant.TenantInfo; +import com.yahoo.vespa.hosted.controller.tenant.TenantInfoAddress; +import com.yahoo.vespa.hosted.controller.tenant.TenantInfoBillingContact; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; import com.yahoo.vespa.serviceview.bindings.ApplicationView; @@ -212,6 +215,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { if (path.matches("/application/v4/")) return root(request); if (path.matches("/application/v4/tenant")) return tenants(request); if (path.matches("/application/v4/tenant/{tenant}")) return tenant(path.get("tenant"), request); + if (path.matches("/application/v4/tenant/{tenant}/info")) return tenantInfo(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/application")) return applications(path.get("tenant"), Optional.empty(), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return application(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/compile-version")) return compileVersion(path.get("tenant"), path.get("application")); @@ -354,6 +358,51 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return new SlimeJsonResponse(slime); } + private HttpResponse tenantInfo(String tenantName, HttpRequest request) { + return controller.tenants().get(TenantName.from(tenantName)) + .filter(tenant -> tenant.type() == Tenant.Type.cloud) + .map(tenant -> tenantInfo(((CloudTenant)tenant).info(), request)) + .orElseGet(() -> ErrorResponse.notFoundError("Tenant '" + tenantName + "' does not exist or does not support this")); + } + + private SlimeJsonResponse tenantInfo(TenantInfo info, HttpRequest request) { + Slime slime = new Slime(); + Cursor infoCursor = slime.setObject(); + if (!info.isEmpty()) { + infoCursor.setString("name", info.name()); + infoCursor.setString("email", info.email()); + infoCursor.setString("website", info.website()); + infoCursor.setString("invoiceEmail", info.invoiceEmail()); + infoCursor.setString("contactName", info.contactName()); + infoCursor.setString("contactEmail", info.contactEmail()); + toSlime(info.address(), infoCursor); + toSlime(info.billingContact(), infoCursor); + } + + return new SlimeJsonResponse(slime); + } + + private void toSlime(TenantInfoAddress address, Cursor parentCursor) { + if (address.isEmpty()) return; + + Cursor addressCursor = parentCursor.setObject("address"); + addressCursor.setString("addressLines", address.addressLines()); + addressCursor.setString("postalCodeOrZip", address.postalCodeOrZip()); + addressCursor.setString("city", address.city()); + addressCursor.setString("stateRegionProvince", address.stateRegionProvince()); + addressCursor.setString("country", address.country()); + } + + private void toSlime(TenantInfoBillingContact billingContact, Cursor parentCursor) { + if (billingContact.isEmpty()) return; + + Cursor addressCursor = parentCursor.setObject("billingContact"); + addressCursor.setString("name", billingContact.name()); + addressCursor.setString("email", billingContact.email()); + addressCursor.setString("phone", billingContact.phone()); + toSlime(billingContact.address(), addressCursor); + } + private HttpResponse applications(String tenantName, Optional<String> applicationName, HttpRequest request) { TenantName tenant = TenantName.from(tenantName); if (controller.tenants().get(tenantName).isEmpty()) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java index a1b06262241..59340458a9c 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java @@ -23,6 +23,7 @@ import org.junit.Test; import java.util.Collections; import java.util.Set; +import static com.yahoo.application.container.handler.Request.Method.GET; import static com.yahoo.application.container.handler.Request.Method.POST; import static com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiTest.createApplicationSubmissionData; @@ -44,12 +45,11 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { .withBooleanFlag(Flags.ENABLE_PUBLIC_SIGNUP_FLOW.id(), true); deploymentTester = new DeploymentTester(new ControllerTester(tester)); deploymentTester.controllerTester().computeVersionStatus(); + setupTenantAndApplication(); } @Test public void test_missing_security_clients_pem() { - setupTenantAndApplication(); - var application = prodBuilder().build(); var deployRequest = request("/application/v4/tenant/scoober/application/albums/submit", POST) @@ -62,6 +62,13 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { 400); } + @Test + public void get_empty_tenant_info() { + var infoRequest = + request("/application/v4/tenant/scoober/info", GET) + .roles(Set.of(Role.reader(tenantName))); + tester.assertResponse(infoRequest, "{}", 200); + } private ApplicationPackageBuilder prodBuilder() { return new ApplicationPackageBuilder() |