diff --git a/java/google/registry/dns/writer/BUILD b/java/google/registry/dns/writer/BUILD new file mode 100644 index 000000000..258362341 --- /dev/null +++ b/java/google/registry/dns/writer/BUILD @@ -0,0 +1,19 @@ +package( + default_visibility = ["//java/google/registry:registry_project"], +) + +licenses(["notice"]) # Apache 2.0 + + +java_library( + name = "writer", + srcs = glob( + ["*.java"], + ), + deps = [ + "//java/com/google/common/annotations", + "//java/com/google/common/base", + "//java/com/google/common/collect", + "//third_party/java/dagger", + ], +) diff --git a/java/google/registry/dns/writer/DnsWriter.java b/java/google/registry/dns/writer/DnsWriter.java new file mode 100644 index 000000000..7e8b8be4c --- /dev/null +++ b/java/google/registry/dns/writer/DnsWriter.java @@ -0,0 +1,56 @@ +// Copyright 2016 The Domain Registry Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.dns.writer; + +/** + * Transaction object for sending an atomic batch of updates for a single zone to the DNS server. + * + *
Here's an example of how you would publish updates for a domain and host: + *
+ * @Inject Provider<DnsWriter> dnsWriter;
+ * try (DnsWriter writer = dnsWriter.get()) {
+ * writer.publishDomain(domainName);
+ * writer.publishHost(hostName);
+ * }
+ *
+ */
+public interface DnsWriter extends AutoCloseable {
+
+ /**
+ * Loads {@code domainName} from datastore and publishes its NS/DS records to the DNS server.
+ * Replaces existing records for the exact name supplied with an NS record for each name server
+ * and a DS record for each delegation signer stored in the registry for the supplied domain name.
+ * If the domain is deleted or is in a "non-publish" state then any existing records are deleted.
+ *
+ * @param domainName the fully qualified domain name, with no trailing dot
+ */
+ void publishDomain(String domainName);
+
+ /**
+ * Loads {@code hostName} from datastore and publishes its A/AAAA glue records to the DNS server,
+ * if it is used as an in-bailiwick nameserver. Orphaned glue records are prohibited. Replaces
+ * existing records for the exact name supplied, with an A or AAAA record (as appropriate) for
+ * each address stored in the registry, for the supplied host name. If the host is deleted then
+ * the existing records are deleted. Assumes that this method will only be called for in-bailiwick
+ * hosts. The registry does not have addresses for other hosts.
+ *
+ * @param hostName the fully qualified host name, with no trailing dot
+ */
+ void publishHost(String hostName);
+
+ /** Commits the updates to the DNS server atomically. */
+ @Override
+ void close();
+}
diff --git a/java/google/registry/dns/writer/DnsWriterZone.java b/java/google/registry/dns/writer/DnsWriterZone.java
new file mode 100644
index 000000000..162186694
--- /dev/null
+++ b/java/google/registry/dns/writer/DnsWriterZone.java
@@ -0,0 +1,23 @@
+// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package google.registry.dns.writer;
+
+import java.lang.annotation.Documented;
+import javax.inject.Qualifier;
+
+/** Dagger qualifier for the fully-qualified zone name that's being updated. */
+@Qualifier
+@Documented
+public @interface DnsWriterZone {}
diff --git a/java/google/registry/dns/writer/VoidDnsWriter.java b/java/google/registry/dns/writer/VoidDnsWriter.java
new file mode 100644
index 000000000..dbe68b017
--- /dev/null
+++ b/java/google/registry/dns/writer/VoidDnsWriter.java
@@ -0,0 +1,58 @@
+// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package google.registry.dns.writer;
+
+import com.google.common.base.Joiner;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Logger;
+import javax.inject.Inject;
+
+/**
+ * {@link DnsWriter} that doesn't actually update records in a DNS server.
+ *
+ * All this class does is write its displeasure to the logs.
+ */
+public final class VoidDnsWriter implements DnsWriter {
+
+ /**
+ * The name of the pricing engine, as used in {@code Registry.dnsWriter}. Remember to change
+ * the value on affected Registry objects to prevent runtime failures.
+ */
+ public static final String NAME = "VoidDnsWriter";
+
+ private static final Logger logger = Logger.getLogger(VoidDnsWriter.class.getName());
+
+ private final Set