diff options
author | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-11-03 10:54:26 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-11-03 10:54:26 +0100 |
commit | 89dd954525fe90c6080dc2f610b489426c9e3a63 (patch) | |
tree | 582e3c683134ce196cd0eda660d24866d8cc1519 | |
parent | 96f6abe9caa338074ee39cb2fd566d3efff464c9 (diff) |
Add method to remove ToS approval
3 files changed, 47 insertions, 1 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/Policy.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/Policy.java index 44f6386e9bc..0468be5f30c 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/Policy.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/Policy.java @@ -193,7 +193,7 @@ enum Policy { .on(PathGroup.dataplaneToken) .in(SystemName.PublicCd, SystemName.Public)), - termsOfService(Privilege.grant(Action.create) + termsOfService(Privilege.grant(Action.create, Action.delete) .on(PathGroup.termsOfService) .in(SystemName.PublicCd, SystemName.Public)); 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 6cf38a1927c..ebcc81ab756 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 @@ -437,6 +437,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/archive-access/aws")) return removeAwsArchiveAccess(path.get("tenant")); if (path.matches("/application/v4/tenant/{tenant}/archive-access/gcp")) return removeGcpArchiveAccess(path.get("tenant")); if (path.matches("/application/v4/tenant/{tenant}/secret-store/{name}")) return deleteSecretStore(path.get("tenant"), path.get("name"), request); + if (path.matches("/application/v4/tenant/{tenant}/terms-of-service")) return unapproveTermsOfService(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/token/{tokenid}")) return deleteToken(path.get("tenant"), path.get("tokenid"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return deleteApplication(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deployment")) return removeAllProdDeployments(path.get("tenant"), path.get("application")); @@ -1264,6 +1265,17 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { return new MessageResponse("Terms of service approved by %s".formatted(approvedBy.getName())); } + private HttpResponse unapproveTermsOfService(String tenant, HttpRequest req) { + if (controller.tenants().require(TenantName.from(tenant)).type() != Tenant.Type.cloud) + throw new IllegalArgumentException("Tenant '" + tenant + "' is not a cloud tenant"); + controller.tenants().lockOrThrow(TenantName.from(tenant), LockedTenant.Cloud.class, t -> { + var updatedTenant = t.withInfo(t.get().info().withBilling(t.get().info().billingContact().withToSApproval( + TermsOfServiceApproval.empty()))); + controller.tenants().store(updatedTenant); + }); + return new MessageResponse("Terms of service approval removed"); + } + private HttpResponse addDeveloperKey(String tenantName, HttpRequest request) { if (controller.tenants().require(TenantName.from(tenantName)).type() != Tenant.Type.cloud) throw new IllegalArgumentException("Tenant '" + tenantName + "' is not a cloud tenant"); 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 3c57f812a48..eb1885423b1 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 @@ -180,6 +180,40 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { } """; tester.assertJsonResponse(request, expectedResponse, 200); + + var unapproveToSRequest = request("/application/v4/tenant/scoober/terms-of-service", DELETE) + .data("{}").roles(Set.of(Role.administrator(tenantName))); + tester.assertResponse(unapproveToSRequest, "{\"message\":\"Terms of service approval removed\"}", 200); + + expectedResponse = """ + { + "contact": { + "name":"name", + "email":"foo@example", + "emailVerified": false, + "phone":"phone" + }, + "taxId": { + "country": "NO", + "type": "no_vat", + "code": "123456789MVA" + }, + "purchaseOrder":"PO9001", + "invoiceEmail":"billing@mycomp.any", + "tosApproval": { + "at": "", + "by": "" + }, + "address": { + "addressLines":"addressLines", + "postalCodeOrZip":"postalCodeOrZip", + "city":"city", + "stateRegionProvince":"stateRegionProvince", + "country":"country" + } + } + """; + tester.assertJsonResponse(request, expectedResponse, 200); } @Test |