Linked zones: shared records kept in step across views
Zones of the same name in different views can be linked. Shared records
are kept in step: a change in one view reaches the others in the same
changeset, as explicit operations, so the diff, permission checks,
history and undo cover every view. Records local to a view override the
shared records of that name and type there; removing the override brings
the shared ones back, and sharing a view's version makes it every view's.
Each zone keeps its own options, serial and file.
Linking existing zones changes no answer: what is the same everywhere
becomes shared, the rest stays local. Unlinking keeps every record, all
local. ACME challenges are written once per link, and --view all changes
a link once. jarl zone link/unlink, zone create --link-with, record
--local/--shared, LINK column, web UI controls, POST /zones/{zone}/link
and /unlink, validation checks linked_*, store migration 11, docs and
e2e.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6313fa51f8
commit
057433c198
31 files changed
+1729
-55
No files matched your search
@@ -55,6 +55,10 @@ const (
|
||||
// back, become view.update or settings.update operations.
|
||||
OpExposureAck = "exposure.ack"
|
||||
OpExposureUnack = "exposure.unack"
|
||||
// Linked zones (docs/views.md#linked-zones): requests that expand
|
||||
// into zone and record updates.
|
||||
OpZoneLink = "zone.link"
|
||||
OpZoneUnlink = "zone.unlink"
|
||||
)
|
||||
|
||||
// AckInput acknowledges (or un-acknowledges) an exposure finding of a view
|
||||
@@ -131,6 +135,13 @@ type ZoneInput struct {
|
||||
Comment *string `json:"comment,omitempty"`
|
||||
// Disabled keeps the zone in Jarl but out of named's configuration.
|
||||
Disabled *bool `json:"disabled,omitempty"`
|
||||
// LinkGroup is the zone's link group (0: not linked). Set by zone.link
|
||||
// and zone.unlink; requests use those.
|
||||
LinkGroup *int64 `json:"link_group,omitempty"`
|
||||
// LinkWith (create only) links the new zone with the zone of the same
|
||||
// name in this view, copying its shared records (or all of its
|
||||
// records, when it isn't linked yet).
|
||||
LinkWith string `json:"link_with,omitempty"`
|
||||
|
||||
// Create only: name servers for the apex NS records (default: the
|
||||
// configured default name servers), additional records, and a zone to
|
||||
@@ -167,6 +178,25 @@ type RecordInput struct {
|
||||
PTR bool `json:"ptr,omitempty"`
|
||||
// MissingOK makes a delete-by-match succeed when nothing matches.
|
||||
MissingOK bool `json:"missing_ok,omitempty"`
|
||||
// Local (requests, linked zones): true keeps the record in this view
|
||||
// only (an override: the whole name and type becomes local here);
|
||||
// false shares it with the linked zones. Unset: like the records of
|
||||
// the same name and type, shared when there are none.
|
||||
Local *bool `json:"local,omitempty"`
|
||||
// SharedID (stored operations) ties the copies of a shared record
|
||||
// together; 0 makes it local.
|
||||
SharedID *int64 `json:"shared_id,omitempty"`
|
||||
}
|
||||
|
||||
// LinkInput links zones of the same name in several views, or (unlink)
|
||||
// takes one out of its link.
|
||||
type LinkInput struct {
|
||||
ZoneID int64 `json:"zone_id,omitempty"`
|
||||
Zone string `json:"zone,omitempty"`
|
||||
View string `json:"view,omitempty"`
|
||||
// With are the views whose zone of the same name to link with (link
|
||||
// only; default: every view that has one).
|
||||
With []string `json:"with,omitempty"`
|
||||
}
|
||||
|
||||
// RRSetInput replaces all records of one name and type.
|
||||
@@ -181,6 +211,11 @@ type RRSetInput struct {
|
||||
Comment *string `json:"comment,omitempty"`
|
||||
// NewIDs are allocated for records that need to be created.
|
||||
NewIDs []int64 `json:"new_ids,omitempty"`
|
||||
// Local (requests): like RecordInput.Local, for the whole set.
|
||||
Local *bool `json:"local,omitempty"`
|
||||
// Shared (stored operations, linked zones): the records are shared
|
||||
// (true) or local (false).
|
||||
Shared *bool `json:"shared,omitempty"`
|
||||
}
|
||||
|
||||
// ViewInput creates or updates a view.
|
||||
|
||||
Reference in new issue
Block a user