--- title: Core Schemas description: BuildPlan defines the holos rendering pipeline. sidebar_position: 100 --- ```go import "github.com/holos-run/holos/api/core/v1alpha5" ``` Package core contains schemas for a [Platform](<#Platform>) and [BuildPlan](<#BuildPlan>). Holos takes a [Platform](<#Platform>) as input, then iterates over each [Component](<#Component>) to produce a [BuildPlan](<#BuildPlan>). Holos processes the [BuildPlan](<#BuildPlan>) to produce fully rendered manifests, each an [Artifact](<#Artifact>). ## Index - [type Artifact](<#Artifact>) - [type Auth](<#Auth>) - [type AuthSource](<#AuthSource>) - [type BuildPlan](<#BuildPlan>) - [type BuildPlanSpec](<#BuildPlanSpec>) - [type Chart](<#Chart>) - [type Command](<#Command>) - [type Component](<#Component>) - [type ExtractYAML](<#ExtractYAML>) - [type File](<#File>) - [type FileContent](<#FileContent>) - [type FileContentMap](<#FileContentMap>) - [type FilePath](<#FilePath>) - [type Generator](<#Generator>) - [type Helm](<#Helm>) - [type Instance](<#Instance>) - [type InternalLabel](<#InternalLabel>) - [type Join](<#Join>) - [type Kind](<#Kind>) - [type Kustomization](<#Kustomization>) - [type Kustomize](<#Kustomize>) - [type Metadata](<#Metadata>) - [type OutputRef](<#OutputRef>) - [type Platform](<#Platform>) - [type PlatformSpec](<#PlatformSpec>) - [type Repository](<#Repository>) - [type Resource](<#Resource>) - [type Resources](<#Resources>) - [type TaskData](<#TaskData>) - [type Transformer](<#Transformer>) - [type Validator](<#Validator>) - [type ValueFile](<#ValueFile>) - [type Values](<#Values>) ## type Artifact {#Artifact} Artifact represents one fully rendered manifest produced by a [Transformer](<#Transformer>) sequence, which transforms a [Generator](<#Generator>) collection. A [BuildPlan](<#BuildPlan>) produces an [Artifact](<#Artifact>) collection. Each Artifact produces one manifest file artifact. Generator Output values are used as Transformer Inputs. The Output field of the final [Transformer](<#Transformer>) should have the same value as the Artifact field. When there is more than one [Generator](<#Generator>) there must be at least one [Transformer](<#Transformer>) to combine outputs into one Artifact. If there is a single Generator, it may directly produce the Artifact output. An Artifact is processed concurrently with other artifacts in the same [BuildPlan](<#BuildPlan>). An Artifact should not use an output from another Artifact as an input. Each [Generator](<#Generator>) may also run concurrently. Each [Transformer](<#Transformer>) is executed sequentially starting after all generators have completed. Output fields are write\-once. It is an error for multiple Generators or Transformers to produce the same Output value within the context of a [BuildPlan](<#BuildPlan>). ```go type Artifact struct { Artifact FilePath `json:"artifact,omitempty" yaml:"artifact,omitempty"` Generators []Generator `json:"generators,omitempty" yaml:"generators,omitempty"` Transformers []Transformer `json:"transformers,omitempty" yaml:"transformers,omitempty"` Validators []Validator `json:"validators,omitempty" yaml:"validators,omitempty"` Skip bool `json:"skip,omitempty" yaml:"skip,omitempty"` } ``` ## type Auth {#Auth} Auth represents environment variable names containing auth credentials. ```go type Auth struct { Username AuthSource `json:"username" yaml:"username"` Password AuthSource `json:"password" yaml:"password"` } ``` ## type AuthSource {#AuthSource} AuthSource represents a source for the value of an [Auth](<#Auth>) field. ```go type AuthSource struct { Value string `json:"value,omitempty" yaml:"value,omitempty"` FromEnv string `json:"fromEnv,omitempty" yaml:"fromEnv,omitempty"` } ``` ## type BuildPlan {#BuildPlan} BuildPlan represents an implementation of the [rendered manifest pattern](). Holos processes a BuildPlan to produce one or more [Artifact](<#Artifact>) output files. BuildPlan artifact files usually contain Kubernetes manifests, but they may have any content. A BuildPlan usually produces two artifacts. One artifact contains a manifest of resources. A second artifact contains a GitOps resource to manage the first, usually an ArgoCD Application resource. Holos uses CUE to construct a BuildPlan. A future enhancement will support user defined executables providing a BuildPlan to Holos in the style of an [external credential provider](). ```go type BuildPlan struct { // Kind represents the type of the resource. Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""` // APIVersion represents the versioned schema of the resource. APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha5\""` // Metadata represents data about the resource such as the Name. Metadata Metadata `json:"metadata" yaml:"metadata"` // Spec specifies the desired state of the resource. Spec BuildPlanSpec `json:"spec" yaml:"spec"` } ``` ## type BuildPlanSpec {#BuildPlanSpec} BuildPlanSpec represents the specification of the [BuildPlan](<#BuildPlan>). ```go type BuildPlanSpec struct { // Artifacts represents the artifacts for holos to build. Artifacts []Artifact `json:"artifacts" yaml:"artifacts"` // Disabled causes the holos cli to disregard the build plan. Disabled bool `json:"disabled,omitempty" yaml:"disabled,omitempty"` } ``` ## type Chart {#Chart} Chart represents a [Helm](<#Helm>) Chart. ```go type Chart struct { // Name represents the chart name. Name string `json:"name" yaml:"name"` // Version represents the chart version. Version string `json:"version" yaml:"version"` // Release represents the chart release when executing helm template. Release string `json:"release" yaml:"release"` // Repository represents the repository to fetch the chart from. Repository Repository `json:"repository,omitempty" yaml:"repository,omitempty"` } ``` ## type Command {#Command} Command represents a generic command for use as a Generator, Transformer, or Validator. Holos uses the Go template engine to render the Args field using data provided by the TaskData field. For example to fill in the fully qualified temporary directory used to provide inputs to the task. ```go type Command struct { // DisplayName represents a friendly display name for the command. DisplayName string `json:"displayName,omitempty" yaml:"displayName,omitempty"` // Args represents the complete command argument vector as a go template. Args []string `json:"args,omitempty" yaml:"args,omitempty"` // OutputRef references the source of the output data. OutputRef OutputRef `json:"outputRef,omitempty" yaml:"outputRef,omitempty"` // TaskData populated by Holos for template rendering. TaskData TaskData `json:"taskData,omitempty" yaml:"taskData,omitempty"` } ``` ## type Component {#Component} Component represents the complete context necessary to produce a [BuildPlan](<#BuildPlan>) from a path containing parameterized CUE configuration. ```go type Component struct { // Name represents the name of the component. Injected as the tag variable // "holos_component_name". Name string `json:"name" yaml:"name"` // Path represents the path of the component relative to the platform root. // Injected as the tag variable "holos_component_path". Path string `json:"path" yaml:"path"` // Instances represents additional cue instance paths to unify with Path. // Useful to unify data files into a component BuildPlan. Added in holos // 0.101.7. Instances []Instance `json:"instances,omitempty" yaml:"instances,omitempty"` // WriteTo represents the holos render component --write-to flag. If empty, // the default value for the --write-to flag is used. WriteTo string `json:"writeTo,omitempty" yaml:"writeTo,omitempty"` // Parameters represent user defined input variables to produce various // [BuildPlan] resources from one component path. Injected as CUE @tag // variables. Parameters with a "holos_" prefix are reserved for use by the // Holos Authors. Multiple environments are a prime example of an input // parameter that should always be user defined, never defined by Holos. Parameters map[string]string `json:"parameters,omitempty" yaml:"parameters,omitempty"` // Labels represent selector labels for the component. Copied to the // resulting BuildPlan. Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` // Annotations represents arbitrary non-identifying metadata. Use the // `app.holos.run/description` to customize the log message of each BuildPlan. Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` } ``` ## type ExtractYAML {#ExtractYAML} ExtractYAML represents a cue data instance encoded as yaml or json. If Path refers to a directory all files in the directory are extracted non\-recursively. Otherwise, path must refer to a file. ```go type ExtractYAML struct { Path string `json:"path" yaml:"path"` } ``` ## type File {#File} File represents a simple single file copy [Generator](<#Generator>). Useful with a [Kustomize](<#Kustomize>) [Transformer](<#Transformer>) to process plain manifest files stored in the component directory. Multiple File generators may be used to transform multiple resources. ```go type File struct { // Source represents a file sub-path relative to the component path. Source FilePath `json:"source" yaml:"source"` } ``` ## type FileContent {#FileContent} FileContent represents file contents. ```go type FileContent string ``` ## type FileContentMap {#FileContentMap} FileContentMap represents a mapping of file paths to file contents. ```go type FileContentMap map[FilePath]FileContent ``` ## type FilePath {#FilePath} FilePath represents a file path. ```go type FilePath string ``` ## type Generator {#Generator} Generator generates Kubernetes resources. [Helm](<#Helm>) and [Resources](<#Resources>) are the most commonly used, often paired together to mix\-in resources to an unmodified Helm chart. A simple [File](<#File>) generator is also available for use with the [Kustomize](<#Kustomize>) transformer. Each Generator in an [Artifact](<#Artifact>) must have a distinct Output value for a [Transformer](<#Transformer>) to reference. 1. [Resources](<#Resources>) \- Generates resources from CUE code. 2. [Helm](<#Helm>) \- Generates rendered yaml from a [Chart](<#Chart>). 3. [File](<#File>) \- Generates data by reading a file from the component directory. ```go type Generator struct { // Kind represents the kind of generator. Must be Resources, Helm, or File. Kind string `json:"kind" yaml:"kind" cue:"\"Resources\" | \"Helm\" | \"File\""` // Output represents a file for a Transformer or Artifact to consume. Output FilePath `json:"output" yaml:"output"` // Resources generator. Ignored unless kind is Resources. Resources are // stored as a two level struct. The top level key is the Kind of resource, // e.g. Namespace or Deployment. The second level key is an arbitrary // InternalLabel. The third level is a map[string]any representing the // Resource. Resources Resources `json:"resources,omitempty" yaml:"resources,omitempty"` // Helm generator. Ignored unless kind is Helm. Helm Helm `json:"helm,omitempty" yaml:"helm,omitempty"` // File generator. Ignored unless kind is File. File File `json:"file,omitempty" yaml:"file,omitempty"` } ``` ## type Helm {#Helm} Helm represents a [Chart](<#Chart>) manifest [Generator](<#Generator>). ```go type Helm struct { // Chart represents a helm chart to manage. Chart Chart `json:"chart" yaml:"chart"` // Values represents values for holos to marshal into values.yaml when // rendering the chart. Values follow ValueFiles when both are provided. Values Values `json:"values" yaml:"values"` // ValueFiles represents hierarchial value files passed in order to the helm // template -f flag. Useful for migration from an ApplicationSet. Use Values // instead. ValueFiles precede Values when both are provided. ValueFiles []ValueFile `json:"valueFiles,omitempty" yaml:"valueFiles,omitempty"` // EnableHooks enables helm hooks when executing the `helm template` command. EnableHooks bool `json:"enableHooks,omitempty" yaml:"enableHooks,omitempty"` // Namespace represents the helm namespace flag Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` // APIVersions represents the helm template --api-versions flag APIVersions []string `json:"apiVersions,omitempty" yaml:"apiVersions,omitempty"` // KubeVersion represents the helm template --kube-version flag KubeVersion string `json:"kubeVersion,omitempty" yaml:"kubeVersion,omitempty"` } ``` ## type Instance {#Instance} Instance represents a data instance to unify with the configuration. Useful to unify json and yaml files with cue configuration files for integration with other tools. For example, executing holos render platform from a pull request workflow after [Kargo]() executes the [yaml update]() and [git wait for pr]() promotion steps. ```go type Instance struct { // Kind is a discriminator. Kind string `json:"kind" yaml:"kind" cue:"\"ExtractYAML\""` // Ignored unless kind is ExtractYAML. ExtractYAML ExtractYAML `json:"extractYAML,omitempty" yaml:"extractYAML,omitempty"` } ``` ## type InternalLabel {#InternalLabel} InternalLabel is an arbitrary unique identifier internal to holos itself. The holos cli is expected to never write a InternalLabel value to rendered output files, therefore use a InternalLabel when the identifier must be unique and internal. Defined as a type for clarity and type checking. ```go type InternalLabel string ``` ## type Join {#Join} Join represents a [Transformer](<#Transformer>) using [bytes.Join]() to concatenate multiple inputs into one output with a separator. Useful for combining output from [Helm](<#Helm>) and [Resources](<#Resources>) together into one [Artifact](<#Artifact>) when [Kustomize](<#Kustomize>) is otherwise unnecessary. ```go type Join struct { Separator string `json:"separator,omitempty" yaml:"separator,omitempty"` } ``` ## type Kind {#Kind} Kind is a discriminator. Defined as a type for clarity and type checking. ```go type Kind string ``` ## type Kustomization {#Kustomization} Kustomization represents a kustomization.yaml file for use with the [Kustomize](<#Kustomize>) [Transformer](<#Transformer>). Untyped to avoid tightly coupling holos to kubectl versions which was a problem for the Flux maintainers. Type checking is expected to happen in CUE against the kubectl version the user prefers. ```go type Kustomization map[string]any ``` ## type Kustomize {#Kustomize} Kustomize represents a kustomization [Transformer](<#Transformer>). ```go type Kustomize struct { // Kustomization represents the decoded kustomization.yaml file Kustomization Kustomization `json:"kustomization" yaml:"kustomization"` // Files holds file contents for kustomize, e.g. patch files. Files FileContentMap `json:"files,omitempty" yaml:"files,omitempty"` } ``` ## type Metadata {#Metadata} Metadata represents data about the resource such as the Name. ```go type Metadata struct { // Name represents the resource name. Name string `json:"name" yaml:"name"` // Labels represents a resource selector. Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` // Annotations represents arbitrary non-identifying metadata. For example // holos uses the `app.holos.run/description` annotation to log resources in a // user customized way. Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` } ``` ## type OutputRef {#OutputRef} OutputRef represents a reference to the data source used as the output of a task. For example, a Generator output may be sourced from standard output or a file path. ```go type OutputRef struct { // Kind represents the kind of output produced. Kind string `json:"kind,omitempty" yaml:"kind,omitempty" cue:"string | *\"Pipe\" | \"Path\""` // Pipe represents stdout or stderr. Ignored unless kind is Pipe. Pipe string `json:"pipe,omitempty" yaml:"pipe,omitempty" cue:"string | *\"stdout\" | \"stderr\""` // Path represents an artifact path relative to the task temp directory. // Ignored unless kind is Path. Path string `json:"path,omitempty" yaml:"path,omitempty"` } ``` ## type Platform {#Platform} Platform represents a platform to manage. A Platform specifies a [Component](<#Component>) collection and integrates the components together into a holistic platform. Holos iterates over the [Component](<#Component>) collection producing a [BuildPlan](<#BuildPlan>) for each, which holos then executes to render manifests. Inspect a Platform resource holos would process by executing: ``` cue export --out yaml ./platform ``` ```go type Platform struct { // Kind is a string value representing the resource. Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""` // APIVersion represents the versioned schema of this resource. APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha5\""` // Metadata represents data about the resource such as the Name. Metadata Metadata `json:"metadata" yaml:"metadata"` // Spec represents the platform specification. Spec PlatformSpec `json:"spec" yaml:"spec"` } ``` ## type PlatformSpec {#PlatformSpec} PlatformSpec represents the platform specification. ```go type PlatformSpec struct { // Components represents a collection of holos components to manage. Components []Component `json:"components" yaml:"components"` } ``` ## type Repository {#Repository} Repository represents a [Helm](<#Helm>) [Chart](<#Chart>) repository. The Auth field is useful to configure http basic authentication to the Helm repository. Holos gets the username and password from the environment variables represented by the Auth field. ```go type Repository struct { Name string `json:"name" yaml:"name"` URL string `json:"url" yaml:"url"` Auth Auth `json:"auth,omitempty" yaml:"auth,omitempty"` } ``` ## type Resource {#Resource} Resource represents one kubernetes api object. ```go type Resource map[string]any ``` ## type Resources {#Resources} Resources represents Kubernetes resources. Most commonly used to mix resources into the [BuildPlan](<#BuildPlan>) generated from CUE, but may be generated from elsewhere. ```go type Resources map[Kind]map[InternalLabel]Resource ``` ## type TaskData {#TaskData} TaskData represents data values associated with a pipeline task necessary to execute the task. For example, the randomly generated temporary directory used to read and write artifact files when executing user defined task commands. Values of this struct are intended for the Go template engine. Holos populates this struct as needed. Holos may treat user provided values as an error condition. ```go type TaskData struct { // TempDir represents the temp directory holos manages for task artifacts. TempDir string `json:"tempDir,omitempty" yaml:"tempDir,omitempty"` } ``` ## type Transformer {#Transformer} Transformer combines multiple inputs from prior [Generator](<#Generator>) or [Transformer](<#Transformer>) outputs into one output. [Kustomize](<#Kustomize>) is the most commonly used transformer. A simple [Join](<#Join>) is also supported for use with plain manifest files. 1. [Kustomize](<#Kustomize>) \- Patch and transform the output from prior generators or transformers. See [Introduction to Kustomize](). 2. [Join](<#Join>) \- Concatenate multiple prior outputs into one output. 3. \[Slice\] \- Slice an artifact into multiple artifacts using [kubectl\\\-slice](). ```go type Transformer struct { // Kind represents the kind of transformer. Must be Kustomize, or Join. Kind string `json:"kind" yaml:"kind" cue:"\"Kustomize\" | \"Join\" | \"Slice\""` // Inputs represents the files to transform. The Output of prior Generators // and Transformers. Inputs []FilePath `json:"inputs" yaml:"inputs"` // Output represents a file for a subsequent Transformer or Artifact to // consume. Output FilePath `json:"output" yaml:"output"` // Kustomize transformer. Ignored unless kind is Kustomize. Kustomize Kustomize `json:"kustomize,omitempty" yaml:"kustomize,omitempty"` // Join transformer. Ignored unless kind is Join. Join Join `json:"join,omitempty" yaml:"join,omitempty"` } ``` ## type Validator {#Validator} Validator validates files. Useful to validate an [Artifact](<#Artifact>) prior to writing it out to the final destination. Holos may execute validators concurrently. See the [validators]() tutorial for an end to end example. ```go type Validator struct { // Kind represents the kind of transformer. Must be Kustomize, or Join. Kind string `json:"kind" yaml:"kind" cue:"\"Command\""` // Inputs represents the files to validate. Usually the final Artifact. Inputs []FilePath `json:"inputs" yaml:"inputs"` // Command represents a validation command. Ignored unless kind is Command. Command Command `json:"command,omitempty" yaml:"command,omitempty"` } ``` ## type ValueFile {#ValueFile} ValueFile represents one Helm value file produced from CUE. ```go type ValueFile struct { // Name represents the file name, e.g. "region-values.yaml" Name string `json:"name" yaml:"name"` // Kind is a discriminator. Kind string `json:"kind" yaml:"kind" cue:"\"Values\""` // Values represents values for holos to marshal into the file name specified // by Name when rendering the chart. Values Values `json:"values,omitempty" yaml:"values,omitempty"` } ``` ## type Values {#Values} Values represents [Helm](<#Helm>) Chart values generated from CUE. ```go type Values map[string]any ``` Generated by [gomarkdoc]()