diff options
author | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-10-16 09:09:30 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@vespa.ai> | 2023-10-16 10:23:06 +0200 |
commit | 1f478cb84353b70247b7513d2054c38e057932e2 (patch) | |
tree | e1c3e18d8527d4b05ddd169118534ab79eec2f84 | |
parent | ce9556b4cdb280e621f3710b93755469c5e3627a (diff) |
Add feature flag to enable trial notifications
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudTrialExpirer.java | 16 | ||||
-rw-r--r-- | flags/src/main/java/com/yahoo/vespa/flags/Flags.java | 6 |
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, |