diff options
author | Øyvind Grønnesby <oyving@verizonmedia.com> | 2021-03-22 15:59:13 +0100 |
---|---|---|
committer | Øyvind Grønnesby <oyving@verizonmedia.com> | 2021-03-22 15:59:13 +0100 |
commit | 59de4d9a97374ee0d5271c612fb5d707c0078291 (patch) | |
tree | 7c00b9697891a08cf98f049ce2cd1cc685dece6c /controller-server | |
parent | 24977c3bf922cb70d8638ad2890075169954c987 (diff) |
Add method to require tenant with type
Diffstat (limited to 'controller-server')
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 d3992290f20..958d8c08101 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 @@ -98,6 +98,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 ca080078328..9420dee3ed4 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 @@ -589,17 +589,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() @@ -629,7 +625,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); @@ -684,7 +680,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()) { @@ -702,14 +698,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)) @@ -726,7 +722,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 4fb91639daa..4e3b570f4c5 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 @@ -190,10 +190,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()); } |