diff options
author | Jon Marius Venstad <jvenstad@yahoo-inc.com> | 2019-03-18 09:01:09 +0100 |
---|---|---|
committer | Jon Marius Venstad <jvenstad@yahoo-inc.com> | 2019-03-18 09:01:09 +0100 |
commit | 1d4b731b3474f8f208ab5b90e0e0667b316263e5 (patch) | |
tree | 4ec4350f8fb3b408b2c2ecdd2ca2aaca7f05255b | |
parent | 32ce5d092445669babe25f0f0e6ab9da8fb42c20 (diff) |
Add some more scaffolding
13 files changed, 120 insertions, 15 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/BillingInfo.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/BillingInfo.java index 0eeb331b59f..1bc3764aacd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/BillingInfo.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/BillingInfo.java @@ -1,4 +1,4 @@ -package com.yahoo.vespa.hosted.controller.tenant; +package com.yahoo.vespa.hosted.controller.api.integration.organization; import java.util.Objects; import java.util.StringJoiner; diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Marketplace.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Marketplace.java new file mode 100644 index 00000000000..b0ee5274a8f --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Marketplace.java @@ -0,0 +1,13 @@ +package com.yahoo.vespa.hosted.controller.api.integration.organization; + +/** + * A marketplace where purchase tokens can be validated and redeemed for payments. + * + * @author jonmv + */ +public interface Marketplace { + + /** Validates and translates the token to billing information which can be used to request payment. */ + BillingInfo resolveCustomer(String registrationToken); + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java index 8be4bb689cc..09a47384689 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java @@ -31,6 +31,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry; import com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade; import com.yahoo.vespa.hosted.controller.auditlog.AuditLogger; import com.yahoo.vespa.hosted.controller.deployment.JobController; +import com.yahoo.vespa.hosted.controller.permits.PermitStore; import com.yahoo.vespa.hosted.controller.persistence.CuratorDb; import com.yahoo.vespa.hosted.controller.versions.OsVersion; import com.yahoo.vespa.hosted.controller.versions.OsVersionStatus; @@ -92,13 +93,13 @@ public class Controller extends AbstractComponent { public Controller(CuratorDb curator, RotationsConfig rotationsConfig, GitHub gitHub, EntityService entityService, ZoneRegistry zoneRegistry, ConfigServer configServer, MetricsService metricsService, NameService nameService, RoutingGenerator routingGenerator, Chef chef, - AthenzClientFactory athenzClientFactory, + AthenzClientFactory athenzClientFactory, PermitStore permitStore, ArtifactRepository artifactRepository, ApplicationStore applicationStore, TesterCloud testerCloud, BuildService buildService, RunDataStore runDataStore, Mailer mailer) { this(curator, rotationsConfig, gitHub, entityService, zoneRegistry, configServer, metricsService, nameService, routingGenerator, chef, - Clock.systemUTC(), athenzClientFactory, artifactRepository, applicationStore, testerCloud, + Clock.systemUTC(), athenzClientFactory, permitStore, artifactRepository, applicationStore, testerCloud, buildService, runDataStore, com.yahoo.net.HostName::getLocalhost, mailer); } @@ -107,8 +108,8 @@ public class Controller extends AbstractComponent { ZoneRegistry zoneRegistry, ConfigServer configServer, MetricsService metricsService, NameService nameService, RoutingGenerator routingGenerator, Chef chef, Clock clock, - AthenzClientFactory athenzClientFactory, ArtifactRepository artifactRepository, - ApplicationStore applicationStore, TesterCloud testerCloud, + AthenzClientFactory athenzClientFactory, PermitStore permitStore, + ArtifactRepository artifactRepository, ApplicationStore applicationStore, TesterCloud testerCloud, BuildService buildService, RunDataStore runDataStore, Supplier<String> hostnameSupplier, Mailer mailer) { @@ -125,7 +126,7 @@ public class Controller extends AbstractComponent { this.mailer = Objects.requireNonNull(mailer, "Mailer cannot be null"); jobController = new JobController(this, runDataStore, Objects.requireNonNull(testerCloud)); - applicationController = new ApplicationController(this, curator, zmsClient, + applicationController = new ApplicationController(this, curator, permitStore, Objects.requireNonNull(rotationsConfig, "RotationsConfig cannot be null"), Objects.requireNonNull(nameService, "NameService cannot be null"), configServer, @@ -134,7 +135,7 @@ public class Controller extends AbstractComponent { Objects.requireNonNull(routingGenerator, "RoutingGenerator cannot be null"), Objects.requireNonNull(buildService, "BuildService cannot be null"), clock); - tenantController = new TenantController(this, curator, zmsClient); + tenantController = new TenantController(this, curator, permitStore); auditLogger = new AuditLogger(curator, clock); // Record the version of this controller 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 e69e28b6432..f6ce63ca2ab 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 @@ -8,7 +8,7 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant; -import com.yahoo.vespa.hosted.controller.tenant.BillingInfo; +import com.yahoo.vespa.hosted.controller.api.integration.organization.BillingInfo; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.vespa.hosted.controller.tenant.UserTenant; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/AthenzPermitExtractor.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/AthenzPermitExtractor.java index b4e96f32d87..70f382e7885 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/AthenzPermitExtractor.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/AthenzPermitExtractor.java @@ -21,6 +21,8 @@ import static com.yahoo.yolean.Exceptions.uncheck; /** * Extracts permits for Athenz or user tenants from HTTP requests. + * + * @author jonmv */ public class AthenzPermitExtractor implements PermitExtractor { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudApplicationPermit.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudApplicationPermit.java index a9d63c418f3..00856ea5e41 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudApplicationPermit.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudApplicationPermit.java @@ -8,18 +8,18 @@ import static java.util.Objects.requireNonNull; /** * Wraps the permit data of an Okta application modification. + * + * @author jonmv */ -public class CloudApplicationPermit { +public class CloudApplicationPermit extends ApplicationPermit { - private final ApplicationId application; private final Principal user; public CloudApplicationPermit(ApplicationId application, Principal user) { - this.application = requireNonNull(application); + super(application); this.user = requireNonNull(user); } - public ApplicationId application() { return application; } public Principal user() { return user; } } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitExtractor.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitExtractor.java new file mode 100644 index 00000000000..1cbe2345680 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitExtractor.java @@ -0,0 +1,25 @@ +package com.yahoo.vespa.hosted.controller.permits; + +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.TenantName; +import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; + +/** + * Extracts permits for {@link CloudTenant}s from HTTP requests. + * + * @author jonmv + */ +public class CloudPermitExtractor implements PermitExtractor { + + @Override + public CloudTenantPermit getTenantPermit(TenantName tenant, HttpRequest request) { + return new CloudTenantPermit(tenant, request.getJDiscRequest().getUserPrincipal(), "token"); + } + + @Override + public CloudApplicationPermit getApplicationPermit(ApplicationId application, HttpRequest request) { + return new CloudApplicationPermit(application, request.getJDiscRequest().getUserPrincipal()); + } + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitStore.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitStore.java new file mode 100644 index 00000000000..1ed42e52aba --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitStore.java @@ -0,0 +1,61 @@ +package com.yahoo.vespa.hosted.controller.permits; + +import com.google.inject.Inject; +import com.yahoo.vespa.hosted.controller.Application; +import com.yahoo.vespa.hosted.controller.api.integration.organization.Marketplace; +import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; +import com.yahoo.vespa.hosted.controller.tenant.Tenant; + +import java.security.Principal; +import java.util.Collections; +import java.util.List; + +/** + * @author jonmv + * @author tokle + */ +public class CloudPermitStore implements PermitStore { + + private final Marketplace marketplace; + + @Inject + public CloudPermitStore(Marketplace marketplace) { + this.marketplace = marketplace; + } + + @Override + public CloudTenant createTenant(TenantPermit permit, List<Tenant> existing, List<Application> applications) { + CloudTenantPermit cloudPermit = (CloudTenantPermit) permit; + + // Do things ... + + return new CloudTenant(cloudPermit.tenant(), marketplace.resolveCustomer(cloudPermit.getRegistrationToken())); + } + + @Override + public void deleteTenant(TenantPermit permit, Tenant tenant, List<Application> applications) { + + // Probably delete customer subscription? + + } + + @Override + public void createApplication(ApplicationPermit permit) { + + // No-op? + + } + + @Override + public void deleteApplication(ApplicationPermit permit) { + + // No-op? + + } + + @Override + public List<Tenant> accessibleTenants(List<Tenant> tenants, Principal user) { + return Collections.emptyList(); + } + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index 91a01435b68..2a685914408 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -12,7 +12,7 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; -import com.yahoo.vespa.hosted.controller.tenant.BillingInfo; +import com.yahoo.vespa.hosted.controller.api.integration.organization.BillingInfo; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.vespa.hosted.controller.tenant.UserTenant; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/CloudTenant.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/CloudTenant.java index cf68c8f3bf9..2d59e539bbd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/CloudTenant.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/CloudTenant.java @@ -1,6 +1,7 @@ package com.yahoo.vespa.hosted.controller.tenant; import com.yahoo.config.provision.TenantName; +import com.yahoo.vespa.hosted.controller.api.integration.organization.BillingInfo; import java.util.Optional; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java index c7fc4732368..29ef2543708 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java @@ -35,6 +35,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.stubs.MockRunDataStore; import com.yahoo.vespa.hosted.controller.api.integration.stubs.MockTesterCloud; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; +import com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade; import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock; import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzDbMock; import com.yahoo.vespa.hosted.controller.integration.ApplicationStoreMock; @@ -345,6 +346,7 @@ public final class ControllerTester { new ChefMock(), clock, new AthenzClientFactoryMock(athensDb), + new AthenzFacade(new AthenzClientFactoryMock(athensDb)), artifactRepository, applicationStore, new MockTesterCloud(), diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java index b78cff88ccf..b262cd5cee7 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java @@ -8,9 +8,8 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant; -import com.yahoo.vespa.hosted.controller.tenant.BillingInfo; +import com.yahoo.vespa.hosted.controller.api.integration.organization.BillingInfo; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; -import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.vespa.hosted.controller.tenant.UserTenant; import org.junit.Test; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java index b9a59a34664..3acbda04fcb 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java @@ -94,6 +94,7 @@ public class ControllerContainerTest { " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockTesterCloud'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockMailer'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.permits.AthenzPermitExtractor'/>\n" + + " <component id='com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade'/>\n" + " <handler id='com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiHandler'>\n" + " <binding>http://*/application/v4/*</binding>\n" + " </handler>\n" + |