diff options
13 files changed, 111 insertions, 195 deletions
diff --git a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java index 36ebb621475..0579aebe771 100644 --- a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java +++ b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java @@ -481,12 +481,13 @@ public class FilesApplicationPackage extends AbstractApplicationPackage { } private static ApplicationMetaData readMetaData(File appDir) { + String originalAppDir = preprocessed.equals(appDir.getName()) ? appDir.getParentFile().getName() : appDir.getName(); ApplicationMetaData defaultMetaData = new ApplicationMetaData("n/a", "n/a", 0L, false, ApplicationId.from(TenantName.defaultName(), - ApplicationName.from(appDir.getName()), + ApplicationName.from(originalAppDir), InstanceName.defaultName()), "", 0L, diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java index f2d0ab03e27..25e2a7593b0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java @@ -119,14 +119,12 @@ public class VespaModelFactory implements ModelFactory { for (ConfigChangeAction action : changeActions) { if (action.getType().equals(ConfigChangeAction.Type.REINDEX)) { VespaModel currentModel = (VespaModel) currentActiveModel.get(); - var currentVersion = currentModel.version(); var currentMeta = currentModel.applicationPackage().getMetaData(); - var nextVersion = nextModel.version(); var nextMeta = nextModel.applicationPackage().getMetaData(); log.log(Level.INFO, String.format("Model [%s/%s] -> [%s/%s] triggers reindexing: %s", currentModel.version().toString(), currentMeta.toString(), nextModel.version().toString(), nextMeta.toString(), - action.toString())); + action)); } } } diff --git a/config-provisioning/pom.xml b/config-provisioning/pom.xml index fdfbbfc9049..c7616b2187a 100644 --- a/config-provisioning/pom.xml +++ b/config-provisioning/pom.xml @@ -8,14 +8,12 @@ <version>7-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> - <groupId>com.yahoo.vespa</groupId> + + <name>config-provisioning</name> + <description>Provisioning APIs.</description> <artifactId>config-provisioning</artifactId> <packaging>container-plugin</packaging> - <version>7-SNAPSHOT</version> - <name>config-provisioning</name> - <description> -Provisioning APIs. - </description> + <dependencies> <dependency> <groupId>com.yahoo.vespa</groupId> @@ -69,11 +67,6 @@ Provisioning APIs. <artifactId>junit</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava-testlib</artifactId> - <scope>test</scope> - </dependency> </dependencies> <build> <plugins> diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java index aa70bf4d26a..f77a6b8d182 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ApplicationId.java @@ -16,14 +16,11 @@ import java.util.regex.Pattern; */ public class ApplicationId implements Comparable<ApplicationId> { - // TODO: remove '.' and '*' from this pattern. - static final Pattern namePattern = Pattern.compile("(?!\\.\\.)[a-zA-Z0-9_.*-]{1,256}"); - - private static final ApplicationId global = new ApplicationId(TenantName.from("*"), - ApplicationName.from("*"), - InstanceName.from("*")) { - @Override public boolean equals(Object other) { return this == other; } - }; + static final Pattern namePattern = Pattern.compile("(?!\\.\\.)[a-zA-Z0-9_-]{1,256}"); + + private static final ApplicationId global = new ApplicationId(TenantName.from("hosted-vespa"), + ApplicationName.from("routing"), + InstanceName.from("default")) { }; private static final Comparator<ApplicationId> comparator = Comparator.comparing(ApplicationId::tenant) .thenComparing(ApplicationId::application) diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/AthenzDomain.java b/config-provisioning/src/main/java/com/yahoo/config/provision/AthenzDomain.java index 7b60d22c810..16cb3c43814 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/AthenzDomain.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/AthenzDomain.java @@ -1,54 +1,23 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import ai.vespa.validation.PatternedStringWrapper; + import java.util.regex.Pattern; /** * @author mortent */ -public class AthenzDomain { - - private static final Pattern PATTERN = Pattern.compile("[a-zA-Z0-9_][a-zA-Z0-9_\\-.]*[a-zA-Z0-9_]"); +public class AthenzDomain extends PatternedStringWrapper<AthenzDomain> { - private final String name; + private static final Pattern PATTERN = Pattern.compile("[a-zA-Z0-9_][a-zA-Z0-9_.-]*[a-zA-Z0-9_]"); private AthenzDomain(String name) { - // TODO bjorncs: Temporarily disable name validation - // validateName(name); - this.name = name; - } - - private static void validateName(String name) { - if (!PATTERN.matcher(name).matches()) { - throw new IllegalArgumentException("Not a valid domain name: '" + name + "'"); - } + super(name, PATTERN, "Athenz domain"); } public static AthenzDomain from(String value) { return new AthenzDomain(value); } - public String value() { return name; } - - @Override - public String toString() { - return "AthenzDomain{" + - "name='" + name + '\'' + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - AthenzDomain that = (AthenzDomain) o; - - return name != null ? name.equals(that.name) : that.name == null; - } - - @Override - public int hashCode() { - return name != null ? name.hashCode() : 0; - } } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/CloudName.java b/config-provisioning/src/main/java/com/yahoo/config/provision/CloudName.java index b4be3531f2a..417e381587e 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/CloudName.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/CloudName.java @@ -1,29 +1,27 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import ai.vespa.validation.PatternedStringWrapper; + import java.util.Objects; +import java.util.regex.Pattern; /** * Represents a cloud provider used in a hosted Vespa system. * * @author mpolden */ -public class CloudName implements Comparable<CloudName> { - - private final static CloudName defaultCloud = from("default"); +public class CloudName extends PatternedStringWrapper<CloudName> { - private final String cloud; + private static final Pattern pattern = Pattern.compile("[a-z]([a-z0-9-]*[a-z0-9])*"); + private static final CloudName defaultCloud = from("default"); private CloudName(String cloud) { - this.cloud = cloud; - } - - public String value() { - return cloud; + super(cloud, pattern, "cloud name"); } public boolean isDefault() { - return defaultName().equals(this); + return equals(defaultCloud); } public static CloudName defaultName() { @@ -34,27 +32,4 @@ public class CloudName implements Comparable<CloudName> { return new CloudName(cloud); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CloudName cloudName = (CloudName) o; - return Objects.equals(cloud, cloudName.cloud); - } - - @Override - public int hashCode() { - return Objects.hash(cloud); - } - - @Override - public String toString() { - return cloud; - } - - @Override - public int compareTo(CloudName o) { - return cloud.compareTo(o.cloud); - } - } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/RegionName.java b/config-provisioning/src/main/java/com/yahoo/config/provision/RegionName.java index 73ad2181965..be431a5fd68 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/RegionName.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/RegionName.java @@ -1,56 +1,35 @@ // 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.Objects; +import ai.vespa.validation.PatternedStringWrapper; + +import java.util.regex.Pattern; /** - * Represents an application's region, which may be any kind of string or default. This type is defined - * in order to provide a type safe API for defining regions. + * A region in a hosted Vespa system. + * A region name must be all lowercase, start with a letter, and contain letters and digits, separated by dashes. * - * @author Ulf Lilleengen - * @since 5.11 + * @author jonmv */ -public class RegionName implements Comparable<RegionName> { +public class RegionName extends PatternedStringWrapper<RegionName> { - private final String region; + private static final Pattern pattern = Pattern.compile("[a-z]([a-z0-9-]*[a-z0-9])*"); + private static final RegionName defaultName = from("default"); private RegionName(String region) { - this.region = region; - } - - @Override - public int hashCode() { - return region.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof RegionName)) return false; - return Objects.equals(((RegionName) obj).region, region); + super(region, pattern, "region name"); } - @Override - public String toString() { - return region; - } - - // TODO: Add verification of region name. public static RegionName from(String region) { return new RegionName(region); } public static RegionName defaultName() { - return new RegionName("default"); + return defaultName; } public boolean isDefault() { - return equals(RegionName.defaultName()); + return equals(defaultName()); } - public String value() { return region; } - - @Override - public int compareTo(RegionName region) { - return this.region.compareTo(region.region); - } } diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java index 01904b5eece..622fc2527bf 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ApplicationIdTest.java @@ -1,12 +1,18 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import static org.junit.Assert.assertEquals; - import com.yahoo.cloud.config.ApplicationIdConfig; import com.yahoo.test.TotalOrderTester; import org.junit.Test; -import com.google.common.testing.EqualsTester; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static com.yahoo.config.provision.ApplicationId.from; +import static com.yahoo.config.provision.ApplicationId.global; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; /** * @author Ulf Lilleengen @@ -15,19 +21,11 @@ import com.google.common.testing.EqualsTester; */ public class ApplicationIdTest { - ApplicationId idFrom(String tenant, String name, String instance) { - ApplicationId.Builder b = new ApplicationId.Builder(); - b.tenant(tenant); - b.applicationName(name); - b.instanceName(instance); - return b.build(); - } - @Test public void require_that_application_id_is_set() { ApplicationId app = applicationId("application"); assertEquals("application", app.application().value()); - app = idFrom("tenant", "application", "instance"); + app = from("tenant", "application", "instance"); assertEquals("tenant", app.tenant().value()); assertEquals("application", app.application().value()); assertEquals("instance", app.instance().value()); @@ -35,22 +33,25 @@ public class ApplicationIdTest { @Test public void require_that_equals_and_hashcode_behaves_correctly() { - new EqualsTester() - .addEqualityGroup(idFrom("tenant1", "name1", "instance1"), - idFrom("tenant1", "name1", "instance1")) - .addEqualityGroup(idFrom("tenant2", "name1", "instance1")) - .addEqualityGroup(idFrom("tenant1", "name2", "instance1")) - .addEqualityGroup(idFrom("tenant1", "name1", "instance2")) - .addEqualityGroup(applicationId("onlyName1")) - .addEqualityGroup(applicationId("onlyName2")) - .testEquals(); + assertEquals(Set.of(from("tenant1", "name1", "instance1"), + from("tenant2", "name1", "instance1"), + from("tenant1", "name2", "instance1"), + from("tenant1", "name1", "instance2"), + applicationId("name1"), + applicationId("name2")), + new HashSet<>(List.of(from("tenant1", "name1", "instance1"), + from("tenant2", "name1", "instance1"), + from("tenant1", "name2", "instance1"), + from("tenant1", "name1", "instance2"), + applicationId("name1"), + applicationId("name2")))); } @Test public void require_that_value_format_is_correct() { ApplicationId id1 = applicationId("foo"); ApplicationId id2 = applicationId("bar"); - ApplicationId id3 = idFrom("tenant", "baz", "bim"); + ApplicationId id3 = from("tenant", "baz", "bim"); assertEquals("default:foo:default", id1.serializedForm()); assertEquals("default:bar:default", id2.serializedForm()); assertEquals("tenant:baz:bim", id3.serializedForm()); @@ -59,8 +60,8 @@ public class ApplicationIdTest { @Test public void require_string_formats_are_correct() { ApplicationId id1 = applicationId("foo"); - ApplicationId id2 = idFrom("bar", "baz", "default"); - ApplicationId id3 = idFrom("tenant", "baz", "bim"); + ApplicationId id2 = from("bar", "baz", "default"); + ApplicationId id3 = from("tenant", "baz", "bim"); assertEquals("default.foo", id1.toShortString()); assertEquals("default.foo.default", id1.toFullString()); assertEquals("bar.baz", id2.toShortString()); @@ -92,11 +93,11 @@ public class ApplicationIdTest { @Test public void require_that_compare_to_is_correct() { new TotalOrderTester<ApplicationId>() - .theseObjects(idFrom("tenant1", "name1", "instance1"), - idFrom("tenant1", "name1", "instance1")) - .areLessThan(idFrom("tenant2", "name1", "instance1")) - .areLessThan(idFrom("tenant2", "name2", "instance1")) - .areLessThan(idFrom("tenant2", "name2", "instance2")) + .theseObjects(from("tenant1", "name1", "instance1"), + from("tenant1", "name1", "instance1")) + .areLessThan(from("tenant2", "name1", "instance1")) + .areLessThan(from("tenant2", "name2", "instance1")) + .areLessThan(from("tenant2", "name2", "instance2")) .testOrdering(); } @@ -106,15 +107,21 @@ public class ApplicationIdTest { builder.tenant("a"); builder.application("b"); builder.instance("c"); - ApplicationId applicationId = ApplicationId.from(new ApplicationIdConfig(builder)); + ApplicationId applicationId = from(new ApplicationIdConfig(builder)); assertEquals("a", applicationId.tenant().value()); assertEquals("b", applicationId.application().value()); assertEquals("c", applicationId.instance().value()); } + @Test + public void require_that_global_is_special() { + assertEquals(global(), global()); + assertNotEquals(global(), from("hosted-vespa", "routing", "default")); + assertEquals(global().serializedForm(), from("hosted-vespa", "routing", "default").serializedForm()); + } + private ApplicationId applicationId(String applicationName) { - return ApplicationId.from(TenantName.defaultName(), - ApplicationName.from(applicationName), InstanceName.defaultName()); + return from(TenantName.defaultName(), ApplicationName.from(applicationName), InstanceName.defaultName()); } } diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterSpecTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterSpecTest.java index 0fe123a774a..dc228ee7fd2 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterSpecTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterSpecTest.java @@ -1,13 +1,16 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import com.google.common.testing.EqualsTester; import com.yahoo.component.Version; +import com.yahoo.config.provision.ClusterSpec.Group; +import com.yahoo.config.provision.ClusterSpec.Id; import org.junit.Test; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import static org.junit.Assert.assertEquals; @@ -18,20 +21,14 @@ public class ClusterSpecTest { @Test public void testIdEquals() { - new EqualsTester() - .addEqualityGroup(ClusterSpec.Id.from("id1"), ClusterSpec.Id.from("id1")) - .addEqualityGroup(ClusterSpec.Id.from("id2")) - .addEqualityGroup(ClusterSpec.Id.from("id3")) - .testEquals(); + assertEquals(Set.of(Id.from("id1"), Id.from("id2"), Id.from("id3")), + new HashSet<>(List.of(Id.from("id1"), Id.from("id1"), Id.from("id2"), Id.from("id3")))); } @Test public void testGroupEquals() { - new EqualsTester() - .addEqualityGroup(ClusterSpec.Group.from(1), ClusterSpec.Group.from(1)) - .addEqualityGroup(ClusterSpec.Group.from(2)) - .addEqualityGroup(ClusterSpec.Group.from(3)) - .testEquals(); + assertEquals(Set.of(Group.from(1), Group.from(2), Group.from(3)), + new HashSet<>(List.of(Group.from(1), Group.from(1), Group.from(2), Group.from(3)))); } @Test diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/IdentifierTestBase.java b/config-provisioning/src/test/java/com/yahoo/config/provision/IdentifierTestBase.java index d4edb7a14eb..fd1a9401b81 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/IdentifierTestBase.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/IdentifierTestBase.java @@ -1,9 +1,12 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; -import com.google.common.testing.EqualsTester; import org.junit.Test; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -12,7 +15,6 @@ import static org.junit.Assert.assertTrue; /** * Generic test for identifiers such as {@link Environment} and {@link RegionName}. * @author Ulf Lilleengen - * @since 5.23 */ public abstract class IdentifierTestBase<ID_TYPE> { @@ -34,10 +36,8 @@ public abstract class IdentifierTestBase<ID_TYPE> { @Test public void testEquals() { - new EqualsTester() - .addEqualityGroup(createInstance("foo"), createInstance("foo")) - .addEqualityGroup(createInstance("bar")) - .addEqualityGroup(createInstance("baz")) - .testEquals(); + assertEquals(Set.of(createInstance("foo"), createInstance("bar"), createInstance("baz")), + new HashSet<>(List.of(createInstance("foo"), createInstance("foo"), createInstance("bar"), createInstance("baz")))); } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java index ebf1fb32141..e5dede9af8a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java @@ -379,7 +379,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { if (completionService == null) { executorService.submit(task); } else { - completionService.submit(() -> { task.run();return true;}); + completionService.submit(() -> { task.run(); return true; }); } updateWorkQueueMetrics(); return true; diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java index 990e8911e91..91edfff5b17 100644 --- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java +++ b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/JobTypeTest.java @@ -33,29 +33,29 @@ public class JobTypeTest { assertEquals(JobType.testUsEast3, JobType.fromJobName("prod.us-east-3.test")); assertEquals(JobType.devAwsUsEast1c, JobType.fromJobName("dev.aws-us-east-1c")); - assertFalse(JobType.dev("snøhetta").isTest()); - assertTrue(JobType.dev("snøhetta").isDeployment()); - assertFalse(JobType.dev("snøhetta").isProduction()); + assertFalse(JobType.dev("snohetta").isTest()); + assertTrue(JobType.dev("snohetta").isDeployment()); + assertFalse(JobType.dev("snohetta").isProduction()); - assertFalse(JobType.perf("snøhetta").isTest()); - assertTrue(JobType.perf("snøhetta").isDeployment()); - assertFalse(JobType.perf("snøhetta").isProduction()); + assertFalse(JobType.perf("snohetta").isTest()); + assertTrue(JobType.perf("snohetta").isDeployment()); + assertFalse(JobType.perf("snohetta").isProduction()); - assertTrue(JobType.deploymentTo(ZoneId.from("test", "snøhetta")).isTest()); - assertTrue(JobType.deploymentTo(ZoneId.from("test", "snøhetta")).isDeployment()); - assertFalse(JobType.deploymentTo(ZoneId.from("test", "snøhetta")).isProduction()); + assertTrue(JobType.deploymentTo(ZoneId.from("test", "snohetta")).isTest()); + assertTrue(JobType.deploymentTo(ZoneId.from("test", "snohetta")).isDeployment()); + assertFalse(JobType.deploymentTo(ZoneId.from("test", "snohetta")).isProduction()); - assertTrue(JobType.deploymentTo(ZoneId.from("staging", "snøhetta")).isTest()); - assertTrue(JobType.deploymentTo(ZoneId.from("staging", "snøhetta")).isDeployment()); - assertFalse(JobType.deploymentTo(ZoneId.from("staging", "snøhetta")).isProduction()); + assertTrue(JobType.deploymentTo(ZoneId.from("staging", "snohetta")).isTest()); + assertTrue(JobType.deploymentTo(ZoneId.from("staging", "snohetta")).isDeployment()); + assertFalse(JobType.deploymentTo(ZoneId.from("staging", "snohetta")).isProduction()); - assertFalse(JobType.prod("snøhetta").isTest()); - assertTrue(JobType.prod("snøhetta").isDeployment()); - assertTrue(JobType.prod("snøhetta").isProduction()); + assertFalse(JobType.prod("snohetta").isTest()); + assertTrue(JobType.prod("snohetta").isDeployment()); + assertTrue(JobType.prod("snohetta").isProduction()); - assertTrue(JobType.test("snøhetta").isTest()); - assertFalse(JobType.test("snøhetta").isDeployment()); - assertTrue(JobType.test("snøhetta").isProduction()); + assertTrue(JobType.test("snohetta").isTest()); + assertFalse(JobType.test("snohetta").isDeployment()); + assertTrue(JobType.test("snohetta").isProduction()); } } diff --git a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/api/AthenzDomain.java b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/api/AthenzDomain.java index 769e81d7732..155ba8ab66a 100644 --- a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/api/AthenzDomain.java +++ b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/api/AthenzDomain.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; */ public class AthenzDomain { - private static final Pattern NAME_PATTERN = Pattern.compile("[a-zA-Z0-9_][a-zA-Z0-9_\\-.]*[a-zA-Z0-9_]"); + private static final Pattern NAME_PATTERN = Pattern.compile("[a-zA-Z0-9_][a-zA-Z0-9_.-]*[a-zA-Z0-9_]"); private final String name; |