/* * Copyright 2016 Google LLC * * 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 com.google.cloud.dns; import static com.google.common.base.Preconditions.checkNotNull; import com.google.api.gax.paging.Page; import com.google.api.services.dns.model.ManagedZone; import java.io.IOException; import java.io.ObjectInputStream; import java.util.List; import java.util.Map; import java.util.Objects; /** * A Google Cloud DNS Zone object. * *

A zone is the container for all of your record sets that share the same DNS name prefix, for * example, example.com. Zones are automatically assigned a set of name servers when they are * created to handle responding to DNS queries for that zone. A zone has quotas for the number of * record sets that it can include. * * @see Google Cloud DNS managed zone * documentation */ public class Zone extends ZoneInfo { private static final long serialVersionUID = -5817771337847861598L; private final DnsOptions options; private transient Dns dns; /** Builder for {@code Zone}. */ public static class Builder extends ZoneInfo.Builder { private final Dns dns; private final ZoneInfo.BuilderImpl infoBuilder; private Builder(Zone zone) { this.dns = zone.dns; this.infoBuilder = new ZoneInfo.BuilderImpl(zone); } @Override public Builder setName(String name) { infoBuilder.setName(name); return this; } @Override Builder setGeneratedId(String generatedId) { infoBuilder.setGeneratedId(generatedId); return this; } @Override Builder setCreationTimeMillis(long creationTimeMillis) { infoBuilder.setCreationTimeMillis(creationTimeMillis); return this; } @Override public Builder setDnsName(String dnsName) { infoBuilder.setDnsName(dnsName); return this; } @Override public Builder setDescription(String description) { infoBuilder.setDescription(description); return this; } @Override Builder setNameServerSet(String nameServerSet) { infoBuilder.setNameServerSet(nameServerSet); return this; } @Override Builder setNameServers(List nameServers) { infoBuilder.setNameServers(nameServers); // infoBuilder makes a copy return this; } @Override public Builder setDnsSecConfig(DnsSecConfig dnsSecConfig) { infoBuilder.setDnsSecConfig(dnsSecConfig); return this; } @Override public Builder setLabels(Map labels) { infoBuilder.setLabels(labels); return this; } @Override public Zone build() { return new Zone(dns, infoBuilder); } } Zone(Dns dns, ZoneInfo.BuilderImpl infoBuilder) { super(infoBuilder); this.dns = dns; this.options = dns.getOptions(); } @Override public Builder toBuilder() { return new Builder(this); } /** * Retrieves the latest information about the zone. The method retrieves the zone by name. * * @param options optional restriction on what fields should be fetched * @return zone object containing updated information or {@code null} if not not found * @throws DnsException upon failure */ public Zone reload(Dns.ZoneOption... options) { return dns.getZone(getName(), options); } /** * Deletes the zone. The method deletes the zone by name. * * @return {@code true} is zone was found and deleted and {@code false} otherwise * @throws DnsException upon failure */ public boolean delete() { return dns.delete(getName()); } /** * Lists all {@link RecordSet}s associated with this zone. The method searches for zone by name. * * @param options optional restriction on listing and fields of {@link RecordSet}s returned * @return a page of record sets * @throws DnsException upon failure or if the zone is not found */ public Page listRecordSets(Dns.RecordSetListOption... options) { return dns.listRecordSets(getName(), options); } /** * Submits {@link ChangeRequestInfo} to the service for it to applied to this zone. The method * searches for zone by name. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return ChangeRequest with server-assigned ID * @throws DnsException upon failure or if the zone is not found */ public ChangeRequest applyChangeRequest( ChangeRequestInfo changeRequest, Dns.ChangeRequestOption... options) { checkNotNull(changeRequest); return dns.applyChangeRequest(getName(), changeRequest, options); } /** * Retrieves an updated information about a change request previously submitted to be applied to * this zone. Returns a {@link ChangeRequest} or {@code null} if the change request was not found. * Throws {@link DnsException} if the zone is not found. * * @param options optional restriction on what fields of {@link ChangeRequest} should be returned * @return updated ChangeRequest * @throws DnsException upon failure or if the zone is not found * @throws NullPointerException if {@code changeRequestId} is null */ public ChangeRequest getChangeRequest( String changeRequestId, Dns.ChangeRequestOption... options) { checkNotNull(changeRequestId); return dns.getChangeRequest(getName(), changeRequestId, options); } /** * Retrieves all change requests for this zone. The method searches for zone by name. Returns a * page of {@link ChangeRequest}s. * * @param options optional restriction on listing and fields to be returned * @return a page of change requests * @throws DnsException upon failure or if the zone is not found */ public Page listChangeRequests(Dns.ChangeRequestListOption... options) { return dns.listChangeRequests(getName(), options); } /** Returns the {@link Dns} service object associated with this zone. */ public Dns getDns() { return this.dns; } @Override public final boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null || !obj.getClass().equals(Zone.class)) { return false; } Zone other = (Zone) obj; return Objects.equals(toPb(), other.toPb()) && Objects.equals(options, other.options); } @Override public final int hashCode() { return Objects.hash(super.hashCode(), options); } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); this.dns = options.getService(); } static Zone fromPb(Dns dns, ManagedZone zone) { ZoneInfo info = ZoneInfo.fromPb(zone); return new Zone(dns, new ZoneInfo.BuilderImpl(info)); } }