--- 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 Platform](<#Platform>) - [type PlatformSpec](<#PlatformSpec>) - [type Repository](<#Repository>) - [type Resource](<#Resource>) - [type Resources](<#Resources>) - [type Transformer](<#Transformer>) - [type Validator](<#Validator>) - [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 command vetting one or more artifacts. Holos appends fully qualified input file paths to the end of the args list, then executes the command. Inputs are written into a temporary directory prior to executing the command and removed afterwards. ```go type Command struct { Args []string `json:"args,omitempty" yaml:"args,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 // `cli.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 Values `json:"values" yaml:"values"` // 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 `cli.holos.run/description` annotation to log resources in a // user customized way. Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,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 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. ```go type Transformer struct { // Kind represents the kind of transformer. Must be Kustomize, or Join. Kind string `json:"kind" yaml:"kind" cue:"\"Kustomize\" | \"Join\""` // 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 Values {#Values} Values represents [Helm](<#Helm>) Chart values generated from CUE. ```go type Values map[string]any ``` Generated by [gomarkdoc]()