summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorsmorgrav <smorgrav@verizonmedia.com>2020-11-05 11:57:10 +0100
committersmorgrav <smorgrav@verizonmedia.com>2020-11-05 12:57:53 +0100
commit55d739706342616a538852fabe39956cd450a736 (patch)
treeae35424f5d8dfd42ecba03d8088550765a88d1e6 /controller-server
parenta65780d57302eaf5a5791068e233f781e35d4401 (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.java55
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())