summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@vespa.ai>2023-10-16 09:09:30 +0200
committerBjørn Christian Seime <bjorncs@vespa.ai>2023-10-16 10:23:06 +0200
commit1f478cb84353b70247b7513d2054c38e057932e2 (patch)
treee1c3e18d8527d4b05ddd169118534ab79eec2f84
parentce9556b4cdb280e621f3710b93755469c5e3627a (diff)
Add feature flag to enable trial notifications
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java16
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java6
2 files changed, 18 insertions, 4 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java
index ed8cd3f54f8..2e6d3be3618 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java
@@ -3,6 +3,9 @@ package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.TenantName;
+import com.yahoo.vespa.flags.BooleanFlag;
+import com.yahoo.vespa.flags.FetchVector;
+import com.yahoo.vespa.flags.Flags;
import com.yahoo.vespa.flags.ListFlag;
import com.yahoo.vespa.flags.PermanentFlags;
import com.yahoo.vespa.hosted.controller.Controller;
@@ -43,10 +46,12 @@ public class CloudTrialExpirer extends ControllerMaintainer {
private static final Duration nonePlanAfter = Duration.ofDays(14);
private static final Duration tombstoneAfter = Duration.ofDays(91);
private final ListFlag<String> extendedTrialTenants;
+ private final BooleanFlag cloudTrialNotificationEnabled;
public CloudTrialExpirer(Controller controller, Duration interval) {
super(controller, interval, null, SystemName.allOf(SystemName::isPublic));
this.extendedTrialTenants = PermanentFlags.EXTENDED_TRIAL_TENANTS.bindTo(controller().flagSource());
+ this.cloudTrialNotificationEnabled = Flags.CLOUD_TRIAL_NOTIFICATIONS.bindTo(controller().flagSource());
}
@Override
@@ -92,10 +97,8 @@ public class CloudTrialExpirer extends ControllerMaintainer {
}
private boolean notifyTenants() {
try {
- // TODO Introduce tenant specific feature flag
-
var currentStatus = controller().curator().readTrialNotifications()
- .map(TrialNotifications::tenants).orElse(List.of());
+ .map(TrialNotifications::tenants).orElse(List.of());
log.fine(() -> "Current: %s".formatted(currentStatus));
var currentStatusByTenant = new HashMap<TenantName, TrialNotifications.Status>();
currentStatus.forEach(status -> currentStatusByTenant.put(status.tenant(), status));
@@ -103,13 +106,18 @@ public class CloudTrialExpirer extends ControllerMaintainer {
var now = controller().clock().instant();
for (var tenant : controller().tenants().asList()) {
+
var status = currentStatusByTenant.get(tenant.name());
var state = status == null ? UNKNOWN : status.state();
var plan = controller().serviceRegistry().billingController().getPlan(tenant.name()).value();
var ageInDays = Duration.between(tenant.createdAt(), now).toDays();
// TODO Replace stubs with proper email content stored in templates.
- if (!List.of("none", "trial").contains(plan)) {
+
+ var enabled = cloudTrialNotificationEnabled.with(FetchVector.Dimension.TENANT_ID, tenant.name().value()).value();
+ if (!enabled) {
+ updatedStatus.add(status);
+ } else if (!List.of("none", "trial").contains(plan)) {
// Ignore tenants that are on a paid plan and skip from inclusion in updated data structure
} else if (status == null && "trial".equals(plan) && ageInDays <= 1) {
updatedStatus.add(updatedStatus(tenant, now, SIGNED_UP));
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index 56cd06d3b35..40afad92983 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -436,6 +436,12 @@ public class Flags {
"Takes effect on next deployment through controller",
APPLICATION_ID);
+ public static final UnboundBooleanFlag CLOUD_TRIAL_NOTIFICATIONS = defineFeatureFlag(
+ "cloud-trial-notifications", false,
+ List.of("bjorncs", "oyving"), "2023-10-13", "2024-03-01",
+ "Whether to send cloud trial email notifications",
+ "Takes effect immediately");
+
/** WARNING: public for testing: All flags should be defined in {@link Flags}. */
public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners,
String createdAt, String expiresAt, String description,