diff options
Diffstat (limited to 'config-provisioning')
5 files changed, 151 insertions, 9 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/security/DummyNodeIdentifierProvider.java b/config-provisioning/src/main/java/com/yahoo/config/provision/security/DummyNodeIdentifierProvider.java new file mode 100644 index 00000000000..0ff0bcc26bb --- /dev/null +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/security/DummyNodeIdentifierProvider.java @@ -0,0 +1,31 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.provision.security; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +import java.security.cert.X509Certificate; +import java.util.List; + +/** + * @author bjorncs + */ +public class DummyNodeIdentifierProvider implements Provider<NodeIdentifier> { + + private final ThrowingNodeIdentifier instance = new ThrowingNodeIdentifier(); + + @Inject + public DummyNodeIdentifierProvider() {} + + @Override + public NodeIdentifier get() { + return instance; + } + + private static class ThrowingNodeIdentifier implements NodeIdentifier { + @Override + public NodeIdentity identifyNode(List<X509Certificate> peerCertificateChain) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentifierException.java b/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentifierException.java index 795a4e8a1d2..6ceb956ccfa 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentifierException.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentifierException.java @@ -5,7 +5,16 @@ package com.yahoo.config.provision.security; * @author bjorncs */ public class NodeIdentifierException extends RuntimeException { + public NodeIdentifierException(String message) { super(message); } + + public NodeIdentifierException(String message, Throwable cause) { + super(message, cause); + } + + public NodeIdentifierException(Throwable cause) { + super(cause); + } } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentity.java b/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentity.java index ea78caaeba7..d323214297f 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentity.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/security/NodeIdentity.java @@ -1,6 +1,7 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision.security; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; @@ -17,11 +18,13 @@ public class NodeIdentity { private final NodeType nodeType; private final String identityName; private final HostName hostname; + private final ApplicationId applicationId; - private NodeIdentity(NodeType nodeType, String identityName, HostName hostname) { + private NodeIdentity(NodeType nodeType, String identityName, HostName hostname, ApplicationId applicationId) { this.nodeType = nodeType; this.identityName = identityName; this.hostname = hostname; + this.applicationId = applicationId; } public NodeType nodeType() { @@ -37,6 +40,10 @@ public class NodeIdentity { return Optional.ofNullable(hostname); } + public Optional<ApplicationId> applicationId() { + return Optional.ofNullable(applicationId); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -44,12 +51,13 @@ public class NodeIdentity { NodeIdentity that = (NodeIdentity) o; return nodeType == that.nodeType && Objects.equals(identityName, that.identityName) && - Objects.equals(hostname, that.hostname); + Objects.equals(hostname, that.hostname) && + Objects.equals(applicationId, that.applicationId); } @Override public int hashCode() { - return Objects.hash(nodeType, identityName, hostname); + return Objects.hash(nodeType, identityName, hostname, applicationId); } @Override @@ -58,6 +66,7 @@ public class NodeIdentity { "nodeType=" + nodeType + ", identityName='" + identityName + '\'' + ", hostname=" + hostname + + ", applicationId=" + applicationId + '}'; } @@ -65,6 +74,7 @@ public class NodeIdentity { private final NodeType nodeType; private String identityName; private HostName hostname; + private ApplicationId applicationId; public Builder(NodeType nodeType) { this.nodeType = nodeType; @@ -80,8 +90,13 @@ public class NodeIdentity { return this; } + public Builder applicationId(ApplicationId applicationId) { + this.applicationId = applicationId; + return this; + } + public NodeIdentity build() { - return new NodeIdentity(nodeType, identityName, hostname); + return new NodeIdentity(nodeType, identityName, hostname, applicationId); } } } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java index 7eeae10eeb8..be967c0cbfa 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java @@ -4,6 +4,7 @@ package com.yahoo.config.provision.zone; import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.SystemName; import java.util.Objects; @@ -17,24 +18,32 @@ import java.util.Objects; public class ZoneId { // TODO: Replace usages of environment + region with usages of this. + // TODO: Remove static factory methods not specifying cloud and system + private final Environment environment; private final RegionName region; private final CloudName cloud; + private final SystemName system; - private ZoneId(Environment environment, RegionName region, CloudName cloud) { + private ZoneId(Environment environment, RegionName region, CloudName cloud, SystemName system) { this.environment = Objects.requireNonNull(environment, "environment must be non-null"); this.region = Objects.requireNonNull(region, "region must be non-null"); this.cloud = Objects.requireNonNull(cloud, "cloud must be non-null"); + this.system = Objects.requireNonNull(system, "system must be non-null"); } private ZoneId(Environment environment, RegionName region) { - this(environment, region, CloudName.defaultName()); + this(environment, region, CloudName.defaultName(), SystemName.defaultSystem()); } public static ZoneId from(Environment environment, RegionName region) { return new ZoneId(environment, region); } + public static ZoneId from(Environment environment, RegionName region, CloudName cloud, SystemName system) { + return new ZoneId(environment, region, cloud, system); + } + public static ZoneId from(String environment, String region) { return from(Environment.from(environment), RegionName.from(region)); } @@ -42,15 +51,26 @@ public class ZoneId { /** Create from a serialised ZoneId. Inverse of {@code ZoneId.value()}. */ public static ZoneId from(String value) { String[] parts = value.split("\\."); - return from(parts[0], parts[1]); + switch (parts.length) { + case 2: + return from(parts[0], parts[1]); + case 4: + return from(parts[2], parts[3], parts[0], parts[1]); + default: + throw new IllegalArgumentException("Cannot deserialize zone id '" + value + "'"); + } } public static ZoneId from(Environment environment, RegionName region, CloudName cloud) { - return new ZoneId(environment, region, cloud); + return new ZoneId(environment, region, cloud, SystemName.defaultSystem()); } public static ZoneId from(String environment, String region, String cloud) { - return new ZoneId(Environment.from(environment), RegionName.from(region), CloudName.from(cloud)); + return new ZoneId(Environment.from(environment), RegionName.from(region), CloudName.from(cloud), SystemName.defaultSystem()); + } + + public static ZoneId from(String environment, String region, String cloud, String system) { + return new ZoneId(Environment.from(environment), RegionName.from(region), CloudName.from(cloud), SystemName.from(system)); } public Environment environment() { @@ -65,17 +85,27 @@ public class ZoneId { return cloud; } + public SystemName system() { + return system; + } + /** Returns the serialised value of this. Inverse of {@code ZoneId.from(String value)}. */ public String value() { return environment + "." + region; + // TODO: Change to the below when there only methods use constructor including cloud and system are used and + // all serialized values contain cloud and system + // return cloud + "." + system + "." + environment + "." + region; } @Override public String toString() { return "zone " + value() + " in " + cloud; + // TODO: Use the below (need to fix some use of toString() in tests first) + //return "zone " + cloud + "." + system + "." + environment + "." + region; } @Override + // TODO: Update to check cloud and system when everyone use methods that specify cloud and system public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ZoneIdTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ZoneIdTest.java new file mode 100644 index 00000000000..a546d429291 --- /dev/null +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ZoneIdTest.java @@ -0,0 +1,57 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.provision; + +import com.yahoo.config.provision.zone.ZoneId; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static org.junit.Assert.assertEquals; + +/** + * @author hmusum + */ +public class ZoneIdTest { + + private static final Environment environment = Environment.prod; + private static final RegionName region = RegionName.from("moon-dark-side-1"); + private static final CloudName cloud = CloudName.from("aws"); + private static final SystemName system = SystemName.Public; + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void testCreatingZoneId() { + ZoneId zoneId = ZoneId.from(environment, region); + assertEquals(region, zoneId.region()); + assertEquals(environment, zoneId.environment()); + assertEquals(CloudName.defaultName(), zoneId.cloud()); + assertEquals(SystemName.defaultSystem(), zoneId.system()); + + ZoneId zoneIdWithCloudAndSystem = ZoneId.from(environment, region, cloud, system); + assertEquals(region, zoneIdWithCloudAndSystem.region()); + assertEquals(environment, zoneIdWithCloudAndSystem.environment()); + assertEquals(cloud, zoneIdWithCloudAndSystem.cloud()); + assertEquals(system, zoneIdWithCloudAndSystem.system()); + } + + @Test + public void testSerializingAndDeserializing() { + ZoneId zoneId = ZoneId.from(environment, region); + assertEquals(environment.value() + "." + region.value(), zoneId.value()); + assertEquals(ZoneId.from(zoneId.value()), zoneId); + + ZoneId zoneIdWithCloudAndSystem = ZoneId.from(environment, region, cloud, system); + assertEquals(environment.value() + "." + region.value(), zoneIdWithCloudAndSystem.value()); + assertEquals(ZoneId.from(zoneIdWithCloudAndSystem.value()), zoneIdWithCloudAndSystem); + // TODO: Expect cloud and system to be part of deserialized value when the new format is supported everywhere + //assertEquals(cloud.value() + "." + system.name() + "." + environment.value() + "." + region.value() , zoneId.value()); + + String serializedZoneId = "some.illegal.value"; + expectedException.expect(IllegalArgumentException.class); + expectedException.expectMessage("Cannot deserialize zone id '" + serializedZoneId + "'"); + ZoneId.from(serializedZoneId); + } + +} |