v1alpha1

package
v0.4.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 20, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

Documentation

Overview

Package v1alpha1 contains the Hecate API.

Hecate models delivery as four things:

Beacon  — watches artifact sources and emits Bundles when something new appears.
Bundle  — an immutable, content-addressed set of artifact versions. The unit that moves.
Gate    — an environment, and the threshold a Bundle must cross to enter it.
Passage — one attempt to move a Bundle through a Gate.

The vocabulary is deliberate: Hecate Kleidouchos is the key-holder who stands at the threshold and decides what may pass.

+kubebuilder:object:generate=true +groupName=hecate.dev

Index

Constants

View Source
const (
	// ConditionReady means the resource is doing its job.
	ConditionReady = "Ready"
	// ConditionReconciling means the controller is actively working on it.
	ConditionReconciling = "Reconciling"
	// ConditionStalled means the controller has stopped retrying.
	ConditionStalled = "Stalled"
)

Condition type names used across Hecate resources.

View Source
const AnnotationReconcile = "reconcile.fluxcd.io/requestedAt"

AnnotationReconcile asks a Beacon or Gate to reconcile immediately, rather than at the end of its interval:

kubectl annotate beacon/app reconcile.fluxcd.io/requestedAt="$(date +%s)" --overwrite

**This is Flux's annotation, on purpose.** It is the same operation people already perform on Flux objects, and asking them to learn a second key for it would be a parallel convention with nothing to recommend it — the strategy is to follow Flux rather than invent alongside (D44). Tooling that already pokes Flux resources this way works on a Beacon unchanged.

The value is opaque and echoed back in `status.lastHandledReconcileAt`, so a caller can tell its own request apart from someone else's.

Variables

View Source
var AddToScheme = SchemeBuilder.AddToScheme

AddToScheme adds the Hecate types to a runtime.Scheme.

View Source
var GroupVersion = schema.GroupVersion{Group: "hecate.dev", Version: "v1alpha1"}

GroupVersion is the group and version of the Hecate API.

View Source
var SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)

SchemeBuilder registers the Hecate types with a runtime.Scheme.

apimachinery's builder rather than controller-runtime's, which is deprecated on the grounds that an API package should have minimal dependencies. Taking that seriously is the point: this package is importable on its own, by a controller, an operator or a CLI that wants the types and nothing else, and it no longer drags controller-runtime along to get them.

Functions

func BundleName

func BundleName(beacon, digest string) string

Name returns the object name for a Bundle with the given digest: the Beacon name and a short digest, which keeps `kubectl get bundles` readable while staying collision-safe in practice.

func ComputeDigest

func ComputeDigest(artifacts []Artifact) string

ComputeDigest returns the content address of a set of artifacts.

Artifacts are canonicalised and sorted before hashing so that ordering in the spec never changes the digest — otherwise the same release discovered in a different order would look like a different Bundle and get promoted twice.

func ReconcileRequestedAt

func ReconcileRequestedAt(annotations map[string]string) string

ReconcileRequestedAt reads the reconcile-request token from an object, or "" when none was set.

Types

type Admission

type Admission struct {
	// From names the Beacon whose Bundles this admission covers.
	From BundleOrigin `json:"from"`
	// After lists upstream Gates a Bundle must have cleared first. Empty means
	// the Bundle may come straight from the Beacon — the entry point of a
	// pipeline.
	//
	// +optional
	After []string `json:"after,omitempty"`
	// RequireApproval blocks crossing until a human explicitly approves the
	// Bundle for this Gate, regardless of upstream state.
	//
	// +optional
	RequireApproval bool `json:"requireApproval,omitempty"`
}

Admission declares one class of Bundle this Gate accepts.

func (*Admission) DeepCopy

func (in *Admission) DeepCopy() *Admission

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Admission.

func (*Admission) DeepCopyInto

func (in *Admission) DeepCopyInto(out *Admission)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Artifact

type Artifact struct {
	// +optional
	Image *ImageArtifact `json:"image,omitempty"`
	// +optional
	Chart *ChartArtifact `json:"chart,omitempty"`
	// +optional
	Commit *CommitArtifact `json:"commit,omitempty"`
}

Artifact is one versioned thing. Exactly one field must be set.

+kubebuilder:validation:MaxProperties=1 +kubebuilder:validation:MinProperties=1

func (*Artifact) DeepCopy

func (in *Artifact) DeepCopy() *Artifact

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Artifact.

func (*Artifact) DeepCopyInto

func (in *Artifact) DeepCopyInto(out *Artifact)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Beacon

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

	Spec   BeaconSpec   `json:"spec"`
	Status BeaconStatus `json:"status,omitempty"`
}

Beacon watches artifact sources and emits a Bundle whenever it sees a new combination worth promoting.

One Beacon per set of artifacts that move together. Two services released on independent schedules want two Beacons, so a change to one does not drag the other through the pipeline with it.

func (*Beacon) DeepCopy

func (in *Beacon) DeepCopy() *Beacon

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Beacon.

func (*Beacon) DeepCopyInto

func (in *Beacon) DeepCopyInto(out *Beacon)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*Beacon) DeepCopyObject

func (in *Beacon) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type BeaconList

type BeaconList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []Beacon `json:"items"`
}

BeaconList is a list of Beacons.

func (*BeaconList) DeepCopy

func (in *BeaconList) DeepCopy() *BeaconList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BeaconList.

func (*BeaconList) DeepCopyInto

func (in *BeaconList) DeepCopyInto(out *BeaconList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*BeaconList) DeepCopyObject

func (in *BeaconList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type BeaconSpec

type BeaconSpec struct {
	// Interval is how often to poll the watched sources. Sources that support
	// webhooks will also emit on push; the interval is the safety net, not the
	// primary mechanism.
	//
	// +kubebuilder:default="5m"
	// +optional
	Interval metav1.Duration `json:"interval,omitempty"`
	// Watch lists the artifact sources to observe.
	//
	// +kubebuilder:validation:MinItems=1
	Watch []WatchSource `json:"watch"`
	// Emit controls when Bundles are created.
	//
	// +kubebuilder:default=Automatic
	// +optional
	Emit EmitPolicy `json:"emit,omitempty"`
	// Retain bounds how many *unreferenced* Bundles from this Beacon are kept.
	//
	// A Beacon polling every couple of minutes emits indefinitely; unbounded,
	// that is etcd growth with no ceiling and a `kubectl get bundles` nobody can
	// read. Zero disables collection entirely.
	//
	// Bundles in use are never collected regardless of this value — see the
	// safety rule in D13. The long-term record belongs in the evidence store,
	// not in etcd.
	//
	// +kubebuilder:default=10
	// +kubebuilder:validation:Minimum=0
	// +optional
	Retain *int32 `json:"retain,omitempty"`
	// Suspend stops this Beacon from discovering anything new, without
	// deleting it. Existing Bundles are unaffected.
	//
	// +optional
	Suspend bool `json:"suspend,omitempty"`
}

BeaconSpec describes what to watch and when to emit.

func (*BeaconSpec) DeepCopy

func (in *BeaconSpec) DeepCopy() *BeaconSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BeaconSpec.

func (*BeaconSpec) DeepCopyInto

func (in *BeaconSpec) DeepCopyInto(out *BeaconSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type BeaconStatus

type BeaconStatus struct {
	// ObservedGeneration is the spec generation this status describes. If it
	// lags metadata.generation, this status is about the previous spec.
	//
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
	// Conditions follow the standard Kubernetes convention.
	//
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`
	// LastHandledReconcileAt echoes the value of the
	// reconcile.fluxcd.io/requestedAt annotation from the last reconcile that
	// acted on it.
	//
	// Without this a caller cannot tell whether its request landed, only that
	// *a* reconcile happened — so a CI job asking for an immediate poll has
	// nothing to wait for. Echoing the caller's own opaque token also
	// distinguishes it from someone else's request (D44).
	//
	// +optional
	LastHandledReconcileAt string `json:"lastHandledReconcileAt,omitempty"`
	// LastPolled is when the sources were last checked.
	//
	// +optional
	LastPolled *metav1.Time `json:"lastPolled,omitempty"`
	// LatestBundle is the most recent Bundle this Beacon emitted.
	//
	// +optional
	LatestBundle string `json:"latestBundle,omitempty"`
	// Discovered is the newest artifact version seen per source, whether or not
	// it produced a Bundle. Useful for answering "why has nothing been emitted?"
	//
	// +optional
	Discovered []Artifact `json:"discovered,omitempty"`
}

BeaconStatus reports what the Beacon has seen.

func (*BeaconStatus) DeepCopy

func (in *BeaconStatus) DeepCopy() *BeaconStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BeaconStatus.

func (*BeaconStatus) DeepCopyInto

func (in *BeaconStatus) DeepCopyInto(out *BeaconStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Bundle

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

	Spec   BundleSpec   `json:"spec"`
	Status BundleStatus `json:"status,omitempty"`
}

Bundle is an immutable, content-addressed set of artifact versions — for example one git commit plus two container images — that move through the pipeline together.

A Bundle is never edited. Any change in artifact versions is a different Bundle with a different digest. Artifacts that need to move at different cadences belong in different Beacons, and therefore different Bundles.

func (*Bundle) ApprovalFor

func (b *Bundle) ApprovalFor(gate string) *BundleApproval

ApprovalFor returns the approval recorded for a Gate, or nil.

Callers that need the approver — recording it in Fides, showing who signed off — want this rather than the boolean, so the name never has to be looked up a second way.

func (*Bundle) DeepCopy

func (in *Bundle) DeepCopy() *Bundle

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Bundle.

func (*Bundle) DeepCopyInto

func (in *Bundle) DeepCopyInto(out *Bundle)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*Bundle) DeepCopyObject

func (in *Bundle) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*Bundle) HasCleared

func (b *Bundle) HasCleared(gate string) bool

HasCleared reports whether this Bundle has successfully passed the named Gate.

func (*Bundle) IsApprovedFor

func (b *Bundle) IsApprovedFor(gate string) bool

IsApprovedFor reports whether a human has explicitly approved this Bundle for the named Gate.

Being approved does not make a Bundle eligible on its own: upstream ordering is checked first and independently (D51).

func (*Bundle) WasBlockedBy added in v0.2.0

func (b *Bundle) WasBlockedBy(gate string) bool

WasBlockedBy reports whether a crossing of this Gate has already failed.

Consulted only by automatic crossing (see gate.NextAuto), never by eligibility: an operator asking for a promotion is entitled to retry, and answering "no" to a human because a previous attempt failed would leave them with nothing to do but edit status by hand.

type BundleApproval

type BundleApproval struct {
	// Gate is the Gate this Bundle is approved for.
	Gate string `json:"gate"`
	// Actor is who approved it. Required, and the whole point of the record.
	Actor string `json:"actor"`
	// At is when the approval was given.
	At metav1.Time `json:"at"`
}

BundleApproval is one human's sign-off for one Gate.

func (*BundleApproval) DeepCopy

func (in *BundleApproval) DeepCopy() *BundleApproval

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleApproval.

func (*BundleApproval) DeepCopyInto

func (in *BundleApproval) DeepCopyInto(out *BundleApproval)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type BundleList

type BundleList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []Bundle `json:"items"`
}

BundleList is a list of Bundles.

func (*BundleList) DeepCopy

func (in *BundleList) DeepCopy() *BundleList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleList.

func (*BundleList) DeepCopyInto

func (in *BundleList) DeepCopyInto(out *BundleList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*BundleList) DeepCopyObject

func (in *BundleList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type BundleOrigin

type BundleOrigin struct {
	// Beacon is the emitting Beacon's name, in this namespace.
	Beacon string `json:"beacon"`
}

BundleOrigin identifies where admitted Bundles come from.

func (*BundleOrigin) DeepCopy

func (in *BundleOrigin) DeepCopy() *BundleOrigin

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleOrigin.

func (*BundleOrigin) DeepCopyInto

func (in *BundleOrigin) DeepCopyInto(out *BundleOrigin)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type BundleSpec

type BundleSpec struct {
	// Beacon names the Beacon that produced this Bundle.
	Beacon string `json:"beacon"`
	// Digest is the content address of this Bundle: a deterministic hash over
	// its artifact versions. Two Bundles with identical artifacts always have
	// the same digest, which is what makes "has this exact thing already been
	// through staging?" answerable.
	//
	// Set by the controller; ignored on input.
	//
	// +optional
	Digest string `json:"digest,omitempty"`
	// Alias is an optional short human-readable handle, so people can say
	// "promote wandering-owl" instead of reciting a hash.
	//
	// +optional
	Alias string `json:"alias,omitempty"`
	// Artifacts are the versioned things this Bundle carries.
	//
	// +kubebuilder:validation:MinItems=1
	Artifacts []Artifact `json:"artifacts"`
}

BundleSpec is the immutable content of a Bundle.

func (*BundleSpec) DeepCopy

func (in *BundleSpec) DeepCopy() *BundleSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleSpec.

func (*BundleSpec) DeepCopyInto

func (in *BundleSpec) DeepCopyInto(out *BundleSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type BundleStatus

type BundleStatus struct {
	// Cleared lists the Gates this Bundle has successfully passed, in order.
	// This is the "how did it get to prod?" record.
	//
	// +optional
	Cleared []GateCrossing `json:"cleared,omitempty"`
	// Blocked lists Gates that rejected this Bundle, with the reason.
	//
	// +optional
	Blocked []GateCrossing `json:"blocked,omitempty"`
	// ApprovedFor lists the Gates a human has explicitly approved this Bundle
	// for.
	//
	// An approval is an *additional* requirement, never an override: upstream
	// ordering is checked first, and a Bundle that has not cleared staging
	// stays ineligible for production no matter who approves it (D51). This
	// comment used to claim the opposite, which would have made an approval a
	// silent way past the whole pipeline.
	//
	// Each entry names its approver. An approval that does not say who gave it
	// cannot satisfy four-eyes anywhere downstream — Fides evaluates
	// segregation of duties by comparing the committer, the approver and the
	// deployer as identities, and "approved" with no name is indistinguishable
	// from the author approving their own change.
	//
	// +optional
	// +listType=map
	// +listMapKey=gate
	ApprovedFor []BundleApproval `json:"approvedFor,omitempty"`
}

BundleStatus records where this Bundle has been.

func (*BundleStatus) DeepCopy

func (in *BundleStatus) DeepCopy() *BundleStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleStatus.

func (*BundleStatus) DeepCopyInto

func (in *BundleStatus) DeepCopyInto(out *BundleStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ChartArtifact

type ChartArtifact struct {
	// Repo is the chart repository — an HTTPS Helm repo or an OCI registry.
	Repo string `json:"repo"`
	// Name is the chart name. Empty for OCI charts, where the repo already
	// identifies the chart.
	//
	// +optional
	Name string `json:"name,omitempty"`
	// Version is the resolved chart version.
	Version string `json:"version"`
}

ChartArtifact is a Helm chart at a specific version.

func (*ChartArtifact) DeepCopy

func (in *ChartArtifact) DeepCopy() *ChartArtifact

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChartArtifact.

func (*ChartArtifact) DeepCopyInto

func (in *ChartArtifact) DeepCopyInto(out *ChartArtifact)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ChartWatch

type ChartWatch struct {
	// Repo is an HTTPS Helm repository or an OCI registry reference.
	Repo string `json:"repo"`
	// Name is the chart name. Omit for OCI, where Repo identifies the chart.
	//
	// +optional
	Name string `json:"name,omitempty"`
	// Constraint is a semantic version range, e.g. "^6.0.0".
	//
	// +optional
	Constraint string `json:"constraint,omitempty"`
	// +optional
	CredentialsRef *LocalSecretRef `json:"credentialsRef,omitempty"`
}

ChartWatch watches a Helm chart repository.

func (*ChartWatch) DeepCopy

func (in *ChartWatch) DeepCopy() *ChartWatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChartWatch.

func (*ChartWatch) DeepCopyInto

func (in *ChartWatch) DeepCopyInto(out *ChartWatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CommitArtifact

type CommitArtifact struct {
	// Repo is the git repository URL.
	Repo string `json:"repo"`
	// SHA is the full commit SHA.
	SHA string `json:"sha"`
	// Branch or Tag records how the commit was found, for display.
	//
	// +optional
	Branch string `json:"branch,omitempty"`
	// +optional
	Tag string `json:"tag,omitempty"`
	// Message is the commit subject, for display.
	//
	// +optional
	Message string `json:"message,omitempty"`
}

CommitArtifact is a git commit.

func (*CommitArtifact) DeepCopy

func (in *CommitArtifact) DeepCopy() *CommitArtifact

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommitArtifact.

func (*CommitArtifact) DeepCopyInto

func (in *CommitArtifact) DeepCopyInto(out *CommitArtifact)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type EmitPolicy

type EmitPolicy string

EmitPolicy controls Bundle creation.

+kubebuilder:validation:Enum={Automatic,Manual}

const (
	// EmitAutomatic creates a Bundle as soon as a new artifact combination is
	// discovered.
	EmitAutomatic EmitPolicy = "Automatic"
	// EmitManual discovers artifacts but never creates Bundles on its own.
	// Someone must ask for one.
	EmitManual EmitPolicy = "Manual"
)

type EvidenceConfig

type EvidenceConfig struct {
	// FidesEnvironment is the Fides environment this Gate corresponds to.
	//
	// Explicit, and a UUID, because that is what the environment-scoped Fides
	// checks take: `/api/v1/environments/{uuid}/policy-check` and
	// `/api/v1/environments/{uuid}/allowlist`. There is no convention that
	// could produce one — an environment's name is not its key — and a
	// convention that silently resolved to the wrong environment would check
	// the wrong policy while reporting success, which is the worst failure a
	// compliance control can have.
	//
	// +kubebuilder:validation:Pattern=`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$`
	FidesEnvironment string `json:"fidesEnvironment"`
	// ServerURL is the Fides server. Empty falls back to the controller's
	// --fides-server flag, so a fleet with one Fides says it once.
	//
	// +optional
	ServerURL string `json:"serverURL,omitempty"`
	// CredentialsRef names a Secret holding a Fides API key under `token`.
	//
	// +optional
	CredentialsRef *LocalSecretRef `json:"credentialsRef,omitempty"`
}

EvidenceConfig binds a Gate to a Fides environment.

One block rather than a scatter of top-level fields, because the rest of the compliance settings — which flow a crossing's trail belongs to, what change-gate risk score is tolerable — land here too.

func (*EvidenceConfig) DeepCopy

func (in *EvidenceConfig) DeepCopy() *EvidenceConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EvidenceConfig.

func (*EvidenceConfig) DeepCopyInto

func (in *EvidenceConfig) DeepCopyInto(out *EvidenceConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type EvidenceRef

type EvidenceRef struct {
	// Trail is the Fides trail identifier for this Passage.
	//
	// +optional
	Trail string `json:"trail,omitempty"`
	// Verdict is the change-gate outcome, e.g. "approve" or "hold".
	//
	// +optional
	Verdict string `json:"verdict,omitempty"`
	// Risk is the change-gate risk score, 0-100.
	//
	// +optional
	Risk *int32 `json:"risk,omitempty"`
	// Blockers are the reasons the change gate is withholding approval.
	//
	// The verdict says a crossing is held; only these say what would unblock
	// it. Without them "hold, risk 62" is a number to escalate rather than a
	// thing to fix, and the reasons existed only inside a step's message.
	//
	// +optional
	Blockers []string `json:"blockers,omitempty"`
	// URL links to the full record.
	//
	// +optional
	URL string `json:"url,omitempty"`
}

EvidenceRef points at the external compliance record for a Passage.

func (*EvidenceRef) DeepCopy

func (in *EvidenceRef) DeepCopy() *EvidenceRef

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EvidenceRef.

func (*EvidenceRef) DeepCopyInto

func (in *EvidenceRef) DeepCopyInto(out *EvidenceRef)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Gate

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

	Spec   GateSpec   `json:"spec"`
	Status GateStatus `json:"status,omitempty"`
}

Gate is an environment, and the threshold a Bundle must cross to enter it.

Gates form the pipeline: a Gate that admits Bundles only after they have cleared an upstream Gate is downstream of it. There is no separate pipeline object — the graph is implied by what each Gate admits, so it cannot drift out of sync with reality.

func (*Gate) DeepCopy

func (in *Gate) DeepCopy() *Gate

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Gate.

func (*Gate) DeepCopyInto

func (in *Gate) DeepCopyInto(out *Gate)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*Gate) DeepCopyObject

func (in *Gate) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type GateCrossing

type GateCrossing struct {
	// Gate is the Gate in question.
	Gate string `json:"gate"`
	// Passage is the Passage that produced this outcome.
	//
	// +optional
	Passage string `json:"passage,omitempty"`
	// At is when it happened.
	At metav1.Time `json:"at"`
	// Actor is who caused it — a user, or the controller for automatic passage.
	//
	// +optional
	Actor string `json:"actor,omitempty"`
	// Reason explains a block.
	//
	// +optional
	Reason string `json:"reason,omitempty"`
}

GateCrossing records one Bundle/Gate outcome.

func (*GateCrossing) DeepCopy

func (in *GateCrossing) DeepCopy() *GateCrossing

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateCrossing.

func (*GateCrossing) DeepCopyInto

func (in *GateCrossing) DeepCopyInto(out *GateCrossing)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GateList

type GateList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []Gate `json:"items"`
}

GateList is a list of Gates.

func (*GateList) DeepCopy

func (in *GateList) DeepCopy() *GateList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateList.

func (*GateList) DeepCopyInto

func (in *GateList) DeepCopyInto(out *GateList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*GateList) DeepCopyObject

func (in *GateList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type GateOccupant

type GateOccupant struct {
	// Bundle is the Bundle's object name.
	Bundle string `json:"bundle"`
	// Digest is its content address.
	//
	// +optional
	Digest string `json:"digest,omitempty"`
	// Passage is the Passage that brought it here.
	//
	// +optional
	Passage string `json:"passage,omitempty"`
	// EnteredAt is when the crossing completed.
	EnteredAt metav1.Time `json:"enteredAt"`
	// Actor is who initiated the crossing.
	//
	// +optional
	Actor string `json:"actor,omitempty"`
	// Verified reports whether this Bundle's verification succeeded here.
	// Downstream Gates should refuse to admit an unverified Bundle.
	//
	// +optional
	Verified *bool `json:"verified,omitempty"`
}

GateOccupant records a Bundle's tenure in a Gate.

func (*GateOccupant) DeepCopy

func (in *GateOccupant) DeepCopy() *GateOccupant

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateOccupant.

func (*GateOccupant) DeepCopyInto

func (in *GateOccupant) DeepCopyInto(out *GateOccupant)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GateSpec

type GateSpec struct {
	// Admits declares which Bundles may cross this Gate.
	//
	// +kubebuilder:validation:MinItems=1
	Admits []Admission `json:"admits"`
	// Passage is the sequence of steps that moves an admitted Bundle into this
	// environment. Typically: render the new state, commit it, push it, and
	// wait for the delivery engine to apply it.
	//
	// +optional
	Passage *PassageTemplate `json:"passage,omitempty"`
	// Watch describes what to monitor to decide whether this Gate is healthy
	// once a Bundle is in place.
	//
	// +optional
	Watch []HealthCheck `json:"watch,omitempty"`
	// Verify describes evidence that must be gathered after crossing before
	// downstream Gates will admit the Bundle. Health says "it is running";
	// verification says "it is working".
	//
	// +optional
	Verify []Verification `json:"verify,omitempty"`
	// Auto admits and crosses eligible Bundles without waiting to be asked.
	// Sensible for dev, rarely for production.
	//
	// +optional
	Auto bool `json:"auto,omitempty"`
	// Windows restricts when Passages may start. Outside every window, eligible
	// Bundles queue rather than fail.
	//
	// +optional
	Windows []Window `json:"windows,omitempty"`
	// Suspend stops new Passages without deleting the Gate. In-flight Passages
	// are unaffected.
	//
	// +optional
	Suspend bool `json:"suspend,omitempty"`
	// Vars are values usable in expressions throughout this Gate's Passage.
	//
	// +optional
	Vars []Var `json:"vars,omitempty"`
	// Retain bounds how many finished Passages this Gate keeps. Older ones
	// beyond the limit are deleted, newest first.
	//
	// Zero means keep everything, which is what an unset-looking field should
	// do. Unfinished Passages, and the one that produced what is currently in
	// the Gate, are never collected whatever this says.
	//
	// A Passage is the record of *how* a crossing happened, so the default is
	// higher than a Beacon's: Gates produce far fewer objects than Beacons, and
	// each is worth more. Long-term history belongs in the evidence store
	// rather than in etcd (D13).
	//
	// +optional
	// +kubebuilder:validation:Minimum=0
	Retain *int32 `json:"retain,omitempty"`
	// Evidence binds this Gate to the compliance system that records what
	// crossed it and decides what may.
	//
	// +optional
	Evidence *EvidenceConfig `json:"evidence,omitempty"`
}

GateSpec describes what this Gate admits and what crossing it involves.

func (*GateSpec) DeepCopy

func (in *GateSpec) DeepCopy() *GateSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateSpec.

func (*GateSpec) DeepCopyInto

func (in *GateSpec) DeepCopyInto(out *GateSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GateStatus

type GateStatus struct {
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`
	// LastHandledReconcileAt echoes the value of the
	// reconcile.fluxcd.io/requestedAt annotation from the last reconcile that
	// acted on it.
	//
	// Without this a caller cannot tell whether its request landed, only that
	// *a* reconcile happened — so a CI job asking for an immediate poll has
	// nothing to wait for. Echoing the caller's own opaque token also
	// distinguishes it from someone else's request (D44).
	//
	// +optional
	LastHandledReconcileAt string `json:"lastHandledReconcileAt,omitempty"`
	// Current is the Bundle presently in this environment.
	//
	// +optional
	Current *GateOccupant `json:"current,omitempty"`
	// Health is the latest assessment from this Gate's watches.
	//
	// +optional
	Health *HealthReport `json:"health,omitempty"`
	// Eligible lists Bundles that could cross now but have not. This is the
	// queue a human acts on, and the answer to "what am I waiting for?"
	//
	// +optional
	Eligible []string `json:"eligible,omitempty"`
	// ActivePassage is the in-flight Passage, if any.
	//
	// +optional
	ActivePassage string `json:"activePassage,omitempty"`
	// History is the recent record of what crossed, newest first.
	//
	// +optional
	History []GateOccupant `json:"history,omitempty"`
	// Evidence is the change gate's verdict for the crossing in progress.
	//
	// Mirrored from the active Passage and **cleared when there is no
	// crossing**, so it can never be a stale verdict presented as current. The
	// question it answers is "why is this sitting there?", which is asked while
	// the crossing is stuck, not afterwards — a finished one is in `history`
	// and in the Passage that produced it.
	//
	// +optional
	Evidence *EvidenceRef `json:"evidence,omitempty"`
}

GateStatus reports what is in this Gate and how it is doing.

func (*GateStatus) DeepCopy

func (in *GateStatus) DeepCopy() *GateStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateStatus.

func (*GateStatus) DeepCopyInto

func (in *GateStatus) DeepCopyInto(out *GateStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitWatch

type GitWatch struct {
	// Repo is the repository URL.
	Repo string `json:"repo"`
	// Branch to follow. Mutually exclusive with Tags.
	//
	// +optional
	Branch string `json:"branch,omitempty"`
	// Tags selects by tag instead of by branch head.
	//
	// +optional
	Tags *TagWatch `json:"tags,omitempty"`
	// Paths restricts which changes count as new. A commit touching nothing in
	// these paths produces no Bundle — this is what keeps a monorepo from
	// promoting every service on every commit.
	//
	// +optional
	Paths []string `json:"paths,omitempty"`
	// IgnorePaths is the inverse, applied after Paths.
	//
	// +optional
	IgnorePaths []string `json:"ignorePaths,omitempty"`
	// +optional
	CredentialsRef *LocalSecretRef `json:"credentialsRef,omitempty"`
}

GitWatch watches a git repository.

func (*GitWatch) DeepCopy

func (in *GitWatch) DeepCopy() *GitWatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitWatch.

func (*GitWatch) DeepCopyInto

func (in *GitWatch) DeepCopyInto(out *GitWatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Health

type Health string

Health describes how well something is doing. The vocabulary is deliberately small: any more states and nobody agrees what they mean.

+kubebuilder:validation:Enum={Healthy,Progressing,Degraded,Unknown,NotApplicable}

const (
	// HealthHealthy means it is doing what it is supposed to.
	HealthHealthy Health = "Healthy"
	// HealthProgressing means it has not converged yet, but something is still
	// working on it. This is a state you wait in, not one you act on.
	HealthProgressing Health = "Progressing"
	// HealthDegraded means it has stopped converging and will not recover
	// without intervention.
	HealthDegraded Health = "Degraded"
	// HealthUnknown means we could not tell. Distinct from Degraded on purpose:
	// "I cannot see it" is different from "I can see it and it is broken".
	HealthUnknown Health = "Unknown"
	// HealthNotApplicable means nothing was configured to check.
	HealthNotApplicable Health = "NotApplicable"
)

func (Health) Merge

func (h Health) Merge(other Health) Health

Merge returns the worse of two Health values. A set is only as healthy as its unhealthiest member.

type HealthCheck

type HealthCheck struct {
	// Uses names a registered health checker, e.g. "flux".
	Uses string `json:"uses"`
	// With is the checker's configuration.
	//
	// +optional
	With *apiextensionsv1.JSON `json:"with,omitempty"`
}

HealthCheck asks a registered checker to assess something.

func (*HealthCheck) DeepCopy

func (in *HealthCheck) DeepCopy() *HealthCheck

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HealthCheck.

func (*HealthCheck) DeepCopyInto

func (in *HealthCheck) DeepCopyInto(out *HealthCheck)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type HealthReport

type HealthReport struct {
	// Status is the overall assessment.
	Status Health `json:"status"`
	// Issues explain any non-Healthy status, in human-readable form.
	//
	// +optional
	Issues []string `json:"issues,omitempty"`
	// Details is opaque, check-specific output for the UI and CLI.
	//
	// +optional
	Details *apiextensionsv1.JSON `json:"details,omitempty"`
	// ObservedAt is when this assessment was made.
	//
	// +optional
	ObservedAt *metav1.Time `json:"observedAt,omitempty"`
	// Since is when the status last changed, as opposed to when it was last
	// checked. "Degraded for 40 minutes" is a different fact from "Degraded,
	// checked 20 seconds ago", and only the first one tells you whether to
	// worry.
	//
	// It is also the only record of how long a Gate has been unhealthy that
	// survives a controller restart, which is what lets time-to-restore be
	// measured rather than estimated (D43).
	//
	// +optional
	Since *metav1.Time `json:"since,omitempty"`
}

HealthReport is the outcome of assessing something's health, with the reasoning attached. A bare status with no explanation is not actionable.

func (*HealthReport) DeepCopy

func (in *HealthReport) DeepCopy() *HealthReport

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HealthReport.

func (*HealthReport) DeepCopyInto

func (in *HealthReport) DeepCopyInto(out *HealthReport)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ImageArtifact

type ImageArtifact struct {
	// Repo is the image repository, e.g. ghcr.io/acme/podinfo.
	Repo string `json:"repo"`
	// Tag is the resolved tag.
	//
	// +optional
	Tag string `json:"tag,omitempty"`
	// Digest is the image digest, e.g. sha256:abc... This is what gets reported
	// to Fides as an artifact, and what makes the promotion auditable — a tag
	// can be moved, a digest cannot.
	//
	// +optional
	Digest string `json:"digest,omitempty"`
}

ImageArtifact is a container image at a specific version.

func (*ImageArtifact) DeepCopy

func (in *ImageArtifact) DeepCopy() *ImageArtifact

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageArtifact.

func (*ImageArtifact) DeepCopyInto

func (in *ImageArtifact) DeepCopyInto(out *ImageArtifact)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ImageWatch

type ImageWatch struct {
	// Repo is the image repository, e.g. ghcr.io/acme/podinfo.
	Repo string `json:"repo"`
	// Select is how to pick the newest tag.
	//
	// +kubebuilder:default=SemVer
	// +optional
	Select TagSelection `json:"select,omitempty"`
	// Constraint narrows the selection. For SemVer this is a range such as
	// "^6.0.0"; for Lexical and NewestBuild it is ignored.
	//
	// +optional
	Constraint string `json:"constraint,omitempty"`
	// Allow is a regular expression tags must match. Use it to exclude the
	// mutable tags that otherwise cause surprise promotions — `latest`,
	// `main`, nightly builds.
	//
	// +optional
	Allow string `json:"allow,omitempty"`
	// Ignore lists exact tags to never select.
	//
	// +optional
	Ignore []string `json:"ignore,omitempty"`
	// Platform restricts digest resolution to one platform for multi-arch
	// images, e.g. "linux/amd64".
	//
	// +optional
	Platform string `json:"platform,omitempty"`
	// CredentialsRef names a Secret holding registry credentials. Omit it to
	// use the controller's ambient cloud identity (IRSA, Workload Identity,
	// Managed Identity).
	//
	// +optional
	CredentialsRef *LocalSecretRef `json:"credentialsRef,omitempty"`
	// Insecure allows a plain-HTTP registry: one that terminates TLS elsewhere,
	// an air-gapped one, or a local development registry.
	//
	// False unless asked for, and deliberately so — downgrading to HTTP without
	// being told to would send the registry credentials above in clear. Matches
	// Flux's own `OCIRepository.spec.insecure`.
	//
	// +optional
	Insecure bool `json:"insecure,omitempty"`
}

ImageWatch watches a container image repository.

func (*ImageWatch) DeepCopy

func (in *ImageWatch) DeepCopy() *ImageWatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageWatch.

func (*ImageWatch) DeepCopyInto

func (in *ImageWatch) DeepCopyInto(out *ImageWatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type LocalSecretRef

type LocalSecretRef struct {
	Name string `json:"name"`
}

LocalSecretRef names a Secret in the same namespace.

func (*LocalSecretRef) DeepCopy

func (in *LocalSecretRef) DeepCopy() *LocalSecretRef

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalSecretRef.

func (*LocalSecretRef) DeepCopyInto

func (in *LocalSecretRef) DeepCopyInto(out *LocalSecretRef)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Passage

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

	Spec   PassageSpec   `json:"spec"`
	Status PassageStatus `json:"status,omitempty"`
}

Passage is one attempt to move a Bundle through a Gate.

A Passage is created, runs its steps to completion, and is then a permanent record of what happened. It is never reused: a second attempt is a second Passage. That is what makes the history trustworthy — nothing is overwritten.

func (*Passage) DeepCopy

func (in *Passage) DeepCopy() *Passage

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Passage.

func (*Passage) DeepCopyInto

func (in *Passage) DeepCopyInto(out *Passage)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*Passage) DeepCopyObject

func (in *Passage) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type PassageList

type PassageList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []Passage `json:"items"`
}

PassageList is a list of Passages.

func (*PassageList) DeepCopy

func (in *PassageList) DeepCopy() *PassageList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PassageList.

func (*PassageList) DeepCopyInto

func (in *PassageList) DeepCopyInto(out *PassageList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*PassageList) DeepCopyObject

func (in *PassageList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type PassagePhase

type PassagePhase string

PassagePhase is the overall outcome of a Passage.

+kubebuilder:validation:Enum={Pending,Running,Succeeded,Failed,Aborted}

const (
	// PassagePending means it has not started — usually waiting on a window,
	// an approval, or a verification gate.
	PassagePending PassagePhase = "Pending"
	// PassageRunning means steps are executing.
	PassageRunning PassagePhase = "Running"
	// PassageSucceeded means every step completed and the Bundle is in the Gate.
	PassageSucceeded PassagePhase = "Succeeded"
	// PassageFailed means a step failed terminally.
	PassageFailed PassagePhase = "Failed"
	// PassageAborted means a human stopped it.
	PassageAborted PassagePhase = "Aborted"
)

func (PassagePhase) Terminal

func (p PassagePhase) Terminal() bool

Terminal reports whether the Passage has finished for good.

type PassageSpec

type PassageSpec struct {
	// Gate is the Gate being crossed.
	Gate string `json:"gate"`
	// Bundle is the Bundle being moved.
	Bundle string `json:"bundle"`
	// Steps is the resolved step list, copied from the Gate at creation time.
	//
	// Copied rather than referenced on purpose: editing a Gate must not
	// retroactively change what an in-flight or completed Passage did.
	//
	// +kubebuilder:validation:MinItems=1
	Steps []Step `json:"steps"`
	// Vars are the Gate's variables, copied at creation for the same reason the
	// steps are: editing a Gate must not change what an in-flight Passage sees.
	//
	// +optional
	Vars []Var `json:"vars,omitempty"`
	// Actor is who initiated this Passage — a username, or "controller" for
	// automatic crossings.
	//
	// +optional
	Actor string `json:"actor,omitempty"`
	// Abort requests that a running Passage stop. Set it to true to cancel;
	// the controller will mark remaining steps Aborted.
	//
	// +optional
	Abort bool `json:"abort,omitempty"`
}

PassageSpec is what this Passage was asked to do. It is immutable once created; the only mutable field is Abort.

func (*PassageSpec) DeepCopy

func (in *PassageSpec) DeepCopy() *PassageSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PassageSpec.

func (*PassageSpec) DeepCopyInto

func (in *PassageSpec) DeepCopyInto(out *PassageSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PassageStatus

type PassageStatus struct {
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
	// Phase is the overall outcome.
	//
	// +kubebuilder:default=Pending
	// +optional
	Phase PassagePhase `json:"phase,omitempty"`
	// Message explains the phase, especially a non-success one.
	//
	// +optional
	Message string `json:"message,omitempty"`
	// Steps records each step's outcome, in spec order.
	//
	// +optional
	Steps []StepStatus `json:"steps,omitempty"`
	// CurrentStep indexes the step being executed.
	//
	// +optional
	CurrentStep int32 `json:"currentStep,omitempty"`
	// StartedAt is when the first step ran.
	//
	// +optional
	StartedAt *metav1.Time `json:"startedAt,omitempty"`
	// FinishedAt is when the Passage reached a terminal phase.
	//
	// +optional
	FinishedAt *metav1.Time `json:"finishedAt,omitempty"`
	// Watch are the health checks this Passage's steps asked the Gate to adopt.
	//
	// A step that waited for something — `flux-wait` waiting on a Kustomization,
	// say — already knows what to watch, and the Gate should keep watching it
	// afterwards. Without this the Gate goes blind the moment the Passage ends,
	// and the operator has to restate the same resources in `gate.spec.watch`.
	//
	// +optional
	Watch []HealthCheck `json:"watch,omitempty"`
	// TraceID is the OpenTelemetry trace this Passage belongs to, so a
	// promotion can be correlated with the CI run that produced the artifact
	// and the reconciliation that applied it.
	//
	// +optional
	TraceID string `json:"traceID,omitempty"`
	// Evidence references the compliance record produced for this Passage.
	//
	// +optional
	Evidence *EvidenceRef `json:"evidence,omitempty"`
}

PassageStatus is what actually happened.

func (*PassageStatus) DeepCopy

func (in *PassageStatus) DeepCopy() *PassageStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PassageStatus.

func (*PassageStatus) DeepCopyInto

func (in *PassageStatus) DeepCopyInto(out *PassageStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PassageTemplate

type PassageTemplate struct {
	// Steps run in order. Each may reference earlier steps' outputs.
	//
	// +kubebuilder:validation:MinItems=1
	Steps []Step `json:"steps"`
}

PassageTemplate is the recipe for crossing this Gate.

func (*PassageTemplate) DeepCopy

func (in *PassageTemplate) DeepCopy() *PassageTemplate

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PassageTemplate.

func (*PassageTemplate) DeepCopyInto

func (in *PassageTemplate) DeepCopyInto(out *PassageTemplate)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderWatch added in v0.2.0

type ProviderWatch struct {
	// Name is the ResourceSetInputProvider, in the Beacon's namespace.
	Name string `json:"name"`
}

ProviderWatch consumes a Flux Operator ResourceSetInputProvider.

**It names one and nothing else, deliberately.** The provider already carries the filter, the semver range and the limit, and it already sorts what it exports — newest first, by semver when a range is given and reverse alphabetically otherwise. Mirroring any of that here would mean two components deciding what "newest" means from different rules, which is the duplication this exists to avoid (D15): Flux Operator already discovers from GitHub, GitLab, Azure DevOps, AWS CodeCommit, Gitea, OCI, ACR, ECR and GAR, and Hecate reads its answer rather than computing a second one.

func (*ProviderWatch) DeepCopy added in v0.2.0

func (in *ProviderWatch) DeepCopy() *ProviderWatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderWatch.

func (*ProviderWatch) DeepCopyInto added in v0.2.0

func (in *ProviderWatch) DeepCopyInto(out *ProviderWatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Step

type Step struct {
	// Uses names a registered step implementation, e.g. "flux-wait".
	Uses string `json:"uses"`
	// As names this step's output so later steps can reference it, e.g. a step
	// with `as: commit` exposes `${{ steps.commit.sha }}`.
	//
	// +optional
	As string `json:"as,omitempty"`
	// With is the step's configuration. Its shape is defined by the step
	// implementation, which publishes a JSON Schema for validation and for
	// generating the UI form.
	//
	// +optional
	With *apiextensionsv1.JSON `json:"with,omitempty"`
	// If is an expression that must evaluate true for the step to run. Skipped
	// steps are recorded as Skipped, not silently omitted.
	//
	// +optional
	If string `json:"if,omitempty"`
	// Timeout bounds how long this step may run before it is abandoned.
	//
	// +optional
	Timeout *metav1.Duration `json:"timeout,omitempty"`
	// ContinueOnError lets the Passage proceed even if this step fails. Use
	// sparingly: it is how a broken deploy gets reported as a success.
	//
	// +optional
	ContinueOnError bool `json:"continueOnError,omitempty"`
}

Step is one instruction in a Passage.

func (*Step) DeepCopy

func (in *Step) DeepCopy() *Step

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Step.

func (*Step) DeepCopyInto

func (in *Step) DeepCopyInto(out *Step)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type StepPhase

type StepPhase string

StepPhase is the outcome of a single step.

+kubebuilder:validation:Enum={Pending,Running,Succeeded,Failed,Skipped,Aborted}

const (
	StepPending   StepPhase = "Pending"
	StepRunning   StepPhase = "Running"
	StepSucceeded StepPhase = "Succeeded"
	StepFailed    StepPhase = "Failed"
	StepSkipped   StepPhase = "Skipped"
	StepAborted   StepPhase = "Aborted"
)

func (StepPhase) Terminal

func (p StepPhase) Terminal() bool

Terminal reports whether a step has reached a state it will not leave.

type StepStatus

type StepStatus struct {
	// Uses is the step implementation that ran.
	Uses string `json:"uses"`
	// As is the step's output name, if it had one.
	//
	// +optional
	As string `json:"as,omitempty"`
	// Phase is the outcome.
	Phase StepPhase `json:"phase"`
	// Reason is a stable, machine-readable code for a failure, in PascalCase —
	// GitAuthFailed, FluxStalled, InvalidConfig.
	//
	// Message is for a human reading one failure; Reason is for everything that
	// has to reason across many: `hecate diagnose`, a dashboard counting failure
	// classes, an operator asking "is this the same problem as yesterday?".
	//
	// +optional
	Reason string `json:"reason,omitempty"`
	// Message explains the phase.
	//
	// +optional
	Message string `json:"message,omitempty"`
	// Output is what the step produced, available to later steps.
	//
	// +optional
	Output *apiextensionsv1.JSON `json:"output,omitempty"`
	// StartedAt is when the step first ran.
	//
	// +optional
	StartedAt *metav1.Time `json:"startedAt,omitempty"`
	// FinishedAt is when the step reached a terminal phase.
	//
	// +optional
	FinishedAt *metav1.Time `json:"finishedAt,omitempty"`
	// Attempts counts how many times this step has been invoked. Steps that
	// wait on external systems are invoked repeatedly until they settle.
	//
	// +optional
	Attempts int32 `json:"attempts,omitempty"`
}

StepStatus records what happened when a step ran.

func (*StepStatus) DeepCopy

func (in *StepStatus) DeepCopy() *StepStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StepStatus.

func (*StepStatus) DeepCopyInto

func (in *StepStatus) DeepCopyInto(out *StepStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TagSelection

type TagSelection string

TagSelection is how to choose among available tags.

+kubebuilder:validation:Enum={SemVer,Lexical,NewestBuild,Digest}

const (
	// SelectSemVer picks the highest semantic version satisfying Constraint.
	SelectSemVer TagSelection = "SemVer"
	// SelectLexical picks the lexically greatest tag. For zero-padded date or
	// build-number schemes.
	SelectLexical TagSelection = "Lexical"
	// SelectNewestBuild picks the most recently pushed tag. Convenient, but it
	// trusts registry timestamps, which are not always what you think.
	SelectNewestBuild TagSelection = "NewestBuild"
	// SelectDigest tracks one fixed tag and reacts when its digest changes.
	// For teams that deliberately move a tag like `stable`.
	SelectDigest TagSelection = "Digest"
)

type TagWatch

type TagWatch struct {
	// +kubebuilder:default=SemVer
	// +optional
	Select TagSelection `json:"select,omitempty"`
	// +optional
	Constraint string `json:"constraint,omitempty"`
	// +optional
	Allow string `json:"allow,omitempty"`
	// +optional
	Ignore []string `json:"ignore,omitempty"`
}

TagWatch selects git tags.

func (*TagWatch) DeepCopy

func (in *TagWatch) DeepCopy() *TagWatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TagWatch.

func (*TagWatch) DeepCopyInto

func (in *TagWatch) DeepCopyInto(out *TagWatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Var

type Var struct {
	Name  string `json:"name"`
	Value string `json:"value"`
}

Var is a named value usable in expressions.

func (*Var) DeepCopy

func (in *Var) DeepCopy() *Var

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Var.

func (*Var) DeepCopyInto

func (in *Var) DeepCopyInto(out *Var)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Verification

type Verification struct {
	// Uses names a registered verifier, e.g. "flagger" or "fides".
	Uses string `json:"uses"`
	// With is the verifier's configuration.
	//
	// +optional
	With *apiextensionsv1.JSON `json:"with,omitempty"`
}

Verification gathers evidence that a crossing actually worked.

func (*Verification) DeepCopy

func (in *Verification) DeepCopy() *Verification

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Verification.

func (*Verification) DeepCopyInto

func (in *Verification) DeepCopyInto(out *Verification)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type WatchSource

type WatchSource struct {
	// +optional
	Image *ImageWatch `json:"image,omitempty"`
	// +optional
	Chart *ChartWatch `json:"chart,omitempty"`
	// +optional
	Git *GitWatch `json:"git,omitempty"`
	// Provider reads an existing Flux Operator ResourceSetInputProvider.
	//
	// +optional
	Provider *ProviderWatch `json:"provider,omitempty"`
}

WatchSource is one artifact source. Exactly one field must be set.

+kubebuilder:validation:MaxProperties=1 +kubebuilder:validation:MinProperties=1

func (*WatchSource) DeepCopy

func (in *WatchSource) DeepCopy() *WatchSource

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WatchSource.

func (*WatchSource) DeepCopyInto

func (in *WatchSource) DeepCopyInto(out *WatchSource)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Window

type Window struct {
	// Schedule is a cron expression marking when the window opens.
	Schedule string `json:"schedule"`
	// Duration is how long it stays open once opened.
	Duration metav1.Duration `json:"duration"`
	// TimeZone is an IANA name, e.g. "Europe/London". Defaults to UTC.
	//
	// Set this deliberately: a window defined in UTC drifts an hour against
	// local working time twice a year, which is exactly when someone is
	// surprised by a deploy.
	//
	// +optional
	TimeZone string `json:"timeZone,omitempty"`
	// Deny inverts the window: instead of the only time Passages may start,
	// it becomes the only time they may not. For change freezes.
	//
	// +optional
	Deny bool `json:"deny,omitempty"`
}

Window is a recurring period during which Passages may start.

func (*Window) DeepCopy

func (in *Window) DeepCopy() *Window

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Window.

func (*Window) DeepCopyInto

func (in *Window) DeepCopyInto(out *Window)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL