Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
0b1f20a
feat: Add internal DNS network contracts
scotwells Oct 9, 2026
2d56405
feat: Reconcile internal DNS VPC access
scotwells Oct 9, 2026
e1d6836
test: Cover internal DNS lifecycle and readiness
scotwells Oct 9, 2026
4fbdb21
fix federation controllers to watch hub API
scotwells Oct 9, 2026
568e7f5
fix DNS intent replication to federation
scotwells Oct 9, 2026
5e50e70
Request the network default DNS domain from DNS
scotwells Oct 11, 2026
b78462b
Test withdrawal for invalid managed DNS allocation
scotwells Oct 11, 2026
8a3d3fe
feat: Keep internal DNS access available through observation outages
scotwells Oct 12, 2026
6252d27
refactor: Remove unused access expiry clock
scotwells Oct 12, 2026
32adde9
docs: Describe persistent interface resolver settings
scotwells Oct 13, 2026
6d07385
fix: Report managed DNS in interface status
scotwells Oct 13, 2026
99e3b4b
test: Verify name-only DNS intent replication
scotwells Oct 13, 2026
6e42011
test: Refresh network DNS update observations
scotwells Oct 13, 2026
3c49d23
refactor: Version internal DNS access mappings
scotwells Oct 13, 2026
381045c
feat: Configure private DNS through named mappings
scotwells Oct 13, 2026
07c7dbd
refactor: Keep current-generation readiness
scotwells Oct 13, 2026
7eab43c
chore: Sync private DNS integration with main
scotwells Oct 14, 2026
41b1a8a
fix: align internal DNS with project routing
scotwells Oct 14, 2026
2150d81
chore: sync network DNS integration with main
scotwells Oct 20, 2026
79703d2
fix: select the network federation hub explicitly
scotwells Oct 21, 2026
8684ccf
chore: merge latest main
scotwells Oct 21, 2026
6a92036
Merge remote-tracking branch 'origin/main' into codex/internal-dns-sy…
scotwells Oct 21, 2026
617582c
Propagate network addressing to project network contexts
scotwells Oct 21, 2026
8013c82
Resolve private DNS regions from platform locations
scotwells Oct 21, 2026
943f175
test: allocate network context subnets in readiness scenarios
scotwells Oct 22, 2026
670aa45
fix: preserve network identity for DNS publishing
scotwells Oct 22, 2026
7e8bc97
fix: publish interfaces with long claim names
scotwells Oct 22, 2026
c84c034
test: exercise project-local network binding readiness
scotwells Oct 22, 2026
2b967ea
fix: isolate internal DNS rollout behavior
scotwells Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -9355,10 +9355,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

```

## go.datum.net/galactic/api/cloud/v1alpha1
## go.datum.net/galactic/api

* Name: go.datum.net/galactic/api/cloud/v1alpha1
* Version: v0.5.8-0.20261016143526-45d3c3514bec
* Name: go.datum.net/galactic/api
* Version: v0.6.3-0.20261021151056-bb0b4c057338
* License: AGPL-3.0

```
Expand Down Expand Up @@ -10038,7 +10038,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see
## go.miloapis.com/ipam/pkg/apis/ipam

* Name: go.miloapis.com/ipam/pkg/apis/ipam
* Version: v0.4.0
* Version: v0.5.1
* License: Unknown

```
Expand All @@ -10048,7 +10048,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see
## go.miloapis.com/ipam/pkg/apis/ipam/v1alpha1

* Name: go.miloapis.com/ipam/pkg/apis/ipam/v1alpha1
* Version: v0.4.0
* Version: v0.5.1
* License: Unknown

```
Expand All @@ -10058,7 +10058,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see
## go.miloapis.com/ipam/pkg/ipamerrors

* Name: go.miloapis.com/ipam/pkg/ipamerrors
* Version: v0.4.0
* Version: v0.5.1
* License: Unknown

```
Expand Down Expand Up @@ -15151,7 +15151,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## google.golang.org/genproto/googleapis/rpc

* Name: google.golang.org/genproto/googleapis/rpc
* Version: v0.0.0-20261005182115-fad411399dd8
* Version: v0.0.0-20261019180522-ce908d29299b
* License: Apache-2.0

```
Expand Down Expand Up @@ -19626,7 +19626,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## sigs.k8s.io/json

* Name: sigs.k8s.io/json
* Version: v0.0.0-20250730193827-2d320260d730
* Version: v0.0.0-20260909141634-11ed52e25bc5
* License: Apache-2.0

```
Expand Down
91 changes: 91 additions & 0 deletions api/v1alpha/internaldns_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// SPDX-License-Identifier: AGPL-3.0-only

package v1alpha

// +kubebuilder:validation:Enum=Managed;Disabled
type NetworkDNSMode string

const (
NetworkDNSModeManaged NetworkDNSMode = "Managed"
NetworkDNSModeDisabled NetworkDNSMode = "Disabled"
)

// NetworkDNSPolicy selects managed resolver access for a network.
type NetworkDNSPolicy struct {
// Mode controls whether network services maintain private resolver access.
// An empty value uses Managed when the Internal DNS feature is enabled.
//
// +kubebuilder:validation:Optional
Mode NetworkDNSMode `json:"mode,omitempty"`
}

// NetworkDNSObjectReference identifies a DNS resource by name.
type NetworkDNSObjectReference struct {
// Name is the resource name in the network's namespace.
//
// +kubebuilder:validation:Required
// +kubebuilder:validation:MinLength=1
Name string `json:"name"`
}

type NetworkDNSResolverSettings struct {
// +kubebuilder:validation:MinItems=1
// +kubebuilder:validation:MaxItems=3
// +kubebuilder:validation:XValidation:rule="self.all(n, isIP(n))",message="nameservers must contain IP addresses"
Nameservers []string `json:"nameservers"`
// +kubebuilder:validation:MaxItems=6
Searches []string `json:"searches,omitempty"`
}

// NetworkDNSSettings are verified resolver settings inherited by interfaces.
type NetworkDNSSettings struct {
// ContextRef identifies the DNS serving and namespace lifetime.
//
// +kubebuilder:validation:Required
ContextRef NetworkDNSObjectReference `json:"contextRef"`

// AccessBindingRef identifies the regional DNS configuration.
//
// +kubebuilder:validation:Required
AccessBindingRef NetworkDNSObjectReference `json:"accessBindingRef"`

// Nameservers are resolver addresses reachable from this network.
//
// +kubebuilder:validation:MinItems=1
// +kubebuilder:validation:MaxItems=3
// +kubebuilder:validation:XValidation:rule="self.all(n, isIP(n))",message="nameservers must contain IP addresses"
Nameservers []string `json:"nameservers"`

// Searches contains DNS search suffixes allocated to this network.
//
// +kubebuilder:validation:MaxItems=6
Searches []string `json:"searches,omitempty"`
}

// NetworkDNSAccessStatus reports the private path verified for one context.
type NetworkDNSAccessStatus struct {
// ContextRef identifies the DNS context used for the proof.
ContextRef NetworkDNSObjectReference `json:"contextRef"`

// AccessBindingRef identifies the DNS configuration used for the proof.
AccessBindingRef NetworkDNSObjectReference `json:"accessBindingRef"`

// ServiceDestination identifies this DNS context inside the shared service.
//
// +kubebuilder:validation:XValidation:rule="isIP(self)",message="serviceDestination must be an IP address"
ServiceDestination string `json:"serviceDestination"`
}

const (
NetworkContextDNSReady = "DNSReady"

NetworkContextDNSReadyReasonReady = "Ready"
NetworkContextDNSReadyReasonDisabled = "Disabled"
NetworkContextDNSReadyReasonPending = "Pending"
NetworkContextDNSReadyReasonAccessAbsent = "AccessAbsent"
NetworkContextDNSReadyReasonNetworkPathNotReady = "NetworkPathNotReady"
NetworkContextDNSReadyReasonNetworkIdentityAbsent = "NetworkIdentityAbsent"

NetworkInterfaceDNSConfiguredReasonApplied = "Applied"
NetworkInterfaceDNSConfiguredReasonUnsupportedMultipleContexts = "UnsupportedMultipleContexts"
)
4 changes: 4 additions & 0 deletions api/v1alpha/network_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ const (

// NetworkSpec defines the desired state of a Network
type NetworkSpec struct {
// DNS configures private resolver access for the network.
//
// +kubebuilder:validation:Optional
DNS NetworkDNSPolicy `json:"dns,omitempty"`

// IPAM settings for the network.
//
Expand Down
12 changes: 12 additions & 0 deletions api/v1alpha/networkcontext_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ type NetworkContextSpec struct {
//
// +kubebuilder:validation:Optional
NetworkGeneration int64 `json:"networkGeneration,omitempty"`

// DNS contains resolver settings whose DNS authorization and private path
// have both been verified for this location.
//
// +kubebuilder:validation:Optional
DNS *NetworkDNSSettings `json:"dns,omitempty"`
}

// NetworkContextStatus defines the observed state of NetworkContext
Expand All @@ -55,6 +61,12 @@ type NetworkContextStatus struct {
//
// +kubebuilder:validation:Optional
IPAM *NetworkContextIPAMStatus `json:"ipam,omitempty"`

// DNSAccess identifies the current private path proof. DNSReady=True applies
// only to this exact context, binding revision, and deadline.
//
// +kubebuilder:validation:Optional
DNSAccess *NetworkDNSAccessStatus `json:"dnsAccess,omitempty"`
}

// NetworkContextIPAMStatus reports what IPAM holds for a network in one
Expand Down
7 changes: 7 additions & 0 deletions api/v1alpha/networkinterface_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ const (
// interface at all. A phase of Available means no claim holds it, which is
// the opposite of anything being available to serve.
NetworkInterfaceHolderAvailable = "HolderAvailable"

// NetworkInterfaceDNSConfigured is reported by the provider after applying
// the current settings in spec.dns to the workload.
NetworkInterfaceDNSConfigured = "DNSConfigured"
)

const (
Expand Down Expand Up @@ -342,6 +346,9 @@ type NetworkInterfaceSpec struct {
// claim holds it, what realizes it on the data plane, and whether programming
// has succeeded.
type NetworkInterfaceStatus struct {
// DNS contains effective resolver settings inherited from the network.
// +kubebuilder:validation:Optional
DNS *NetworkDNSResolverSettings `json:"dns,omitempty"`
// phase reports whether a claim holds the interface. Bound means the claim in
// spec.claimRef holds it. Available means it is retained and holding its
// addresses with no claim bound.
Expand Down
115 changes: 115 additions & 0 deletions api/v1alpha/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions config/components/cell-controllers/config.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
apiVersion: apiserver.config.datumapis.com/v1alpha1
kind: CellControllerManager
# Internal DNS is an alpha network integration and remains off until the
# shared resolver attachments are configured for this cell.
internalDNS:
# Enables private resolver route programming and readiness reporting.
enabled: false
# Presents the same resolver address inside each consumer VPC.
# frontend: fd53::53
# Allocates one stable service destination from this prefix per DNS context.
# servicePrefix: fd70:100::/64
# Selects the shared resolver attachments that serve authorized VPCs.
# producerAttachmentSelector:
# service.datum.net/internal-dns: "true"
metricsServer:
bindAddress: ":8443"
ipam:
Expand Down
Loading
Loading