Documentation ¶
Overview ¶
Package serverstate exports the interface and verification harness for implementing a new state storage backend for the server.
Additional state storage backends is not an officially supported extension of Waypoint, so you do this at your own peril. It will not be supported. However, this package is exported because we maintain our own private state backends for other use cases of Waypoint.
Index ¶
- Constants
- Variables
- type Instance
- type InstanceExec
- type InstanceExecHandler
- type Interface
- type Job
- type ListOperationOption
- func ListWithOrder(f *pb.OperationOrder) ListOperationOption
- func ListWithPhysicalState(f pb.Operation_PhysicalState) ListOperationOption
- func ListWithStatusFilter(f ...*pb.StatusFilter) ListOperationOption
- func ListWithWatchSet(ws memdb.WatchSet) ListOperationOption
- func ListWithWorkspace(f *pb.Ref_Workspace) ListOperationOption
- type ListOperationOptions
- type Pruner
Constants ¶
const ( DefaultUser = "waypoint" DefaultUserId = "00000000000000000000000001" )
See the docs in singleprocess.
Variables ¶
var ( JobWaitingTimeout = 2 * time.Minute JobHeartbeatTimeout = 2 * time.Minute )
These variables control the timeouts associated with the job system. The job system implementaions MUST use them. They are GUARANTEED to be written only when the state implementation is NOT running. Therefore, no lock is needed to read them.
These MUST be used because the tests in statetest will manipulate these to verify various behaviors.
Functions ¶
This section is empty.
Types ¶
type Instance ¶
type Instance struct { Id string DeploymentId string Project string Application string Workspace string LogBuffer *logbuffer.Buffer Type pb.Instance_Type DisableExec bool }
Instance represents a running deployment instance for an application.
type InstanceExec ¶
type InstanceExec struct { Id int64 InstanceId string Args []string Pty *pb.ExecStreamRequest_PTY ClientEventCh <-chan *pb.ExecStreamRequest EntrypointEventCh chan<- *pb.EntrypointExecRequest Connected uint32 // This is the context that the client side is running inside. // It is used by the entrypoint side to detect if the client is still // around or not. Context context.Context }
InstanceExec represents a single exec session.
type InstanceExecHandler ¶ added in v0.9.0
type InstanceExecHandler interface { // InstanceExecCreateByTargetedInstance registers an exec request for a specific instance, // identified by it's database id. InstanceExecCreateByTargetedInstance(ctx context.Context, id string, exec *InstanceExec) error // InstanceExecCreateByDeployment looks up the instances running the given deployment, // picks an instance, and assigns the exec to that instance. InstanceExecCreateByDeployment(ctx context.Context, did string, exec *InstanceExec) error // InstanceExecCreateForVirtualInstance is used for plugins that require instances to be // created just to handle exec requests. The given instance id doesn't have to exist yet, // the code will wait for the instance to come online, then assign the exec request to it. InstanceExecCreateForVirtualInstance(ctx context.Context, id string, exec *InstanceExec) error // InstanceExecDelete deletes an exec request, identified by it's numeric id (InstanceExec.Id) InstanceExecDelete(ctx context.Context, id int64) error // InstanceExecById retrieves an exec request, identified by it's numeric id (InstanceExec.Id) InstanceExecById(ctx context.Context, id int64) (*InstanceExec, error) // InstanceExecListByInstanceId returns any exec requests for the given instance id. InstanceExecListByInstanceId(ctx context.Context, id string, ws memdb.WatchSet) ([]*InstanceExec, error) // InstanceExecById retrieves an exec request, identified by it's numeric id (InstanceExec.Id). // The implementer also can use this opertunity to do any sychronization of state, such as // connecting to external systems. InstanceExecConnect(ctx context.Context, id int64) (*InstanceExec, error) // InstanceExecWaitConnected is run to allow the implementation to sync up with a call to // InstanceExecConnect run elsewhere. InstanceExecWaitConnected(ctx context.Context, exec *InstanceExec) error }
InstanceExecHandler is an optional interface that the state interface can implement. When it does, the functionality associated with `waypoint exec` will be available.
type Interface ¶
type Interface interface { // Close is always called when the server is shutting down or reloading // the state store. This should clean up any resources (file handles, etc.) // that the state storage is using. io.Closer HMACKeyEmpty(context.Context) bool HMACKeyCreateIfNotExist(ctx context.Context, id string, size int) (*pb.HMACKey, error) HMACKeyGet(ctx context.Context, id string) (*pb.HMACKey, error) TokenSignature(ctx context.Context, tokenBody []byte, keyId string) (signature []byte, err error) TokenSignatureVerify(ctx context.Context, tokenBody []byte, signature []byte, keyId string) (isValid bool, err error) ServerConfigSet(context.Context, *pb.ServerConfig) error ServerConfigGet(context.Context) (*pb.ServerConfig, error) UserPut(context.Context, *pb.User) error UserGet(context.Context, *pb.Ref_User) (*pb.User, error) UserDelete(context.Context, *pb.Ref_User) error UserList(context.Context) ([]*pb.User, error) UserEmpty(context.Context) (bool, error) UserGetOIDC(ctx context.Context, iss, sub string) (*pb.User, error) UserGetEmail(context.Context, string) (*pb.User, error) AuthMethodPut(context.Context, *pb.AuthMethod) error AuthMethodGet(context.Context, *pb.Ref_AuthMethod) (*pb.AuthMethod, error) AuthMethodDelete(context.Context, *pb.Ref_AuthMethod) error AuthMethodList(context.Context) ([]*pb.AuthMethod, error) RunnerCreate(context.Context, *pb.Runner) error RunnerDelete(context.Context, string) error RunnerOffline(context.Context, string) error RunnerAdopt(context.Context, string, bool) error RunnerReject(context.Context, string) error RunnerById(context.Context, string, memdb.WatchSet) (*pb.Runner, error) RunnerList(context.Context) ([]*pb.Runner, error) OnDemandRunnerConfigPut(context.Context, *pb.OnDemandRunnerConfig) (*pb.OnDemandRunnerConfig, error) OnDemandRunnerConfigGet(context.Context, *pb.Ref_OnDemandRunnerConfig) (*pb.OnDemandRunnerConfig, error) OnDemandRunnerConfigDelete(context.Context, *pb.Ref_OnDemandRunnerConfig) error OnDemandRunnerConfigList(context.Context) ([]*pb.OnDemandRunnerConfig, error) OnDemandRunnerConfigDefault(context.Context) ([]*pb.Ref_OnDemandRunnerConfig, error) ServerURLTokenSet(context.Context, string) error ServerURLTokenGet(context.Context) (string, error) ServerIdSet(ctx context.Context, id string) error ServerIdGet(context.Context) (string, error) CreateSnapshot(context.Context, io.Writer) error StageRestoreSnapshot(context.Context, io.Reader) error ConfigSet(context.Context, ...*pb.ConfigVar) error ConfigDelete(context.Context, ...*pb.ConfigVar) error ConfigGet(context.Context, *pb.ConfigGetRequest) ([]*pb.ConfigVar, error) ConfigGetWatch(context.Context, *pb.ConfigGetRequest, memdb.WatchSet) ([]*pb.ConfigVar, error) ConfigSourceSet(context.Context, ...*pb.ConfigSource) error ConfigSourceDelete(context.Context, ...*pb.ConfigSource) error ConfigSourceGet(context.Context, *pb.GetConfigSourceRequest) ([]*pb.ConfigSource, error) ConfigSourceGetWatch(context.Context, *pb.GetConfigSourceRequest, memdb.WatchSet) ([]*pb.ConfigSource, error) InstanceCreate(context.Context, *Instance) error InstanceDelete(context.Context, string) error InstanceById(context.Context, string) (*Instance, error) InstancesByApp(context.Context, *pb.Ref_Application, *pb.Ref_Workspace, memdb.WatchSet) ([]*Instance, error) InstancesByDeployment(context.Context, string, memdb.WatchSet) ([]*Instance, error) WorkspaceList(context.Context) ([]*pb.Workspace, error) WorkspaceListByProject(context.Context, *pb.Ref_Project) ([]*pb.Workspace, error) WorkspaceListByApp(context.Context, *pb.Ref_Application) ([]*pb.Workspace, error) WorkspaceGet(context.Context, string) (*pb.Workspace, error) WorkspacePut(context.Context, *pb.Workspace) error WorkspaceDelete(context.Context, string) error ProjectPut(context.Context, *pb.Project) error ProjectGet(context.Context, *pb.Ref_Project) (*pb.Project, error) ProjectDelete(context.Context, *pb.Ref_Project) error ProjectUpdateDataRef(context.Context, *pb.Ref_Project, *pb.Ref_Workspace, *pb.Job_DataSource_Ref) error ProjectCount(context.Context) (uint64, error) ProjectList(context.Context, *pb.PaginationRequest) ([]*pb.Ref_Project, *pb.PaginationResponse, error) ProjectListBundles(context.Context, *pb.PaginationRequest) ([]*pb.UI_ProjectBundle, *pb.PaginationResponse, error) ProjectListWorkspaces(context.Context, *pb.Ref_Project) ([]*pb.Workspace_Project, error) ProjectPollPeek(context.Context, memdb.WatchSet) (*pb.Project, time.Time, error) ProjectPollComplete(context.Context, *pb.Project, time.Time) error AppPut(context.Context, *pb.Application) (*pb.Application, error) AppDelete(context.Context, *pb.Ref_Application) error AppGet(context.Context, *pb.Ref_Application) (*pb.Application, error) ApplicationPollPeek(context.Context, memdb.WatchSet) (*pb.Project, time.Time, error) ApplicationPollComplete(context.Context, *pb.Project, time.Time) error GetFileChangeSignal(context.Context, *pb.Ref_Application) (string, error) ArtifactPut(context.Context, bool, *pb.PushedArtifact) error ArtifactGet(context.Context, *pb.Ref_Operation) (*pb.PushedArtifact, error) ArtifactLatest(context.Context, *pb.Ref_Application, *pb.Ref_Workspace) (*pb.PushedArtifact, error) ArtifactList(context.Context, *pb.Ref_Application, ...ListOperationOption) ([]*pb.PushedArtifact, error) BuildPut(context.Context, bool, *pb.Build) error BuildGet(context.Context, *pb.Ref_Operation) (*pb.Build, error) BuildLatest(context.Context, *pb.Ref_Application, *pb.Ref_Workspace) (*pb.Build, error) BuildList(context.Context, *pb.Ref_Application, ...ListOperationOption) ([]*pb.Build, error) DeploymentPut(context.Context, bool, *pb.Deployment) error DeploymentGet(context.Context, *pb.Ref_Operation) (*pb.Deployment, error) DeploymentLatest(context.Context, *pb.Ref_Application, *pb.Ref_Workspace) (*pb.Deployment, error) DeploymentList(context.Context, *pb.Ref_Application, ...ListOperationOption) ([]*pb.Deployment, error) ReleasePut(context.Context, bool, *pb.Release) error ReleaseGet(context.Context, *pb.Ref_Operation) (*pb.Release, error) ReleaseLatest(context.Context, *pb.Ref_Application, *pb.Ref_Workspace) (*pb.Release, error) ReleaseList(context.Context, *pb.Ref_Application, ...ListOperationOption) ([]*pb.Release, error) StatusReportPut(context.Context, bool, *pb.StatusReport) error StatusReportGet(context.Context, *pb.Ref_Operation) (*pb.StatusReport, error) StatusReportLatest( context.Context, *pb.Ref_Application, *pb.Ref_Workspace, func(*pb.StatusReport) (bool, error), ) (*pb.StatusReport, error) StatusReportList(context.Context, *pb.Ref_Application, ...ListOperationOption) ([]*pb.StatusReport, error) TriggerPut(context.Context, *pb.Trigger) error TriggerGet(context.Context, *pb.Ref_Trigger) (*pb.Trigger, error) TriggerDelete(context.Context, *pb.Ref_Trigger) error TriggerList(context.Context, *pb.Ref_Workspace, *pb.Ref_Project, *pb.Ref_Application, []string) ([]*pb.Trigger, error) JobCreate(context.Context, ...*pb.Job) error JobProjectScopedRequest(context.Context, *pb.Ref_Project, *pb.Job) ([]*pb.QueueJobRequest, error) JobList(context.Context, *pb.ListJobsRequest) ([]*pb.Job, *pb.PaginationResponse, error) JobLatestInit(context.Context, *pb.Ref_Project) (*pb.Job, error) JobById(context.Context, string, memdb.WatchSet) (*Job, error) JobPeekForRunner(context.Context, *pb.Runner) (*Job, error) JobAssignForRunner(context.Context, *pb.Runner) (*Job, error) JobAck(context.Context, string, bool) (*Job, error) JobUpdateRef(context.Context, string, *pb.Job_DataSource_Ref) error JobUpdateExpiry(context.Context, string, *timestamppb.Timestamp) error JobUpdate(context.Context, string, func(*pb.Job) error) error JobComplete(context.Context, string, *pb.Job_Result, error) error JobCancel(context.Context, string, bool) error JobHeartbeat(context.Context, string) error JobExpire(context.Context, string) error JobIsAssignable(context.Context, *pb.Job) (bool, error) TaskPut(context.Context, *pb.Task) error TaskGet(context.Context, *pb.Ref_Task) (*pb.Task, error) TaskDelete(context.Context, *pb.Ref_Task) error TaskCancel(context.Context, *pb.Ref_Task) error TaskList(context.Context, *pb.ListTaskRequest) ([]*pb.Task, error) JobsByTaskRef(context.Context, *pb.Task) (*pb.Job, *pb.Job, *pb.Job, *pb.Job, error) PipelinePut(context.Context, *pb.Pipeline) error PipelineGet(context.Context, *pb.Ref_Pipeline) (*pb.Pipeline, error) PipelineDelete(context.Context, *pb.Ref_Pipeline) error PipelineList(context.Context, *pb.Ref_Project) ([]*pb.Pipeline, error) PipelineRunPut(context.Context, *pb.PipelineRun) error PipelineRunGet(context.Context, *pb.Ref_Pipeline, uint64) (*pb.PipelineRun, error) PipelineRunGetLatest(context.Context, string) (*pb.PipelineRun, error) PipelineRunGetById(context.Context, string) (*pb.PipelineRun, error) PipelineRunList(context.Context, *pb.Ref_Pipeline) ([]*pb.PipelineRun, error) }
Interface is the primary interface implemented by an implementation.
Any changes to this interface will require changes to all implementations in all projects.
type Job ¶
type Job struct { // Full job structure. *pb.Job // OutputBuffer is the terminal output for this job. This is a buffer // that may not contain the full amount of output depending on the // time of connection. OutputBuffer *logbuffer.Buffer // Blocked is true if this job is blocked for some reason. The reasons // a job may be blocked: // - another job for the same project/app/workspace. // - a dependent job hasn't completed yet Blocked bool }
Job is the exported structure that is returned for most state APIs and gives callers access to more information than the pure job structure.
type ListOperationOption ¶
type ListOperationOption func(opts *ListOperationOptions)
ListOperationOption is an exported type to set configuration for listing operations.
func ListWithOrder ¶
func ListWithOrder(f *pb.OperationOrder) ListOperationOption
ListWithOrder sets ordering on the list operation.
func ListWithPhysicalState ¶
func ListWithPhysicalState(f pb.Operation_PhysicalState) ListOperationOption
ListWithPhysicalState sets ordering on the list operation.
func ListWithStatusFilter ¶
func ListWithStatusFilter(f ...*pb.StatusFilter) ListOperationOption
ListWithStatusFilter sets a status filter.
func ListWithWatchSet ¶
func ListWithWatchSet(ws memdb.WatchSet) ListOperationOption
ListWithWatchSet registers watches for the listing, allowing the watcher to detect if new items are added.
func ListWithWorkspace ¶
func ListWithWorkspace(f *pb.Ref_Workspace) ListOperationOption
ListWithWorkspace sets ordering on the list operation.
type ListOperationOptions ¶
type ListOperationOptions struct { Application *pb.Ref_Application Workspace *pb.Ref_Workspace Status []*pb.StatusFilter Order *pb.OperationOrder PhysicalState pb.Operation_PhysicalState WatchSet memdb.WatchSet }
ListOperationOptions are options that can be set for List calls on operations for filtering and limiting the response.
func BuildListOperationOptions ¶
func BuildListOperationOptions(ref *pb.Ref_Application, opts ...ListOperationOption) *ListOperationOptions
BuildListOperationOptions is a helper for implementations to create a ListOperationOptions from an app ref and a set of options.
type Pruner ¶
Pruner is implemented by state storage implementations that require a periodic prune. The implementation can't control when this is called, but it will be called roughly every hour or shorter.
During pruning, other operations are still allowed to come in. It is up to the state implementation to handle safe concurrency.