From 5e0502391c2ca7c4b0bfc9f4f652da2676f26314 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 12 Oct 2022 15:55:11 +0200 Subject: Add instance tags --- .../main/java/com/yahoo/config/provision/Tags.java | 61 ++++++++++++++++++++++ .../java/com/yahoo/config/provision/TagsTest.java | 52 ++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java create mode 100644 config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java (limited to 'config-provisioning') diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java new file mode 100644 index 00000000000..007db2fd171 --- /dev/null +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java @@ -0,0 +1,61 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.provision; + +import java.util.Set; + +/** + * A deployment may have a list of tags associated with it. Config files may have variants for these tags similar + * to how they may have variants for instance and zone. + * + * @author bratseth + */ +public class Tags { + + private final Set tags; + + public Tags(Set tags) { + this.tags = Set.copyOf(tags); + } + + public boolean contains(String tag) { + return tags.contains(tag); + } + + public boolean intersects(Tags other) { + return this.tags.stream().anyMatch(other::contains); + } + + public boolean isEmpty() { return tags.isEmpty(); } + + public boolean containsAll(Tags other) { return tags.containsAll(other.tags); } + + /** Returns this as a space-separated string which can be used to recreate this by calling fromString(). */ + public String asString() { return String.join(" ", tags); } + + @Override + public String toString() { + return asString(); + } + + @Override + public boolean equals(Object other) { + if (other == this) return true; + if (other == null || other.getClass() != getClass()) return false; + return tags.equals(((Tags)other).tags); + } + + @Override + public int hashCode() { + return tags.hashCode(); + } + + public static Tags empty() { return new Tags(Set.of()); } + + /** + * Creates this from a space-separated string or null. */ + public static Tags fromString(String tagsString) { + if (tagsString == null || tagsString.isBlank()) return empty(); + return new Tags(Set.of(tagsString.trim().split(" "))); + } + +} diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java new file mode 100644 index 00000000000..1f2b2737619 --- /dev/null +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java @@ -0,0 +1,52 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.provision; + +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author bratseth + */ +public class TagsTest { + + @Test + public void testEmpty() { + assertEquals(Tags.empty(), Tags.fromString(null)); + assertEquals(Tags.empty(), Tags.fromString("")); + assertEquals(Tags.empty(), Tags.fromString(" ")); + } + + @Test + public void testSerialization() { + Tags tags = new Tags(Set.of("a", "tag2", "3")); + assertEquals(tags, Tags.fromString(tags.toString())); // Required by automatic serialization + assertEquals(tags, Tags.fromString(tags.asString())); // Required by automatic serialization + } + + @Test + public void testContains() { + Tags tags = new Tags(Set.of("a", "tag2", "3")); + assertTrue(tags.contains("a")); + assertTrue(tags.contains("tag2")); + assertTrue(tags.contains("3")); + assertFalse(tags.contains("other")); + + Tags subTags = new Tags(Set.of("a", "3")); + assertTrue(tags.containsAll(subTags)); + assertFalse(subTags.containsAll(tags)); + } + + @Test + public void testIntersects() { + Tags tags1 = new Tags(Set.of("a", "tag2", "3")); + Tags tags2 = new Tags(Set.of("a", "tag3")); + assertTrue(tags1.intersects(tags2)); + assertTrue(tags2.intersects(tags1)); + } + +} -- cgit v1.2.3 From 62155715d957a4a7444df2d094381e552c2ee222 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 13 Oct 2022 12:14:39 +0200 Subject: Update config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java Co-authored-by: Jon Marius Venstad --- .../src/test/java/com/yahoo/config/provision/TagsTest.java | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'config-provisioning') diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java index 1f2b2737619..a20e674c66e 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/TagsTest.java @@ -20,6 +20,11 @@ public class TagsTest { assertEquals(Tags.empty(), Tags.fromString("")); assertEquals(Tags.empty(), Tags.fromString(" ")); } + + @Test + public void testDeserialization() { + assertEquals(new Tags(Set.of("tag1", "tag2")), Tags.fromString(" tag1 tag2 ")); + } @Test public void testSerialization() { -- cgit v1.2.3 From d0188f3fc32198c165f178d6aaabab39467b54e6 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 13 Oct 2022 12:14:47 +0200 Subject: Update config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java Co-authored-by: Jon Marius Venstad --- config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'config-provisioning') diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java index 007db2fd171..2865f956627 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java @@ -55,7 +55,7 @@ public class Tags { * Creates this from a space-separated string or null. */ public static Tags fromString(String tagsString) { if (tagsString == null || tagsString.isBlank()) return empty(); - return new Tags(Set.of(tagsString.trim().split(" "))); + return new Tags(Set.of(tagsString.trim().split(" +"))); } } -- cgit v1.2.3 From 11fb09016d44de8514019d29908dfb7d4c623840 Mon Sep 17 00:00:00 2001 From: jonmv Date: Thu, 13 Oct 2022 12:36:36 +0200 Subject: Stable tag order in asString() --- .../src/main/java/com/yahoo/config/provision/Tags.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'config-provisioning') diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java index 2865f956627..3a54a0b9ebb 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Tags.java @@ -2,6 +2,7 @@ package com.yahoo.config.provision; import java.util.Set; +import java.util.stream.Collectors; /** * A deployment may have a list of tags associated with it. Config files may have variants for these tags similar @@ -30,7 +31,9 @@ public class Tags { public boolean containsAll(Tags other) { return tags.containsAll(other.tags); } /** Returns this as a space-separated string which can be used to recreate this by calling fromString(). */ - public String asString() { return String.join(" ", tags); } + public String asString() { + return tags.stream().sorted().collect(Collectors.joining(" ")); + } @Override public String toString() { -- cgit v1.2.3