Release
One application, rendered from one source, applied to one cluster.
Release is the unit of delivery. It binds one source, one way to render that source, and one
target cluster.
| API group | core.convoy.kumodo.io/v1alpha1 |
| Scope | Namespaced |
| Subresources | /status, /sync, /pin, /mutations, /lifecycle, /preview, /diff, /health, /history. See Subresources. |
| Conditions | Applied, RolloutSucceeded, LifecycleSucceeded, InSync, Healthy. See Conditions. |
Example#
apiVersion: core.convoy.kumodo.io/v1alpha1
kind: Release
metadata:
name: podinfo-helmreg-in-cluster
namespace: default
spec:
clusterRef:
name: dev-local
source:
type: helmRegistry
helmRegistry:
name: podinfo
namespace: default
chart:
name: podinfo
version: "6.12.0"
content:
type: helm
helm:
releaseName: podinfo-from-helmreg
releaseNamespace: default
dependencyMode: vendored
values:
- type: gitRepository
gitRepository:
name: podinfo-values
namespace: default
ref:
branch: main
paths:
- podinfo/values.yaml
- type: inline
inline:
image:
tag: 6.13.0
syncPolicy:
automatic: true
prune:
orphaned: false
includeCRDs: false
includeNamespaces: false
interval: 1m
Object structure#
A Release has four writable parts. Only spec is under spec. The other three are top-level
fields, so that each one can have its own subresource, RBAC rule and audit event.
| Field | Written through | Purpose |
|---|---|---|
spec | the main resource | Source, content, cluster and policies. |
mutations | the main resource, or /mutations | The ordered post-render mutation pipeline. |
lifecycle | the main resource, or /lifecycle | Lifecycle hooks, per phase. |
pin | /pin only | Holds the Release on one render. |
spec.source#
spec.source tells convoy where to fetch from and which version. source.type selects one
block: gitRepository, helmRegistry or ociRegistry. Each block references a source object
by name, and adds the version to fetch.
- Git refs. convoy uses the first ref field that is set, in the order
branch,tag,commit. Validation does not reject more than one.semveris accepted, but fetch fails withApplied=False, reasonUnsupported. - Chart versions.
helmRegistry.chart.versionandociRegistry.artifact.versionmust match a version exactly. Version ranges do not work. A leadingvis ignored for Helm repositories. - Namespace. The referenced source must be in the namespace of the Release. An empty
namespacemeans the namespace of the Release. - Immutable.
source.type, and thenameandnamespaceof the referenced source, cannot change after creation. The version fields can change.
| Field | Type | Description |
|---|---|---|
spec.source required | ReleaseSourceSpec | Source is the content source of the release. Immutable after creation. To re-target, create a new Release. |
spec.source.gitRepository | ReleaseGitRepositorySpec | GitRepository is the Git repository source for the release. |
spec.source.gitRepository.name required | string | Name is the name of the [github.com/kumodo-io/convoy/api/source/v1alpha1.GitRepository] object. |
spec.source.gitRepository.namespace | string | Namespace is the namespace of the [github.com/kumodo-io/convoy/api/source/v1alpha1.GitRepository] object. |
spec.source.gitRepository.ref | ReleaseGitRepositoryRefSpec | Ref is the reference to the target revision of the Git repository. |
spec.source.gitRepository.ref.branch | string | Branch is the branch to track in the Git repository. |
spec.source.gitRepository.ref.commit | string | Commit is the commit to track in the Git repository. |
spec.source.gitRepository.ref.semver | string | Semver is the tag-based semantic version expression to track in the Git repository. |
spec.source.gitRepository.ref.tag | string | Tag is the tag to track in the Git repository. |
spec.source.helmRegistry | ReleaseHelmRegistrySpec | HelmRegistry is the Helm registry source for the release. |
spec.source.helmRegistry.chart | ReleaseHelmRegistryChartSpec | Chart is the definition of the Helm chart to be installed. |
spec.source.helmRegistry.chart.name required | string | Name is the name of the Helm chart. |
spec.source.helmRegistry.chart.version required | string | Version is the version of the Helm chart. |
spec.source.helmRegistry.name required | string | Name is the name of the [github.com/kumodo-io/convoy/api/source/v1alpha1.HelmRegistry] object. |
spec.source.helmRegistry.namespace | string | Namespace is the namespace of the [github.com/kumodo-io/convoy/api/source/v1alpha1.HelmRegistry] object. |
spec.source.ociRegistry | ReleaseOCIRegistrySpec | OCIRegistry is the OCI registry source for the release. |
spec.source.ociRegistry.artifact | ReleaseOCIRegistryArtifactSpec | Artifact is the definition of the OCI artifact to be installed. |
spec.source.ociRegistry.artifact.name required | string | Name is the name of the OCI artifact. |
spec.source.ociRegistry.artifact.version required | string | Version is the version of the OCI artifact. |
spec.source.ociRegistry.name required | string | Name is the name of the [github.com/kumodo-io/convoy/api/source/v1alpha1.OCIRegistry] object. |
spec.source.ociRegistry.namespace | string | Namespace is the namespace of the [github.com/kumodo-io/convoy/api/source/v1alpha1.OCIRegistry] object. |
spec.source.type required | string | Type is the type of the source.
|
spec.content#
spec.content tells convoy how to render the fetched files. content.type is immutable.
content.type | Rendered | Notes |
|---|---|---|
helm | Yes, in-process with the Helm SDK | releaseName defaults to the chart name. releaseNamespace defaults to default, and sets only .Release.Namespace (see KB-10). dependencyMode: vendored (the default) is the only mode that works. resolve gives reason Unsupported. |
manifests | Yes | Each entry in paths is a file, a directory prefix, or . for the whole tree. Globs do not work. Only .yaml and .yml files load. |
kustomize | Yes, in-process | targetNamespace uses the namespace transformer of Kustomize. |
jsonnet | No | Accepted by the API. Rendering gives reason Unsupported. |
Validation does not check that the content type fits the source type.
| Field | Type | Description |
|---|---|---|
spec.content required | ReleaseContentSpec | Content is the content of the release. |
spec.content.helm | ReleaseContentHelmSpec | Helm is the Helm chart content of the release. |
spec.content.helm.dependencyMode required | string | DependencyMode is the dependency mode for the Helm chart.
|
spec.content.helm.path | string | Path is the path to the Helm chart within the source. Ignored if the source is a Helm registry. |
spec.content.helm.releaseName | string | ReleaseName is the name of the Helm release. Defaults to the Helm chart name if not specified. |
spec.content.helm.releaseNamespace | string | ReleaseNamespace is the namespace of the Helm release. Defaults to 'default' namespace if not specified. |
spec.content.helm.values | []ValuesSourceSpec | Values contains a list of values sources to be applied to the Helm chart. |
spec.content.helm.values[].configMap | ConfigMapKeySelector | ConfigMap defines the config map and the key containing the values. |
spec.content.helm.values[].gitRepository | ValuesSourceGitRepositorySpec | GitRepository defines the configuration of the git repository used as values source. |
spec.content.helm.values[].gitRepository.name required | string | Name is the name of the [github.com/kumodo-io/convoy/api/source/v1alpha1.GitRepository] object. |
spec.content.helm.values[].gitRepository.namespace | string | Namespace is the namespace of the [github.com/kumodo-io/convoy/api/source/v1alpha1.GitRepository] object. |
spec.content.helm.values[].gitRepository.paths required | []string | Paths is the list of paths to values files in the git repository. |
spec.content.helm.values[].gitRepository.ref | ReleaseGitRepositoryRefSpec | Ref is the reference to the target revision of the Git repository. |
spec.content.helm.values[].gitRepository.ref.branch | string | Branch is the branch to track in the Git repository. |
spec.content.helm.values[].gitRepository.ref.commit | string | Commit is the commit to track in the Git repository. |
spec.content.helm.values[].gitRepository.ref.semver | string | Semver is the tag-based semantic version expression to track in the Git repository. |
spec.content.helm.values[].gitRepository.ref.tag | string | Tag is the tag to track in the Git repository. |
spec.content.helm.values[].inline | JSON | Inline contains inlined values. |
spec.content.helm.values[].secret | SecretKeySelector | Secret defines the secret and the key containing the values. |
spec.content.helm.values[].type required | string | Type defines the type of values source.
|
spec.content.jsonnet | ReleaseContentJsonnetSpec | Jsonnet is the jsonnet content of the release. |
spec.content.jsonnet.path required | string | Path is the path to the jsonnet file within the source. |
spec.content.jsonnet.targetNamespace | string | TargetNamespace is the namespace to target for the jsonnet bundle. Defaults to 'default' namespace if not specified. |
spec.content.jsonnet.tla | []EnvVarlist type: map, keys: name | TLA is the list of top-level arguments to pass to the jsonnet file. |
spec.content.kustomize | ReleaseContentKustomizeSpec | Kustomize is the kustomize content of the release. |
spec.content.kustomize.path required | string | Path is the path to the kustomize bundle within the source. |
spec.content.kustomize.targetNamespace | string | TargetNamespace is the namespace to target for the kustomize bundle. Defaults to 'default' namespace if not specified. |
spec.content.manifests | ReleaseContentManifestsSpec | Manifests is the manifests content of the release. |
spec.content.manifests.paths required | []stringlist type: atomic | Paths is the list of paths to the manifests within the source. |
spec.content.manifests.targetNamespace | string | TargetNamespace is the namespace to target for the manifests. Defaults to 'default' namespace if not specified. |
spec.content.type required | string | Type is the type of the content. Immutable after creation.
|
spec.clusterRef#
The target Cluster. It must be in the namespace of the Release. clusterRef is immutable.
| Field | Type | Description |
|---|---|---|
spec.clusterRef required | ReleaseClusterRefSpec | ClusterRef is the reference to the cluster where the release will be deployed. Immutable after creation. |
spec.clusterRef.name required | string | Name is the name of the cluster. |
spec.clusterRef.namespace | string | Namespace is the namespace of the cluster. |
spec.syncPolicy#
automatic: trueapplies each new render. Withautomatic: false, convoy renders and reports status, but applies only after a/syncrequest.automatichas no default: if you do not set it, the Release uses manual mode.intervalis the period of the periodic reconcile of this Release. The observer uses the same interval.prune.orphaneddeletes objects that the render no longer contains. CRDs and Namespaces are not deleted unlessincludeCRDsorincludeNamespacesis set.retryBackoffsets the retry delay after a transient failure.waveStrategyorders this Release relative to other Releases on the sameCluster.
| Field | Type | Description |
|---|---|---|
spec.syncPolicy required | ReleaseSyncPolicySpec | SyncPolicy is the sync policy for the release. |
spec.syncPolicy.automatic required | boolean | Automatic defines whether the release should be automatically synced. Manual syncing requires the POST /sync to trigger the sync. |
spec.syncPolicy.interval required | Duration | Interval is the poll interval for drift detection. |
spec.syncPolicy.prune required | PruneSpec | Prune controls steady-state garbage collection of resources dropped from the render. |
spec.syncPolicy.prune.includeCRDs required | boolean | IncludeCRDs defines whether to prune orphaned CustomResourceDefinitions (dangerous — cascades to all CRs). |
spec.syncPolicy.prune.includeNamespaces required | boolean | IncludeNamespaces defines whether to prune orphaned Namespaces (dangerous). |
spec.syncPolicy.prune.orphaned required | boolean | Orphaned defines whether to delete resources this Release previously applied but no longer renders. |
spec.syncPolicy.retryBackoff required | ReleaseRetryBackoffSpec | RetryBackoff defines the backoff policy for retrying failed syncs. |
spec.syncPolicy.retryBackoff.factor required | number | Factor is the backoff factor. |
spec.syncPolicy.retryBackoff.initial required | Duration | Initial is the initial backoff duration. |
spec.syncPolicy.retryBackoff.max required | Duration | Max is the maximum backoff duration. |
spec.syncPolicy.waveStrategy required | ReleaseWaveStrategySpec | WaveStrategy defines the wave strategy. |
spec.syncPolicy.waveStrategy.strategy required | string | Strategy is the wave strategy.
|
spec.syncPolicy.waveStrategy.timeout | Duration | Timeout is the timeout for the wave strategy. If not set, controller will wait indefinitely. |
spec.syncPolicy.waveStrategy.wave required | integer | Wave is the wave number. |
spec.healthAssessment and spec.failurePolicy#
healthAssessment selects health rule sets by label and sets the deadline after which a failing
resource is Degraded. A nil selector selects no rule set. An empty selector {} selects all
rule sets.
failurePolicy.rollback sets what convoy does when a rollout fails: Never,
OnReleaseFailure or OnWaveFailure. A value other than Never requires
healthAssessment.deadline. Without a deadline, a rollout cannot fail, so the API rejects the
Release.
| Field | Type | Description |
|---|---|---|
spec.healthAssessment | ReleaseHealthAssessment | HealthAssessment defines the health assessment configuration for resources delivered by the Release. |
spec.healthAssessment.deadline | Duration | Deadline is the interval within what the deployed resources must pass collected health rules. |
spec.healthAssessment.globalRuleSetSelector | LabelSelector | GlobalRuleSetSelector defines the standard kubernetes [k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector] that will be used to collect the cluster-scoped [github.com/kumodo-io/convoy/api/extensions/v1alpha1.GlobalHealthRuleSet] |
spec.healthAssessment.localRuleSetSelector | LabelSelector | LocalRuleSetSelector defines the standard kubernetes [k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector] that will be used to collect the namespaced [github.com/kumodo-io/convoy/api/extensions/v1alpha1.HealthRuleSet], These rule sets will be looked up in the Release namespace. |
| Field | Type | Description |
|---|---|---|
spec.failurePolicy | ReleaseFailurePolicy | FailurePolicy is the failure policy for the release. |
spec.failurePolicy.rollback required | string | Rollback defines the rollback policy.
|
spec.retentionPolicy#
keepHistory is the number of applied renders that convoy keeps in the render store. If it is
not set, convoy keeps 10. 0 keeps all renders. Without a render store, there is no history.
| Field | Type | Description |
|---|---|---|
spec.retentionPolicy required | ReleaseRetentionPolicySpec | RetentionPolicy is the retention policy for the release. |
spec.retentionPolicy.keepHistory | integer | KeepHistory is how many historical (rendered, applied) records to retain in the render store. It drives /history depth and the rollback range. Unset (nil) uses a default; an explicit 0 means unlimited (retain all); a positive N keeps the newest N. The current render is always retained regardless. |
spec.deletionPolicy#
When you delete a Release:
keepWorkloads: false(the default) deletes the applied objects from the cluster.truekeeps them.blockOnClusterUnreachable: truekeeps the Release until the cluster is reachable again. Withfalse, convoy deletes the Release and leaves the objects on an unreachable cluster.
| Field | Type | Description |
|---|---|---|
spec.deletionPolicy required | ReleaseDeletionPolicy | DeletionPolicy defines the deletion policy for Release. |
spec.deletionPolicy.blockOnClusterUnreachable required | boolean | BlockOnClusterUnreachable flag defines whether to block Release object deletion in case the KeepWorkloads flag is set to false and the target Cluster is unreachable. |
spec.deletionPolicy.keepWorkloads required | boolean | KeepWorkloads flag defines whether to cleanup deployed resources on the Release object deletion. |
mutations#
An ordered list of post-render mutations. Write it through the main resource or through
/mutations. See Release mutations for the types, fields and
admission rules.
lifecycle#
Lifecycle hooks per phase: preSync, postSync, syncFailed, preDelete, postDelete. Write
them through the main resource or through /lifecycle. See
Release lifecycle hooks for the fields, admission rules and
status.
pin#
The pin holds the Release on one render. Write it through
/pin.
- To pin, set
renderRef. The apiserver setspinnedAtandpinnedBy. - To unpin, write an empty
renderRef. - A pin is not possible before the first successful render.
- To pin a render that is not the current one, convoy needs a render store that contains that render.
| Field | Type | Description |
|---|---|---|
pin | ReleasePin | ReleasePin defines the desired state of the ReleasePin. |
pin.pinnedAt required | Time | PinnedAt is the time when the release was pinned. |
pin.pinnedBy | string | PinnedBy is the name of the user that pinned the release. |
pin.reason | string | Reason is the reason for pinning the release. |
pin.renderRef required | string | RenderRef is the reference to the rendered state that is pinned. |
Status#
lastAttemptedis the most recent render attempt.lastSuccessfulis the most recent render that convoy applied.rolloutandlastHealthyrecord the progressive rollout. See Progressive rollout.wavesrecords the sync waves of the last apply.lifecyclerecords the hooks of the current render.healthSummarycounts resources per health state.suspendedis never set.historyTruncatedis never set.
| Field | Type | Description |
|---|---|---|
status | ReleaseStatus | ReleaseStatus reflects the observed state of the Release. |
status.conditions | []Conditionlist type: map, keys: type | Conditions is the list of conditions related to the release. |
status.healthSummary | ReleaseHealthSummary | HealthSummary reflects the health status of the release. |
status.healthSummary.degraded required | integer | Degraded is the number of degraded resources in the release. |
status.healthSummary.healthy required | integer | Healthy is the number of healthy resources in the release. |
status.healthSummary.progressing required | integer | Progressing is the number of progressing resources in the release. |
status.healthSummary.suspended required | integer | Suspended is the number of suspended resources in the release. |
status.healthSummary.total required | integer | Total is the total number of resources in the release. |
status.healthSummary.unknown required | integer | Unknown is the number of resources in an unknown state. |
status.historyTruncated required | boolean | HistoryTruncated is true if the release history is truncated. |
status.lastAttempted | ReleaseAttemptedRenderStatus | LastAttempted is the last attempted sync attempt. |
status.lastAttempted.attemptedAt | Time | AttemptedAt is the time when the Release sync was attempted. |
status.lastAttempted.failure | ReleaseAttemptedRenderFailureStatus | Failure is the failure status of the release render attempt. |
status.lastAttempted.failure.hookName | string | HookName is the name of the hook that failed. |
status.lastAttempted.failure.hookPhase | string | HookPhase is the phase of the hook that failed.
|
status.lastAttempted.failure.message required | string | Message is the failure message. |
status.lastAttempted.failure.mutationIndex | integer | MutationIndex is the index of the mutation that failed. |
status.lastAttempted.failure.stage required | string | Stage is the stage of the failure.
|
status.lastAttempted.failure.waveNumber | integer | WaveNumber is the wave number of the failure. |
status.lastAttempted.phase | string | Phase is the phase of the release render attempt.
|
status.lastAttempted.renderRef required | string | RenderRef is the reference to the rendered state. |
status.lastAttempted.resolvedCluster required | ResolvedCluster | ResolvedCluster is the resolved cluster of the release. |
status.lastAttempted.resolvedCluster.metadataSnapshot | map[string]string | MetadataSnapshot is the snapshot of the cluster metadata. |
status.lastAttempted.resolvedCluster.name required | string | Name is the name of the cluster. |
status.lastAttempted.resolvedCluster.namespace | string | Namespace is the namespace of the cluster. |
status.lastAttempted.resolvedCluster.observedGeneration required | integer | ObservedGeneration is the observed generation of the cluster. |
status.lastAttempted.resolvedCluster.server required | string | Server is the server URL of the cluster. |
status.lastAttempted.resolvedCluster.uid required | string | UID is the UID of the cluster. |
status.lastAttempted.resolvedMutations required | []ResolvedMutationlist type: atomic | ResolvedMutations is the resolved mutations of the release. |
status.lastAttempted.resolvedMutations[].contentHash required | string | ContentHash is the content hash of the mutation. |
status.lastAttempted.resolvedMutations[].index required | integer | Index is the index of the mutation. |
status.lastAttempted.resolvedMutations[].sourceRef required | ReleaseMutationFromSpec | SourceRef is the source reference of the mutation. |
status.lastAttempted.resolvedMutations[].sourceRef.kind required | string | Kind is the kind of the source. |
status.lastAttempted.resolvedMutations[].sourceRef.name required | string | Name is the name of the source. |
status.lastAttempted.resolvedMutations[].sourceRef.namespace | string | Namespace is the namespace of the source. |
status.lastAttempted.resolvedMutations[].sourceRef.path required | string | Path is the path to the mutation within the source. |
status.lastAttempted.resolvedMutations[].sourceRef.ref | ReleaseGitRepositoryRefSpec | Ref is the reference for GitRepository used as a mutation source. |
status.lastAttempted.resolvedMutations[].sourceRef.ref.branch | string | Branch is the branch to track in the Git repository. |
status.lastAttempted.resolvedMutations[].sourceRef.ref.commit | string | Commit is the commit to track in the Git repository. |
status.lastAttempted.resolvedMutations[].sourceRef.ref.semver | string | Semver is the tag-based semantic version expression to track in the Git repository. |
status.lastAttempted.resolvedMutations[].sourceRef.ref.tag | string | Tag is the tag to track in the Git repository. |
status.lastAttempted.resolvedMutations[].sourceRevision required | string | SourceRevision is the source revision of the mutation. |
status.lastAttempted.resolvedMutations[].type required | string | Type is the type of the mutation.
|
status.lastAttempted.resolvedSource required | ResolvedSource | ResolvedSource is the resolved source of the release. |
status.lastAttempted.resolvedSource.contentType required | string | ContentType is the type of the content.
|
status.lastAttempted.resolvedSource.kind required | string | Kind is the kind of the source. |
status.lastAttempted.resolvedSource.name required | string | Name is the name of the source. |
status.lastAttempted.resolvedSource.namespace | string | Namespace is the namespace of the source. |
status.lastAttempted.resolvedSource.observedGeneration required | integer | ObservedGeneration is the observed generation of the source. |
status.lastAttempted.resolvedSource.path | string | Path is the path to the content within the source. |
status.lastAttempted.resolvedSource.ref | string | Ref is the ref of the source if applicable, e.g. branch, tag, commit. |
status.lastAttempted.resolvedSource.revision required | string | Revision is the revision of the source. |
status.lastAttempted.resolvedSource.uid required | string | UID is the UID of the source. |
status.lastAttempted.resolvedSource.url required | string | URL is the URL of the source. |
status.lastAttempted.syncedAt | Time | SyncedAt is the time when the Release was synced. |
status.lastAttempted.syncedResources | integer | SyncedResources is the number of resources synced. |
status.lastHandledForceSyncAt | Time | LastHandledForceSyncAt reflects the timestamp of the last handled forced sync (/sync?force=true). A force request newer than this bypasses the pre-apply dry-run and clears a held Failed/RolledBack rollout. |
status.lastHandledSyncAt | Time | LastHandledSyncAt reflects the timestamp when the last sync was handled |
status.lastHealthy | LastHealthy | LastHealthy is the reference to the last healthy applied render. |
status.lastHealthy.renderRef required | string | |
status.lastSuccessful | ReleaseAttemptedRenderStatus | LastSuccessful is the last successful sync attempt. |
status.lastSuccessful.attemptedAt | Time | AttemptedAt is the time when the Release sync was attempted. |
status.lastSuccessful.failure | ReleaseAttemptedRenderFailureStatus | Failure is the failure status of the release render attempt. |
status.lastSuccessful.failure.hookName | string | HookName is the name of the hook that failed. |
status.lastSuccessful.failure.hookPhase | string | HookPhase is the phase of the hook that failed.
|
status.lastSuccessful.failure.message required | string | Message is the failure message. |
status.lastSuccessful.failure.mutationIndex | integer | MutationIndex is the index of the mutation that failed. |
status.lastSuccessful.failure.stage required | string | Stage is the stage of the failure.
|
status.lastSuccessful.failure.waveNumber | integer | WaveNumber is the wave number of the failure. |
status.lastSuccessful.phase | string | Phase is the phase of the release render attempt.
|
status.lastSuccessful.renderRef required | string | RenderRef is the reference to the rendered state. |
status.lastSuccessful.resolvedCluster required | ResolvedCluster | ResolvedCluster is the resolved cluster of the release. |
status.lastSuccessful.resolvedCluster.metadataSnapshot | map[string]string | MetadataSnapshot is the snapshot of the cluster metadata. |
status.lastSuccessful.resolvedCluster.name required | string | Name is the name of the cluster. |
status.lastSuccessful.resolvedCluster.namespace | string | Namespace is the namespace of the cluster. |
status.lastSuccessful.resolvedCluster.observedGeneration required | integer | ObservedGeneration is the observed generation of the cluster. |
status.lastSuccessful.resolvedCluster.server required | string | Server is the server URL of the cluster. |
status.lastSuccessful.resolvedCluster.uid required | string | UID is the UID of the cluster. |
status.lastSuccessful.resolvedMutations required | []ResolvedMutationlist type: atomic | ResolvedMutations is the resolved mutations of the release. |
status.lastSuccessful.resolvedMutations[].contentHash required | string | ContentHash is the content hash of the mutation. |
status.lastSuccessful.resolvedMutations[].index required | integer | Index is the index of the mutation. |
status.lastSuccessful.resolvedMutations[].sourceRef required | ReleaseMutationFromSpec | SourceRef is the source reference of the mutation. |
status.lastSuccessful.resolvedMutations[].sourceRef.kind required | string | Kind is the kind of the source. |
status.lastSuccessful.resolvedMutations[].sourceRef.name required | string | Name is the name of the source. |
status.lastSuccessful.resolvedMutations[].sourceRef.namespace | string | Namespace is the namespace of the source. |
status.lastSuccessful.resolvedMutations[].sourceRef.path required | string | Path is the path to the mutation within the source. |
status.lastSuccessful.resolvedMutations[].sourceRef.ref | ReleaseGitRepositoryRefSpec | Ref is the reference for GitRepository used as a mutation source. |
status.lastSuccessful.resolvedMutations[].sourceRef.ref.branch | string | Branch is the branch to track in the Git repository. |
status.lastSuccessful.resolvedMutations[].sourceRef.ref.commit | string | Commit is the commit to track in the Git repository. |
status.lastSuccessful.resolvedMutations[].sourceRef.ref.semver | string | Semver is the tag-based semantic version expression to track in the Git repository. |
status.lastSuccessful.resolvedMutations[].sourceRef.ref.tag | string | Tag is the tag to track in the Git repository. |
status.lastSuccessful.resolvedMutations[].sourceRevision required | string | SourceRevision is the source revision of the mutation. |
status.lastSuccessful.resolvedMutations[].type required | string | Type is the type of the mutation.
|
status.lastSuccessful.resolvedSource required | ResolvedSource | ResolvedSource is the resolved source of the release. |
status.lastSuccessful.resolvedSource.contentType required | string | ContentType is the type of the content.
|
status.lastSuccessful.resolvedSource.kind required | string | Kind is the kind of the source. |
status.lastSuccessful.resolvedSource.name required | string | Name is the name of the source. |
status.lastSuccessful.resolvedSource.namespace | string | Namespace is the namespace of the source. |
status.lastSuccessful.resolvedSource.observedGeneration required | integer | ObservedGeneration is the observed generation of the source. |
status.lastSuccessful.resolvedSource.path | string | Path is the path to the content within the source. |
status.lastSuccessful.resolvedSource.ref | string | Ref is the ref of the source if applicable, e.g. branch, tag, commit. |
status.lastSuccessful.resolvedSource.revision required | string | Revision is the revision of the source. |
status.lastSuccessful.resolvedSource.uid required | string | UID is the UID of the source. |
status.lastSuccessful.resolvedSource.url required | string | URL is the URL of the source. |
status.lastSuccessful.syncedAt | Time | SyncedAt is the time when the Release was synced. |
status.lastSuccessful.syncedResources | integer | SyncedResources is the number of resources synced. |
status.lifecycle | LifecycleStatus | Lifecycle reflects the observed state of the release lifecycle hooks. |
status.lifecycle.postDelete | []LifecycleHookStatuslist type: map, keys: name | PostDelete are the post-delete hooks. |
status.lifecycle.postDelete[].apiVersion required | string | ApiVersion is the API version of the resource created by the hook. |
status.lifecycle.postDelete[].cleanedUpAt | Time | CleanedUpAt is the time when the hook was cleaned up. |
status.lifecycle.postDelete[].completedAt | Time | CompletedAt is the time when the hook completed. |
status.lifecycle.postDelete[].followUpAction | string | FollowUpAction is the action to take after the hook failed.
|
status.lifecycle.postDelete[].kind required | string | Kind is the kind of the resource created by the hook. |
status.lifecycle.postDelete[].message | string | Message is the human-readable message containing the failure reason, if any. |
status.lifecycle.postDelete[].name required | string | Name is the name of the hook. |
status.lifecycle.postDelete[].renderRef | string | RenderRef is the hash of the release render lifecycle hook was triggered by. |
status.lifecycle.postDelete[].resourceName required | string | ResourceName is the name of the resource created by the hook. |
status.lifecycle.postDelete[].resourceNamespace required | string | ResourceNamespace is the namespace of the resource created by the hook. |
status.lifecycle.postDelete[].source required | string | Source is the source of the hook.
|
status.lifecycle.postDelete[].startedAt | Time | StartedAt is the time when the hook started. |
status.lifecycle.postDelete[].state required | string | State is the state of the hook.
|
status.lifecycle.postDelete[].weight required | integer | Weight is the weight of the hook. |
status.lifecycle.postSync | []LifecycleHookStatuslist type: map, keys: name | PostSync are the post-sync hooks. |
status.lifecycle.postSync[].apiVersion required | string | ApiVersion is the API version of the resource created by the hook. |
status.lifecycle.postSync[].cleanedUpAt | Time | CleanedUpAt is the time when the hook was cleaned up. |
status.lifecycle.postSync[].completedAt | Time | CompletedAt is the time when the hook completed. |
status.lifecycle.postSync[].followUpAction | string | FollowUpAction is the action to take after the hook failed.
|
status.lifecycle.postSync[].kind required | string | Kind is the kind of the resource created by the hook. |
status.lifecycle.postSync[].message | string | Message is the human-readable message containing the failure reason, if any. |
status.lifecycle.postSync[].name required | string | Name is the name of the hook. |
status.lifecycle.postSync[].renderRef | string | RenderRef is the hash of the release render lifecycle hook was triggered by. |
status.lifecycle.postSync[].resourceName required | string | ResourceName is the name of the resource created by the hook. |
status.lifecycle.postSync[].resourceNamespace required | string | ResourceNamespace is the namespace of the resource created by the hook. |
status.lifecycle.postSync[].source required | string | Source is the source of the hook.
|
status.lifecycle.postSync[].startedAt | Time | StartedAt is the time when the hook started. |
status.lifecycle.postSync[].state required | string | State is the state of the hook.
|
status.lifecycle.postSync[].weight required | integer | Weight is the weight of the hook. |
status.lifecycle.preDelete | []LifecycleHookStatuslist type: map, keys: name | PreDelete are the pre-delete hooks. |
status.lifecycle.preDelete[].apiVersion required | string | ApiVersion is the API version of the resource created by the hook. |
status.lifecycle.preDelete[].cleanedUpAt | Time | CleanedUpAt is the time when the hook was cleaned up. |
status.lifecycle.preDelete[].completedAt | Time | CompletedAt is the time when the hook completed. |
status.lifecycle.preDelete[].followUpAction | string | FollowUpAction is the action to take after the hook failed.
|
status.lifecycle.preDelete[].kind required | string | Kind is the kind of the resource created by the hook. |
status.lifecycle.preDelete[].message | string | Message is the human-readable message containing the failure reason, if any. |
status.lifecycle.preDelete[].name required | string | Name is the name of the hook. |
status.lifecycle.preDelete[].renderRef | string | RenderRef is the hash of the release render lifecycle hook was triggered by. |
status.lifecycle.preDelete[].resourceName required | string | ResourceName is the name of the resource created by the hook. |
status.lifecycle.preDelete[].resourceNamespace required | string | ResourceNamespace is the namespace of the resource created by the hook. |
status.lifecycle.preDelete[].source required | string | Source is the source of the hook.
|
status.lifecycle.preDelete[].startedAt | Time | StartedAt is the time when the hook started. |
status.lifecycle.preDelete[].state required | string | State is the state of the hook.
|
status.lifecycle.preDelete[].weight required | integer | Weight is the weight of the hook. |
status.lifecycle.preSync | []LifecycleHookStatuslist type: map, keys: name | PreSync are the pre-sync hooks. |
status.lifecycle.preSync[].apiVersion required | string | ApiVersion is the API version of the resource created by the hook. |
status.lifecycle.preSync[].cleanedUpAt | Time | CleanedUpAt is the time when the hook was cleaned up. |
status.lifecycle.preSync[].completedAt | Time | CompletedAt is the time when the hook completed. |
status.lifecycle.preSync[].followUpAction | string | FollowUpAction is the action to take after the hook failed.
|
status.lifecycle.preSync[].kind required | string | Kind is the kind of the resource created by the hook. |
status.lifecycle.preSync[].message | string | Message is the human-readable message containing the failure reason, if any. |
status.lifecycle.preSync[].name required | string | Name is the name of the hook. |
status.lifecycle.preSync[].renderRef | string | RenderRef is the hash of the release render lifecycle hook was triggered by. |
status.lifecycle.preSync[].resourceName required | string | ResourceName is the name of the resource created by the hook. |
status.lifecycle.preSync[].resourceNamespace required | string | ResourceNamespace is the namespace of the resource created by the hook. |
status.lifecycle.preSync[].source required | string | Source is the source of the hook.
|
status.lifecycle.preSync[].startedAt | Time | StartedAt is the time when the hook started. |
status.lifecycle.preSync[].state required | string | State is the state of the hook.
|
status.lifecycle.preSync[].weight required | integer | Weight is the weight of the hook. |
status.lifecycle.syncFailed | []LifecycleHookStatuslist type: map, keys: name | SyncFailed are the sync-failed hooks. |
status.lifecycle.syncFailed[].apiVersion required | string | ApiVersion is the API version of the resource created by the hook. |
status.lifecycle.syncFailed[].cleanedUpAt | Time | CleanedUpAt is the time when the hook was cleaned up. |
status.lifecycle.syncFailed[].completedAt | Time | CompletedAt is the time when the hook completed. |
status.lifecycle.syncFailed[].followUpAction | string | FollowUpAction is the action to take after the hook failed.
|
status.lifecycle.syncFailed[].kind required | string | Kind is the kind of the resource created by the hook. |
status.lifecycle.syncFailed[].message | string | Message is the human-readable message containing the failure reason, if any. |
status.lifecycle.syncFailed[].name required | string | Name is the name of the hook. |
status.lifecycle.syncFailed[].renderRef | string | RenderRef is the hash of the release render lifecycle hook was triggered by. |
status.lifecycle.syncFailed[].resourceName required | string | ResourceName is the name of the resource created by the hook. |
status.lifecycle.syncFailed[].resourceNamespace required | string | ResourceNamespace is the namespace of the resource created by the hook. |
status.lifecycle.syncFailed[].source required | string | Source is the source of the hook.
|
status.lifecycle.syncFailed[].startedAt | Time | StartedAt is the time when the hook started. |
status.lifecycle.syncFailed[].state required | string | State is the state of the hook.
|
status.lifecycle.syncFailed[].weight required | integer | Weight is the weight of the hook. |
status.observedGeneration | integer | ObservedGeneration is the last generation that was observed by the controller. |
status.pin | ReleasePinStatus | Pin is the status of the release pin. |
status.pin.intent required | string | Intent is the intention of pinning the release. Derives from the Release.Spec.Pin.RenderRef: if the renderRef matches the latest Release state, then the intent is "freeze". Otherwise, it's "rollback".
|
status.pin.renderInputs | ReleasePinRenderInputsStatus | RenderInputs is the inputs used to render the release. |
status.pin.renderInputs.contentPath | string | ContentPath is the path to the content within the source. |
status.pin.renderInputs.contentType required | string | ContentType is the type of the content.
|
status.pin.renderInputs.mutationsHash | string | MutationsHash is the hash of the mutations applied to the content. |
status.pin.renderInputs.sourceKind required | string | SourceKind is the kind of the source. |
status.pin.renderInputs.sourceName required | string | SourceName is the name of the source. |
status.pin.renderInputs.sourceNamespace | string | SourceNamespace is the namespace of the source. |
status.pin.renderInputs.sourceRevision | string | SourceRevision is the revision of the source. |
status.reconciledAt | Time | ReconciledAt is the time when the release was reconciled. |
status.resolvedRetentionPolicy | ResolvedRetentionPolicyStatus | ResolvedRetentionPolicy is the resolved retention policy of the release. |
status.resolvedRetentionPolicy.historyCount required | integer | HistoryCount is the observed history count. |
status.resolvedRetentionPolicy.keepHistory required | integer | KeepHistory is the resulting retention policy for the release. |
status.rollout | RolloutStatus | Rollout reflects the release rollout state. |
status.rollout.message | string | Message contains the human-readable message about the failure reason. |
status.rollout.renderRef required | string | RenderRef reflects the reference to the render being rolled out. |
status.rollout.startedAt required | Time | StartedAt contains the timestamp when the rollout started. |
status.rollout.state required | string | State reflects the rollout state.
|
status.waves | []ResourceWaveStatuslist type: map, keys: number | Waves reflects the order in which resources were applied and their health status. Each wave entry represents a group of resources applied together, with a state indicating whether they have been fully applied and healthy, are in progress, or have failed. |
status.waves[].applied | boolean | Applied reflects whether all resources within the wave are applied. |
status.waves[].completedAt | Time | CompletedAt is the time when the wave completed. |
status.waves[].failedAt | Time | FailedAt is the time when the wave failed. |
status.waves[].healthy | boolean | Healthy reflects whether all resources within the wave are healthy. |
status.waves[].message | string | Message is the failure message. |
status.waves[].number required | integer | Number is the resources wave weight. |
status.waves[].resources | integer | Resources is the number of resources in the wave. |
status.waves[].startedAt | Time | StartedAt is the time when the wave started. |
status.waves[].state | string | State is the state of the wave.
|
Conditions#
Each condition has one writer. There is no combined Ready condition on a Release. Read the
conditions together:
Applied | InSync | Healthy | Meaning |
|---|---|---|---|
True | True | True | Applied, no drift, healthy. |
True | True | False, reason Progressing | The workloads are not ready yet. |
True | True | False, reason Degraded | Applied and in sync, but a resource failed its health rules after the deadline. |
True | False | any | The live state drifted from the render. |
False | any | any | The last reconcile did not apply. The reason tells why. |
InSync and Healthy are written by the observer. Applied, RolloutSucceeded and
LifecycleSucceeded are written by the controller-manager.
Applied · written by convoy-controller-manager (field manager convoy-release)
| Reason | Status | Meaning |
|---|---|---|
Applied | True | convoy applied the current render. In manual sync mode, the current render is equal to the last applied render. |
SourceNotReady | False | convoy could not fetch the source. convoy retries. |
ValuesNotReady | False | convoy could not read a Helm values layer (a ConfigMap, a Secret or a GitRepository path). convoy retries. |
ClusterNotReady | False | The Cluster does not exist or is not reachable. convoy retries. |
Unsupported | False | The Release uses a feature that convoy does not implement, for example a Git semver ref, Helm dependencyMode: resolve or jsonnet content. This is a configuration error, so convoy does not retry with backoff. |
Unappliable | False | The target cluster rejected the render in the pre-apply server-side dry run. convoy applies nothing. A forced /sync skips the dry run. |
DeployFailed | False | Rendering, mutation or the apply failed. The message and status.lastAttempted.failure.stage tell which step failed. convoy retries. |
PruneFailed | False | convoy applied the render, but could not delete an object that the render no longer contains. convoy retries. |
Pinned | False | convoy cannot apply the pinned render, because no render store is configured or the store does not contain that render. |
WaitingForSync | False | Manual sync mode. The current render differs from the last applied render. convoy waits for a /sync request. |
WaitingForWaveHealth | False | A sync wave waits until the resources of the previous wave are healthy. |
WaveFailed | False | A sync wave timed out while it waited for the previous wave. The Release has no failurePolicy. |
RolloutFailed | False | A sync wave timed out while it waited for the previous wave, and the failurePolicy did not roll back. |
RolledBack | True | The rollout failed and convoy applied the last healthy render again. |
WaitingForClusterWave | False | The Release waits for the Releases of a lower cluster wave on the same Cluster. |
ClusterWaveFailed | False | The Releases of a lower cluster wave did not become ready before the cluster-wave timeout. |
WaitingForHook | False | convoy waits for the workloads of a lifecycle hook phase to complete. |
HookFailed | False | A lifecycle hook with onFailure: Fail failed. convoy stops the sync. |
RolloutSucceeded · written by convoy-controller-manager (field manager convoy-release)
| Reason | Status | Meaning |
|---|---|---|
Progressing | Unknown | convoy waits for the resources of the render to become healthy. |
Succeeded | True | All resources of the render became healthy. |
Failed | False | The resources did not become healthy before the deadline, and convoy did not roll back. |
RolledBack | False | The resources did not become healthy before the deadline, and convoy applied the last healthy render. |
LifecycleSucceeded · written by convoy-controller-manager (field manager convoy-release)
| Reason | Status | Meaning |
|---|---|---|
AllSucceeded | True | All lifecycle hooks succeeded or were skipped. |
Running | Unknown | At least one lifecycle hook is still running. |
HookFailed | False | A lifecycle hook failed. This is so for each onFailure value. onFailure only controls if the sync continues. |
InSync · written by convoy-observer (field manager convoy-observe)
| Reason | Status | Meaning |
|---|---|---|
InSync | True | The live objects match the desired render. |
Drifted | False | At least one live object differs from the desired render, or is missing. In automatic sync mode, the observer requests a /sync. |
Undetermined | Unknown | The observer could not compare the live state with the render, for example because the cluster is not reachable. |
Healthy · written by convoy-observer (field manager convoy-health)
| Reason | Status | Meaning |
|---|---|---|
Healthy | True | All assessed resources are healthy. |
Progressing | False | At least one resource is not healthy yet, and no resource is Degraded or Unknown. |
Degraded | False | At least one resource is Degraded. It did not pass its health rules before spec.healthAssessment.deadline. |
Unknown | Unknown | At least one resource has no health state, or the observer could not assess the Release (for example, a health rule does not compile). |
NotConfigured | True | The Release has no spec.healthAssessment. |
Pending | Unknown | The current render is not applied or not assessed yet. The health of the previous render does not count. |
Printer columns#
kubectl get releases shows these columns:
| Column | Value |
|---|---|
Content | spec.content.type |
Source | The source type and name |
Cluster | spec.clusterRef.name |
State | status.rollout.state, or <unknown> without a failure policy |
Applied, InSync, Healthy | The status of each condition, or <unknown> |
Lifecycle | N/A, Running:<phase>, Failed:<phase> or Completed:<phase> for the hooks of the current render |
- Subresources
The verbs, served components and RBAC of the Release subresources.
In the code
convoy v0.9.0
api/core.ValidateReleaseapi/core/validation.go:141api/core.ValidateReleaseUpdateapi/core/validation.go:212api/core.validateSameNamespaceRefsapi/core/validation.go:168api/core.validateFailurePolicyapi/core/validation.go:334api/core.validateLifecycleHookapi/core/validation.go:421internal/render.gatherFilesinternal/render/render.go:86internal/controller/gitrepository.(*gitFetcher).cloneinternal/controller/gitrepository/fetcher.go:132internal/controller/release.effectiveKeepHistoryinternal/controller/release/controller.go:1829