Documentation
¶
Index ¶
- Constants
- Variables
- func AutoMergeWorkspaceKey(organization, workspace string) string
- type AutoMergeRef
- type AutoMergeResult
- type AutoMergeState
- type AutoMergeWorkspaceState
- type RunEvent
- type RunMetadata
- type RunPollingTask
- type Stream
- func (s *Stream) AddRunMeta(rmd RunMetadata) error
- func (s *Stream) BeginAutoMergeApply(ref AutoMergeRef, workspaces []string) error
- func (s *Stream) EnsureAutoMergeState(state *AutoMergeState) error
- func (s *Stream) FinalizeAutoMerge(ref AutoMergeRef, merged bool) (AutoMergeResult, bool, error)
- func (s *Stream) GetRunMeta(runID string) (RunMetadata, error)
- func (s *Stream) HealthCheck() error
- func (s *Stream) NewTFRunPollingTask(meta RunMetadata, delay time.Duration) RunPollingTask
- func (s *Stream) PublishTFRunEvent(ctx context.Context, re RunEvent) error
- func (s *Stream) RecordAutoMergeRequested(ref AutoMergeRef) error
- func (s *Stream) RecordAutoMergeSuccess(ref AutoMergeRef) (bool, error)
- func (s *Stream) RegisterAutoMergeRun(ref AutoMergeRef) error
- func (s *Stream) ReleaseAutoMergeClaim(ref AutoMergeRef) error
- func (s *Stream) SubscribeTFRunEvents(vcsProvider string, cb func(run RunEvent) bool) (closer func(), err error)
- func (s *Stream) SubscribeTFRunPollingTasks(cb func(task RunPollingTask) bool) (closer func(), err error)
- type StreamClient
- type TFRunEvent
- func (e *TFRunEvent) GetContext() context.Context
- func (e *TFRunEvent) GetMetadata() RunMetadata
- func (e *TFRunEvent) GetNewStatus() string
- func (e *TFRunEvent) GetRunID() string
- func (e *TFRunEvent) SetCarrier(carrier map[string]string)
- func (e *TFRunEvent) SetContext(ctx context.Context)
- func (e *TFRunEvent) SetMetadata(meta RunMetadata)
- type TFRunMetadata
- func (r *TFRunMetadata) GetAction() string
- func (r *TFRunMetadata) GetAutoMerge() bool
- func (r *TFRunMetadata) GetAutoMergeGeneration() string
- func (r *TFRunMetadata) GetAutoMergeSequence() int64
- func (r *TFRunMetadata) GetCommitSHA() string
- func (r *TFRunMetadata) GetDiscussionID() string
- func (r *TFRunMetadata) GetMRInternalID() int
- func (r *TFRunMetadata) GetMRProjectNameWithNamespace() string
- func (r *TFRunMetadata) GetOrganization() string
- func (r *TFRunMetadata) GetRootNoteID() int64
- func (r *TFRunMetadata) GetRunID() string
- func (r *TFRunMetadata) GetVcsProvider() string
- func (r *TFRunMetadata) GetWorkspace() string
- type TFRunPollingTask
- func (task *TFRunPollingTask) Completed() error
- func (task *TFRunPollingTask) GetContext() context.Context
- func (task *TFRunPollingTask) GetLastStatus() string
- func (task *TFRunPollingTask) GetRunID() string
- func (task *TFRunPollingTask) GetRunMetaData() RunMetadata
- func (task *TFRunPollingTask) Reschedule(ctx context.Context) error
- func (task *TFRunPollingTask) Schedule(ctx context.Context) error
- func (task *TFRunPollingTask) SetCarrier(carrier map[string]string)
- func (task *TFRunPollingTask) SetLastStatus(status string)
Constants ¶
const ( ApplyAction string = "apply" PlanAction string = "plan" )
const (
// AutoMergeMetadataKvBucket stores aggregate state for each VCS change and commit.
AutoMergeMetadataKvBucket = "AUTO_MERGE_METADATA"
)
const RunEventsStreamName = "RUN_EVENTS"
const RunMetadataKvBucket = "RUN_METADATA"
const RunPollingKvName = "POLLING_TASKS"
const RunPollingStreamNameV0 = "RUN_POLLING"
const TaskPollingDelayDefault = 10 * time.Second
const TaskPollingDelayMinimum = 1 * time.Second
Variables ¶
var ErrAutoMergeStateNotFound = errors.New("auto-merge state not found")
var FailedResponse = []byte("failed")
var SuccessDoneResponse = []byte("done")
var SuccessResponse = []byte("success")
Functions ¶
func AutoMergeWorkspaceKey ¶ added in v0.7.0
Types ¶
type AutoMergeRef ¶ added in v0.7.0
type AutoMergeRef struct {
// VcsProvider, Project, MergeRequest, and CommitSHA locate aggregate state.
VcsProvider string
Project string
MergeRequest int
CommitSHA string
// Organization and Workspace select one workspace within the aggregate.
Organization string
Workspace string
// RunID identifies the TFC apply reporting an event.
RunID string
// Generation identifies the apply command that dispatched RunID.
Generation string
// Sequence rejects events from an older apply command.
Sequence int64
}
AutoMergeRef identifies one workspace apply within an MR commit.
func AutoMergeRefForRun ¶ added in v0.7.0
func AutoMergeRefForRun(run RunMetadata) AutoMergeRef
type AutoMergeResult ¶ added in v0.7.0
type AutoMergeResult string
const ( AutoMergeResultAutoMerged AutoMergeResult = "auto_merged" AutoMergeResultManuallyMerged AutoMergeResult = "manually_merged" AutoMergeResultClosedUnmerged AutoMergeResult = "closed_unmerged" )
type AutoMergeState ¶ added in v0.7.0
type AutoMergeState struct {
// VcsProvider and Project identify the repository containing the change.
VcsProvider string `json:"vcs_provider"`
Project string `json:"project"`
// MergeRequest and CommitSHA pin this state to one immutable change revision.
MergeRequest int `json:"merge_request"`
CommitSHA string `json:"commit_sha"`
// Eligible is true only when every affected workspace opted into auto-merge.
Eligible bool `json:"eligible"`
// Workspaces tracks the current apply state of every affected workspace.
Workspaces map[string]*AutoMergeWorkspaceState `json:"workspaces"`
// MergeClaimed atomically grants one worker permission to request the merge.
MergeClaimed bool `json:"merge_claimed"`
// MergeRequested records that the VCS accepted TFBuddy's merge request.
MergeRequested bool `json:"merge_requested"`
// Finalized prevents duplicate terminal VCS webhooks from recording a result twice.
Finalized bool `json:"finalized"`
}
AutoMergeState coordinates all workspaces affected by one MR commit.
func NewAutoMergeState ¶ added in v0.7.0
type AutoMergeWorkspaceState ¶ added in v0.7.0
type AutoMergeWorkspaceState struct {
// Generation identifies the apply command that dispatched this workspace run.
Generation string `json:"generation,omitempty"`
// Sequence orders apply commands so older deliveries cannot replace newer state.
Sequence int64 `json:"sequence,omitempty"`
// RunID identifies the current non-targeted TFC apply for this generation.
RunID string `json:"run_id,omitempty"`
// Applied records whether RunID completed successfully.
Applied bool `json:"applied"`
}
AutoMergeWorkspaceState tracks the newest apply run for one workspace. Applied is only true when that exact run completed successfully without targets.
type RunEvent ¶
type RunEvent interface {
GetRunID() string
GetContext() context.Context
SetContext(context.Context)
SetCarrier(map[string]string)
GetNewStatus() string
GetMetadata() RunMetadata
SetMetadata(RunMetadata)
}
type RunMetadata ¶
type RunMetadata interface {
GetAction() string
GetMRInternalID() int
GetRootNoteID() int64
GetMRProjectNameWithNamespace() string
GetDiscussionID() string
GetRunID() string
GetWorkspace() string
GetCommitSHA() string
GetOrganization() string
GetVcsProvider() string
GetAutoMerge() bool
GetAutoMergeGeneration() string
GetAutoMergeSequence() int64
}
type RunPollingTask ¶
type Stream ¶
type Stream struct {
// contains filtered or unexported fields
}
func (*Stream) AddRunMeta ¶
func (s *Stream) AddRunMeta(rmd RunMetadata) error
func (*Stream) BeginAutoMergeApply ¶ added in v0.7.0
func (s *Stream) BeginAutoMergeApply(ref AutoMergeRef, workspaces []string) error
BeginAutoMergeApply atomically marks every workspace selected by one apply command pending before any per-workspace run is dispatched.
func (*Stream) EnsureAutoMergeState ¶ added in v0.7.0
func (s *Stream) EnsureAutoMergeState(state *AutoMergeState) error
func (*Stream) FinalizeAutoMerge ¶ added in v0.7.0
func (s *Stream) FinalizeAutoMerge(ref AutoMergeRef, merged bool) (AutoMergeResult, bool, error)
func (*Stream) GetRunMeta ¶
func (s *Stream) GetRunMeta(runID string) (RunMetadata, error)
func (*Stream) HealthCheck ¶
func (*Stream) NewTFRunPollingTask ¶
func (s *Stream) NewTFRunPollingTask(meta RunMetadata, delay time.Duration) RunPollingTask
func (*Stream) PublishTFRunEvent ¶
func (*Stream) RecordAutoMergeRequested ¶ added in v0.7.0
func (s *Stream) RecordAutoMergeRequested(ref AutoMergeRef) error
func (*Stream) RecordAutoMergeSuccess ¶ added in v0.7.0
func (s *Stream) RecordAutoMergeSuccess(ref AutoMergeRef) (bool, error)
RecordAutoMergeSuccess marks the current run successful and atomically claims the merge when every expected workspace is applied. Duplicate or stale run events are harmless and cannot claim the merge.
func (*Stream) RegisterAutoMergeRun ¶ added in v0.7.0
func (s *Stream) RegisterAutoMergeRun(ref AutoMergeRef) error
func (*Stream) ReleaseAutoMergeClaim ¶ added in v0.7.0
func (s *Stream) ReleaseAutoMergeClaim(ref AutoMergeRef) error
func (*Stream) SubscribeTFRunEvents ¶
func (*Stream) SubscribeTFRunPollingTasks ¶
func (s *Stream) SubscribeTFRunPollingTasks(cb func(task RunPollingTask) bool) (closer func(), err error)
type StreamClient ¶
type StreamClient interface {
HealthCheck() error
PublishTFRunEvent(ctx context.Context, re RunEvent) error
AddRunMeta(rmd RunMetadata) error
GetRunMeta(runID string) (RunMetadata, error)
EnsureAutoMergeState(state *AutoMergeState) error
BeginAutoMergeApply(ref AutoMergeRef, workspaces []string) error
RegisterAutoMergeRun(ref AutoMergeRef) error
RecordAutoMergeSuccess(ref AutoMergeRef) (bool, error)
ReleaseAutoMergeClaim(ref AutoMergeRef) error
RecordAutoMergeRequested(ref AutoMergeRef) error
FinalizeAutoMerge(ref AutoMergeRef, merged bool) (AutoMergeResult, bool, error)
NewTFRunPollingTask(meta RunMetadata, delay time.Duration) RunPollingTask
SubscribeTFRunPollingTasks(cb func(task RunPollingTask) bool) (closer func(), err error)
SubscribeTFRunEvents(queue string, cb func(run RunEvent) bool) (closer func(), err error)
}
func NewStream ¶
func NewStream(js nats.JetStreamContext, dedupWindow time.Duration) StreamClient
NewStream wires up the runstream JetStream client. dedupWindow is the JetStream Duplicates window applied to the RUN_EVENTS stream so that Nats-Msg-Id-based dedup actually fires server-side. Operators tune it via TFBUDDY_JETSTREAM_DEDUP_WINDOW.
type TFRunEvent ¶
type TFRunEvent struct {
RunID string
Organization string
Workspace string
NewStatus string
Metadata RunMetadata
Carrier propagation.MapCarrier `json:"Carrier"`
// contains filtered or unexported fields
}
TFRunEvent represents a status change on a run
func (*TFRunEvent) GetContext ¶ added in v0.2.1
func (e *TFRunEvent) GetContext() context.Context
func (*TFRunEvent) GetMetadata ¶
func (e *TFRunEvent) GetMetadata() RunMetadata
func (*TFRunEvent) GetNewStatus ¶
func (e *TFRunEvent) GetNewStatus() string
func (*TFRunEvent) GetRunID ¶
func (e *TFRunEvent) GetRunID() string
func (*TFRunEvent) SetCarrier ¶ added in v0.2.1
func (e *TFRunEvent) SetCarrier(carrier map[string]string)
func (*TFRunEvent) SetContext ¶ added in v0.2.1
func (e *TFRunEvent) SetContext(ctx context.Context)
func (*TFRunEvent) SetMetadata ¶
func (e *TFRunEvent) SetMetadata(meta RunMetadata)
type TFRunMetadata ¶
type TFRunMetadata struct {
// RunID is the ID generated by TFC for the run
RunID string
// Organization is the TFC organization name
Organization string
// Workspace is the TFC workspace name
Workspace string
// Source is the trigger source of the TFC run
// options include:
// "merge_request" - for runs started via MR push or comment
// "merge" - for runs started when MR is merged (apply after merge repos) (NOT IMPLEMENTED)
// "slack" - for runs started via ChatOps (NOT IMPLEMENTED)
Source string
// Action is the triggered action (i.e. plan / apply)
Action string
// The git Commit SHA for which the run has been triggered
CommitSHA string
// MergeRequestProjectNameWithNamespace is the fully qualified Gitlab project name (e.g. /group/subgroup/project)
MergeRequestProjectNameWithNamespace string
// MergeRequestIID is the Gitlab Merge Request IID for which the Run has been triggered
MergeRequestIID int
// DiscussionID is the MergeRequest discussion thread where status updates should be written (optional)
DiscussionID string
// RootNoteID is the top level note of the discussion thread. It will be updated with progress info.
RootNoteID int64
VcsProvider string
AutoMerge bool
AutoMergeGeneration string
AutoMergeSequence int64
}
func (*TFRunMetadata) GetAction ¶
func (r *TFRunMetadata) GetAction() string
func (*TFRunMetadata) GetAutoMerge ¶ added in v0.3.0
func (r *TFRunMetadata) GetAutoMerge() bool
func (*TFRunMetadata) GetAutoMergeGeneration ¶ added in v0.7.0
func (r *TFRunMetadata) GetAutoMergeGeneration() string
func (*TFRunMetadata) GetAutoMergeSequence ¶ added in v0.7.0
func (r *TFRunMetadata) GetAutoMergeSequence() int64
func (*TFRunMetadata) GetCommitSHA ¶
func (r *TFRunMetadata) GetCommitSHA() string
func (*TFRunMetadata) GetDiscussionID ¶
func (r *TFRunMetadata) GetDiscussionID() string
func (*TFRunMetadata) GetMRInternalID ¶
func (r *TFRunMetadata) GetMRInternalID() int
func (*TFRunMetadata) GetMRProjectNameWithNamespace ¶
func (r *TFRunMetadata) GetMRProjectNameWithNamespace() string
func (*TFRunMetadata) GetOrganization ¶
func (r *TFRunMetadata) GetOrganization() string
func (*TFRunMetadata) GetRootNoteID ¶
func (r *TFRunMetadata) GetRootNoteID() int64
func (*TFRunMetadata) GetRunID ¶
func (r *TFRunMetadata) GetRunID() string
func (*TFRunMetadata) GetVcsProvider ¶
func (r *TFRunMetadata) GetVcsProvider() string
func (*TFRunMetadata) GetWorkspace ¶
func (r *TFRunMetadata) GetWorkspace() string
type TFRunPollingTask ¶
type TFRunPollingTask struct {
RunMetadata
LastStatus string
NextPoll time.Time
Processing bool
LastUpdate time.Time
// Revision is the NATS KV entry revision
Revision uint64
Carrier propagation.MapCarrier `json:"Carrier"`
// contains filtered or unexported fields
}
func (*TFRunPollingTask) Completed ¶
func (task *TFRunPollingTask) Completed() error
func (*TFRunPollingTask) GetContext ¶ added in v0.2.1
func (task *TFRunPollingTask) GetContext() context.Context
func (*TFRunPollingTask) GetLastStatus ¶
func (task *TFRunPollingTask) GetLastStatus() string
func (*TFRunPollingTask) GetRunID ¶
func (task *TFRunPollingTask) GetRunID() string
func (*TFRunPollingTask) GetRunMetaData ¶
func (task *TFRunPollingTask) GetRunMetaData() RunMetadata
func (*TFRunPollingTask) Reschedule ¶
func (task *TFRunPollingTask) Reschedule(ctx context.Context) error
func (*TFRunPollingTask) Schedule ¶
func (task *TFRunPollingTask) Schedule(ctx context.Context) error
func (*TFRunPollingTask) SetCarrier ¶ added in v0.2.1
func (task *TFRunPollingTask) SetCarrier(carrier map[string]string)
func (*TFRunPollingTask) SetLastStatus ¶
func (task *TFRunPollingTask) SetLastStatus(status string)