summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorTorbjørn Smørgrav <smorgrav@users.noreply.github.com>2020-11-03 17:25:15 +0100
committerGitHub <noreply@github.com>2020-11-03 17:25:15 +0100
commit0257c2fe0b871d73197be67cc845de4986ed00bd (patch)
treeb0d96e4ad1b7e4d6ea3959a09ad33836bdcc086d /controller-server
parentb58c9ff4b588f0d19ace4c0a1641f3213fd014a5 (diff)
parent17319b95b70ded3f0437bff2dc9396df5c7c715f (diff)
Merge pull request #15140 from vespa-engine/smorgrav/tenantinfo_get_api
Smorgrav/tenantinfo get api
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java49
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java11
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()