<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PackageVariant Controllers on Porch Documentation</title><link>/docs/5_architecture_and_components/controllers/packagevariants/</link><description>Recent content in PackageVariant Controllers on Porch Documentation</description><generator>Hugo</generator><language>en-us</language><atom:link href="/docs/5_architecture_and_components/controllers/packagevariants/index.xml" rel="self" type="application/rss+xml"/><item><title>Design</title><link>/docs/5_architecture_and_components/controllers/packagevariants/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/design/</guid><description>&lt;h2 id="architecture">Architecture&lt;/h2>&lt;p>The Controllers follow a 
&lt;a href="https://kubernetes.io/docs/concepts/architecture/controller/#controller-pattern" target="_blank">&lt;strong>standard Kubernetes controller pattern&lt;/strong>&lt;/a>
using the controller-runtime framework:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Controller Manager │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌──────────────────┐ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ PackageVariant │ │PackageVariantSet │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Reconciler │ │ Reconciler │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Watch/Reconcile │ │ Watch/Reconcile │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Loop │ │ Loop │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └────────┬─────────┘ └────────┬─────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └───────────┬───────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ↓ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ┌─────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Shared Client │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (Porch API) │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─────────────────┘ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key architectural patterns:&lt;/strong>&lt;/p></description></item><item><title>PackageVariant Controller</title><link>/docs/5_architecture_and_components/controllers/packagevariants/packagevariant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/packagevariant/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>PackageVariant Controller&lt;/strong> is a Kubernetes controller that manages individual package variants - maintaining a one-to-one relationship between an upstream package and a downstream package. It continuously synchronizes downstream PackageRevisions with upstream changes and applies configured mutations.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reconciliation-based&lt;/strong>: Uses standard Kubernetes controller-runtime reconciliation loop&lt;/li>
&lt;li>&lt;strong>Upstream tracking&lt;/strong>: Monitors upstream PackageRevisions for changes via UpstreamLock comparison&lt;/li>
&lt;li>&lt;strong>Draft-driven workflow&lt;/strong>: All changes create draft PackageRevisions that require approval&lt;/li>
&lt;li>&lt;strong>Policy-based ownership&lt;/strong>: Configurable adoption and deletion policies for existing packages&lt;/li>
&lt;li>&lt;strong>Mutation application&lt;/strong>: Applies package context, pipeline functions, and config injection&lt;/li>
&lt;li>&lt;strong>Finalizer-based cleanup&lt;/strong>: Ensures proper cleanup of owned PackageRevisions on deletion&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="reconciliation-state-machine">Reconciliation State Machine&lt;/h3>&lt;p>The PackageVariant controller implements a state machine that determines actions based on the current state of upstream and downstream packages:&lt;/p></description></item><item><title>PackageVariantSet Controller</title><link>/docs/5_architecture_and_components/controllers/packagevariants/packagevariantset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/packagevariantset/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>PackageVariantSet Controller&lt;/strong> manages bulk creation of PackageVariant CRs based on target selectors. It implements a declarative fan-out pattern where a single upstream package is automatically instantiated across multiple downstream targets using template-based generation with CEL expressions.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fan-out pattern&lt;/strong>: One upstream package → multiple PackageVariant CRs → multiple downstream packages&lt;/li>
&lt;li>&lt;strong>Target selection&lt;/strong>: Three mechanisms for identifying targets (repository list, repository selector, object selector)&lt;/li>
&lt;li>&lt;strong>Template-based generation&lt;/strong>: Single template generates multiple PackageVariants with per-target customization&lt;/li>
&lt;li>&lt;strong>CEL expression evaluation&lt;/strong>: Dynamic configuration using Common Expression Language&lt;/li>
&lt;li>&lt;strong>Set-based reconciliation&lt;/strong>: Desired state computed and reconciled against existing PackageVariants&lt;/li>
&lt;li>&lt;strong>Owner reference management&lt;/strong>: PackageVariantSet owns all generated PackageVariants&lt;/li>
&lt;/ul>
&lt;h2 id="reconciliation-overview">Reconciliation Overview&lt;/h2>&lt;p>The PackageVariantSet controller implements a declarative fan-out pattern where a single upstream package is automatically instantiated across multiple downstream targets using template-based generation with CEL expressions.&lt;/p></description></item><item><title>Interactions with Porch APIs</title><link>/docs/5_architecture_and_components/controllers/packagevariants/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/5_architecture_and_components/controllers/packagevariants/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Controllers are &lt;strong>clients&lt;/strong> of the Porch API, not part of the Porch server. They run as a separate microservice, interacting
with Porch through standard Kubernetes client-go mechanisms. The controllers watch Porch API resources (PackageRevisions,
Repositories) and create/update/upgrade PackageRevisions (PackageVariant controller) and PackageVariants (PackageVariantSet
controller) through the Porch API to automate creation and management of package revisions on two levels of templating.
PackageVariants allow multiple downstream package revisions, each with its own defined customisations, to be spun off a
single upstream package revision; PackageVariantSets enable the same behaviour for PackageVariants themselves.&lt;/p></description></item></channel></rss>