~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
991 lines · 27.0 KB Raw History
package v1alpha1

import (
	"strings"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	commonv1 "github.com/johnandersen777/socialweb-computer-kcp/api/common/v1alpha1"
)

type ComponentRestartPolicy string

const (
	ComponentRestartNever ComponentRestartPolicy = "Never"

	ComponentRestartOnFailure ComponentRestartPolicy = "OnFailure"

	ComponentRestartAlways ComponentRestartPolicy = "Always"
)

type ComponentPhase string

const (
	ComponentPhasePending ComponentPhase = "Pending"

	ComponentPhaseStarting ComponentPhase = "Starting"

	ComponentPhaseRunning ComponentPhase = "Running"

	ComponentPhaseReady ComponentPhase = "Ready"

	ComponentPhaseFailed ComponentPhase = "Failed"

	ComponentPhaseStopping ComponentPhase = "Stopping"

	ComponentPhaseSuspended ComponentPhase = "Suspended"
)

const (
	KindOpenBaoServer = "OpenBaoServer"

	KindRemoteOpenBao = "RemoteOpenBao"
)

func VaultServerRef(server string) *commonv1.ObjectRef {
	server = strings.TrimSpace(server)
	if server == "" {
		return nil
	}
	if name, ok := strings.CutPrefix(server, KindRemoteOpenBao+"/"); ok {
		return &commonv1.ObjectRef{Kind: KindRemoteOpenBao, Name: strings.TrimSpace(name)}
	}
	return &commonv1.ObjectRef{Kind: KindOpenBaoServer, Name: server}
}

func VaultServer(r *commonv1.ObjectRef, fallback string) string {
	if r == nil || strings.TrimSpace(r.Name) == "" {
		return fallback
	}
	if strings.EqualFold(strings.TrimSpace(r.Kind), KindRemoteOpenBao) {
		return KindRemoteOpenBao + "/" + strings.TrimSpace(r.Name)
	}
	return strings.TrimSpace(r.Name)
}

type ComponentIdentity struct {
	MarketIdentityRef *commonv1.ObjectRef `json:"marketIdentityRef,omitempty"`

	Did string `json:"did,omitempty"`

	Handle string `json:"handle,omitempty"`
}

type ComponentLimits struct {
	CpuMillicores int32 `json:"cpuMillicores,omitempty"`

	MemoryBytes int64 `json:"memoryBytes,omitempty"`

	DiskBytes int64 `json:"diskBytes,omitempty"`
}

type ComponentTLS struct {
	Enabled bool `json:"enabled,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	CertRef string `json:"certRef,omitempty"`

	CABundle string `json:"caBundle,omitempty"`

	CARef *commonv1.ObjectRef `json:"caRef,omitempty"`
}

func (t *ComponentTLS) CA() *commonv1.ObjectRef {
	if t == nil {
		return nil
	}
	return t.CARef
}

type ComponentServiceAuth struct {
	Issuer string `json:"issuer,omitempty"`

	Audience []string `json:"audience,omitempty"`

	Hostname string `json:"hostname,omitempty"`

	KeyRef string `json:"keyRef,omitempty"`
}

type ComponentOverrides map[string]ComponentOverride

type ComponentOverride struct {
	Suspend *bool `json:"suspend,omitempty"`

	RestartPolicy ComponentRestartPolicy `json:"restartPolicy,omitempty"`

	Limits *ComponentLimits `json:"limits,omitempty"`

	ServiceAuth *ComponentServiceAuthOverride `json:"serviceAuth,omitempty"`

	Comms *MarketComms `json:"comms,omitempty"`

	Ingress *IngressConfig `json:"ingress,omitempty"`

	Settings *ComponentSettings `json:"settings,omitempty"`
}

type ComponentServiceAuthOverride struct {
	Audience []string `json:"audience,omitempty"`

	Hostname string `json:"hostname,omitempty"`
}

type ComponentSettings struct {
	Bidder *BidderSettings `json:"bidder,omitempty"`

	Requester *RequesterSettings `json:"requester,omitempty"`

	GuestControlPlane *GuestControlPlaneSettings `json:"guestControlPlane,omitempty"`

	Pds *PdsSettings `json:"pds,omitempty"`

	SshServer *SshServerSettings `json:"sshServer,omitempty"`

	GatewayAPI *GatewayAPISettings `json:"gatewayAPI,omitempty"`

	IngressProxy *IngressProxySettings `json:"ingressProxy,omitempty"`

	Relay *RelaySettings `json:"relay,omitempty"`

	PolicyEngine *PolicyEngineSettings `json:"policyEngine,omitempty"`
}

type BidderSettings struct {
	HeartbeatIntervalSeconds *int32 `json:"heartbeatIntervalSeconds,omitempty"`

	OfferingRefreshSeconds *int32 `json:"offeringRefreshSeconds,omitempty"`

	BidTTLSeconds *int32 `json:"bidTtlSeconds,omitempty"`

	MaxConcurrentGuests *int32 `json:"maxConcurrentGuests,omitempty"`

	PolicyTimeoutSeconds *int32 `json:"policyTimeoutSeconds,omitempty"`
}

type RequesterSettings struct {
	MaxConcurrent *int32 `json:"maxConcurrent,omitempty"`

	PerAccount *int32 `json:"perAccount,omitempty"`

	ContractPollMilliseconds *int32 `json:"contractPollMilliseconds,omitempty"`

	BidWindowSeconds *int32 `json:"bidWindowSeconds,omitempty"`

	ReceiptTimeoutSeconds *int32 `json:"receiptTimeoutSeconds,omitempty"`

	ReceiptPollMilliseconds *int32 `json:"receiptPollMilliseconds,omitempty"`

	SessionCapSeconds *int32 `json:"sessionCapSeconds,omitempty"`

	SessionIdleSeconds *int32 `json:"sessionIdleSeconds,omitempty"`

	DirectoryTTLSeconds *int32 `json:"directoryTTLSeconds,omitempty"`

	DirectoryKeys *int32 `json:"directoryKeys,omitempty"`

	PolicyTimeoutSeconds *int32 `json:"policyTimeoutSeconds,omitempty"`

	OAuthScopes []string `json:"oauthScopes,omitempty"`
}

type GuestControlPlaneSettings struct {
	GuestLoginMount string `json:"guestLoginMount,omitempty"`

	Role string `json:"role,omitempty"`

	GrantSyncSeconds *int32 `json:"grantSyncSeconds,omitempty"`

	IssuerRetrySeconds *int32 `json:"issuerRetrySeconds,omitempty"`

	HostKeyAttempts *int32 `json:"hostKeyAttempts,omitempty"`

	RelayEnabled *bool `json:"relayEnabled,omitempty"`

	HostKeyRef string `json:"hostKeyRef,omitempty"`
}

type PdsSettings struct {
	MaxBlobSize *int64 `json:"maxBlobSize,omitempty"`

	MaxRequestBytes *int64 `json:"maxRequestBytes,omitempty"`

	ContactEmail string `json:"contactEmail,omitempty"`

	OAuth *PdsOAuthSettings `json:"oauth,omitempty"`
}

type PdsOAuthSettings struct {
	AllowLocalhostClients *bool `json:"allowLocalhostClients,omitempty"`

	AccessTokenTTLSeconds *int32 `json:"accessTokenTTLSeconds,omitempty"`

	RefreshTokenTTLSeconds *int32 `json:"refreshTokenTTLSeconds,omitempty"`

	DisableLocalhostClients *bool `json:"disableLocalhostClients,omitempty"`

	Scopes []string `json:"scopes,omitempty"`
}

type SshServerSettings struct {
	MaxConnections *int32 `json:"maxConnections,omitempty"`

	MaxSessions *int32 `json:"maxSessions,omitempty"`

	SessionsPerAccount *int32 `json:"sessionsPerAccount,omitempty"`

	MaxAuthAttempts *int32 `json:"maxAuthAttempts,omitempty"`

	AuthTimeoutSeconds *int32 `json:"authTimeoutSeconds,omitempty"`

	SessionMaxSeconds *int32 `json:"sessionMaxSeconds,omitempty"`

	CacheEntries *int32 `json:"cacheEntries,omitempty"`
}

type GatewayAPISettings struct {
	RequiredDownloads []string `json:"requiredDownloads,omitempty"`
}

type IngressProxySettings struct {
	RelayTimeoutMilliseconds *int32 `json:"relayTimeoutMilliseconds,omitempty"`

	KeepaliveMilliseconds *int32 `json:"keepaliveMilliseconds,omitempty"`

	KeepaliveTimeoutMilliseconds *int32 `json:"keepaliveTimeoutMilliseconds,omitempty"`

	ReconnectGraceMilliseconds *int32 `json:"reconnectGraceMilliseconds,omitempty"`

	NonceTTLMilliseconds *int32 `json:"nonceTTLMilliseconds,omitempty"`
}

type RelaySettings struct {
	CrawlIntervalSeconds *int32 `json:"crawlIntervalSeconds,omitempty"`
}

type PolicyEngineSettings struct {
	Limits *PolicyEngineLimitsSettings `json:"limits,omitempty"`

	Trust *PolicyEngineTrustSettings `json:"trust,omitempty"`

	Cache *PolicyEngineCacheSettings `json:"cache,omitempty"`

	Sandbox *PolicyEngineSandboxSettings `json:"sandbox,omitempty"`
}

type PolicyEngineSandboxSettings struct {
	Provider string `json:"provider,omitempty" apigen:"enum=deno|browser|embedded"`

	Browser *PolicyEngineBrowserSandboxSettings `json:"browser,omitempty"`

	Embedded *PolicyEngineEmbeddedSandboxSettings `json:"embedded,omitempty"`
}

type PolicyEngineBrowserSandboxSettings struct {
	TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty" apigen:"minimum=1"`
}

type PolicyEngineEmbeddedSandboxSettings struct {
	TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty" apigen:"minimum=1"`
}

type PolicyEngineLimitsSettings struct {
	MaxConcurrentRuns *int32 `json:"maxConcurrentRuns,omitempty"`

	QueueDepth *int32 `json:"queueDepth,omitempty"`

	ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"`

	MaxConsoleBytes *int64 `json:"maxConsoleBytes,omitempty"`

	MaxOutputBytes *int64 `json:"maxOutputBytes,omitempty"`

	MaxCacheEntries *int32 `json:"maxCacheEntries,omitempty"`

	MaxCacheBytes *int64 `json:"maxCacheBytes,omitempty"`
}

type PolicyEngineTrustSettings struct {
	TTLSeconds *int64 `json:"ttlSeconds,omitempty"`
}

type PolicyEngineCacheSettings struct {
	VerdictTTLSeconds *int64 `json:"verdictTTLSeconds,omitempty"`

	ScopeTTLSeconds *int64 `json:"scopeTTLSeconds,omitempty"`

	RecordTTLSeconds *int64 `json:"recordTTLSeconds,omitempty"`
}

type ComponentStorage struct {
	DataDir string `json:"dataDir,omitempty"`

	BlobsDir string `json:"blobsDir,omitempty"`

	CertsDir string `json:"certsDir,omitempty"`
}

type ComponentServe struct {
	Host string `json:"host,omitempty" apigen:"default=127.0.0.1"`

	Port int32 `json:"port,omitempty" apigen:"minimum=0,maximum=65535"`

	HealthPath string `json:"healthPath,omitempty" apigen:"userEndpoint"`
}

type ComponentSpec struct {
	Suspend bool `json:"suspend,omitempty"`

	RestartedAt string `json:"restartedAt,omitempty"`

	RestartPolicy ComponentRestartPolicy `json:"restartPolicy,omitempty"`

	StateDir string `json:"stateDir,omitempty"`

	Network *MarketNetworkValue `json:"network,omitempty"`

	Limits *ComponentLimits `json:"limits,omitempty"`

	TLS *ComponentTLS `json:"tls,omitempty"`

	ServiceAuth *ComponentServiceAuth `json:"serviceAuth,omitempty"`
}

type Endpoint struct {
	Name string `json:"name"`

	URL string `json:"url,omitempty"`

	Address string `json:"address,omitempty"`

	Protocol string `json:"protocol,omitempty"`
}

type ComponentStatus struct {
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	Phase ComponentPhase `json:"phase,omitempty"`

	Ready bool `json:"ready"`

	Endpoint string `json:"endpoint,omitempty"`

	Endpoints []Endpoint `json:"endpoints,omitempty"`

	Message string `json:"message,omitempty"`

	Restarts int32 `json:"restarts,omitempty"`

	StartedAt string `json:"startedAt,omitempty"`

	Conditions []metav1.Condition `json:"conditions,omitempty"`
}

type Bidder struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   BidderSpec   `json:"spec,omitempty"`
	Status BidderStatus `json:"status,omitempty"`
}

type BidderStatus struct {
	ComponentStatus `json:",inline"`

	GuestNetwork *GuestNetworkStatus `json:"guestNetwork,omitempty"`
}

type BidderList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []Bidder `json:"items"`
}

type BidderSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	PdsRef *commonv1.ObjectRef `json:"pdsRef,omitempty"`

	PolicyEngineRef *commonv1.ObjectRef `json:"policyEngineRef,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	GuestImageSource string `json:"guestImageSource,omitempty"`

	Firecracker *FirecrackerProvider `json:"firecracker,omitempty"`

	Kcp *KcpProvider `json:"kcp,omitempty"`

	MaxConcurrentGuests int32 `json:"maxConcurrentGuests,omitempty" apigen:"minimum=0"`

	HeartbeatIntervalSeconds *int32 `json:"heartbeatIntervalSeconds,omitempty" apigen:"default=60,minimum=1"`

	OfferingRefreshSeconds *int32 `json:"offeringRefreshSeconds,omitempty" apigen:"default=300,minimum=0"`

	BidTTLSeconds *int32 `json:"bidTtlSeconds,omitempty" apigen:"default=86400,minimum=1"`

	PolicyTimeoutSeconds *int32 `json:"policyTimeoutSeconds,omitempty" apigen:"default=120,minimum=1"`

	Operator string `json:"operator,omitempty"`

	Policy string `json:"policy,omitempty"`

	PolicyArgs string `json:"policyArgs,omitempty"`

	Association *commonv1.AssociationPolicy `json:"association,omitempty"`

	GuestNetwork *GuestNetworkOptions `json:"guestNetwork,omitempty"`

	BidderDIDs []string `json:"bidderDIDs,omitempty"`

	MarketExposureRef *commonv1.LocalObjectRef `json:"marketExposureRef,omitempty"`

	Mode string `json:"mode,omitempty"`

	Comms *MarketComms `json:"comms,omitempty"`

	SuspendParticipation bool `json:"suspendParticipation,omitempty"`

	ComputeKinds []string `json:"computeKinds,omitempty" apigen:"listType=set"`
}

type SecretsFallback string

const (
	SecretsFallbackNone SecretsFallback = "None"

	SecretsFallbackSealed SecretsFallback = "Sealed"
)

type GuestControlPlane struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   GuestControlPlaneSpec `json:"spec,omitempty"`
	Status ComponentStatus       `json:"status,omitempty"`
}

type GuestControlPlaneList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []GuestControlPlane `json:"items"`
}

type GuestControlPlaneSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	PdsRef *commonv1.ObjectRef `json:"pdsRef,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	HostKeyRef string `json:"hostKeyRef,omitempty"`

	GuestLoginMount string `json:"guestLoginMount,omitempty" apigen:"default=sshsig,pattern=^[a-z0-9][a-z0-9-]{0,62}$"`

	Role string `json:"role,omitempty" apigen:"default=kcp"`

	GrantSyncSeconds *int32 `json:"grantSyncSeconds,omitempty" apigen:"default=30,minimum=1"`

	IssuerRetrySeconds *int32 `json:"issuerRetrySeconds,omitempty" apigen:"default=30,minimum=1"`

	HostKeyAttempts *int32 `json:"hostKeyAttempts,omitempty" apigen:"minimum=1"`

	RelayEnabled *bool `json:"relayEnabled,omitempty"`
}

type PdsMode string

const (
	PdsModeRepo PdsMode = "Repo"

	PdsModeFull PdsMode = "Full"
)

type Pds struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   PdsSpec         `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type PdsList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []Pds `json:"items"`
}

type PdsSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	Mode PdsMode `json:"mode,omitempty" apigen:"default=Full"`

	PlcURL string `json:"plcURL,omitempty" apigen:"userEndpoint"`

	PublicBaseURL string `json:"publicBaseURL,omitempty" apigen:"userEndpoint"`

	RequireIngress bool `json:"requireIngress,omitempty"`

	IngressRef *commonv1.ObjectRef `json:"ingressRef,omitempty"`

	PublicURL string `json:"publicURL,omitempty" apigen:"userEndpoint"`

	StableHost string `json:"stableHost,omitempty"`

	AllowExplicitDID bool `json:"allowExplicitDID,omitempty"`

	MaxBlobSize *int64 `json:"maxBlobSize,omitempty"`

	MaxRequestBytes *int64 `json:"maxRequestBytes,omitempty"`

	ContactEmail string `json:"contactEmail,omitempty"`

	OAuth *PdsOAuth `json:"oauth,omitempty"`
}

type PdsOAuth struct {
	Issuer string `json:"issuer,omitempty"`

	AllowLocalhostClients bool `json:"allowLocalhostClients,omitempty"`

	AccessTokenTTLSeconds int32 `json:"accessTokenTTLSeconds,omitempty"`

	RefreshTokenTTLSeconds int32 `json:"refreshTokenTTLSeconds,omitempty"`

	DisableLocalhostClients bool `json:"disableLocalhostClients,omitempty"`

	Scopes []string `json:"scopes,omitempty"`
}

type Requester struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   RequesterSpec   `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type RequesterList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []Requester `json:"items"`
}

type RequesterSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	PdsRef *commonv1.ObjectRef `json:"pdsRef,omitempty"`

	PdsDID string `json:"pdsDID,omitempty"`

	MarketExposureRef *commonv1.LocalObjectRef `json:"marketExposureRef,omitempty"`

	OperatorDID string `json:"operatorDID,omitempty"`

	PolicyEngineRef *commonv1.ObjectRef `json:"policyEngineRef,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	Mode string `json:"mode,omitempty" apigen:"enum=local|localrepo|callback|oauth|oauthbrowser|oauthqr"`

	GuestSSHKeysFile string `json:"guestSSHKeysFile,omitempty" apigen:"userEndpoint"`

	BidderDIDs []string `json:"bidderDIDs,omitempty"`

	OwnerSessionsFile string `json:"ownerSessionsFile,omitempty" apigen:"userEndpoint"`

	IrohSocket string `json:"irohSocket,omitempty"`

	AcceptCopies int32 `json:"acceptCopies,omitempty"`

	MaxConcurrent int32 `json:"maxConcurrent,omitempty" apigen:"default=64,minimum=1"`

	PerAccount int32 `json:"perAccount,omitempty" apigen:"default=16,minimum=1"`

	ContractPollMilliseconds *int32 `json:"contractPollMilliseconds,omitempty" apigen:"default=2000,minimum=1"`

	BidWindowSeconds *int32 `json:"bidWindowSeconds,omitempty" apigen:"default=30,minimum=1"`

	ReceiptTimeoutSeconds *int32 `json:"receiptTimeoutSeconds,omitempty" apigen:"default=300,minimum=1"`

	ReceiptPollMilliseconds *int32 `json:"receiptPollMilliseconds,omitempty" apigen:"default=500,minimum=1"`

	SessionCapSeconds *int32 `json:"sessionCapSeconds,omitempty" apigen:"default=3600,minimum=1"`

	SessionIdleSeconds *int32 `json:"sessionIdleSeconds,omitempty" apigen:"default=300,minimum=1"`

	DirectoryTTLSeconds *int32 `json:"directoryTTLSeconds,omitempty" apigen:"default=60,minimum=1"`

	DirectoryKeys *int32 `json:"directoryKeys,omitempty" apigen:"default=10000,minimum=1"`

	PolicyTimeoutSeconds *int32 `json:"policyTimeoutSeconds,omitempty" apigen:"default=120,minimum=1"`

	Association *commonv1.AssociationPolicy `json:"association,omitempty"`

	OAuthScopes []string `json:"oauthScopes,omitempty"`

	Comms *MarketComms `json:"comms,omitempty"`

	Ingress *IngressConfig `json:"ingress,omitempty"`

	SecretsFallback SecretsFallback `json:"secretsFallback,omitempty" apigen:"enum=None|Sealed"`

	AtircParentRef *commonv1.SecretRef `json:"atircParentRef,omitempty"`

	AtircMintedRef *commonv1.SecretRef `json:"atircMintedRef,omitempty"`

	SuspendParticipation bool `json:"suspendParticipation,omitempty"`

	ContractOwnerDid string `json:"contractOwnerDid,omitempty"`
}

type GatewayAPI struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   GatewayAPISpec  `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type GatewayAPIList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []GatewayAPI `json:"items"`
}

type GatewayAPISpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	PdsRef *commonv1.ObjectRef `json:"pdsRef,omitempty"`

	RequesterRef *commonv1.ObjectRef `json:"requesterRef,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	ClusterProvider *GatewayClusterProvider `json:"clusterProvider,omitempty"`

	ClusterStateDir string `json:"clusterStateDir,omitempty"`

	KubeconfigCAFile string `json:"kubeconfigCAFile,omitempty" apigen:"userEndpoint"`

	PublicOrigin string `json:"publicOrigin,omitempty"`

	Audience string `json:"audience,omitempty"`

	RequiredDownloads []string `json:"requiredDownloads,omitempty"`

	PostSignInURL string `json:"postSignInURL,omitempty" apigen:"userEndpoint"`

	NodeMarket *GatewayNodeMarket `json:"nodeMarket,omitempty"`

	NodesOnly bool `json:"nodesOnly,omitempty"`
}

type GatewayNodeMarket struct {
	OwnerSessionsFile string `json:"ownerSessionsFile,omitempty" apigen:"userEndpoint"`

	UserDataBaseFile string `json:"userDataBaseFile,omitempty" apigen:"userEndpoint"`

	HomeWorkspace string `json:"homeWorkspace,omitempty"`

	ContractWorkspace string `json:"contractWorkspace,omitempty"`

	NodePolicy string `json:"nodePolicy,omitempty"`

	NodePolicyArgs string `json:"nodePolicyArgs,omitempty"`

	InfraRecord *GatewayInfraRecord `json:"infraRecord,omitempty"`

	VaultMount string `json:"vaultMount,omitempty"`
}

type GatewayInfraRecord struct {
	RepoWorkspace string `json:"repoWorkspace"`

	EventSourceRefs []commonv1.ObjectRef `json:"eventSourceRefs,omitempty"`
}

type SshServer struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   SshServerSpec   `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type SshServerList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []SshServer `json:"items"`
}

type SshServerSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	RequesterRef *commonv1.ObjectRef `json:"requesterRef,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	HostKeyRef string `json:"hostKeyRef,omitempty"`

	OwnerSessionsFile string `json:"ownerSessionsFile,omitempty" apigen:"userEndpoint"`

	PublicListen string `json:"publicListen,omitempty"`

	PublicOrigin string `json:"publicOrigin,omitempty"`

	WebListen string `json:"webListen,omitempty"`

	OperatorDid string `json:"operatorDid,omitempty"`

	MaxAccounts int32 `json:"maxAccounts,omitempty" apigen:"default=64,minimum=1"`

	PolicyEngineRef *commonv1.ObjectRef `json:"policyEngineRef,omitempty"`

	AccountRequesters bool `json:"accountRequesters,omitempty"`

	MaxConnections int32 `json:"maxConnections,omitempty" apigen:"default=10000,minimum=1"`

	MaxSessions int32 `json:"maxSessions,omitempty" apigen:"default=1000,minimum=1"`

	SessionsPerAccount int32 `json:"sessionsPerAccount,omitempty" apigen:"default=1000,minimum=1"`

	MaxAuthAttempts int32 `json:"maxAuthAttempts,omitempty" apigen:"default=6,minimum=1"`

	AuthTimeoutSeconds *int32 `json:"authTimeoutSeconds,omitempty" apigen:"default=120,minimum=1"`

	SessionMaxSeconds *int32 `json:"sessionMaxSeconds,omitempty" apigen:"default=3600,minimum=1"`

	CacheEntries int32 `json:"cacheEntries,omitempty" apigen:"default=1024,minimum=1"`
}

type Plc struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   PlcSpec         `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type PlcList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []Plc `json:"items"`
}

type PlcSpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`
}

type Relay struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   RelaySpec       `json:"spec,omitempty"`
	Status ComponentStatus `json:"status,omitempty"`
}

type RelayList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []Relay `json:"items"`
}

type RelaySpec struct {
	ComponentSpec `json:",inline"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	PdsRefs []commonv1.ObjectRef `json:"pdsRefs,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	CrawlIntervalSeconds *int32 `json:"crawlIntervalSeconds,omitempty" apigen:"minimum=0"`
}

type IngressProxy struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   IngressProxySpec `json:"spec,omitempty"`
	Status ComponentStatus  `json:"status,omitempty"`
}

type IngressProxyList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []IngressProxy `json:"items"`
}

const (
	IngressProviderXRPCSubscription = "xrpc-subscription"

	IngressProviderIroh = "iroh"

	IngressProviderOpenTunnel = "opentunnel"

	IngressProviderWebRTC = "webrtc"
)

type IngressProxySpec struct {
	ComponentSpec `json:",inline"`

	Provider string `json:"provider,omitempty" apigen:"enum=xrpc-subscription|iroh|opentunnel"`

	Identity *ComponentIdentity `json:"identity,omitempty"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	RelayRef *commonv1.ObjectRef `json:"relayRef,omitempty"`

	RelayURL string `json:"relayURL,omitempty" apigen:"userEndpoint"`

	IngressProxyHost string `json:"ingressProxyHost,omitempty"`

	IdentityRef *commonv1.ObjectRef `json:"identityRef,omitempty"`

	PublicHost string `json:"publicHost,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`

	Iroh *IngressProxyIroh `json:"iroh,omitempty"`

	OpenTunnel *IngressProxyOpenTunnel `json:"opentunnel,omitempty"`

	RelayTimeoutMilliseconds *int32 `json:"relayTimeoutMilliseconds,omitempty" apigen:"default=30000,minimum=1"`

	KeepaliveMilliseconds *int32 `json:"keepaliveMilliseconds,omitempty" apigen:"default=5000,minimum=1"`

	KeepaliveTimeoutMilliseconds *int32 `json:"keepaliveTimeoutMilliseconds,omitempty" apigen:"default=5000,minimum=1"`

	ReconnectGraceMilliseconds *int32 `json:"reconnectGraceMilliseconds,omitempty" apigen:"minimum=0"`

	NonceTTLMilliseconds *int32 `json:"nonceTTLMilliseconds,omitempty" apigen:"default=60000,minimum=1"`
}

type IngressProxyIroh struct {
	DumbpipePath string `json:"dumbpipePath,omitempty" apigen:"userEndpoint"`

	RelayURL string `json:"relayURL,omitempty" apigen:"userEndpoint"`

	ListenHost string `json:"listenHost,omitempty"`
}

type IngressProxyOpenTunnel struct {
	Command []string `json:"command,omitempty"`

	RouteName string `json:"routeName,omitempty" apigen:"maxLength=63,pattern=^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"`

	ProxyProtocol string `json:"proxyProtocol,omitempty" apigen:"enum=v1|v2"`

	LocalHost string `json:"localHost,omitempty"`
}

type DispatcherTLS struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   DispatcherTLSSpec `json:"spec,omitempty"`
	Status ComponentStatus   `json:"status,omitempty"`
}

type DispatcherTLSList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`

	Items []DispatcherTLS `json:"items"`
}

type DispatcherTLSSpec struct {
	ComponentSpec `json:",inline"`

	VaultRef *commonv1.ObjectRef `json:"vaultRef,omitempty"`

	UpstreamRef *commonv1.ObjectRef `json:"upstreamRef,omitempty"`

	Hostnames []string `json:"hostnames,omitempty"`

	Storage *ComponentStorage `json:"storage,omitempty"`

	Serve *ComponentServe `json:"serve,omitempty" apigen:"default={}"`
}