diff options
author | Morten Tokle <mortent@verizonmedia.com> | 2021-04-07 08:45:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-07 08:45:45 +0200 |
commit | 5d89a774c5133332b4c6486f344b1543e1f04dce (patch) | |
tree | 93a32608908227ae096ca98ddf2be724629cc401 | |
parent | 0f1eee2034f80b7d0655294ff3fd3b7ea2630598 (diff) | |
parent | 59de4d9a97374ee0d5271c612fb5d707c0078291 (diff) |
Merge pull request #17100 from vespa-engine/ogronnesby/require-tenant-with-type
Add method to require tenant with type
3 files changed, 19 insertions, 12 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java index fdcadb6301e..f3e192aef90 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java @@ -92,6 +92,17 @@ public class TenantController { return get(name).orElseThrow(() -> new IllegalArgumentException("No such tenant '" + name + "'.")); } + /** Returns the tenant with the given name, and ensures the type */ + public <T extends Tenant> T require(TenantName name, Class<T> tenantType) { + return get(name) + .map(t -> { + try { return tenantType.cast(t); } catch (ClassCastException e) { + throw new IllegalArgumentException("Tenant '" + name + "' was of type '" + t.getClass().getSimpleName() + "' and not '" + tenantType.getSimpleName() + "'"); + } + }) + .orElseThrow(() -> new IllegalArgumentException("No such tenant '" + name + "'.")); + } + /** Replace and store any previous version of given tenant */ public void store(LockedTenant tenant) { curator.writeTenant(tenant.get()); 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 d082cf6fea9..16642ecbfc7 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 @@ -590,17 +590,13 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } private HttpResponse validateSecretStore(String tenantName, String secretStoreName, HttpRequest request) { - var awsRegion = request.getProperty("aws-region"); var parameterName = request.getProperty("parameter-name"); var applicationId = ApplicationId.fromFullString(request.getProperty("application-id")); var zoneId = ZoneId.from(request.getProperty("zone")); var deploymentId = new DeploymentId(applicationId, zoneId); - var tenant = (CloudTenant)controller.tenants().require(applicationId.tenant()); - if (tenant.type() != Tenant.Type.cloud) { - return ErrorResponse.badRequest("Tenant '" + applicationId.tenant() + "' is not a cloud tenant"); - } + var tenant = controller.tenants().require(applicationId.tenant(), CloudTenant.class); var tenantSecretStore = tenant.tenantSecretStores() .stream() @@ -630,7 +626,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { String pemDeveloperKey = toSlime(request.getData()).get().field("key").asString(); PublicKey developerKey = KeyUtils.fromPemEncodedPublicKey(pemDeveloperKey); - Principal user = ((CloudTenant) controller.tenants().require(TenantName.from(tenantName))).developerKeys().get(developerKey); + Principal user = controller.tenants().require(TenantName.from(tenantName), CloudTenant.class).developerKeys().get(developerKey); Slime root = new Slime(); controller.tenants().lockOrThrow(TenantName.from(tenantName), LockedTenant.Cloud.class, tenant -> { tenant = tenant.withoutDeveloperKey(developerKey); @@ -685,7 +681,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { var externalId = mandatory("externalId", data).asString(); var role = mandatory("role", data).asString(); - var tenant = (CloudTenant) controller.tenants().require(TenantName.from(tenantName)); + var tenant = controller.tenants().require(TenantName.from(tenantName), CloudTenant.class); var tenantSecretStore = new TenantSecretStore(name, awsId, role); if (!tenantSecretStore.isValid()) { @@ -703,14 +699,14 @@ public class ApplicationApiHandler extends LoggingRequestHandler { controller.tenants().store(lockedTenant); }); - tenant = (CloudTenant) controller.tenants().require(TenantName.from(tenantName)); + tenant = controller.tenants().require(TenantName.from(tenantName), CloudTenant.class); var slime = new Slime(); toSlime(slime.setObject(), tenant.tenantSecretStores()); return new SlimeJsonResponse(slime); } private HttpResponse deleteSecretStore(String tenantName, String name, HttpRequest request) { - var tenant = (CloudTenant) controller.tenants().require(TenantName.from(tenantName)); + var tenant = controller.tenants().require(TenantName.from(tenantName), CloudTenant.class); var optionalSecretStore = tenant.tenantSecretStores().stream() .filter(secretStore -> secretStore.getName().equals(name)) @@ -727,7 +723,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { controller.tenants().store(lockedTenant); }); - tenant = (CloudTenant) controller.tenants().require(TenantName.from(tenantName)); + tenant = controller.tenants().require(TenantName.from(tenantName), CloudTenant.class); var slime = new Slime(); toSlime(slime.setObject(), tenant.tenantSecretStores()); return new SlimeJsonResponse(slime); 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 0193c5b19f9..7074d0d7354 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 @@ -189,10 +189,10 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { lockedTenant = lockedTenant.withSecretStore(new TenantSecretStore("secret-foo", "123", "some-role")); tester.controller().tenants().store(lockedTenant); }); - var tenant = (CloudTenant) tester.controller().tenants().require(tenantName); + var tenant = tester.controller().tenants().require(tenantName, CloudTenant.class); assertEquals(1, tenant.tenantSecretStores().size()); tester.assertResponse(deleteRequest, "{\"secretStores\":[]}", 200); - tenant = (CloudTenant) tester.controller().tenants().require(tenantName); + tenant = tester.controller().tenants().require(tenantName, CloudTenant.class); assertEquals(0, tenant.tenantSecretStores().size()); } |