diff options
Diffstat (limited to 'controller-api')
10 files changed, 152 insertions, 44 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/DeploymentId.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/DeploymentId.java index 80fe98a4489..c0bebf54803 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/DeploymentId.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/DeploymentId.java @@ -1,7 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.api.identifiers; -import com.yahoo.config.provision.Zone; +import com.yahoo.config.provision.ZoneId; /** * Application + zone. @@ -12,9 +12,9 @@ import com.yahoo.config.provision.Zone; public class DeploymentId { private final com.yahoo.config.provision.ApplicationId application; - private final Zone zone; + private final ZoneId zone; - public DeploymentId(com.yahoo.config.provision.ApplicationId application, Zone zone) { + public DeploymentId(com.yahoo.config.provision.ApplicationId application, ZoneId zone) { this.application = application; this.zone = zone; } @@ -22,7 +22,7 @@ public class DeploymentId { public com.yahoo.config.provision.ApplicationId applicationId() { return application; } - public Zone zone() { return zone; } + public ZoneId zone() { return zone; } public String dottedString() { diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/ZoneId.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/ZoneId.java deleted file mode 100644 index 79210143d19..00000000000 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/ZoneId.java +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.controller.api.identifiers; - -/** - * @author smorgrav - */ -public class ZoneId extends Identifier { - - public ZoneId(EnvironmentId envId, RegionId regionId) { - super(envId.id() + ":" + regionId.id()); - } - -} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MetricsService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MetricsService.java index 1ceb064ad44..d3e1b881bbd 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MetricsService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MetricsService.java @@ -2,7 +2,7 @@ package com.yahoo.vespa.hosted.controller.api.integration; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.Zone; +import com.yahoo.config.provision.ZoneId; import java.util.Map; @@ -15,9 +15,9 @@ public interface MetricsService { ApplicationMetrics getApplicationMetrics(ApplicationId application); - DeploymentMetrics getDeploymentMetrics(ApplicationId application, Zone zone); + DeploymentMetrics getDeploymentMetrics(ApplicationId application, ZoneId zone); - Map<String, SystemMetrics> getSystemMetrics(ApplicationId application, Zone zone); + Map<String, SystemMetrics> getSystemMetrics(ApplicationId application, ZoneId zone); class DeploymentMetrics { diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java index c82a3fd571d..ec9cf0b3436 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java @@ -22,20 +22,33 @@ public class MemoryNameService implements NameService { } @Override - public RecordId createCname(String alias, String canonicalName) { + public RecordId createCname(RecordName alias, RecordData canonicalName) { RecordId id = new RecordId(UUID.randomUUID().toString()); records.put(id, new Record(id, Record.Type.CNAME, alias, canonicalName)); return id; } @Override - public Optional<Record> findRecord(Record.Type type, String name) { + public Optional<Record> findRecord(Record.Type type, RecordName name) { return records.values().stream() .filter(record -> record.type() == type && record.name().equals(name)) .findFirst(); } @Override + public Optional<Record> findRecord(Record.Type type, RecordData data) { + return records.values() + .stream() + .filter(record -> record.type() == type && record.data().equals(data)) + .findFirst(); + } + + @Override + public void updateRecord(RecordId id, RecordData newData) { + records.computeIfPresent(id, (k, record) -> new Record(id, record.type(), record.name(), newData)); + } + + @Override public void removeRecord(RecordId id) { records.remove(id); } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java index 9b7c527db63..078a7e7cefb 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java @@ -14,12 +14,18 @@ public interface NameService { * Create a new CNAME record * * @param alias The alias to create - * @param canonicalName The canonical name which the alias should point to. This must be a domain. + * @param canonicalName The canonical name which the alias should point to. This must be a FQDN. */ - RecordId createCname(String alias, String canonicalName); + RecordId createCname(RecordName alias, RecordData canonicalName); /** Find record by type and name */ - Optional<Record> findRecord(Record.Type type, String name); + Optional<Record> findRecord(Record.Type type, RecordName name); + + /** Find record by type and data */ + Optional<Record> findRecord(Record.Type type, RecordData data); + + /** Update existing record */ + void updateRecord(RecordId id, RecordData newData); /** Remove record by ID */ void removeRecord(RecordId id); diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java index f190d11cf8f..b51202e8261 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/Record.java @@ -12,14 +12,14 @@ public class Record { private final RecordId id; private final Type type; - private final String name; - private final String value; + private final RecordName name; + private final RecordData data; - public Record(RecordId id, Type type, String name, String value) { - this.id = id; - this.type = type; - this.name = name; - this.value = value; + public Record(RecordId id, Type type, RecordName name, RecordData data) { + this.id = Objects.requireNonNull(id, "id cannot be null"); + this.type = Objects.requireNonNull(type, "type cannot be null"); + this.name = Objects.requireNonNull(name, "name cannot be null"); + this.data = Objects.requireNonNull(data, "data cannot be null"); } /** Unique identifier for this */ @@ -32,13 +32,13 @@ public class Record { return type; } - /** Value for this, e.g. IP address for "A" record */ - public String value() { - return value; + /** Data in this, e.g. IP address for "A" record */ + public RecordData data() { + return data; } /** Name of this, e.g. a FQDN for "A" record */ - public String name() { + public RecordName name() { return name; } @@ -60,7 +60,7 @@ public class Record { "id=" + id + ", type=" + type + ", name='" + name + '\'' + - ", value='" + value + '\'' + + ", data='" + data + '\'' + '}'; } @@ -72,11 +72,11 @@ public class Record { return Objects.equals(id, record.id) && type == record.type && Objects.equals(name, record.name) && - Objects.equals(value, record.value); + Objects.equals(data, record.data); } @Override public int hashCode() { - return Objects.hash(id, type, name, value); + return Objects.hash(id, type, name, data); } } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordData.java new file mode 100644 index 00000000000..e0d19e0fff9 --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordData.java @@ -0,0 +1,55 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.api.integration.dns; + +import java.util.Objects; + +/** + * Represents the data field of a DNS record (RDATA). + * + * E.g. this may be an IP address for A records, or a FQDN for CNAME records. + * + * @author mpolden + */ +public class RecordData { + + private final String data; + + private RecordData(String data) { + this.data = Objects.requireNonNull(data, "data cannot be null"); + } + + public String asString() { + return data; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RecordData that = (RecordData) o; + return Objects.equals(data, that.data); + } + + @Override + public int hashCode() { + return Objects.hash(data); + } + + @Override + public String toString() { + return "RecordValue{" + + "value='" + data + '\'' + + '}'; + } + + /** Create a new record containing the given data */ + public static RecordData from(String data) { + return new RecordData(data); + } + + /** Create a new record and append a trailing dot to given data, if missing */ + public static RecordData fqdn(String data) { + return from(data.endsWith(".") ? data : data + "."); + } + +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordName.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordName.java new file mode 100644 index 00000000000..aa239ece588 --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/RecordName.java @@ -0,0 +1,47 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.api.integration.dns; + +import java.util.Objects; + +/** + * Represents the name field of a DNS record (NAME). This is typically a FQDN. + * + * @author mpolden + */ +public class RecordName { + + private final String name; + + private RecordName(String name) { + this.name = Objects.requireNonNull(name, "name cannot be null"); + } + + public String asString() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RecordName that = (RecordName) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + + @Override + public String toString() { + return "RecordName{" + + "name='" + name + '\'' + + '}'; + } + + public static RecordName from(String name) { + return new RecordName(name); + } + +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/zone/ZoneRegistry.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/zone/ZoneRegistry.java index df6f023f6af..3318bf783d8 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/zone/ZoneRegistry.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/zone/ZoneRegistry.java @@ -5,7 +5,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; -import com.yahoo.config.provision.Zone; +import com.yahoo.config.provision.ZoneId; import java.net.URI; import java.time.Duration; @@ -20,8 +20,8 @@ import java.util.Optional; public interface ZoneRegistry { SystemName system(); - List<Zone> zones(); - Optional<Zone> getZone(Environment environment, RegionName region); + List<ZoneId> zones(); + Optional<ZoneId> getZone(Environment environment, RegionName region); List<URI> getConfigServerUris(Environment environment, RegionName region); Optional<URI> getLogServerUri(Environment environment, RegionName region); Optional<Duration> getDeploymentTimeToLive(Environment environment, RegionName region); diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/identifiers/IdentifierTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/identifiers/IdentifierTest.java index 7e4d543fd18..aa3d1be879e 100644 --- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/identifiers/IdentifierTest.java +++ b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/identifiers/IdentifierTest.java @@ -3,7 +3,7 @@ package com.yahoo.vespa.hosted.controller.api.identifiers; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; -import com.yahoo.config.provision.Zone; +import com.yahoo.config.provision.ZoneId; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -147,7 +147,7 @@ public class IdentifierTest { @Test public void application_instance_id_dotted_string_is_subindentifers_concatinated_with_dots() { DeploymentId id = new DeploymentId(com.yahoo.config.provision.ApplicationId.from("tenant", "application", "instance"), - new Zone(Environment.prod, RegionName.from("region"))); + ZoneId.from("prod", "region")); assertEquals("tenant.application.prod.region.instance", id.dottedString()); } } |