stack

package
v0.0.0-...-339125a Latest Latest
Warning

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

Go to latest
Published: Jan 3, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package application provides small helpers for grouping resources that make up a single application or deployment unit.

An Bundle can be used by the cluster package to add a collection of Kubernetes resources, typically represented by a Flux Kustomization, to a cluster layout.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func RegisterApplicationConfig

func RegisterApplicationConfig(gvk gvk.GVK, factory func() ApplicationConfig)

RegisterApplicationConfig registers an ApplicationConfig type with the stack registry

func RegisterArgoWorkflow

func RegisterArgoWorkflow(factory func() Workflow)

RegisterArgoWorkflow registers the ArgoCD workflow factory. This is called by the argocd package during init.

func RegisterFluxWorkflow

func RegisterFluxWorkflow(factory func() Workflow)

RegisterFluxWorkflow registers the Flux workflow factory. This is called by the fluxcd package during init.

Types

type Application

type Application struct {
	Name      string
	Namespace string
	Config    ApplicationConfig
}

Application represents a deployable application with a configuration.

func NewApplication

func NewApplication(name, namespace string, cfg ApplicationConfig) *Application

NewApplication constructs an Application with the provided parameters.

func (*Application) Generate

func (a *Application) Generate() ([]*client.Object, error)

Generate returns the resources for this application.

func (*Application) SetConfig

func (a *Application) SetConfig(cfg ApplicationConfig)

SetConfig replaces the application configuration.

func (*Application) SetName

func (a *Application) SetName(name string)

SetName updates the application name.

func (*Application) SetNamespace

func (a *Application) SetNamespace(ns string)

SetNamespace updates the target namespace.

type ApplicationConfig

type ApplicationConfig interface {
	Generate(*Application) ([]*client.Object, error)
}

ApplicationConfig describes the behaviour of specific application types.

func CreateApplicationConfig

func CreateApplicationConfig(apiVersion, kind string) (ApplicationConfig, error)

CreateApplicationConfig creates a new ApplicationConfig instance for the given apiVersion and kind

type ApplicationMetadata

type ApplicationMetadata struct {
	Name      string            `yaml:"name" json:"name"`
	Namespace string            `yaml:"namespace,omitempty" json:"namespace,omitempty"`
	Labels    map[string]string `yaml:"labels,omitempty" json:"labels,omitempty"`
}

ApplicationMetadata contains common metadata fields

type ApplicationWrapper

type ApplicationWrapper struct {
	APIVersion string              `yaml:"apiVersion" json:"apiVersion"`
	Kind       string              `yaml:"kind" json:"kind"`
	Metadata   ApplicationMetadata `yaml:"metadata" json:"metadata"`
	Spec       ApplicationConfig   `yaml:"-" json:"-"`
}

ApplicationWrapper provides type detection and unmarshaling for ApplicationConfig

func (*ApplicationWrapper) MarshalYAML

func (w *ApplicationWrapper) MarshalYAML() (interface{}, error)

MarshalYAML implements custom YAML marshaling

func (*ApplicationWrapper) ToApplication

func (w *ApplicationWrapper) ToApplication() *Application

ToApplication converts the wrapper to a stack.Application

func (*ApplicationWrapper) UnmarshalYAML

func (w *ApplicationWrapper) UnmarshalYAML(node *yaml.Node) error

UnmarshalYAML implements custom YAML unmarshaling with type detection

type ApplicationWrappers

type ApplicationWrappers []ApplicationWrapper

ApplicationWrappers is a slice of ApplicationWrapper for unmarshaling multiple configs

func (ApplicationWrappers) ToApplications

func (ws ApplicationWrappers) ToApplications() []*Application

ToApplications converts all wrappers to Applications

type BootstrapConfig

type BootstrapConfig struct {
	// Common fields
	Enabled bool `yaml:"enabled"`

	// Flux-specific
	FluxMode        string   `yaml:"fluxMode,omitempty"` // "gitops-toolkit" or "flux-operator"
	FluxVersion     string   `yaml:"fluxVersion,omitempty"`
	Components      []string `yaml:"components,omitempty"`
	Registry        string   `yaml:"registry,omitempty"`
	ImagePullSecret string   `yaml:"imagePullSecret,omitempty"`

	// Source configuration
	SourceURL string `yaml:"sourceURL,omitempty"` // OCI/Git repository URL
	SourceRef string `yaml:"sourceRef,omitempty"` // Tag/branch/ref

	// ArgoCD-specific (mock for now)
	ArgoCDVersion   string `yaml:"argoCDVersion,omitempty"`
	ArgoCDNamespace string `yaml:"argoCDNamespace,omitempty"`
}

BootstrapConfig defines the bootstrap configuration for GitOps tools

type Bundle

type Bundle struct {
	// Name identifies the application set.
	Name string
	// ParentPath is the hierarchical path to the parent bundle (e.g., "cluster/infrastructure")
	// Empty for root bundles. This avoids circular references while maintaining hierarchy.
	ParentPath string
	// DependsOn lists other bundles this bundle depends on
	DependsOn []*Bundle
	// Interval controls how often Flux reconciles the bundle.
	Interval string
	// SourceRef specifies the source for the bundle.
	SourceRef *SourceRef
	// Applications holds the Kubernetes objects that belong to the application.
	Applications []*Application
	// Labels are common labels that should be applied to each resource.
	Labels map[string]string
	// contains filtered or unexported fields
}

Bundle represents a unit of deployment, typically the resources that are reconciled by a single Flux Kustomization.

func NewBundle

func NewBundle(name string, resources []*Application, labels map[string]string) (*Bundle, error)

NewBundle constructs a Bundle with the given name, resources and labels. It returns an error if validation fails.

func (*Bundle) Generate

func (a *Bundle) Generate() ([]*client.Object, error)

func (*Bundle) GetParent

func (b *Bundle) GetParent() *Bundle

GetParent returns the runtime parent reference (may be nil).

func (*Bundle) GetParentPath

func (b *Bundle) GetParentPath() string

GetParentPath returns the hierarchical path to the parent bundle.

func (*Bundle) GetPath

func (b *Bundle) GetPath() string

GetPath returns the full hierarchical path of this bundle.

func (*Bundle) InitializePathMap

func (b *Bundle) InitializePathMap(allBundles []*Bundle)

InitializePathMap builds the runtime path lookup map for efficient hierarchy navigation. This should be called on the root bundle after the tree structure is complete.

func (*Bundle) SetParent

func (b *Bundle) SetParent(parent *Bundle)

SetParent sets the parent bundle and updates the ParentPath accordingly. This method maintains both the serializable path and runtime reference.

func (*Bundle) Validate

func (a *Bundle) Validate() error

Validate performs basic sanity checks on the Bundle.

type BundleBuilder

type BundleBuilder interface {
	WithApplication(name string, appConfig ApplicationConfig) BundleBuilder
	WithDependency(bundle *Bundle) BundleBuilder
	WithSourceRef(sourceRef *SourceRef) BundleBuilder
	End() NodeBuilder
	Build() *Cluster
}

BundleBuilder provides fluent interface for building Bundle configurations

type BundleBuilderImpl

type BundleBuilderImpl struct {
	// contains filtered or unexported fields
}

BundleBuilderImpl implements BundleBuilder with immutable pattern

func (*BundleBuilderImpl) Build

func (bb *BundleBuilderImpl) Build() *Cluster

Build finalizes the cluster construction

func (*BundleBuilderImpl) End

func (bb *BundleBuilderImpl) End() NodeBuilder

End returns to the parent NodeBuilder

func (*BundleBuilderImpl) WithApplication

func (bb *BundleBuilderImpl) WithApplication(name string, appConfig ApplicationConfig) BundleBuilder

WithApplication adds an application to the bundle

func (*BundleBuilderImpl) WithDependency

func (bb *BundleBuilderImpl) WithDependency(bundle *Bundle) BundleBuilder

WithDependency adds a bundle dependency

func (*BundleBuilderImpl) WithSourceRef

func (bb *BundleBuilderImpl) WithSourceRef(sourceRef *SourceRef) BundleBuilder

WithSourceRef sets the source reference

type Cluster

type Cluster struct {
	Name   string        `yaml:"name"`
	Node   *Node         `yaml:"node,omitempty"`
	GitOps *GitOpsConfig `yaml:"gitops,omitempty"`
}

Cluster describes a cluster configuration. A cluster configuration is a set of configurations that are packaged in one or more package units

func NewCluster

func NewCluster(name string, tree *Node) *Cluster

NewCluster creates a Cluster with the provided metadata.

func (*Cluster) GetGitOps

func (c *Cluster) GetGitOps() *GitOpsConfig

func (*Cluster) GetName

func (c *Cluster) GetName() string

GetName Helper getters.

func (*Cluster) GetNode

func (c *Cluster) GetNode() *Node

func (*Cluster) SetGitOps

func (c *Cluster) SetGitOps(g *GitOpsConfig)

func (*Cluster) SetName

func (c *Cluster) SetName(n string)

SetName Setters for metadata fields.

func (*Cluster) SetNode

func (c *Cluster) SetNode(t *Node)

type ClusterBuilder

type ClusterBuilder interface {
	WithNode(name string) NodeBuilder
	WithGitOps(gitops *GitOpsConfig) ClusterBuilder
	Build() *Cluster
}

ClusterBuilder provides fluent interface for building Cluster configurations

func NewClusterBuilder

func NewClusterBuilder(name string) ClusterBuilder

NewClusterBuilder creates a new fluent cluster builder

type ClusterBuilderImpl

type ClusterBuilderImpl struct {
	// contains filtered or unexported fields
}

ClusterBuilderImpl implements ClusterBuilder with immutable pattern

func (*ClusterBuilderImpl) Build

func (cb *ClusterBuilderImpl) Build() *Cluster

Build finalizes the cluster construction

func (*ClusterBuilderImpl) WithGitOps

func (cb *ClusterBuilderImpl) WithGitOps(gitops *GitOpsConfig) ClusterBuilder

WithGitOps sets GitOps configuration

func (*ClusterBuilderImpl) WithNode

func (cb *ClusterBuilderImpl) WithNode(name string) NodeBuilder

WithNode adds a child node and returns a NodeBuilder for chaining

type GitOpsConfig

type GitOpsConfig struct {
	Type      string           `yaml:"type"` // "flux" or "argocd"
	Bootstrap *BootstrapConfig `yaml:"bootstrap,omitempty"`
}

GitOpsConfig defines the GitOps tool configuration for the cluster

type Node

type Node struct {
	// Name identifies the application set.
	Name string `yaml:"name"`
	// ParentPath is the hierarchical path to the parent node (e.g., "cluster/infrastructure")
	// Empty for root nodes. This avoids circular references while maintaining hierarchy.
	ParentPath string `yaml:"parentPath,omitempty"`
	// Children list child bundles
	Children []*Node `yaml:"children,omitempty"`
	// PackageRef identifies in which package the tree of resources get bundled together
	// If undefined, the PackageRef of the parent is inherited
	PackageRef *schema.GroupVersionKind `yaml:"packageref,omitempty"`
	// Bundle holds the applications that get deployed on this level
	Bundle *Bundle `yaml:"bundle,omitempty"`
	// contains filtered or unexported fields
}

Node represents a hierarchic structure holding all deployment bundles each tree has a list of children, which can be a deployment, or a subtree It could match a kubernetes cluster's full configuration, or it could be just a part of that, when parts are e.g. packaged in different OCI artifacts Tree's with a common PackageRef are packaged together

func (*Node) GetBundle

func (n *Node) GetBundle() *Bundle

func (*Node) GetChildren

func (n *Node) GetChildren() []*Node

func (*Node) GetName

func (n *Node) GetName() string

func (*Node) GetPackageRef

func (n *Node) GetPackageRef() *schema.GroupVersionKind

func (*Node) GetParent

func (n *Node) GetParent() *Node

func (*Node) GetParentPath

func (n *Node) GetParentPath() string

func (*Node) GetPath

func (n *Node) GetPath() string

GetPath returns the full hierarchical path of this node.

func (*Node) InitializePathMap

func (n *Node) InitializePathMap()

InitializePathMap builds the runtime path lookup map for efficient hierarchy navigation. This should be called on the root node after the tree structure is complete.

func (*Node) SetBundle

func (n *Node) SetBundle(bundle *Bundle)

func (*Node) SetChildren

func (n *Node) SetChildren(children []*Node)

func (*Node) SetName

func (n *Node) SetName(name string)

func (*Node) SetPackageRef

func (n *Node) SetPackageRef(ref *schema.GroupVersionKind)

func (*Node) SetParent

func (n *Node) SetParent(parent *Node)

SetParent sets the parent node and updates the ParentPath accordingly. This method maintains both the serializable path and runtime reference.

func (*Node) SetParentPath

func (n *Node) SetParentPath(path string)

type NodeBuilder

type NodeBuilder interface {
	WithChild(name string) NodeBuilder
	WithBundle(name string) BundleBuilder
	WithPackageRef(ref *schema.GroupVersionKind) NodeBuilder
	End() ClusterBuilder
	Build() *Cluster
}

NodeBuilder provides fluent interface for building Node configurations

type NodeBuilderImpl

type NodeBuilderImpl struct {
	// contains filtered or unexported fields
}

NodeBuilderImpl implements NodeBuilder with immutable pattern

func (*NodeBuilderImpl) Build

func (nb *NodeBuilderImpl) Build() *Cluster

Build finalizes the cluster construction

func (*NodeBuilderImpl) End

func (nb *NodeBuilderImpl) End() ClusterBuilder

End returns to the parent ClusterBuilder

func (*NodeBuilderImpl) WithBundle

func (nb *NodeBuilderImpl) WithBundle(name string) BundleBuilder

WithBundle adds a bundle to the current node

func (*NodeBuilderImpl) WithChild

func (nb *NodeBuilderImpl) WithChild(name string) NodeBuilder

WithChild adds a child node

func (*NodeBuilderImpl) WithPackageRef

func (nb *NodeBuilderImpl) WithPackageRef(ref *schema.GroupVersionKind) NodeBuilder

WithPackageRef sets the package reference

type SourceRef

type SourceRef struct {
	Kind      string
	Name      string
	Namespace string
}

SourceRef defines a reference to a Flux source.

type Workflow

type Workflow interface {
	// GenerateFromCluster creates GitOps resources from a cluster definition.
	// This is the primary entry point for resource generation.
	GenerateFromCluster(*Cluster) ([]client.Object, error)

	// CreateLayoutWithResources creates a new manifest layout that includes
	// both the application manifests and the GitOps resources needed to
	// deploy them. This combines manifest generation with GitOps resource
	// generation in a single operation.
	// The rules parameter is expected to be of type layout.LayoutRules
	CreateLayoutWithResources(*Cluster, interface{}) (interface{}, error)

	// GenerateBootstrap creates bootstrap resources for initializing the
	// GitOps system itself. This is used to set up the GitOps controller
	// (Flux, ArgoCD, etc.) in the cluster.
	GenerateBootstrap(*BootstrapConfig, *Node) ([]client.Object, error)
}

Workflow defines the core interface for GitOps workflow implementations. This interface provides a minimal abstraction for converting stack definitions into GitOps-specific resources (Flux Kustomizations, ArgoCD Applications, etc.).

func NewWorkflow

func NewWorkflow(provider string) (Workflow, error)

NewWorkflow creates a workflow implementation based on the provider type. Supported providers: "flux", "argocd"

Directories

Path Synopsis
Package generators provides a pluggable system for generating Kubernetes resources from different configuration formats.
Package generators provides a pluggable system for generating Kubernetes resources from different configuration formats.
appworkload
Package appworkload provides generators for creating standard Kubernetes workloads (Deployments, StatefulSets, DaemonSets) along with their associated resources (Services, Ingresses, PersistentVolumeClaims).
Package appworkload provides generators for creating standard Kubernetes workloads (Deployments, StatefulSets, DaemonSets) along with their associated resources (Services, Ingresses, PersistentVolumeClaims).
fluxhelm
Package fluxhelm provides generators for creating Flux HelmRelease resources along with their associated source resources (HelmRepository, GitRepository, OCIRepository, or Bucket).
Package fluxhelm provides generators for creating Flux HelmRelease resources along with their associated source resources (HelmRepository, GitRepository, OCIRepository, or Bucket).
Package layout provides utilities for generating cluster directory layouts and for writing Kubernetes and Flux manifests to disk.
Package layout provides utilities for generating cluster directory layouts and for writing Kubernetes and Flux manifests to disk.

Jump to

Keyboard shortcuts

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