Documentation
¶
Index ¶
- Constants
- Variables
- func API_ConnectToExisting(w http.ResponseWriter, req *http.Request)
- func API_ForceReform(w http.ResponseWriter, req *http.Request)
- func API_GetConfig(w http.ResponseWriter, req *http.Request)
- func API_GetLogs(w http.ResponseWriter, req *http.Request)
- func API_GetNextIP(w http.ResponseWriter, req *http.Request)
- func API_NATSStatus(w http.ResponseWriter, req *http.Request)
- func API_NewConstellation(w http.ResponseWriter, req *http.Request)
- func API_Ping(w http.ResponseWriter, req *http.Request)
- func API_Reset(w http.ResponseWriter, req *http.Request)
- func API_Restart(w http.ResponseWriter, req *http.Request)
- func AdjustDNS(logBuffer *lumberjack.Logger) error
- func CheckConstellationToken(req *http.Request) error
- func ClientConnectToJS() error
- func ClientHeartbeatInit()
- func CloseNATSClient()
- func ConnectToExisting(yamlBody []byte, config utils.Config) (utils.Config, error)
- func ConstellationAPIDevices(w http.ResponseWriter, req *http.Request)
- func ConstellationConnected() bool
- func DNSEntriesIdRoute(w http.ResponseWriter, req *http.Request)
- func DNSEntriesRoute(w http.ResponseWriter, req *http.Request)
- func DeploymentsHealthRoute(w http.ResponseWriter, req *http.Request)
- func DeploymentsIdRoute(w http.ResponseWriter, req *http.Request)
- func DeploymentsRoute(w http.ResponseWriter, req *http.Request)
- func DeploymentsUnbrokeRoute(w http.ResponseWriter, req *http.Request)
- func DeviceBlock(w http.ResponseWriter, req *http.Request)
- func DeviceCreate_API(w http.ResponseWriter, req *http.Request)
- func DeviceEdit_API(w http.ResponseWriter, req *http.Request)
- func DeviceList(w http.ResponseWriter, req *http.Request)
- func DevicePing(w http.ResponseWriter, req *http.Request)
- func DevicePublicList(w http.ResponseWriter, req *http.Request)
- func ExportDefaultConfigToYAML(outputPath string) error
- func ExportLighthouseFromDB() error
- func GetAllDevices() ([]utils.ConstellationDevice, error)
- func GetAllDevicesEvenBlocked() ([]utils.ConstellationDevice, error)
- func GetAllLightHouses() ([]utils.ConstellationDevice, error)
- func GetAllLighthouseIPFromTempConfig() ([]string, error)
- func GetAllTunneledRoutes() []utils.ProxyRouteConfig
- func GetCertFingerprint(certPath string) (string, error)
- func GetClusterIPs() ([]*url.URL, error)
- func GetConfigAttribute(configPath string, attr string) (string, error)
- func GetConstellationFromIP(ip string) *utils.ConstellationDevice
- func GetCurrentDevice() (utils.ConstellationDevice, error)
- func GetCurrentDeviceAPIKey() (string, error)
- func GetCurrentDeviceHostname() (string, error)
- func GetCurrentDeviceIP() (string, error)
- func GetCurrentDeviceIsExitNode() (bool, error)
- func GetCurrentDeviceIsLoadbalancer() (bool, error)
- func GetCurrentDeviceIsRelay() (bool, error)
- func GetCurrentDeviceName() (string, error)
- func GetCurrentLeaderName() string
- func GetDefaultHostnames() []string
- func GetDeviceConfigManualSync(w http.ResponseWriter, req *http.Request)
- func GetDeviceIp(device string) string
- func GetLocalTunnelCache() []utils.ConstellationTunnel
- func GetNATSCredentials() (string, string, error)
- func GetNextAvailableIP(cidr string) string
- func GetStickyTarget(clientKey string) (string, bool)
- func Init()
- func InitConfig()
- func InitDNS()
- func InitHostname()
- func InitNATSClient() error
- func InitPingLighthouses()
- func IsClientConnected() bool
- func IsClientNode() bool
- func IsClientSynced() bool
- func IsConstellationIP(ip string) bool
- func IsConstellationStandalone() bool
- func IsNATSHA() bool
- func IsTunneled(route utils.ProxyRouteConfig) bool
- func MasterNATSClientRouter()
- func NodesUnbrokeRoute(w http.ResponseWriter, req *http.Request)
- func PingLighthouses()
- func PingNATSClient() bool
- func PublicDeviceListNATS(m *nats.Msg)
- func PublishDomainOp(domain string, state interface{}) error
- func PublishFileDomain(domain string, filename string) error
- func PublishNATSMessage(topic string, payload string) error
- func ReloadDNS()
- func RequestRestartNebula()
- func RequestRestartNebulaStaggered()
- func ResetNebula() error
- func RestartNebula()
- func SendNATSMessage(topic string, payload string) (string, error)
- func SendNATSMessageAllReply(topic string, payload string, timeout time.Duration, ...) error
- func SetStickyTarget(clientKey string, deviceName string)
- func StartClientDeviceSync()
- func StartNATS()
- func StartOplogApply()
- func StartSchedulerInConstellation()
- func StartTunnelProber()
- func StopDNS()
- func StopHeartbeat()
- func StopNATS()
- func StopOplogApply()
- func StopSchedulerInConstellation()
- func StopTunnelProber()
- func TunnelList(w http.ResponseWriter, req *http.Request)
- func UpdateFirewallBlockedClients() error
- func UpdateLocalTunnelCache()
- func ValidateStaticHosts(logBuffer *lumberjack.Logger) error
- type AuthKeysPayload
- type DNSPayload
- type DatabasePayload
- type DeviceBlockRequestJSON
- type DeviceCreateRequestJSON
- type DeviceEditRequestJSON
- type DeviceResyncRequest
- type Domain
- type FilePayload
- type NATSStatus
- type NodeHeartbeat
- type OpEnvelope
- type OplogSnapshot
- type PublicDeviceInfo
Constants ¶
const ( DomainAuthKeys = "auth_keys" DomainDNS = "dns" DomainAPITokens = "api_tokens" DomainRoles = "roles" DomainOpenIDClients = "openid_clients" DomainFileCACrt = "file:ca.crt" DomainFileCAKey = "file:ca.key" DomainFileRclone = "file:rclone.conf" DomainDatabase = "database" )
const ConstellationDNSSuffix = ".constellation."
ConstellationDNSSuffix lets clients that refuse to forward single-label names (systemd-resolved, Windows) reach devices as <name>.constellation
Variables ¶
var CachedDeviceNames = map[string]string{}
var CachedDevices = map[string]utils.ConstellationDevice{}
var DNSBlacklist = map[string]bool{}
var DNSStarted = false
var NATSClientTopic = ""
var NATSStarted atomic.Bool
var NebulaDefaultConfig utils.NebulaConfig
var NebulaHasStarted = false
var NebulaStarted atomic.Bool
NebulaStarted/NATSStarted are atomic: read from watchdog/supervisor goroutines
var (
ProcessMux sync.Mutex
)
Functions ¶
func API_ConnectToExisting ¶
func API_ConnectToExisting(w http.ResponseWriter, req *http.Request)
API_ConnectToExisting godoc @Summary Connect this node to an existing Constellation VPN network @Tags constellation @Accept application/x-yaml @Produce json @Param body body string true "Nebula YAML configuration" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/connect [post]
func API_ForceReform ¶ added in v0.23.0
func API_ForceReform(w http.ResponseWriter, req *http.Request)
API_ForceReform godoc @Summary Force the constellation to re-form around this manager @Description HA only. Bumps the op-log epoch, drops local JetStream state, blocks the other managers and restarts NATS, leaving this node writable in formation mode so replacements can be enrolled. Does not touch the CA, keys, config or device data. @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 400 {object} utils.HTTPErrorResult @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/force-reform [post]
func API_GetConfig ¶
func API_GetConfig(w http.ResponseWriter, req *http.Request)
API_GetConfig godoc @Summary Get the current Nebula configuration @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/config [get]
func API_GetLogs ¶
func API_GetLogs(w http.ResponseWriter, req *http.Request)
API_GetLogs godoc @Summary Get Nebula VPN service logs @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/logs [get]
func API_GetNextIP ¶ added in v0.21.0
func API_GetNextIP(w http.ResponseWriter, req *http.Request)
API_GetNextIP godoc @Summary Get the next available IP address in the Constellation CIDR range @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/get-next-ip [get]
func API_NATSStatus ¶ added in v0.22.35
func API_NATSStatus(w http.ResponseWriter, req *http.Request)
API_NATSStatus godoc @Summary Detailed NATS/JetStream status for debugging @Description Declared topology (role, HA mode), live NATS server/client/JetStream/KV state, connection counts and known managers. @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Router /api/constellation/nats-status [get]
func API_NewConstellation ¶ added in v0.21.0
func API_NewConstellation(w http.ResponseWriter, req *http.Request)
API_NewConstellation godoc @Summary Create a new Constellation VPN network @Tags constellation @Accept json @Produce json @Param body body object true "Constellation creation payload (deviceName, isLighthouse, hostname, ipRange)" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 400 {object} utils.HTTPErrorResult @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/create [post]
func API_Ping ¶ added in v0.16.0
func API_Ping(w http.ResponseWriter, req *http.Request)
API_Ping godoc @Summary Check if the NATS client connection is alive @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Router /api/constellation/ping [get]
func API_Reset ¶
func API_Reset(w http.ResponseWriter, req *http.Request)
API_Reset godoc @Summary Reset the Nebula VPN configuration @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Router /api/constellation/reset [get]
func API_Restart ¶
func API_Restart(w http.ResponseWriter, req *http.Request)
API_Restart godoc @Summary Restart the Nebula VPN service and HTTP server @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Router /api/constellation/restart [get]
func AdjustDNS ¶ added in v0.19.0
func AdjustDNS(logBuffer *lumberjack.Logger) error
func CheckConstellationToken ¶ added in v0.16.0
TODO: Cache this
func ClientConnectToJS ¶ added in v0.21.0
func ClientConnectToJS() error
func ClientHeartbeatInit ¶ added in v0.21.0
func ClientHeartbeatInit()
func CloseNATSClient ¶ added in v0.16.0
func CloseNATSClient()
func ConnectToExisting ¶ added in v0.22.0
ConnectToExisting applies a Nebula YAML config to connect this node to an existing Constellation network. It returns the updated config. The caller is responsible for persisting the config and restarting Nebula.
func ConstellationAPIDevices ¶
func ConstellationAPIDevices(w http.ResponseWriter, req *http.Request)
func ConstellationConnected ¶ added in v0.21.0
func ConstellationConnected() bool
func DNSEntriesIdRoute ¶ added in v0.22.0
func DNSEntriesIdRoute(w http.ResponseWriter, req *http.Request)
func DNSEntriesRoute ¶ added in v0.22.0
func DNSEntriesRoute(w http.ResponseWriter, req *http.Request)
func DeploymentsHealthRoute ¶ added in v0.22.19
func DeploymentsHealthRoute(w http.ResponseWriter, req *http.Request)
func DeploymentsIdRoute ¶ added in v0.22.11
func DeploymentsIdRoute(w http.ResponseWriter, req *http.Request)
func DeploymentsRoute ¶ added in v0.22.11
func DeploymentsRoute(w http.ResponseWriter, req *http.Request)
func DeploymentsUnbrokeRoute ¶ added in v0.22.19
func DeploymentsUnbrokeRoute(w http.ResponseWriter, req *http.Request)
func DeviceBlock ¶
func DeviceBlock(w http.ResponseWriter, req *http.Request)
DeviceBlock godoc @Summary Block or unblock a Constellation device @Tags constellation @Accept json @Produce json @Param body body DeviceBlockRequestJSON true "Device block/unblock payload" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/block [post]
func DeviceCreate_API ¶ added in v0.21.0
func DeviceCreate_API(w http.ResponseWriter, req *http.Request)
DeviceCreate_API godoc @Summary Create a new Constellation device and generate its certificates @Tags constellation @Accept json @Produce json @Param body body DeviceCreateRequestJSON true "Device creation payload" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/devices [post]
func DeviceEdit_API ¶ added in v0.21.0
func DeviceEdit_API(w http.ResponseWriter, req *http.Request)
DeviceEdit_API godoc @Summary Edit the current Constellation device properties @Tags constellation @Accept json @Produce json @Param body body DeviceEditRequestJSON true "Device edit payload" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/edit-device [post]
func DeviceList ¶
func DeviceList(w http.ResponseWriter, req *http.Request)
DeviceList godoc @Summary List Constellation devices for the current user (or all if admin) @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/devices [get]
func DevicePing ¶ added in v0.19.0
func DevicePing(w http.ResponseWriter, req *http.Request)
DevicePing godoc @Summary Ping a Constellation device to check reachability @Tags constellation @Produce json @Param id path string true "Device name/ID" @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 400 {object} utils.HTTPErrorResult @Failure 403 {object} utils.HTTPErrorResult @Failure 404 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/devices/{id}/ping [get]
func DevicePublicList ¶ added in v0.19.0
func DevicePublicList(w http.ResponseWriter, req *http.Request)
DevicePublicList godoc @Summary List public information about all non-blocked Constellation devices @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 401 {object} utils.HTTPErrorResult @Failure 500 {object} utils.HTTPErrorResult @Router /api/constellation/public-devices [get]
func ExportDefaultConfigToYAML ¶ added in v0.21.0
func ExportLighthouseFromDB ¶ added in v0.21.0
func ExportLighthouseFromDB() error
func GetAllDevices ¶ added in v0.21.0
func GetAllDevices() ([]utils.ConstellationDevice, error)
func GetAllDevicesEvenBlocked ¶ added in v0.21.0
func GetAllDevicesEvenBlocked() ([]utils.ConstellationDevice, error)
func GetAllLightHouses ¶
func GetAllLightHouses() ([]utils.ConstellationDevice, error)
func GetAllLighthouseIPFromTempConfig ¶ added in v0.21.0
func GetAllTunneledRoutes ¶ added in v0.21.0
func GetAllTunneledRoutes() []utils.ProxyRouteConfig
func GetCertFingerprint ¶
func GetClusterIPs ¶ added in v0.21.0
func GetConfigAttribute ¶ added in v0.18.0
func GetConstellationFromIP ¶ added in v0.22.19
func GetConstellationFromIP(ip string) *utils.ConstellationDevice
func GetCurrentDevice ¶ added in v0.21.0
func GetCurrentDevice() (utils.ConstellationDevice, error)
func GetCurrentDeviceAPIKey ¶ added in v0.21.0
func GetCurrentDeviceHostname ¶ added in v0.21.0
func GetCurrentDeviceIP ¶ added in v0.21.0
func GetCurrentDeviceIsExitNode ¶ added in v0.21.0
func GetCurrentDeviceIsLoadbalancer ¶ added in v0.21.0
func GetCurrentDeviceIsRelay ¶ added in v0.21.0
func GetCurrentDeviceName ¶ added in v0.21.0
func GetCurrentLeaderName ¶ added in v0.22.19
func GetCurrentLeaderName() string
GetCurrentLeaderName returns the sanitized device name of the current scheduler leader, or "" when it cannot be determined (no cluster, NATS not connected, or no leader elected yet). Best-effort — never errors — so it is safe to call from request handlers regardless of cluster state. The name is returned exactly as stored (the raw DeviceName, validated subject/KV-safe at creation); callers match it client-side rather than reversing the sanitization.
func GetDefaultHostnames ¶ added in v0.21.0
func GetDefaultHostnames() []string
func GetDeviceConfigManualSync ¶ added in v0.16.0
func GetDeviceConfigManualSync(w http.ResponseWriter, req *http.Request)
GetDeviceConfigManualSync rebuilds a device's config (no pki/api key) for a resync QR
func GetDeviceIp ¶ added in v0.16.0
func GetLocalTunnelCache ¶ added in v0.21.0
func GetLocalTunnelCache() []utils.ConstellationTunnel
func GetNATSCredentials ¶ added in v0.16.0
func GetNextAvailableIP ¶ added in v0.21.0
GetNextAvailableIP fetches all used IPs from the database and returns the next available IP in the given CIDR range
func GetStickyTarget ¶ added in v0.22.0
func InitConfig ¶
func InitConfig()
func InitHostname ¶ added in v0.21.0
func InitHostname()
func InitNATSClient ¶ added in v0.16.0
func InitNATSClient() error
func InitPingLighthouses ¶ added in v0.19.0
func InitPingLighthouses()
func IsClientConnected ¶ added in v0.16.0
func IsClientConnected() bool
func IsClientNode ¶ added in v0.23.1
func IsClientNode() bool
func IsClientSynced ¶ added in v0.23.1
func IsClientSynced() bool
func IsConstellationIP ¶ added in v0.21.0
func IsConstellationStandalone ¶ added in v0.22.10
func IsConstellationStandalone() bool
IsConstellationStandalone reports whether this server has no Cosmos peers to talk to over NATS — neither peer lighthouses to cluster with nor non- lighthouse Cosmos servers that would connect to this node as clients. Plain Nebula client devices (CosmosNode == 0) don't run NATS so they don't count. When true, all NATS-adjacent activity must be skipped.
func IsNATSHA ¶ added in v0.22.35
func IsNATSHA() bool
IsNATSHA reports whether this constellation was created with the HA (clustered JetStream) option. Immutable: read from the creator's main config (NATSReplicas >= 3) or from this node's device config (cstln_nats_ha).
func IsTunneled ¶ added in v0.21.0
func IsTunneled(route utils.ProxyRouteConfig) bool
func MasterNATSClientRouter ¶ added in v0.16.0
func MasterNATSClientRouter()
func NodesUnbrokeRoute ¶ added in v0.22.19
func NodesUnbrokeRoute(w http.ResponseWriter, req *http.Request)
func PingLighthouses ¶ added in v0.19.0
func PingLighthouses()
func PingNATSClient ¶ added in v0.16.0
func PingNATSClient() bool
func PublicDeviceListNATS ¶ added in v0.21.0
func PublishDomainOp ¶ added in v0.23.0
PublishDomainOp publishes the full state of a config domain and waits for the apply loop to install it locally. Callers must NOT hold utils.ConfigLock — the apply path takes it.
func PublishFileDomain ¶ added in v0.23.0
PublishFileDomain publishes a loose config file's current contents as the full state of its domain.
func PublishNATSMessage ¶ added in v0.16.0
func ReloadDNS ¶ added in v0.23.0
func ReloadDNS()
ReloadDNS rebinds the DNS server against the current config. Reaction of the dns op-log domain, replacing the old restart-everything sync.
func RequestRestartNebula ¶ added in v0.23.0
func RequestRestartNebula()
RequestRestartNebula coalesces reactive restarts (oplog apply, snapshot install) so a burst of device writes triggers one restart, not one each.
func RequestRestartNebulaStaggered ¶ added in v0.23.0
func RequestRestartNebulaStaggered()
RequestRestartNebulaStaggered delays each node by its rank in the shared device table, turning a thundering-herd restart into a rolling one.
func ResetNebula ¶
func ResetNebula() error
func RestartNebula ¶
func RestartNebula()
func SendNATSMessage ¶ added in v0.16.0
func SendNATSMessageAllReply ¶ added in v0.21.0
func SetStickyTarget ¶ added in v0.22.0
func StartClientDeviceSync ¶ added in v0.23.1
func StartClientDeviceSync()
StartClientDeviceSync does one fetch on connect, retried up to 5 times every 15s. A restart bumps the generation so a stale attempt exits.
func StartOplogApply ¶ added in v0.23.0
func StartOplogApply()
StartOplogApply brings up the apply loop; safe to call repeatedly.
func StartSchedulerInConstellation ¶ added in v0.22.11
func StartSchedulerInConstellation()
StartSchedulerInConstellation is the thin bridge that wires pro.StartScheduler into the constellation lifecycle. It exists here (not inline at the call site) so the `pro` package stays independent of `constellation` — the same pattern used by `api_deployments.go` for the HTTP handlers.
This must be called AFTER the NATS client is connected (nc, js are non-nil) AND after pro.ClientHeartbeatInit has had a chance to create/attach the constellation-deployments KV. `ClientHeartbeatInit` in tunnels.go is the right place.
func StartTunnelProber ¶ added in v0.23.0
func StartTunnelProber()
func StopHeartbeat ¶ added in v0.21.0
func StopHeartbeat()
func StopOplogApply ¶ added in v0.23.0
func StopOplogApply()
StopOplogApply tears the loop down. Never blocks: it runs from CloseNATSClient/StopNATS, which RestartNebula calls from an apply reaction.
func StopSchedulerInConstellation ¶ added in v0.22.11
func StopSchedulerInConstellation()
StopSchedulerInConstellation halts the scheduler. Called from StopHeartbeat and CloseNATSClient so the scheduler shuts down cleanly when the constellation client disconnects.
func StopTunnelProber ¶ added in v0.23.0
func StopTunnelProber()
func TunnelList ¶ added in v0.21.0
func TunnelList(w http.ResponseWriter, req *http.Request)
TunnelList godoc @Summary List all active Constellation tunnels @Tags constellation @Produce json @Security BearerAuth @Success 200 {object} utils.APIResponse @Failure 403 {object} utils.HTTPErrorResult @Router /api/constellation/tunnels [get]
func UpdateFirewallBlockedClients ¶ added in v0.19.0
func UpdateFirewallBlockedClients() error
func UpdateLocalTunnelCache ¶ added in v0.21.0
func UpdateLocalTunnelCache()
func ValidateStaticHosts ¶ added in v0.19.0
func ValidateStaticHosts(logBuffer *lumberjack.Logger) error
Types ¶
type AuthKeysPayload ¶ added in v0.23.0
type DNSPayload ¶ added in v0.23.0
type DatabasePayload ¶ added in v0.23.0
type DatabasePayload struct {
PostgresHost string `json:"postgresHost"`
PostgresDatabase string `json:"postgresDatabase"`
PostgresUsername string `json:"postgresUsername"`
PostgresPassword string `json:"postgresPassword"`
}
DatabasePayload carries the Postgres connection only. NodeName stays node-local: it is this node's metrics identity.
type DeviceBlockRequestJSON ¶
type DeviceCreateRequestJSON ¶
type DeviceCreateRequestJSON struct {
DeviceName string `json:"deviceName" validate:"required,min=3,max=32"`
IP string `json:"ip" validate:"required,ipv4"`
// for devices only
Nickname string `json:"nickname,omitempty" validate:"omitempty,max=32"`
Invisible bool `json:"invisible,omitempty"`
// for lighthouse only
IsLighthouse bool `json:"isLighthouse,omitempty"`
CosmosNode int `json:"cosmosNode,omitempty"`
IsRelay bool `json:"isRelay,omitempty"`
IsLoadBalancer bool `json:"isLoadBalancer,omitempty"`
IsExitNode bool `json:"isExitNode,omitempty"`
PublicHostname string `json:"PublicHostname,omitempty"`
Port string `json:"port,omitempty"`
// internal
APIKey string `json:"-"`
}
func DeviceCreate ¶
func DeviceCreate(request DeviceCreateRequestJSON) (string, string, string, DeviceCreateRequestJSON, error)
type DeviceEditRequestJSON ¶ added in v0.21.0
type DeviceResyncRequest ¶ added in v0.16.0
type Domain ¶ added in v0.23.0
type Domain struct {
Name string
Apply func(state json.RawMessage) error
React func(old json.RawMessage, new json.RawMessage)
Snapshot func() (json.RawMessage, error)
}
Everything the op-log replicates that isn't a SQLite row lives here, one entry per domain. Adding a future domain is one registry entry — that is the point of the indirection.
Apply runs with utils.ConfigLock already held by the caller; React runs after the sequence is committed, and must not block the apply loop.
type FilePayload ¶ added in v0.23.0
type FilePayload struct {
Data string `json:"data"`
}
FilePayload carries a loose config file as base64. Empty Data means "no such file here" and is never applied, so a node that lacks a CA can't wipe everyone's.
type NATSStatus ¶ added in v0.22.35
type NATSStatus struct {
// declared topology
Role string `json:"role"` // "manager" | "agent"
HAMode bool `json:"haMode"` // clustered JetStream constellation
// live state
NebulaStarted bool `json:"nebulaStarted"`
ServerRunning bool `json:"serverRunning"`
ClientConnected bool `json:"clientConnected"`
// Starting: within the post-start grace period — failing steps are
// likely still coming up rather than broken
Starting bool `json:"starting"`
// "disabled" (agents, proxied to managers) | "standalone" | "clustered"
JetStreamMode string `json:"jetstreamMode"`
JetStreamReady bool `json:"jetstreamReady"` // JS API answers
KVNodesReady bool `json:"kvNodesReady"` // constellation-nodes bucket reachable
KnownManagers []string `json:"knownManagers"`
// connection counts from the embedded server
ConnectedClients int `json:"connectedClients"`
ConnectedLeafs int `json:"connectedLeafs"` // manager: attached agents; agent: 1 when attached to a manager
ClusterRoutes int `json:"clusterRoutes"` // HA managers: connected manager routes
// ManagerLinkUp: can this node reach a manager's NATS — matters on
// agents, whose local client is always connected to its own server.
ManagerLinkUp bool `json:"managerLinkUp"`
// op-log health. OplogAttached is also "config is writable here": writes
// are published, not applied locally, so a detached node is read-only.
OplogAttached bool `json:"oplogAttached"`
OplogHalted bool `json:"oplogHalted"`
OplogHaltReason string `json:"oplogHaltReason,omitempty"`
OplogEpoch uint64 `json:"oplogEpoch"`
OplogSeq uint64 `json:"oplogSeq"`
ConfigWritable bool `json:"configWritable"`
// OplogReplicas is the log's actual replication factor, 0 when the stream is
// not reachable. It is the only externally visible evidence that the R1→R3
// scale-up happened: writes succeed perfectly well against an R1 stream, so a
// cluster that silently never scaled looks identical to a healthy one.
OplogReplicas int `json:"oplogReplicas"`
}
NATSStatus is a debugging snapshot of this node's declared topology and the live state of the embedded NATS stack.
func GetNATSStatus ¶ added in v0.22.35
func GetNATSStatus() NATSStatus
type NodeHeartbeat ¶ added in v0.21.0
type NodeHeartbeat struct {
DeviceName string
IP string
IsRelay bool
IsLighthouse bool
IsExitNode bool
CosmosNode int
Tunnels []utils.ProxyRouteConfig
// Hostnames are the names this node serves itself (main hostname and
// non-tunneled routes) so every constellation DNS can answer for them.
Hostnames []string `json:"hostnames,omitempty"`
// RunningDeployments is the list of scheduler-managed deployment names
// currently running on this node, derived from docker containers carrying
// the `cosmos-deployment` label. Populated from docker at heartbeat time;
// see UpdateLocalTunnelCache / heartbeat goroutine in tunnels.go.
RunningDeployments []string `json:"runningDeployments"`
// RunningDeploymentVersions maps each running deployment name to the spec
// version its containers were created from (the cosmos-deployment-version
// label). The scheduler diffs this against the desired Deployment.Version to
// detect a node running a stale spec and trigger a rolling re-apply. Built
// from docker alongside RunningDeployments each heartbeat.
RunningDeploymentVersions map[string]int `json:"runningDeploymentVersions,omitempty"`
// CPUPercent and RAMPercent are the node's latest resource-usage sample,
// populated from pro.GetCurrentResources() on each heartbeat tick. Used by
// the LeastBusyPlacement strategy. Zero when MonitoringOn is false.
CPUPercent float64 `json:"cpuPercent,omitempty"`
RAMPercent float64 `json:"ramPercent,omitempty"`
// MonitoringOn signals whether CPU/RAM numbers are trustworthy. False when
// the operator disabled monitoring (MonitoringDisabled config flag) or
// when the sampler hasn't produced a reading yet.
MonitoringOn bool `json:"monitoringOn"`
// Tags mirror ConstellationDevice.Tags so the leader can filter eligible
// placement targets by deployment affinity without an extra DB round-trip.
Tags []string `json:"tags,omitempty"`
}
type OpEnvelope ¶ added in v0.23.0
type OpEnvelope struct {
V int `json:"v"`
Epoch uint64 `json:"epoch"`
Kind string `json:"kind"` // "db" | "domain"
Table string `json:"table,omitempty"`
Domain string `json:"domain,omitempty"`
Op string `json:"op"`
PK string `json:"pk,omitempty"` // informational, for log reading
Filter map[string]interface{} `json:"filter,omitempty"`
Doc json.RawMessage `json:"doc,omitempty"`
Origin string `json:"origin"`
ReqID string `json:"reqId"`
}
OpEnvelope is one entry in the log. Domain payloads carry the FULL domain state with op "set", which makes them idempotent and last-writer-wins in stream order; db payloads carry a filter+doc mutation.
type OplogSnapshot ¶ added in v0.23.0
type OplogSnapshot struct {
Epoch uint64 `json:"epoch"`
Seq uint64 `json:"seq"`
Dump json.RawMessage `json:"dump"`
Domains map[string]json.RawMessage `json:"domains"`
}
type PublicDeviceInfo ¶ added in v0.19.0
type PublicDeviceInfo struct {
DeviceID string `json:"id"`
DeviceName string `json:"name"`
User string `json:"user"`
IP string `json:"ip"`
IsLighthouse bool `json:"isLighthouse"`
CosmosNode int `json:"cosmosNode"`
IsRelay bool `json:"isRelay"`
IsExitNode bool `json:"isExitNode"`
PublicHostname string `json:"publicHostname"`
Port string `json:"port"`
}
PublicDeviceInfo represents the limited device information exposed to the public API
Source Files
¶
- DNS.go
- NATS.go
- NATS_client_only.go
- api_deployments.go
- api_devices_block.go
- api_devices_config.go
- api_devices_create.go
- api_devices_edit.go
- api_devices_index.go
- api_devices_list.go
- api_devices_ping.go
- api_devices_public.go
- api_dns.go
- api_force_reform.go
- api_get_ip.go
- api_nebula.go
- api_nebula_connect.go
- api_tunnels.go
- config-manip.go
- dns_cluster.go
- dns_match.go
- index.go
- nebula.go
- nebula_default.go
- oplog.go
- oplog_apply.go
- oplog_domains.go
- oplog_snapshot.go
- scheduler.go
- tunnel_health.go
- tunnels.go