summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-02-28 12:58:53 +0100
committerMartin Polden <mpolden@mpolden.no>2019-04-23 14:54:02 +0200
commitb7cd339056254d6a57324cdfa587106248de1a49 (patch)
treee93223db86fd663ccff5f2aa667c2c71244d1203 /node-repository
parent6ea90e965c39f61e3df6953d99107312a5a89955 (diff)
Remove feature flags API
Superseded by separate flags module.
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java8
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flag.java109
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/FlagId.java34
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flags.java70
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java26
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializer.java65
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/FlagsResponse.java51
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java26
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/flag/FlagsTest.java64
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializerTest.java33
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java38
14 files changed, 1 insertions, 530 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
index 999eae73475..ccdfbf0b402 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
@@ -15,7 +15,6 @@ import com.yahoo.config.provisioning.NodeRepositoryConfig;
import com.yahoo.transaction.Mutex;
import com.yahoo.transaction.NestedTransaction;
import com.yahoo.vespa.curator.Curator;
-import com.yahoo.vespa.hosted.provision.flag.Flags;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList;
@@ -87,7 +86,6 @@ public class NodeRepository extends AbstractComponent {
private final OsVersions osVersions;
private final FirmwareChecks firmwareChecks;
private final DockerImages dockerImages;
- private final Flags flags;
/**
* Creates a node repository from a zookeeper provider.
@@ -112,7 +110,6 @@ public class NodeRepository extends AbstractComponent {
this.osVersions = new OsVersions(this.db);
this.firmwareChecks = new FirmwareChecks(db, clock);
this.dockerImages = new DockerImages(db, dockerImage);
- this.flags = new Flags(this.db);
// read and write all nodes to make sure they are stored in the latest version of the serialized format
for (Node.State state : Node.State.values())
@@ -137,11 +134,6 @@ public class NodeRepository extends AbstractComponent {
/** Returns the docker images to use for nodes in this. */
public DockerImages dockerImages() { return dockerImages; }
- /** Returns feature flags of this node repository */
- public Flags flags() {
- return flags;
- }
-
// ---------------- Query API ----------------------------------------------------------------
/**
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flag.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flag.java
deleted file mode 100644
index a22e1dea024..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flag.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.flag;
-
-import com.google.common.collect.ImmutableSet;
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.HostName;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Represents a feature flag and its status. Use {@link Flags#get(FlagId)} to lookup status for a specific flag.
- *
- * @author mpolden
- */
-public class Flag {
-
- private final FlagId id;
- private final boolean enabled;
- private final Set<String> hostnames;
- private final Set<ApplicationId> applications;
-
- public Flag(FlagId id, boolean enabled, Set<String> hostnames, Set<ApplicationId> applications) {
- this.id = Objects.requireNonNull(id, "id must be non-null");
- this.enabled = enabled;
- this.hostnames = ImmutableSet.copyOf(Objects.requireNonNull(hostnames, "hostnames must be non-null"));
- this.applications = ImmutableSet.copyOf(Objects.requireNonNull(applications, "applications must be non-null"));
- }
-
- public FlagId id() {
- return id;
- }
-
- /** The hostnames this flag should apply to */
- public Set<String> hostnames() {
- return hostnames;
- }
-
- /** The applications this flag should apply to */
- public Set<ApplicationId> applications() {
- return applications;
- }
-
- /**
- * Returns whether this flag is enabled for all dimensions. Note: More specific dimensions always return true when
- * this is true
- */
- public boolean isEnabled() {
- return enabled;
- }
-
- /** Returns whether this flag is enabled for given hostname */
- public boolean isEnabled(HostName hostname) {
- return enabled || hostnames.contains(hostname.value());
- }
-
- /** Returns whether this flag is enabled for given application */
- public boolean isEnabled(ApplicationId application) {
- return enabled || applications.contains(application);
- }
-
- /** Returns a copy of this with this flag enabled for all dimensions */
- public Flag withEnabled(boolean enabled) {
- return new Flag(id, enabled, hostnames, applications);
- }
-
- /** Returns a copy of this with enabled set for hostname */
- public Flag withEnabled(HostName hostname, boolean enabled) {
- Set<String> hostnames = new LinkedHashSet<>(this.hostnames);
- if (enabled) {
- hostnames.add(hostname.value());
- } else {
- hostnames.remove(hostname.value());
- }
- return new Flag(id, this.enabled, hostnames, applications);
- }
-
- /** Returns a copy of this with enabled set for application */
- public Flag withEnabled(ApplicationId application, boolean enabled) {
- Set<ApplicationId> applications = new LinkedHashSet<>(this.applications);
- if (enabled) {
- applications.add(application);
- } else {
- applications.remove(application);
- }
- return new Flag(id, this.enabled, hostnames, applications);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Flag flag = (Flag) o;
- return id == flag.id;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(id);
- }
-
- /** Create a flag for given feature that is disabled for all dimensions */
- public static Flag disabled(FlagId id) {
- return new Flag(id, false, Collections.emptySet(), Collections.emptySet());
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/FlagId.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/FlagId.java
deleted file mode 100644
index 1b798c14588..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/FlagId.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.flag;
-
-import java.util.Arrays;
-
-/**
- * Features of this node repository that can be toggled.
- *
- * @author mpolden
- */
-public enum FlagId {
-
- /** Indicates whether a exclusive load balancer should be provisioned */
- exclusiveLoadBalancer("exclusive-load-balancer");
-
- private final String serializedValue;
-
- FlagId(String serializedValue) {
- this.serializedValue = serializedValue;
- }
-
- public String serializedValue() {
- return serializedValue;
- }
-
- public static FlagId fromSerializedForm(String value) {
- return Arrays.stream(FlagId.values())
- .filter(f -> f.serializedValue().equals(value))
- .findFirst()
- .orElseThrow(() -> new IllegalArgumentException("Could not find flag ID by serialized value '" +
- value + "'"));
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flags.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flags.java
deleted file mode 100644
index b4ecf415ede..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/flag/Flags.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.flag;
-
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.HostName;
-import com.yahoo.vespa.curator.Lock;
-import com.yahoo.vespa.hosted.provision.NodeRepository;
-import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-/**
- * This class provides feature flags for the node repository. A feature flag can be toggled for the following
- * dimensions:
- *
- * 1) The node repository (entire zone)
- * 2) A specific node
- * 3) A specific application
- *
- * Code which needs to consider feature flags can access them through {@link NodeRepository#flags()}.
- *
- * @author mpolden
- */
-public class Flags {
-
- private final CuratorDatabaseClient db;
-
- public Flags(CuratorDatabaseClient db) {
- this.db = Objects.requireNonNull(db, "db must be non-null");
- }
-
- /** Get status for given feature flag */
- public Flag get(FlagId id) {
- return db.readFlag(id).orElseGet(() -> Flag.disabled(id));
- }
-
- /** Get all known feature flags */
- public List<Flag> list() {
- return Arrays.stream(FlagId.values())
- .map(this::get)
- .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
- }
-
- /** Enable feature flag in this node repository */
- public void setEnabled(FlagId flag, boolean enabled) {
- write(flag, (f) -> f.withEnabled(enabled));
- }
-
- /** Enable feature flag for given application */
- public void setEnabled(FlagId flag, ApplicationId application, boolean enabled) {
- write(flag, (f) -> f.withEnabled(application, enabled));
- }
-
- /** Enable feature flag for given node */
- public void setEnabled(FlagId flag, HostName hostname, boolean enabled) {
- write(flag, (f) -> f.withEnabled(hostname, enabled));
- }
-
- private void write(FlagId id, Function<Flag, Flag> updateFunc) {
- try (Lock lock = db.lockFlags()) {
- db.writeFlag(updateFunc.apply(get(id)));
- }
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
index 3ed8ef9f64a..a78c48418ea 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
@@ -20,8 +20,6 @@ import com.yahoo.vespa.curator.recipes.CuratorCounter;
import com.yahoo.vespa.curator.transaction.CuratorOperations;
import com.yahoo.vespa.curator.transaction.CuratorTransaction;
import com.yahoo.vespa.hosted.provision.Node;
-import com.yahoo.vespa.hosted.provision.flag.Flag;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId;
import com.yahoo.vespa.hosted.provision.node.Agent;
@@ -77,6 +75,7 @@ public class CuratorDatabaseClient {
public CuratorDatabaseClient(NodeFlavors flavors, Curator curator, Clock clock, Zone zone, boolean useCache) {
this.nodeSerializer = new NodeSerializer(flavors);
this.zone = zone;
+ curator.delete(flagsRoot); // TODO: Remove after 7.42 has been released
this.curatorDatabase = new CuratorDatabase(curator, root, useCache);
this.clock = clock;
this.provisionIndexCounter = new CuratorCounter(curator, root.append("provisionIndexCounter").getAbsolute());
@@ -97,7 +96,6 @@ public class CuratorDatabaseClient {
curatorDatabase.create(dockerImagesPath());
curatorDatabase.create(firmwareCheckPath());
curatorDatabase.create(loadBalancersRoot);
- curatorDatabase.create(flagsRoot);
provisionIndexCounter.initialize(100);
}
@@ -527,28 +525,6 @@ public class CuratorDatabaseClient {
return loadBalancersRoot.append(id.serializedForm());
}
- public void writeFlag(Flag flag) {
- Path path = flagPath(flag.id());
- NestedTransaction transaction = new NestedTransaction();
- CuratorTransaction curatorTransaction = curatorDatabase.newCuratorTransactionIn(transaction);
- curatorTransaction.add(createOrSet(path, FlagSerializer.toJson(flag)));
- transaction.commit();
- }
-
-
- // Flags
- public Optional<Flag> readFlag(FlagId id) {
- return read(flagPath(id), FlagSerializer::fromJson);
- }
-
- public Lock lockFlags() {
- return lock(lockRoot.append("flagsLock"), defaultLockTimeout);
- }
-
- private Path flagPath(FlagId id) {
- return flagsRoot.append(id.serializedValue());
- }
-
private Transaction.Operation createOrSet(Path path, byte[] data) {
if (curatorDatabase.exists(path)) {
return CuratorOperations.setData(path.getAbsolute(), data);
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializer.java
deleted file mode 100644
index 431aa92a513..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.persistence;
-
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.slime.ArrayTraverser;
-import com.yahoo.slime.Cursor;
-import com.yahoo.slime.Inspector;
-import com.yahoo.slime.Slime;
-import com.yahoo.vespa.config.SlimeUtils;
-import com.yahoo.vespa.hosted.provision.flag.Flag;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * @author mpolden
- */
-public class FlagSerializer {
-
- private static final String featureField = "feature";
- private static final String enabledField = "enabled";
- private static final String hostnamesField = "hostnames";
- private static final String applicationsField = "applications";
-
- public static byte[] toJson(Flag flag) {
- Slime slime = new Slime();
- Cursor root = slime.setObject();
-
- root.setString(featureField, flag.id().serializedValue());
- root.setBool(enabledField, flag.isEnabled());
-
- Cursor nodeArray = root.setArray(hostnamesField);
- flag.hostnames().forEach(nodeArray::addString);
-
- Cursor applicationArray = root.setArray(applicationsField);
- flag.applications().forEach(application -> applicationArray.addString(application.serializedForm()));
-
- try {
- return SlimeUtils.toJsonBytes(slime);
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- }
-
- public static Flag fromJson(byte[] data) {
- Inspector inspect = SlimeUtils.jsonToSlime(data).get();
-
- Set<String> hostnames = new LinkedHashSet<>();
- inspect.field(hostnamesField).traverse((ArrayTraverser) (i, hostname) -> hostnames.add(hostname.asString()));
-
- Set<ApplicationId> applications = new LinkedHashSet<>();
- inspect.field(applicationsField).traverse((ArrayTraverser) (i, application) -> {
- applications.add(ApplicationId.fromSerializedForm(application.asString()));
- });
-
- return new Flag(FlagId.fromSerializedForm(inspect.field(featureField).asString()),
- inspect.field(enabledField).asBool(),
- hostnames,
- applications);
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/FlagsResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/FlagsResponse.java
deleted file mode 100644
index 1bc016bcda2..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/FlagsResponse.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.restapi.v2;
-
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.container.jdisc.HttpResponse;
-import com.yahoo.slime.Cursor;
-import com.yahoo.slime.JsonFormat;
-import com.yahoo.slime.Slime;
-import com.yahoo.vespa.hosted.provision.flag.Flag;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * @author mpolden
- */
-public class FlagsResponse extends HttpResponse {
-
- private final List<Flag> flags;
-
- public FlagsResponse(List<Flag> flags) {
- super(200);
- this.flags = flags;
- }
-
- @Override
- public void render(OutputStream out) throws IOException {
- Slime slime = new Slime();
- Cursor root = slime.setObject();
- Cursor flagArray = root.setArray("flags");
- flags.forEach(flag -> {
- Cursor flagObject = flagArray.addObject();
- flagObject.setString("id", flag.id().serializedValue());
- flagObject.setBool("enabled", flag.isEnabled());
- Cursor nodeArray = flagObject.setArray("enabledHostnames");
- flag.hostnames().forEach(nodeArray::addString);
- Cursor applicationArray = flagObject.setArray("enabledApplications");
- flag.applications().stream()
- .map(ApplicationId::serializedForm)
- .forEach(applicationArray::addString);
- });
- new JsonFormat(true).encode(out, slime);
- }
-
- @Override
- public String getContentType() {
- return "application/json";
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
index 58125304d6f..a18b7ab72ad 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
@@ -2,10 +2,8 @@
package com.yahoo.vespa.hosted.provision.restapi.v2;
import com.yahoo.component.Version;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.HostFilter;
-import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.NodeType;
import com.yahoo.container.jdisc.HttpRequest;
@@ -20,7 +18,6 @@ import com.yahoo.vespa.config.SlimeUtils;
import com.yahoo.vespa.hosted.provision.NoSuchNodeException;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
import com.yahoo.vespa.hosted.provision.maintenance.NodeRepositoryMaintenance;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.filter.ApplicationFilter;
@@ -108,7 +105,6 @@ public class NodesApiHandler extends LoggingRequestHandler {
if (path.equals( "/nodes/v2/command/")) return ResourcesResponse.fromStrings(request.getUri(), "restart", "reboot");
if (path.equals( "/nodes/v2/maintenance/")) return new JobsResponse(maintenance.jobControl());
if (path.equals( "/nodes/v2/upgrade/")) return new UpgradeResponse(maintenance.infrastructureVersions(), nodeRepository.osVersions(), nodeRepository.dockerImages());
- if (path.equals( "/nodes/v2/flags/")) return new FlagsResponse(nodeRepository.flags().list());
throw new NotFoundException("Nothing at path '" + path + "'");
}
@@ -169,8 +165,6 @@ public class NodesApiHandler extends LoggingRequestHandler {
return new MessageResponse("Added " + addedNodes + " nodes to the provisioned state");
}
if (path.matches("/nodes/v2/maintenance/inactive/{job}")) return setJobActive(path.get("job"), false);
- if (path.matches("/nodes/v2/flags/{flag}")) return setFlag(path.get("flag"), true, "", "");
- if (path.matches("/nodes/v2/flags/{flag}/{dimension}/{value}")) return setFlag(path.get("flag"), true, path.get("dimension"), path.get("value"));
if (path.matches("/nodes/v2/upgrade/firmware")) return requestFirmwareCheckResponse();
throw new NotFoundException("Nothing at path '" + request.getUri().getPath() + "'");
@@ -184,8 +178,6 @@ public class NodesApiHandler extends LoggingRequestHandler {
return new MessageResponse("Removed " + removedNodes.stream().map(Node::hostname).collect(Collectors.joining(", ")));
}
if (path.matches("/nodes/v2/maintenance/inactive/{job}")) return setJobActive(path.get("job"), true);
- if (path.matches("/nodes/v2/flags/{flag}")) return setFlag(path.get("flag"), false, "", "");
- if (path.matches("/nodes/v2/flags/{flag}/{dimension}/{value}")) return setFlag(path.get("flag"), false, path.get("dimension"), path.get("value"));
if (path.matches("/nodes/v2/upgrade/firmware")) return cancelFirmwareCheckResponse();
throw new NotFoundException("Nothing at path '" + request.getUri().getPath() + "'");
@@ -283,24 +275,6 @@ public class NodesApiHandler extends LoggingRequestHandler {
return new MessageResponse((active ? "Re-activated" : "Deactivated" ) + " job '" + jobName + "'");
}
- private HttpResponse setFlag(String flag, boolean enabled, String dimension, String value) {
- FlagId flagId = FlagId.fromSerializedForm(flag);
- switch (dimension) {
- case "application":
- nodeRepository.flags().setEnabled(flagId, ApplicationId.fromSerializedForm(value), enabled);
- break;
- case "node":
- nodeRepository.flags().setEnabled(flagId, HostName.from(value), enabled);
- break;
- case "":
- nodeRepository.flags().setEnabled(flagId, enabled);
- break;
- default: throw new IllegalArgumentException("Unknown flag dimension '" + dimension + "'");
- }
- return new MessageResponse((enabled ? "Enabled" : "Disabled") + " feature " + flagId +
- (!value.isEmpty() ? " for " + dimension + " '" + value + "'" : ""));
- }
-
private MessageResponse setTargetVersions(HttpRequest request) {
NodeType nodeType = NodeType.valueOf(lastElement(request.getUri().getPath()).toLowerCase());
Inspector inspector = toSlime(request.getData()).get();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
index ca02c0c215b..b9fb88e900e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
@@ -20,7 +20,6 @@ import com.yahoo.vespa.curator.mock.MockCurator;
import com.yahoo.vespa.flags.InMemoryFlagSource;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.Status;
import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner;
@@ -127,8 +126,6 @@ public class MockNodeRepository extends NodeRepository {
dirtyRecursively(node55.hostname(), Agent.system, getClass().getSimpleName());
ApplicationId zoneApp = ApplicationId.from(TenantName.from("zoneapp"), ApplicationName.from("zoneapp"), InstanceName.from("zoneapp"));
- // TODO: Remove this once feature flag is removed
- this.flags().setEnabled(FlagId.exclusiveLoadBalancer, zoneApp, true);
ClusterSpec zoneCluster = ClusterSpec.request(ClusterSpec.Type.container,
ClusterSpec.Id.from("node-admin"),
Version.fromString("6.42"),
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/flag/FlagsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/flag/FlagsTest.java
deleted file mode 100644
index 5018b18c491..00000000000
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/flag/FlagsTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.flag;
-
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.HostName;
-import com.yahoo.vespa.curator.mock.MockCurator;
-import com.yahoo.vespa.hosted.provision.NodeRepository;
-import com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors;
-import com.yahoo.vespa.hosted.provision.testutils.MockNodeRepository;
-import org.junit.Test;
-
-import java.util.function.Supplier;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @author mpolden
- */
-public class FlagsTest {
-
- @Test
- public void test_flag_toggling() {
- NodeRepository nodeRepository = new MockNodeRepository(new MockCurator(), new MockNodeFlavors());
- Flags flags = nodeRepository.flags();
- Supplier<Flag> flag = () -> flags.get(FlagId.exclusiveLoadBalancer);
-
- // Flag is disabled by default
- assertFalse(flag.get().isEnabled());
-
- // Toggle flag for a node
- {
- HostName node1 = HostName.from("host1");
- flags.setEnabled(FlagId.exclusiveLoadBalancer, node1, true);
- assertTrue(flag.get().isEnabled(node1));
- assertFalse(flag.get().isEnabled());
- flags.setEnabled(FlagId.exclusiveLoadBalancer, node1, false);
- assertFalse(flag.get().isEnabled(node1));
- }
-
- // Toggle flag for an application
- {
- ApplicationId app1 = ApplicationId.from("tenant1", "application1", "default");
- flags.setEnabled(FlagId.exclusiveLoadBalancer, app1, true);
- assertTrue(flag.get().isEnabled(app1));
- assertFalse(flag.get().isEnabled());
- flags.setEnabled(FlagId.exclusiveLoadBalancer, app1, false);
- assertFalse(flag.get().isEnabled(app1));
- }
-
- // Toggle flag globally
- {
- flags.setEnabled(FlagId.exclusiveLoadBalancer, true);
- assertTrue(flag.get().isEnabled());
- // Flag is implicitly enabled for all dimensions
- assertTrue(flag.get().isEnabled(HostName.from("host1")));
- assertTrue(flag.get().isEnabled(ApplicationId.from("tenant1", "application1", "default")));
- flags.setEnabled(FlagId.exclusiveLoadBalancer, false);
- assertFalse(flag.get().isEnabled());
- }
- }
-
-
-}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
index 9870b94a8d5..52d297232de 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java
@@ -6,7 +6,6 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.HostSpec;
import com.yahoo.transaction.NestedTransaction;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId;
import com.yahoo.vespa.hosted.provision.node.Agent;
@@ -36,7 +35,6 @@ public class LoadBalancerExpirerTest {
Duration.ofDays(1),
new JobControl(tester.nodeRepository().database()),
tester.loadBalancerService());
- tester.nodeRepository().flags().setEnabled(FlagId.exclusiveLoadBalancer, true);
Supplier<Map<LoadBalancerId, LoadBalancer>> loadBalancers = () -> tester.nodeRepository().database().readLoadBalancers();
// Deploy two applications with load balancers
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializerTest.java
deleted file mode 100644
index 15f2289d340..00000000000
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/FlagSerializerTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.persistence;
-
-import com.google.common.collect.ImmutableSet;
-import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.vespa.hosted.provision.flag.Flag;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
-import org.junit.Test;
-
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author mpolden
- */
-public class FlagSerializerTest {
-
- @Test
- public void test_serialization() {
- Flag flag = new Flag(FlagId.exclusiveLoadBalancer, true,
- ImmutableSet.of("host1", "host2"),
- Collections.singleton(
- ApplicationId.from("tenant1", "application1", "default")
- ));
- Flag serialized = FlagSerializer.fromJson(FlagSerializer.toJson(flag));
- assertEquals(flag.id(), serialized.id());
- assertEquals(flag.isEnabled(), serialized.isEnabled());
- assertEquals(flag.hostnames(), serialized.hostnames());
- assertEquals(flag.applications(), serialized.applications());
- }
-
-}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
index 2ed15b0a06f..4f7e09d0bd7 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
@@ -10,7 +10,6 @@ import com.yahoo.config.provision.HostSpec;
import com.yahoo.config.provision.RotationName;
import com.yahoo.transaction.NestedTransaction;
import com.yahoo.vespa.hosted.provision.Node;
-import com.yahoo.vespa.hosted.provision.flag.FlagId;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance;
import com.yahoo.vespa.hosted.provision.lb.Real;
@@ -44,7 +43,6 @@ public class LoadBalancerProvisionerTest {
ClusterSpec.Id containerCluster1 = ClusterSpec.Id.from("qrs1");
ClusterSpec.Id contentCluster = ClusterSpec.Id.from("content");
Set<RotationName> rotationsCluster1 = Set.of(RotationName.from("r1-1"), RotationName.from("r1-2"));
- tester.nodeRepository().flags().setEnabled(FlagId.exclusiveLoadBalancer, true);
tester.activate(app1, prepare(app1,
clusterRequest(ClusterSpec.Type.container, containerCluster1, rotationsCluster1),
clusterRequest(ClusterSpec.Type.content, contentCluster)));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java
index 6dca643da7c..75995245274 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java
@@ -778,44 +778,6 @@ public class RestApiTest {
"{\"message\":\"Cancelled outstanding requests for firmware checks\"}");
}
- @Test
- public void test_flags() throws Exception {
- assertFile(new Request("http://localhost:8080/nodes/v2/flags/"), "flags1.json");
-
- // Enable flag for application
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer/application/foo:bar:default",
- new byte[0], Request.Method.POST),
- "{\"message\":\"Enabled feature exclusiveLoadBalancer for application 'foo:bar:default'\"}");
-
- // Enable flag for node
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer/node/host1",
- new byte[0], Request.Method.POST),
- "{\"message\":\"Enabled feature exclusiveLoadBalancer for node 'host1'\"}");
-
- assertFile(new Request("http://localhost:8080/nodes/v2/flags/"), "flags2.json");
-
- // Enable flag for entire repository
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer",
- new byte[0], Request.Method.POST),
- "{\"message\":\"Enabled feature exclusiveLoadBalancer\"}");
-
- // Disable flag for application
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer/application/foo:bar:default",
- new byte[0], Request.Method.DELETE),
- "{\"message\":\"Disabled feature exclusiveLoadBalancer for application 'foo:bar:default'\"}");
-
- // Disable flag for node
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer/node/host1",
- new byte[0], Request.Method.DELETE),
- "{\"message\":\"Disabled feature exclusiveLoadBalancer for node 'host1'\"}");
-
- // Disable flag for entire repository
- assertResponse(new Request("http://localhost:8080/nodes/v2/flags/exclusive-load-balancer",
- new byte[0], Request.Method.DELETE),
- "{\"message\":\"Disabled feature exclusiveLoadBalancer\"}");
-
- }
-
/** Tests the rendering of each node separately to make it easier to find errors */
@Test
public void test_single_node_rendering() throws Exception {