diff options
author | smorgrav <smorgrav@verizonmedia.com> | 2020-11-05 11:57:10 +0100 |
---|---|---|
committer | smorgrav <smorgrav@verizonmedia.com> | 2020-11-05 12:57:53 +0100 |
commit | 55d739706342616a538852fabe39956cd450a736 (patch) | |
tree | ae35424f5d8dfd42ecba03d8088550765a88d1e6 /controller-server | |
parent | a65780d57302eaf5a5791068e233f781e35d4401 (diff) |
Implement POST handler for tenantInfo
Diffstat (limited to 'controller-server')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 55 |
1 files changed, 55 insertions, 0 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 d0fa0f1a7f0..128c6093913 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 @@ -266,6 +266,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { private HttpResponse handlePOST(Path path, HttpRequest request) { if (path.matches("/application/v4/tenant/{tenant}")) return createTenant(path.get("tenant"), request); + if (path.matches("/application/v4/tenant/{tenant}/info")) return updateTenantInfo(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/key")) return addDeveloperKey(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return createApplication(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying/platform")) return deployPlatform(path.get("tenant"), path.get("application"), "default", false, request); @@ -403,6 +404,60 @@ public class ApplicationApiHandler extends LoggingRequestHandler { toSlime(billingContact.address(), addressCursor); } + private HttpResponse updateTenantInfo(String tenantName, HttpRequest request) { + return controller.tenants().get(TenantName.from(tenantName)) + .filter(tenant -> tenant.type() == Tenant.Type.cloud) + .map(tenant -> updateTenantInfo(((CloudTenant)tenant), request)) + .orElseGet(() -> ErrorResponse.notFoundError("Tenant '" + tenantName + "' does not exist or does not support this")); + } + + private String getString(Inspector field, String defaultVale) { + return field.valid() ? field.asString() : defaultVale; + } + + private SlimeJsonResponse updateTenantInfo(CloudTenant tenant, HttpRequest request) { + TenantInfo oldInfo = tenant.info(); + + // Merge info from request with the existing info + Inspector insp = toSlime(request.getData()).get(); + TenantInfo mergedInfo = TenantInfo.EMPTY + .withName(getString(insp.field("name"), oldInfo.name())) + .withEmail(getString(insp.field("email"), oldInfo.email())) + .withWebsite(getString(insp.field("website"), oldInfo.email())) + .withInvoiceEmail(getString(insp.field("invoiceEmail"), oldInfo.invoiceEmail())) + .withContactName(getString(insp.field("contactName"), oldInfo.contactName())) + .withContactEmail(getString(insp.field("contactEmail"), oldInfo.contactName())) + .withAddress(updateTenantInfoAddress(insp.field("address"), oldInfo.address())) + .withBillingContact(updateTenantInfoBillingContact(insp.field("billingContact"), oldInfo.billingContact())); + + // Store changes + controller.tenants().lockOrThrow(tenant.name(), LockedTenant.Cloud.class, lockedTenant -> { + lockedTenant = lockedTenant.withInfo(mergedInfo); + controller.tenants().store(lockedTenant); + }); + + return new MessageResponse("Tenant info updated"); + } + + private TenantInfoAddress updateTenantInfoAddress(Inspector insp, TenantInfoAddress oldAddress) { + if (!insp.valid()) return oldAddress; + return TenantInfoAddress.EMPTY + .withCountry(getString(insp.field("country"), oldAddress.country())) + .withStateRegionProvince(getString(insp.field("stateRegionProvince"), oldAddress.stateRegionProvince())) + .withCity(getString(insp.field("city"), oldAddress.city())) + .withPostalCodeOrZip(getString(insp.field("postalCodeOrZip"), oldAddress.postalCodeOrZip())) + .withAddressLines(getString(insp.field("addressLines"), oldAddress.addressLines())); + } + + private TenantInfoBillingContact updateTenantInfoBillingContact(Inspector insp, TenantInfoBillingContact oldContact) { + if (!insp.valid()) return oldContact; + return TenantInfoBillingContact.EMPTY + .withName(getString(insp.field("name"), oldContact.name())) + .withEmail(getString(insp.field("email"), oldContact.email())) + .withPhone(getString(insp.field("phone"), oldContact.phone())) + .withAddress(updateTenantInfoAddress(insp.field("address"), oldContact.address())); + } + private HttpResponse applications(String tenantName, Optional<String> applicationName, HttpRequest request) { TenantName tenant = TenantName.from(tenantName); if (controller.tenants().get(tenantName).isEmpty()) |