DNSZoneSpec

Struct DNSZoneSpec 

Source
pub struct DNSZoneSpec {
    pub zone_name: String,
    pub cluster_ref: Option<String>,
    pub cluster_provider_ref: Option<String>,
    pub soa_record: SOARecord,
    pub ttl: Option<i32>,
    pub name_server_ips: Option<HashMap<String, String>>,
    pub records_from: Option<Vec<RecordSource>>,
}
Expand description

DNSZone defines a DNS zone to be managed by BIND9.

A DNSZone represents an authoritative DNS zone (e.g., example.com) that will be served by a BIND9 cluster. The zone includes SOA record information and will be synchronized to all instances in the referenced cluster via AXFR/IXFR.

DNSZones can reference either:

  • A namespace-scoped Bind9Cluster (using clusterRef)
  • A cluster-scoped ClusterBind9Provider (using clusterProviderRef)

Exactly one of clusterRef or clusterProviderRef must be specified.

§Example: Namespace-scoped Cluster

apiVersion: bindy.firestoned.io/v1beta1
kind: DNSZone
metadata:
  name: example-com
  namespace: dev-team-alpha
spec:
  zoneName: example.com
  clusterRef: dev-team-dns  # References Bind9Cluster in same namespace
  soaRecord:
    primaryNs: ns1.example.com.
    adminEmail: admin.example.com.
    serial: 2024010101
    refresh: 3600
    retry: 600
    expire: 604800
    negativeTtl: 86400
  ttl: 3600

§Example: Cluster-scoped Global Cluster

apiVersion: bindy.firestoned.io/v1beta1
kind: DNSZone
metadata:
  name: production-example-com
  namespace: production
spec:
  zoneName: example.com
  clusterProviderRef: shared-production-dns  # References ClusterBind9Provider (cluster-scoped)
  soaRecord:
    primaryNs: ns1.example.com.
    adminEmail: admin.example.com.
    serial: 2024010101
    refresh: 3600
    retry: 600
    expire: 604800
    negativeTtl: 86400
  ttl: 3600

Fields§

§zone_name: String

DNS zone name (e.g., “example.com”).

Must be a valid DNS zone name. Can be a domain or subdomain. Examples: “example.com”, “internal.example.com”, “10.in-addr.arpa”

§cluster_ref: Option<String>

Reference to a namespace-scoped Bind9Cluster in the same namespace.

Must match the name of a Bind9Cluster resource in the same namespace. The zone will be added to all instances in this cluster.

Either clusterRef or clusterProviderRef must be specified (not both).

§cluster_provider_ref: Option<String>

Reference to a cluster-scoped ClusterBind9Provider.

Must match the name of a ClusterBind9Provider resource (cluster-scoped). The zone will be added to all instances in this provider.

Either clusterRef or clusterProviderRef must be specified (not both).

§soa_record: SOARecord

SOA (Start of Authority) record - defines zone authority and refresh parameters.

The SOA record is required for all authoritative zones and contains timing information for zone transfers and caching.

§ttl: Option<i32>

Default TTL (Time To Live) for records in this zone, in seconds.

If not specified, individual records must specify their own TTL. Typical values: 300-86400 (5 minutes to 1 day).

§name_server_ips: Option<HashMap<String, String>>

Map of nameserver hostnames to IP addresses for glue records.

Glue records provide IP addresses for nameservers within the zone’s own domain. This is necessary when delegating subdomains where the nameserver is within the delegated zone itself.

Example: When delegating sub.example.com with nameserver ns1.sub.example.com, you must provide the IP address of ns1.sub.example.com as a glue record.

Format: {"ns1.example.com.": "192.0.2.1", "ns2.example.com.": "192.0.2.2"}

Note: Nameserver hostnames should end with a dot (.) for FQDN.

§records_from: Option<Vec<RecordSource>>

Sources for DNS records to include in this zone.

This field defines label selectors that automatically associate DNS records with this zone. Records with matching labels will be included in the zone’s DNS configuration.

This follows the standard Kubernetes selector pattern used by Services, NetworkPolicies, and other resources for declarative resource association.

§Example: Match podinfo records in dev/staging environments

recordsFrom:
  - selector:
      matchLabels:
        app: podinfo
      matchExpressions:
        - key: environment
          operator: In
          values:
            - dev
            - staging

§Selector Operators

  • In: Label value must be in the specified values list
  • NotIn: Label value must NOT be in the specified values list
  • Exists: Label key must exist (any value)
  • DoesNotExist: Label key must NOT exist

§Use Cases

  • Multi-environment zones: Dynamically include records based on environment labels
  • Application-specific zones: Group all records for an application using app label
  • Team-based zones: Use team labels to automatically route records to team-owned zones
  • Temporary records: Use labels to include/exclude records without changing zoneRef

Trait Implementations§

Source§

impl Clone for DNSZoneSpec

Source§

fn clone(&self) -> DNSZoneSpec

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DNSZoneSpec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for DNSZoneSpec

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl JsonSchema for DNSZoneSpec

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl Serialize for DNSZoneSpec

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,