summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jvenstad@yahoo-inc.com>2019-03-18 09:01:09 +0100
committerJon Marius Venstad <jvenstad@yahoo-inc.com>2019-03-18 09:01:09 +0100
commit1d4b731b3474f8f208ab5b90e0e0667b316263e5 (patch)
tree4ec4350f8fb3b408b2c2ecdd2ca2aaca7f05255b
parent32ce5d092445669babe25f0f0e6ab9da8fb42c20 (diff)
Add some more scaffolding
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/BillingInfo.java (renamed from controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/BillingInfo.java)2
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/organization/Marketplace.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedTenant.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/AthenzPermitExtractor.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudApplicationPermit.java8
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitExtractor.java25
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/permits/CloudPermitStore.java61
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/tenant/CloudTenant.java1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java1
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" +