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
- Variables
- func BundleName(beacon, digest string) string
- func ComputeDigest(artifacts []Artifact) string
- func ReconcileRequestedAt(annotations map[string]string) string
- type Admission
- type Artifact
- type Beacon
- type BeaconList
- type BeaconSpec
- type BeaconStatus
- type Bundle
- func (b *Bundle) ApprovalFor(gate string) *BundleApproval
- func (in *Bundle) DeepCopy() *Bundle
- func (in *Bundle) DeepCopyInto(out *Bundle)
- func (in *Bundle) DeepCopyObject() runtime.Object
- func (b *Bundle) HasCleared(gate string) bool
- func (b *Bundle) IsApprovedFor(gate string) bool
- func (b *Bundle) WasBlockedBy(gate string) bool
- type BundleApproval
- type BundleList
- type BundleOrigin
- type BundleSpec
- type BundleStatus
- type ChartArtifact
- type ChartWatch
- type CommitArtifact
- type EmitPolicy
- type EvidenceConfig
- type EvidenceRef
- type Gate
- type GateCrossing
- type GateList
- type GateOccupant
- type GateSpec
- type GateStatus
- type GitWatch
- type Health
- type HealthCheck
- type HealthReport
- type ImageArtifact
- type ImageWatch
- type LocalSecretRef
- type Passage
- type PassageList
- type PassagePhase
- type PassageSpec
- type PassageStatus
- type PassageTemplate
- type ProviderWatch
- type Step
- type StepPhase
- type StepStatus
- type TagSelection
- type TagWatch
- type Var
- type Verification
- type WatchSource
- type Window
Constants ¶
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.
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 ¶
var AddToScheme = SchemeBuilder.AddToScheme
AddToScheme adds the Hecate types to a runtime.Scheme.
var GroupVersion = schema.GroupVersion{Group: "hecate.dev", Version: "v1alpha1"}
GroupVersion is the group and version of the Hecate API.
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 ¶
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 ¶
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 ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Admission.
func (*Admission) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Artifact.
func (*Artifact) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Beacon.
func (*Beacon) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Beacon) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Bundle.
func (*Bundle) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Bundle) DeepCopyObject ¶
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (*Bundle) HasCleared ¶
HasCleared reports whether this Bundle has successfully passed the named Gate.
func (*Bundle) IsApprovedFor ¶
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
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Gate.
func (*Gate) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Gate) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateList.
func (*GateList) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*GateList) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GateSpec.
func (*GateSpec) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitWatch.
func (*GitWatch) DeepCopyInto ¶
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" )
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Passage.
func (*Passage) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Passage) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Step.
func (*Step) DeepCopyInto ¶
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}
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TagWatch.
func (*TagWatch) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type Var ¶
Var is a named value usable in expressions.
func (*Var) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Var.
func (*Var) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Window.
func (*Window) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.