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

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

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

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

	Spec   ComputeContractSpec   `json:"spec,omitempty"`
	Status ComputeContractStatus `json:"status,omitempty"`
}

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

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

type ComputeContractTemplate struct {
	VMName string `json:"vmName,omitempty"`

	BidderDids []string `json:"bidderDids,omitempty"`

	DenyBidderDids []string `json:"denyBidderDids,omitempty"`

	SshAuthorizedKeys []string `json:"sshAuthorizedKeys,omitempty"`

	UserData string `json:"userData,omitempty"`

	ComputeKind ComputeKind `json:"computeKind,omitempty" apigen:"default=vm,enum=vm|deno"`

	Policy string `json:"policy,omitempty"`

	PolicyArgs string `json:"policyArgs,omitempty"`

	VMReadyTimeoutSec int `json:"vmReadyTimeoutSec,omitempty"`

	Tunnels []ComputeContractTunnel `json:"tunnels,omitempty" apigen:"listType=map,listMapKey=tag"`

	Agent *ComputeContractAgent `json:"agent,omitempty"`

	Association *ComputeContractAssociation `json:"association,omitempty"`

	GuestTools []string `json:"guestTools,omitempty" apigen:"listType=set,enum=socialweb-computer"`
}

type ComputeContractSpec struct {
	ComputeContractTemplate `json:",inline"`

	SecretsRef *commonv1.SecretRef `json:"secretsRef,omitempty"`

	Release bool `json:"release,omitempty"`

	ReleaseRequestedAt string `json:"releaseRequestedAt,omitempty"`

	OwnerDid string `json:"ownerDid,omitempty"`

	Adopt bool `json:"adopt,omitempty"`

	NodeJoin *ComputeContractNodeJoin `json:"nodeJoin,omitempty"`

	TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty" apigen:"default=691200,minimum=0"`
}

type ContractBidVerdict string

const (
	ContractBidConsidered ContractBidVerdict = "considered"

	ContractBidDenied ContractBidVerdict = "denied"

	ContractBidChosen ContractBidVerdict = "chosen"

	ContractBidNotChosen ContractBidVerdict = "notChosen"

	ContractBidPolicyRejected ContractBidVerdict = "policyRejected"
)

type ContractBid struct {
	Did string `json:"did"`

	URI string `json:"uri"`

	Offer string `json:"offer,omitempty"`

	Cost int64 `json:"cost,omitempty"`

	Verdict ContractBidVerdict `json:"verdict"`

	ArrivedAt string `json:"arrivedAt"`
}

type ContractChosenReason string

const (
	ContractChosenFirstFree ContractChosenReason = "firstFree"

	ContractChosenBestWithinWindow ContractChosenReason = "bestWithinWindow"

	ContractChosenPolicy ContractChosenReason = "policy"

	ContractChosenResumed ContractChosenReason = "resumed"
)

type ContractChosen struct {
	URI string `json:"uri"`

	Did string `json:"did"`

	Reason ContractChosenReason `json:"reason"`

	Considered int `json:"considered"`
}

type ComputeContractNodeJoin struct {
	ClusterRef commonv1.LocalObjectRef `json:"clusterRef"`

	Meshd *ComputeContractMeshd `json:"meshd,omitempty"`

	NodeAgent *ComputeContractNodeAgent `json:"nodeAgent,omitempty"`
}

type ComputeContractTunnel struct {
	Tag string `json:"tag" apigen:"pattern=^[a-z0-9]([a-z0-9-]{0,30}[a-z0-9])?$"`

	Port int `json:"port" apigen:"minimum=1,maximum=65535"`

	Server string `json:"server,omitempty" apigen:"userEndpoint"`

	Shell *ComputeContractShell `json:"shell,omitempty"`

	Transport TunnelTransport `json:"transport,omitempty" apigen:"default=opentunnel,enum=opentunnel|webrtc"`
}

type ComputeContractShell struct {
	EnvFile string `json:"envFile,omitempty" apigen:"userEndpoint,default=/etc/wootty/wootty.env"`
}

type ComputeContractAgent struct {
	EnvFile string `json:"envFile,omitempty" apigen:"userEndpoint,default=/etc/atirc/atirc.env"`
}

type AtircRevokesState string

const (
	AtircRevokesPending AtircRevokesState = "Pending"

	AtircRevokesDone AtircRevokesState = "Done"

	AtircRevokesAbandoned AtircRevokesState = "Abandoned"
)

type ComputeContractAssociation struct {
	Subject string `json:"subject,omitempty"`

	FromGuest bool `json:"fromGuest,omitempty"`

	RefFile string `json:"refFile,omitempty" apigen:"userEndpoint,default=/etc/socialweb-computer/association-ref"`
}

const GuestToolSocialwebComputer = "socialweb-computer"

type ComputeKind string

const (
	ComputeKindVM ComputeKind = "vm"

	ComputeKindDeno ComputeKind = "deno"
)

type TunnelTransport string

const (
	TunnelTransportOpenTunnel TunnelTransport = "opentunnel"

	TunnelTransportWebRTC TunnelTransport = "webrtc"
)

type ComputeContractNodeAgent struct {
	DownloadBase string `json:"downloadBase"`

	Pins []ComputeContractMeshdPin `json:"pins"`
}

type ComputeContractMeshd struct {
	DownloadBase string `json:"downloadBase"`

	Pins []ComputeContractMeshdPin `json:"pins"`
}

type ComputeContractMeshdPin struct {
	Arch string `json:"arch"`

	Sha256 string `json:"sha256"`
}

type ComputeContractPhase string

const (
	ComputeContractPending ComputeContractPhase = "Pending"

	ComputeContractRequesting ComputeContractPhase = "Requesting"

	ComputeContractHeld ComputeContractPhase = "Held"

	ComputeContractReleasing ComputeContractPhase = "Releasing"

	ComputeContractReleased ComputeContractPhase = "Released"

	ComputeContractFailed ComputeContractPhase = "Failed"
)

const FinalizerComputeContract = "computecontract.socialweb.computer/release"

func (c *ComputeContract) HoldsGuest() bool {
	state := c.Status.Contract
	if state == nil || state.Termination != nil {
		return false
	}
	if c.Status.Phase == ComputeContractReleased || c.Status.Phase == ComputeContractFailed {
		return false
	}
	return state.Receipt != nil || state.AcceptURI != "" || (state.Accept != nil && state.Accept.URI != "")
}

type ComputeContractRelease struct {
	StartedAt string `json:"startedAt,omitempty"`

	Deadline string `json:"deadline,omitempty"`

	Attempts int `json:"attempts,omitempty"`

	LastError string `json:"lastError,omitempty"`

	RequestedAt string `json:"requestedAt,omitempty"`
}

type ComputeContractEvent struct {
	URI string `json:"uri"`

	CID string `json:"cid,omitempty"`

	ReceiptURI string `json:"receiptUri,omitempty"`

	ReceivedAt string `json:"receivedAt,omitempty"`
}

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

	Phase ComputeContractPhase `json:"phase,omitempty"`

	Message string `json:"message,omitempty"`

	SecretsURL string `json:"secretsUrl,omitempty"`

	SecretsFetchedAt string `json:"secretsFetchedAt,omitempty"`

	Contract *NodeClaimContract `json:"contract,omitempty"`

	Grant *NodeClaimGrant `json:"grant,omitempty"`

	Bids []ContractBid `json:"bids,omitempty"`

	Chosen *ContractChosen `json:"chosen,omitempty"`

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

	Execution *ExecutionStatus `json:"execution,omitempty"`

	Release *ComputeContractRelease `json:"release,omitempty"`

	PendingEvents []ComputeContractEvent `json:"pendingEvents,omitempty"`

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

	AssociationMessage string `json:"associationMessage,omitempty"`

	AtircRevokes AtircRevokesState `json:"atircRevokes,omitempty" apigen:"enum=Pending|Done|Abandoned"`

	HeldSession *ComputeContractHeldSession `json:"heldSession,omitempty"`
}

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

	GuestKeyPath string `json:"guestKeyPath,omitempty"`

	Until string `json:"until"`
}

const (
	ComputeContractConditionResumed = "Resumed"

	ComputeContractConditionProgressing = "Progressing"

	ComputeContractConditionHeld = "Held"

	ComputeContractConditionReleaseAcknowledged = "ReleaseAcknowledged"

	ComputeContractConditionReleaseFailed = "ReleaseFailed"

	ComputeContractConditionGuestRequesterReleased = "GuestRequesterReleased"

	ComputeContractConditionTerminated = "Terminated"

	ComputeContractConditionAtircTokenMinted = "AtircTokenMinted"
)