1018 lines
38 KiB
Go
1018 lines
38 KiB
Go
package cluster
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/example/remote-access-platform/backend/internal/platform/clusterauth"
|
|
)
|
|
|
|
const (
|
|
PlatformRoleAdmin = "platform_admin"
|
|
PlatformRoleRecoveryAdmin = "platform_recovery_admin"
|
|
|
|
ClusterStatusActive = "active"
|
|
ClusterStatusDisabled = "disabled"
|
|
|
|
JoinRequestStatusPending = "pending"
|
|
JoinRequestStatusApproved = "approved"
|
|
JoinRequestStatusRejected = "rejected"
|
|
|
|
NodeRegistrationPending = "pending"
|
|
NodeRegistrationActive = "active"
|
|
|
|
DefaultClusterSlug = "default"
|
|
|
|
VPNConnectionModeSingleActive = "single_active"
|
|
|
|
VPNConnectionDesiredEnabled = "enabled"
|
|
VPNConnectionDesiredDisabled = "disabled"
|
|
|
|
VPNConnectionStatusDisabled = "disabled"
|
|
VPNConnectionStatusEnabled = "enabled"
|
|
VPNConnectionStatusConnecting = "connecting"
|
|
VPNConnectionStatusActive = "active"
|
|
VPNConnectionStatusDegraded = "degraded"
|
|
VPNConnectionStatusFailed = "failed"
|
|
|
|
VPNLeaseStatusActive = "active"
|
|
VPNLeaseStatusReleased = "released"
|
|
VPNLeaseStatusExpired = "expired"
|
|
VPNLeaseStatusFenced = "fenced"
|
|
|
|
VPNAssignmentStatusNotStarted = "not_started"
|
|
VPNAssignmentStatusAssigned = "assigned"
|
|
VPNAssignmentStatusLeaseRequired = "lease_required"
|
|
VPNAssignmentStatusBlocked = "blocked"
|
|
VPNAssignmentStatusUnknown = "unknown"
|
|
)
|
|
|
|
var allowedNodeRoles = map[string]struct{}{
|
|
"entry-node": {},
|
|
"relay-node": {},
|
|
"core-mesh": {},
|
|
"rdp-worker": {},
|
|
"vnc-worker": {},
|
|
"vpn-exit": {},
|
|
"vpn-connector": {},
|
|
"file-storage-cache": {},
|
|
"update-cache": {},
|
|
"video-relay": {},
|
|
}
|
|
|
|
type Cluster struct {
|
|
ID string `json:"id"`
|
|
Slug string `json:"slug"`
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
Region *string `json:"region,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ClusterNode struct {
|
|
ID string `json:"id"`
|
|
OwnerOrganizationID *string `json:"owner_organization_id,omitempty"`
|
|
NodeKey string `json:"node_key"`
|
|
Name string `json:"name"`
|
|
OwnershipType string `json:"ownership_type"`
|
|
RegistrationStatus string `json:"registration_status"`
|
|
HealthStatus string `json:"health_status"`
|
|
VersionState string `json:"version_state"`
|
|
PartitionState string `json:"partition_state"`
|
|
ReportedVersion *string `json:"reported_version,omitempty"`
|
|
LastSeenAt *time.Time `json:"last_seen_at,omitempty"`
|
|
MembershipStatus string `json:"membership_status"`
|
|
MembershipMetadata json.RawMessage `json:"membership_metadata"`
|
|
NodeGroupID *string `json:"node_group_id,omitempty"`
|
|
NodeGroupName *string `json:"node_group_name,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ClusterNodeGroup struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
ParentGroupID *string `json:"parent_group_id,omitempty"`
|
|
Name string `json:"name"`
|
|
Description *string `json:"description,omitempty"`
|
|
SortOrder int `json:"sort_order"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type NodeJoinToken struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
Scope json.RawMessage `json:"scope"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
MaxUses int `json:"max_uses"`
|
|
UsedCount int `json:"used_count"`
|
|
Status string `json:"status"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
RevokedAt *time.Time `json:"revoked_at,omitempty"`
|
|
AuthorityPayload json.RawMessage `json:"authority_payload,omitempty"`
|
|
AuthoritySignature *ClusterSignature `json:"authority_signature,omitempty"`
|
|
}
|
|
|
|
type CreatedJoinToken struct {
|
|
NodeJoinToken
|
|
Token string `json:"token"`
|
|
}
|
|
|
|
type NodeBootstrap struct {
|
|
NodeID string `json:"node_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
IdentityStatus string `json:"identity_status"`
|
|
Certificate map[string]any `json:"certificate"`
|
|
HeartbeatEndpoint string `json:"heartbeat_endpoint"`
|
|
ClusterAuthority *ClusterAuthorityDescriptor `json:"cluster_authority,omitempty"`
|
|
AuthorityPayload json.RawMessage `json:"authority_payload,omitempty"`
|
|
AuthoritySignature *ClusterSignature `json:"authority_signature,omitempty"`
|
|
}
|
|
|
|
type NodeJoinRequest struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
JoinTokenID *string `json:"join_token_id,omitempty"`
|
|
NodeName string `json:"node_name"`
|
|
NodeFingerprint string `json:"node_fingerprint"`
|
|
PublicKey string `json:"public_key"`
|
|
ReportedCapabilities json.RawMessage `json:"reported_capabilities"`
|
|
ReportedFacts json.RawMessage `json:"reported_facts"`
|
|
RequestedRoles json.RawMessage `json:"requested_roles"`
|
|
Status string `json:"status"`
|
|
ReviewedByUserID *string `json:"reviewed_by_user_id,omitempty"`
|
|
ReviewedAt *time.Time `json:"reviewed_at,omitempty"`
|
|
ApprovedNodeID *string `json:"approved_node_id,omitempty"`
|
|
RejectionReason *string `json:"rejection_reason,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
ApprovalPayload json.RawMessage `json:"approval_payload,omitempty"`
|
|
ApprovalSignature json.RawMessage `json:"approval_signature,omitempty"`
|
|
}
|
|
|
|
type NodeRoleAssignment struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
OrganizationID *string `json:"organization_id,omitempty"`
|
|
Role string `json:"role"`
|
|
Status string `json:"status"`
|
|
Policy json.RawMessage `json:"policy"`
|
|
AssignedByUserID *string `json:"assigned_by_user_id,omitempty"`
|
|
AssignedAt time.Time `json:"assigned_at"`
|
|
RevokedAt *time.Time `json:"revoked_at,omitempty"`
|
|
}
|
|
|
|
type NodeHeartbeat struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
HealthStatus string `json:"health_status"`
|
|
ReportedVersion *string `json:"reported_version,omitempty"`
|
|
Capabilities json.RawMessage `json:"capabilities"`
|
|
ServiceStates json.RawMessage `json:"service_states"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
}
|
|
|
|
type NodeWorkloadDesiredState struct {
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
ServiceType string `json:"service_type"`
|
|
DesiredState string `json:"desired_state"`
|
|
Version *string `json:"version,omitempty"`
|
|
RuntimeMode string `json:"runtime_mode"`
|
|
ArtifactRef *string `json:"artifact_ref,omitempty"`
|
|
Config json.RawMessage `json:"config"`
|
|
Environment json.RawMessage `json:"environment"`
|
|
UpdatedByUserID *string `json:"updated_by_user_id,omitempty"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type NodeWorkloadStatus struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
ServiceType string `json:"service_type"`
|
|
ReportedState string `json:"reported_state"`
|
|
RuntimeMode string `json:"runtime_mode"`
|
|
Version *string `json:"version,omitempty"`
|
|
StatusPayload json.RawMessage `json:"status_payload"`
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
}
|
|
|
|
type MeshLinkObservation struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
SourceNodeID string `json:"source_node_id"`
|
|
TargetNodeID string `json:"target_node_id"`
|
|
LinkStatus string `json:"link_status"`
|
|
LatencyMs *int `json:"latency_ms,omitempty"`
|
|
QualityScore *int `json:"quality_score,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
}
|
|
|
|
type MeshRouteIntent struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
SourceSelector json.RawMessage `json:"source_selector"`
|
|
DestinationSelector json.RawMessage `json:"destination_selector"`
|
|
ServiceClass string `json:"service_class"`
|
|
Priority int `json:"priority"`
|
|
Status string `json:"status"`
|
|
Policy json.RawMessage `json:"policy"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type SyntheticMeshRouteConfig struct {
|
|
RouteID string `json:"route_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
SourceNodeID string `json:"source_node_id"`
|
|
DestinationNodeID string `json:"destination_node_id"`
|
|
Hops []string `json:"hops"`
|
|
AllowedChannels []string `json:"allowed_channels"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
MaxTTL int `json:"max_ttl"`
|
|
MaxHops int `json:"max_hops"`
|
|
RouteVersion string `json:"route_version,omitempty"`
|
|
PolicyVersion string `json:"policy_version,omitempty"`
|
|
PeerDirectoryVersion string `json:"peer_directory_version,omitempty"`
|
|
}
|
|
|
|
type PeerEndpointCandidate struct {
|
|
EndpointID string `json:"endpoint_id"`
|
|
NodeID string `json:"node_id"`
|
|
Transport string `json:"transport"`
|
|
Address string `json:"address"`
|
|
AddressFamily string `json:"address_family,omitempty"`
|
|
Reachability string `json:"reachability"`
|
|
NATType string `json:"nat_type,omitempty"`
|
|
ConnectivityMode string `json:"connectivity_mode"`
|
|
Region string `json:"region,omitempty"`
|
|
Priority int `json:"priority"`
|
|
PolicyTags []string `json:"policy_tags,omitempty"`
|
|
LastVerifiedAt *time.Time `json:"last_verified_at,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type PeerDirectoryEntry struct {
|
|
NodeID string `json:"node_id"`
|
|
RouteIDs []string `json:"route_ids,omitempty"`
|
|
EndpointCount int `json:"endpoint_count"`
|
|
CandidateCount int `json:"candidate_count"`
|
|
ConnectivityModes []string `json:"connectivity_modes,omitempty"`
|
|
RecoverySeed bool `json:"recovery_seed"`
|
|
}
|
|
|
|
type PeerRecoverySeed struct {
|
|
NodeID string `json:"node_id"`
|
|
Endpoint string `json:"endpoint"`
|
|
Transport string `json:"transport"`
|
|
ConnectivityMode string `json:"connectivity_mode,omitempty"`
|
|
Region string `json:"region,omitempty"`
|
|
Priority int `json:"priority"`
|
|
LastVerifiedAt *time.Time `json:"last_verified_at,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type PeerRendezvousLease struct {
|
|
LeaseID string `json:"lease_id"`
|
|
PeerNodeID string `json:"peer_node_id"`
|
|
RelayNodeID string `json:"relay_node_id"`
|
|
RelayEndpoint string `json:"relay_endpoint"`
|
|
Transport string `json:"transport"`
|
|
ConnectivityMode string `json:"connectivity_mode,omitempty"`
|
|
RouteIDs []string `json:"route_ids,omitempty"`
|
|
AllowedChannels []string `json:"allowed_channels,omitempty"`
|
|
Priority int `json:"priority"`
|
|
ControlPlaneOnly bool `json:"control_plane_only"`
|
|
IssuedAt time.Time `json:"issued_at"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
Reason string `json:"reason,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type RendezvousRelayPolicyDecision struct {
|
|
RouteID string `json:"route_id,omitempty"`
|
|
PeerNodeID string `json:"peer_node_id"`
|
|
WithdrawnLeaseID string `json:"withdrawn_lease_id,omitempty"`
|
|
StaleRelayNodeID string `json:"stale_relay_node_id,omitempty"`
|
|
SelectedRelayID string `json:"selected_relay_id,omitempty"`
|
|
SelectedEndpoint string `json:"selected_endpoint,omitempty"`
|
|
Score int `json:"score,omitempty"`
|
|
Reason string `json:"reason"`
|
|
ScoreReasons []string `json:"score_reasons,omitempty"`
|
|
ReporterNodeID string `json:"reporter_node_id,omitempty"`
|
|
}
|
|
|
|
type RendezvousRelayPolicyReport struct {
|
|
SchemaVersion string `json:"schema_version"`
|
|
ScoringMode string `json:"scoring_mode"`
|
|
FeedbackMaxAgeSeconds int `json:"feedback_max_age_seconds"`
|
|
StaleRelayCount int `json:"stale_relay_count"`
|
|
WithdrawnLeaseCount int `json:"withdrawn_lease_count"`
|
|
ReplacementLeaseCount int `json:"replacement_lease_count"`
|
|
Decisions []RendezvousRelayPolicyDecision `json:"decisions,omitempty"`
|
|
}
|
|
|
|
type RoutePathDecision struct {
|
|
DecisionID string `json:"decision_id"`
|
|
RouteID string `json:"route_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
LocalNodeID string `json:"local_node_id"`
|
|
SourceNodeID string `json:"source_node_id"`
|
|
DestinationNodeID string `json:"destination_node_id"`
|
|
OriginalHops []string `json:"original_hops"`
|
|
EffectiveHops []string `json:"effective_hops"`
|
|
PreviousHopID string `json:"previous_hop_id,omitempty"`
|
|
NextHopID string `json:"next_hop_id,omitempty"`
|
|
LocalRole string `json:"local_role"`
|
|
SelectedRelayID string `json:"selected_relay_id,omitempty"`
|
|
SelectedRelayEndpoint string `json:"selected_relay_endpoint,omitempty"`
|
|
StaleRelayNodeID string `json:"stale_relay_node_id,omitempty"`
|
|
RendezvousPeerNodeID string `json:"rendezvous_peer_node_id,omitempty"`
|
|
RendezvousLeaseID string `json:"rendezvous_lease_id,omitempty"`
|
|
RendezvousLeaseReason string `json:"rendezvous_lease_reason,omitempty"`
|
|
DecisionSource string `json:"decision_source"`
|
|
Generation string `json:"generation"`
|
|
PathScore int `json:"path_score,omitempty"`
|
|
ScoreReasons []string `json:"score_reasons,omitempty"`
|
|
ControlPlaneOnly bool `json:"control_plane_only"`
|
|
ProductionForwarding bool `json:"production_forwarding"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
}
|
|
|
|
type RoutePathDecisionReport struct {
|
|
SchemaVersion string `json:"schema_version"`
|
|
DecisionMode string `json:"decision_mode"`
|
|
Generation string `json:"generation"`
|
|
DecisionCount int `json:"decision_count"`
|
|
ReplacementDecisionCount int `json:"replacement_decision_count"`
|
|
ControlPlaneOnly bool `json:"control_plane_only"`
|
|
ProductionForwarding bool `json:"production_forwarding"`
|
|
Decisions []RoutePathDecision `json:"decisions,omitempty"`
|
|
}
|
|
|
|
type NodeSyntheticMeshConfig struct {
|
|
Enabled bool `json:"enabled"`
|
|
SchemaVersion string `json:"schema_version"`
|
|
ClusterID string `json:"cluster_id"`
|
|
LocalNodeID string `json:"local_node_id"`
|
|
AuthorityRequired bool `json:"authority_required"`
|
|
ClusterAuthority *ClusterAuthorityDescriptor `json:"cluster_authority,omitempty"`
|
|
AuthorityPayload json.RawMessage `json:"authority_payload,omitempty"`
|
|
AuthoritySignature *ClusterSignature `json:"authority_signature,omitempty"`
|
|
ConfigVersion string `json:"config_version,omitempty"`
|
|
PeerDirectoryVersion string `json:"peer_directory_version,omitempty"`
|
|
PolicyVersion string `json:"policy_version,omitempty"`
|
|
PeerEndpoints map[string]string `json:"peer_endpoints"`
|
|
PeerEndpointCandidates map[string][]PeerEndpointCandidate `json:"peer_endpoint_candidates,omitempty"`
|
|
PeerDirectory []PeerDirectoryEntry `json:"peer_directory,omitempty"`
|
|
RecoverySeeds []PeerRecoverySeed `json:"recovery_seeds,omitempty"`
|
|
RendezvousLeases []PeerRendezvousLease `json:"rendezvous_leases,omitempty"`
|
|
RendezvousRelayPolicy *RendezvousRelayPolicyReport `json:"rendezvous_relay_policy,omitempty"`
|
|
RoutePathDecisions *RoutePathDecisionReport `json:"route_path_decisions,omitempty"`
|
|
Routes []SyntheticMeshRouteConfig `json:"routes"`
|
|
ProductionForwarding bool `json:"production_forwarding"`
|
|
}
|
|
|
|
type MeshQoSPolicy struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
ServiceClass string `json:"service_class"`
|
|
Priority int `json:"priority"`
|
|
ReliabilityMode string `json:"reliability_mode"`
|
|
DropPolicy string `json:"drop_policy"`
|
|
BandwidthPolicy json.RawMessage `json:"bandwidth_policy"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type FabricEntryPoint struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
EndpointType string `json:"endpoint_type"`
|
|
PublicEndpoint *string `json:"public_endpoint,omitempty"`
|
|
Policy json.RawMessage `json:"policy"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type FabricEntryPointNode struct {
|
|
EntryPointID string `json:"entry_point_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
Status string `json:"status"`
|
|
Priority int `json:"priority"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
AddedByUserID *string `json:"added_by_user_id,omitempty"`
|
|
AddedAt time.Time `json:"added_at"`
|
|
}
|
|
|
|
type FabricEgressPool struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
Description *string `json:"description,omitempty"`
|
|
RouteScope json.RawMessage `json:"route_scope"`
|
|
Policy json.RawMessage `json:"policy"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type FabricEgressPoolNode struct {
|
|
EgressPoolID string `json:"egress_pool_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
Status string `json:"status"`
|
|
Priority int `json:"priority"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
AddedByUserID *string `json:"added_by_user_id,omitempty"`
|
|
AddedAt time.Time `json:"added_at"`
|
|
}
|
|
|
|
type ClusterAuthorityState struct {
|
|
ClusterID string `json:"cluster_id"`
|
|
AuthorityState string `json:"authority_state"`
|
|
MutationMode string `json:"mutation_mode"`
|
|
Term int64 `json:"term"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
UpdatedByUserID *string `json:"updated_by_user_id,omitempty"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ClusterSignature = clusterauth.Signature
|
|
|
|
type ClusterAuthorityDescriptor struct {
|
|
SchemaVersion string `json:"schema_version"`
|
|
ClusterID string `json:"cluster_id"`
|
|
AuthorityState string `json:"authority_state"`
|
|
KeyAlgorithm string `json:"key_algorithm"`
|
|
PublicKey string `json:"public_key"`
|
|
PublicKeyFingerprint string `json:"public_key_fingerprint"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ClusterAuthorityKey struct {
|
|
ClusterAuthorityDescriptor
|
|
PrivateKey string `json:"-"`
|
|
}
|
|
|
|
type ClusterAdminSummary struct {
|
|
ClusterID string `json:"cluster_id"`
|
|
Slug string `json:"slug"`
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
Region *string `json:"region,omitempty"`
|
|
AuthorityState string `json:"authority_state"`
|
|
MutationMode string `json:"mutation_mode"`
|
|
ClusterKeyAlgorithm *string `json:"cluster_key_algorithm,omitempty"`
|
|
ClusterKeyFingerprint *string `json:"cluster_key_fingerprint,omitempty"`
|
|
NodeCount int64 `json:"node_count"`
|
|
HealthyNodeCount int64 `json:"healthy_node_count"`
|
|
PendingJoinCount int64 `json:"pending_join_count"`
|
|
ActiveRoleAssignmentCount int64 `json:"active_role_assignment_count"`
|
|
LastNodeSeenAt *time.Time `json:"last_node_seen_at,omitempty"`
|
|
}
|
|
|
|
type ClusterAuditEvent struct {
|
|
ID string `json:"id"`
|
|
ClusterID *string `json:"cluster_id,omitempty"`
|
|
ActorUserID *string `json:"actor_user_id,omitempty"`
|
|
EventType string `json:"event_type"`
|
|
TargetType string `json:"target_type"`
|
|
TargetID *string `json:"target_id,omitempty"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type FabricTestingFlag struct {
|
|
ID string `json:"id"`
|
|
ScopeType string `json:"scope_type"`
|
|
ScopeID *string `json:"scope_id,omitempty"`
|
|
ClusterID *string `json:"cluster_id,omitempty"`
|
|
Enabled bool `json:"enabled"`
|
|
TelemetryEnabled bool `json:"telemetry_enabled"`
|
|
SyntheticLinksEnabled bool `json:"synthetic_links_enabled"`
|
|
HistoryRetentionHours int `json:"history_retention_hours"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
UpdatedByUserID *string `json:"updated_by_user_id,omitempty"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type EffectiveNodeTestingFlags struct {
|
|
Enabled bool `json:"enabled"`
|
|
TelemetryEnabled bool `json:"telemetry_enabled"`
|
|
SyntheticLinksEnabled bool `json:"synthetic_links_enabled"`
|
|
HistoryRetentionHours int `json:"history_retention_hours"`
|
|
AppliedScopes []string `json:"applied_scopes"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
}
|
|
|
|
type NodeTelemetryObservation struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
CPUPercent *float64 `json:"cpu_percent,omitempty"`
|
|
MemoryUsedBytes *int64 `json:"memory_used_bytes,omitempty"`
|
|
MemoryTotalBytes *int64 `json:"memory_total_bytes,omitempty"`
|
|
DiskUsedBytes *int64 `json:"disk_used_bytes,omitempty"`
|
|
DiskTotalBytes *int64 `json:"disk_total_bytes,omitempty"`
|
|
NetworkRxBytes *int64 `json:"network_rx_bytes,omitempty"`
|
|
NetworkTxBytes *int64 `json:"network_tx_bytes,omitempty"`
|
|
ProcessCount *int `json:"process_count,omitempty"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
}
|
|
|
|
type VPNConnection struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
OrganizationID string `json:"organization_id"`
|
|
Name string `json:"name"`
|
|
TargetEndpoint json.RawMessage `json:"target_endpoint"`
|
|
ProtocolFamily string `json:"protocol_family"`
|
|
CredentialRef *string `json:"credential_ref,omitempty"`
|
|
Mode string `json:"mode"`
|
|
DesiredState string `json:"desired_state"`
|
|
AllowedNodePolicy json.RawMessage `json:"allowed_node_policy"`
|
|
RoutingUsage json.RawMessage `json:"routing_usage"`
|
|
RoutePolicy json.RawMessage `json:"route_policy"`
|
|
QoSPolicy json.RawMessage `json:"qos_policy"`
|
|
PlacementPolicy json.RawMessage `json:"placement_policy"`
|
|
Status string `json:"status"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
UpdatedByUserID *string `json:"updated_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type VPNConnectionAllowedNode struct {
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
RolePreference string `json:"role_preference"`
|
|
Status string `json:"status"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type VPNConnectionRoutePolicy struct {
|
|
ID string `json:"id"`
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
OrganizationID string `json:"organization_id"`
|
|
RouteType string `json:"route_type"`
|
|
Destination string `json:"destination"`
|
|
Action string `json:"action"`
|
|
ServiceType *string `json:"service_type,omitempty"`
|
|
Priority int `json:"priority"`
|
|
Policy json.RawMessage `json:"policy"`
|
|
Status string `json:"status"`
|
|
CreatedByUserID *string `json:"created_by_user_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type VPNConnectionLease struct {
|
|
ID string `json:"id"`
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
OwnerNodeID string `json:"owner_node_id"`
|
|
LeaseGeneration int64 `json:"lease_generation"`
|
|
FencingToken string `json:"fencing_token"`
|
|
Status string `json:"status"`
|
|
AcquiredAt time.Time `json:"acquired_at"`
|
|
RenewedAt time.Time `json:"renewed_at"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
ReleasedAt *time.Time `json:"released_at,omitempty"`
|
|
FencedAt *time.Time `json:"fenced_at,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata"`
|
|
}
|
|
|
|
type VPNLeaseOwnerEligibility struct {
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
OrganizationID string `json:"organization_id"`
|
|
OwnerNodeID string `json:"owner_node_id"`
|
|
MembershipStatus string `json:"membership_status"`
|
|
NodeRegistrationStatus string `json:"node_registration_status"`
|
|
AllowedByPolicy bool `json:"allowed_by_policy"`
|
|
HasAuthorizedRole bool `json:"has_authorized_role"`
|
|
}
|
|
|
|
type NodeVPNAssignmentLease struct {
|
|
LeaseID string `json:"lease_id"`
|
|
OwnerNodeID string `json:"owner_node_id"`
|
|
LeaseGeneration int64 `json:"lease_generation"`
|
|
Status string `json:"status"`
|
|
RenewedAt time.Time `json:"renewed_at"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
}
|
|
|
|
type NodeVPNAssignment struct {
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
OrganizationID string `json:"organization_id"`
|
|
Name string `json:"name"`
|
|
TargetEndpoint json.RawMessage `json:"target_endpoint"`
|
|
ProtocolFamily string `json:"protocol_family"`
|
|
Mode string `json:"mode"`
|
|
DesiredState string `json:"desired_state"`
|
|
RoutingUsage json.RawMessage `json:"routing_usage"`
|
|
RoutePolicy json.RawMessage `json:"route_policy"`
|
|
QoSPolicy json.RawMessage `json:"qos_policy"`
|
|
PlacementPolicy json.RawMessage `json:"placement_policy"`
|
|
Status string `json:"status"`
|
|
HasCredentialRef bool `json:"has_credential_ref"`
|
|
AssignmentReason string `json:"assignment_reason"`
|
|
ActiveLease *NodeVPNAssignmentLease `json:"active_lease,omitempty"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type NodeVPNAssignmentStatus struct {
|
|
ID string `json:"id"`
|
|
VPNConnectionID string `json:"vpn_connection_id"`
|
|
ClusterID string `json:"cluster_id"`
|
|
NodeID string `json:"node_id"`
|
|
ObservedStatus string `json:"observed_status"`
|
|
StatusPayload json.RawMessage `json:"status_payload"`
|
|
ObservedAt time.Time `json:"observed_at"`
|
|
}
|
|
|
|
type CreateClusterInput struct {
|
|
ActorUserID string
|
|
Slug string
|
|
Name string
|
|
Region *string
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type UpdateClusterInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
Name string
|
|
Status string
|
|
Region *string
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type CreateJoinTokenInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
Scope json.RawMessage
|
|
ExpiresAt time.Time
|
|
MaxUses int
|
|
}
|
|
|
|
type CreateJoinRequestInput struct {
|
|
ClusterID string
|
|
JoinToken string
|
|
NodeName string
|
|
NodeFingerprint string
|
|
PublicKey string
|
|
ReportedCapabilities json.RawMessage
|
|
ReportedFacts json.RawMessage
|
|
RequestedRoles json.RawMessage
|
|
}
|
|
|
|
type GetJoinRequestBootstrapInput struct {
|
|
ClusterID string
|
|
JoinRequestID string
|
|
NodeFingerprint string
|
|
PublicKey string
|
|
}
|
|
|
|
type ApproveJoinRequestInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
JoinRequestID string
|
|
NodeKey string
|
|
OwnershipType string
|
|
OwnerOrganizationID *string
|
|
}
|
|
|
|
type ApprovedJoinRequest struct {
|
|
JoinRequest NodeJoinRequest `json:"join_request"`
|
|
Bootstrap NodeBootstrap `json:"node_bootstrap"`
|
|
}
|
|
|
|
type JoinRequestBootstrapResult struct {
|
|
Status string `json:"status"`
|
|
JoinRequest NodeJoinRequest `json:"join_request"`
|
|
Bootstrap *NodeBootstrap `json:"node_bootstrap,omitempty"`
|
|
}
|
|
|
|
type RejectJoinRequestInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
JoinRequestID string
|
|
Reason string
|
|
}
|
|
|
|
type AssignNodeRoleInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
OrganizationID *string
|
|
Role string
|
|
Status string
|
|
Policy json.RawMessage
|
|
}
|
|
|
|
type AttachExistingNodeInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
Roles []string
|
|
}
|
|
|
|
type CreateNodeGroupInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
ParentGroupID *string
|
|
Name string
|
|
Description *string
|
|
SortOrder int
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type AssignNodeGroupInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
GroupID *string
|
|
}
|
|
|
|
type RevokeJoinTokenInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
TokenID string
|
|
}
|
|
|
|
type RevokeNodeIdentityInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
Reason string
|
|
}
|
|
|
|
type DisableMembershipInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
Reason string
|
|
}
|
|
|
|
type RecordHeartbeatInput struct {
|
|
ClusterID string
|
|
NodeID string
|
|
HealthStatus string
|
|
ReportedVersion *string
|
|
Capabilities json.RawMessage
|
|
ServiceStates json.RawMessage
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type UpsertFabricTestingFlagInput struct {
|
|
ActorUserID string
|
|
ScopeType string
|
|
ScopeID *string
|
|
ClusterID *string
|
|
Enabled bool
|
|
TelemetryEnabled bool
|
|
SyntheticLinksEnabled bool
|
|
HistoryRetentionHours int
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type RecordNodeTelemetryInput struct {
|
|
ClusterID string
|
|
NodeID string
|
|
CPUPercent *float64
|
|
MemoryUsedBytes *int64
|
|
MemoryTotalBytes *int64
|
|
DiskUsedBytes *int64
|
|
DiskTotalBytes *int64
|
|
NetworkRxBytes *int64
|
|
NetworkTxBytes *int64
|
|
ProcessCount *int
|
|
Payload json.RawMessage
|
|
ObservedAt time.Time
|
|
}
|
|
|
|
type SetDesiredWorkloadInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
NodeID string
|
|
ServiceType string
|
|
DesiredState string
|
|
Version *string
|
|
RuntimeMode string
|
|
ArtifactRef *string
|
|
Config json.RawMessage
|
|
Environment json.RawMessage
|
|
}
|
|
|
|
type ReportWorkloadStatusInput struct {
|
|
ClusterID string
|
|
NodeID string
|
|
ServiceType string
|
|
ReportedState string
|
|
RuntimeMode string
|
|
Version *string
|
|
StatusPayload json.RawMessage
|
|
}
|
|
|
|
type ReportMeshLinkInput struct {
|
|
ClusterID string
|
|
SourceNodeID string
|
|
TargetNodeID string
|
|
LinkStatus string
|
|
LatencyMs *int
|
|
QualityScore *int
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type GetNodeSyntheticMeshConfigInput struct {
|
|
ClusterID string
|
|
NodeID string
|
|
}
|
|
|
|
type CreateRouteIntentInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
SourceSelector json.RawMessage
|
|
DestinationSelector json.RawMessage
|
|
ServiceClass string
|
|
Priority int
|
|
Policy json.RawMessage
|
|
}
|
|
|
|
type CreateFabricEntryPointInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
Name string
|
|
Status string
|
|
EndpointType string
|
|
PublicEndpoint *string
|
|
Policy json.RawMessage
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type SetFabricEntryPointNodeInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
EntryPointID string
|
|
NodeID string
|
|
Status string
|
|
Priority int
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type CreateFabricEgressPoolInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
Name string
|
|
Status string
|
|
Description *string
|
|
RouteScope json.RawMessage
|
|
Policy json.RawMessage
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type SetFabricEgressPoolNodeInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
EgressPoolID string
|
|
NodeID string
|
|
Status string
|
|
Priority int
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type UpdateClusterAuthorityInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
AuthorityState string
|
|
MutationMode string
|
|
Notes *string
|
|
}
|
|
|
|
type CreateVPNConnectionInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
OrganizationID string
|
|
Name string
|
|
TargetEndpoint json.RawMessage
|
|
ProtocolFamily string
|
|
CredentialRef *string
|
|
Mode string
|
|
DesiredState string
|
|
AllowedNodePolicy json.RawMessage
|
|
RoutingUsage json.RawMessage
|
|
RoutePolicy json.RawMessage
|
|
QoSPolicy json.RawMessage
|
|
PlacementPolicy json.RawMessage
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type UpdateVPNConnectionDesiredStateInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
DesiredState string
|
|
}
|
|
|
|
type UpsertVPNConnectionRoutePolicyInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
RouteType string
|
|
Destination string
|
|
Action string
|
|
ServiceType *string
|
|
Priority int
|
|
Policy json.RawMessage
|
|
Status string
|
|
}
|
|
|
|
type SetVPNConnectionAllowedNodesInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
NodeIDs []string
|
|
RolePreference string
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type AcquireVPNConnectionLeaseInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
OwnerNodeID string
|
|
TTL time.Duration
|
|
Metadata json.RawMessage
|
|
}
|
|
|
|
type RenewVPNConnectionLeaseInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
LeaseID string
|
|
OwnerNodeID string
|
|
FencingToken string
|
|
TTL time.Duration
|
|
}
|
|
|
|
type ReleaseVPNConnectionLeaseInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
LeaseID string
|
|
OwnerNodeID string
|
|
FencingToken string
|
|
}
|
|
|
|
type FenceVPNConnectionLeaseInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
VPNConnectionID string
|
|
LeaseID string
|
|
Reason string
|
|
}
|
|
|
|
type ExpireStaleVPNConnectionLeasesInput struct {
|
|
ActorUserID string
|
|
ClusterID string
|
|
}
|
|
|
|
type ReportNodeVPNAssignmentStatusInput struct {
|
|
ClusterID string
|
|
NodeID string
|
|
VPNConnectionID string
|
|
ObservedStatus string
|
|
StatusPayload json.RawMessage
|
|
ObservedAt time.Time
|
|
}
|