summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Tokle <mortent@verizonmedia.com>2021-04-07 08:45:45 +0200
committerGitHub <noreply@github.com>2021-04-07 08:45:45 +0200
commit5d89a774c5133332b4c6486f344b1543e1f04dce (patch)
tree93a32608908227ae096ca98ddf2be724629cc401
parent0f1eee2034f80b7d0655294ff3fd3b7ea2630598 (diff)
parent59de4d9a97374ee0d5271c612fb5d707c0078291 (diff)
Merge pull request #17100 from vespa-engine/ogronnesby/require-tenant-with-type
Add method to require tenant with type
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java4
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());
}