<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Porch on Porch Documentation</title><link>/v1.5/</link><description>Recent content in Porch on Porch Documentation</description><generator>Hugo</generator><language>en-us</language><atom:link href="/v1.5/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI Reference</title><link>/v1.5/docs/7_cli_api/porchctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/7_cli_api/porchctl/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>&lt;code>porchctl&lt;/code> is the command-line interface for interacting with Porch. It communicates with a Kubernetes API server that has Porch installed as an aggregated API server, allowing you to manage repository registrations and packages within those repositories.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>&lt;p>See 
&lt;a href="/v1.5/docs/3_getting_started/installing-porchctl/">Installing porchctl&lt;/a> for installation instructions.&lt;/p>
&lt;h2 id="global-flags">Global Flags&lt;/h2>&lt;p>These flags are available for all porchctl commands:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--kubeconfig string&lt;/code>&lt;/td>
 &lt;td>Path to kubeconfig file. Only required if out-of-cluster. Can also be set via &lt;code>KUBECONFIG&lt;/code> environment variable.&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--log-flush-frequency duration&lt;/code>&lt;/td>
 &lt;td>Maximum seconds between log flushes&lt;/td>
 &lt;td>&lt;code>5s&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--truncate-output&lt;/code>&lt;/td>
 &lt;td>Enable output truncation&lt;/td>
 &lt;td>&lt;code>true&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>-v, --v Level&lt;/code>&lt;/td>
 &lt;td>Log level verbosity&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>-h, --help&lt;/code>&lt;/td>
 &lt;td>Help for porchctl&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="commands">Commands&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="#repo">repo&lt;/a> - Manage package repositories&lt;/li>
&lt;li>
&lt;a href="#rpkg">rpkg&lt;/a> - Manage packages&lt;/li>
&lt;li>
&lt;a href="#completion">completion&lt;/a> - Generate shell autocompletion&lt;/li>
&lt;li>
&lt;a href="#version">version&lt;/a> - Print version information&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="repo">repo&lt;/h2>&lt;p>Manage package repositories.&lt;/p></description></item><item><title>Design</title><link>/v1.5/docs/5_architecture_and_components/controllers/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/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>Development Environment</title><link>/v1.5/docs/12_contributing/code-contribution/development-environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/12_contributing/code-contribution/development-environment/</guid><description>&lt;p>This guide walks you through setting up a local Porch development environment with a kind cluster, enabling you to debug the Porch server and controllers in VS Code with various configurations.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://docs.docker.com/get-docker/" target="_blank">Docker&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation" target="_blank">kind&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/docs/tasks/tools/" target="_blank">kubectl&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://go.dev/doc/install" target="_blank">Go&lt;/a> (version specified 
&lt;a href="https://github.com/nephio-project/porch/blob/main/go.mod#L3" target="_blank">in Porch&amp;rsquo;s go.mod&lt;/a>)&lt;/li>
&lt;li>
&lt;a href="https://code.visualstudio.com/" target="_blank">VS Code&lt;/a> with 
&lt;a href="https://marketplace.visualstudio.com/items?itemName=golang.go" target="_blank">Go extension&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://www.gnu.org/software/make/" target="_blank">make&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="macos-users">MacOS Users&lt;/h3>&lt;p>The deployment scripts require bash 4.x or later. MacOS ships with bash 3.x:&lt;/p>
&lt;ol>
&lt;li>Install bash 4.x+ via Homebrew: &lt;code>brew install bash&lt;/code>&lt;/li>
&lt;li>Ensure &lt;code>/opt/homebrew/bin&lt;/code> appears before &lt;code>/bin&lt;/code> and &lt;code>/usr/bin&lt;/code> in your PATH&lt;/li>
&lt;/ol>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>

 This permanently changes your default bash version system-wide.

&lt;/div>

&lt;h2 id="automated-setup">Automated Setup&lt;/h2>&lt;p>The quickest way to set up your development environment - from the root directory of the Porch repository, run:&lt;/p></description></item><item><title>Function Evaluation</title><link>/v1.5/docs/5_architecture_and_components/function-runner/functionality/function-evaluation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/function-runner/functionality/function-evaluation/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Function evaluation is the core responsibility of the Function Runner - executing KRM (Kubernetes Resource Model) functions through pluggable evaluator strategies. The system uses a strategy pattern where different evaluators handle function execution in different ways (pod-based, executable, or chained), all conforming to a common interface.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Function Evaluation System │
&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">│ │ Evaluator │ │ Execution │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Interface │ ───&amp;gt; │ Strategies │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Common │ │ • Pod Evaluator │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Contract │ │ • Exec Evaluator│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Pluggable │ │ • Multi Eval │ │
&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">│ │ Wrapper │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Server │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • gRPC Frontend │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Binary Exec │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Result Parse │ │
&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;h2 id="evaluator-interface">Evaluator Interface&lt;/h2>&lt;p>All evaluators implement a common interface that defines the contract for function execution.&lt;/p></description></item><item><title>Git Authentication</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/git-authentication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/git-authentication/</guid><description>&lt;h2 id="authentication-methods">Authentication Methods&lt;/h2>&lt;p>The Porch Server handles interaction with Git repositories through Repository Custom Resources (CRs) that act as a link between the Porch Server and the Git repositories.&lt;/p>
&lt;p>Porch Server supports three authentication methods for Git repositories:&lt;/p>
&lt;ol>
&lt;li>
&lt;a href="#1-basic-authentication">Basic Authentication&lt;/a> - Username and password or Personal Access Token (post-deployment)&lt;/li>
&lt;li>
&lt;a href="#2-bearer-token-authentication">Bearer Token Authentication&lt;/a> - Token-based authentication (post-deployment)&lt;/li>
&lt;li>
&lt;a href="#3-httpstls-configuration">HTTPS/TLS Configuration&lt;/a> - Custom TLS certificates for self-hosted Git (&lt;strong>requires pre-deployment configuration&lt;/strong>)&lt;/li>
&lt;/ol>
&lt;h3 id="1-basic-authentication">1. Basic Authentication&lt;/h3>&lt;p>Uses username and password or Personal Access Token (PAT). The secret must:&lt;/p></description></item><item><title>Installing Porchctl CLI</title><link>/v1.5/docs/3_getting_started/installing-porchctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/3_getting_started/installing-porchctl/</guid><description>&lt;h2 id="download-the-latest-porchctl-binary">Download the latest porchctl binary&lt;/h2>




&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
 data-td-tp-persist="linux amd64" aria-controls="tabs-00-00" aria-selected="true">
 Linux AMD64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
 data-td-tp-persist="linux arm64" aria-controls="tabs-00-01" aria-selected="false">
 Linux ARM64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-02" role="tab"
 data-td-tp-persist="macos amd64" aria-controls="tabs-00-02" aria-selected="false">
 macOS AMD64
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-03" role="tab"
 data-td-tp-persist="macos arm64" aria-controls="tabs-00-03" aria-selected="false">
 macOS ARM64
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-0-content">
 &lt;div class="tab-pane fade show active"
 id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.7/porchctl_1.5.7_linux_amd64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.7/porchctl_1.5.7_linux_arm64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.7/porchctl_1.5.7_darwin_amd64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-03" role="tabpanel" aria-labelled-by="tabs-00-03-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.7/porchctl_1.5.7_darwin_arm64.tar.gz&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
&lt;/div>



&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note:&lt;/h4>

 &lt;p>To download a specific version of porch and its porchctl binary you can do so by replacing the version number and machine type its for in the curl link above.&lt;/p></description></item><item><title>Packages</title><link>/v1.5/docs/2_concepts/package/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/package/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important!&lt;/h4>

 A &amp;ldquo;Porch package&amp;rdquo; is a collection of &lt;strong>package revisions on the same kpt package&lt;/strong>. Porch does not have the concept of a
&amp;ldquo;Package&amp;rdquo; internally - whenever an API request is received on a package, Porch composes the response from the package revisions
associated with the kpt package. When users say they are creating, editing, or upgrading &amp;ldquo;a package&amp;rdquo; in Porch, they are
manipulating a &lt;strong>PackageRevision&lt;/strong> resource and its paired &lt;strong>PackageRevisionResources&lt;/strong> resource. These are Porch&amp;rsquo;s Kubernetes
API interpretations of kpt package metadata and contents stored in Git repositories.

&lt;/div>

&lt;h2 id="what-is-a-package-in-porch">What is a Package in Porch?&lt;/h2>&lt;p>In Porch, a &lt;strong>package&lt;/strong> is represented, not as files you directly manipulate, but through Kubernetes API resources presenting
different views of the package&amp;rsquo;s file contents. When you work with a package in Porch, you interact with revisions of the
package, and each such &lt;strong>package revision&lt;/strong> has a pair of resources: a &lt;strong>PackageRevision&lt;/strong> resource and a &lt;strong>PackageRevisionResources&lt;/strong>
resource:&lt;/p></description></item><item><title>PackageVariant Reconciliation</title><link>/v1.5/docs/5_architecture_and_components/controllers/functionality/packagevariant-reconciliation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/functionality/packagevariant-reconciliation/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The PackageVariant controller implements a continuous synchronization pattern between upstream and downstream packages. It monitors upstream PackageRevisions for changes, detects when downstream packages need updating, and creates appropriate drafts (clone, upgrade, or edit) to maintain synchronization while applying configured mutations.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ PackageVariant Reconciliation System │
&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">│ │ State Machine │ │ Upstream │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ──&amp;gt; │ Tracking │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • No Downstream │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Upstream Chg │ │ • UpstreamLock │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutation Chg │ │ • Comparison │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Up-to-date │ │ • Detection │ │
&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">│ │ Draft │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Management │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Clone │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Upgrade │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Edit │ │
&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;h2 id="reconciliation-state-machine">Reconciliation State Machine&lt;/h2>&lt;p>The controller implements a state machine that determines actions based on current state:&lt;/p></description></item><item><title>Repository Sync</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/repository-sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/repository-sync/</guid><description>&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Documentation Location&lt;/h4>

 This documentation is currently located in the system configuration section but should be moved to a more logical location as it&amp;rsquo;s about configuring individual Repository resources, not system-wide settings. This may be relocated in future documentation updates.

&lt;/div>

&lt;h2 id="sync-configuration-fields">Sync Configuration Fields&lt;/h2>&lt;p>The &lt;code>spec.sync&lt;/code> field in a Repository CR controls synchronization behavior with the external repository. Repositories without sync configuration use the system default for periodic synchronization (10 minutes, overridden by RepoSyncFrequency parameter in porch-server deployment).&lt;/p></description></item><item><title>Repository Synchronization</title><link>/v1.5/docs/5_architecture_and_components/package-cache/functionality/repository-synchronization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/functionality/repository-synchronization/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Package Cache synchronization system manages the synchronization of package repositories between external Git sources and the internal cache. Both cache implementations (CR Cache and DB Cache) utilize a common SyncManager to handle periodic and one-time synchronization operations.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&lt;p>&lt;img src="/v1.5/images/porch/repository-sync.svg" alt="Repository Sync Architecture" />&lt;/p>


&lt;a href="/v1.5/images/porch/repository-sync-interactive.html" target="_blank">📊 Interactive Architecture Diagram&lt;/a>

&lt;h2 id="core-components">Core Components&lt;/h2>&lt;h3 id="1-syncmanager">1. SyncManager&lt;/h3>&lt;p>&lt;strong>Purpose&lt;/strong>: Central orchestrator for repository synchronization operations.&lt;/p>
&lt;p>&lt;strong>Components&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Handler&lt;/strong>: Interface for cache-specific sync operations&lt;/li>
&lt;li>&lt;strong>Core Client&lt;/strong>: Kubernetes API client for cluster communication&lt;/li>
&lt;li>&lt;strong>Next Sync Time&lt;/strong>: Tracks when the next synchronization should occur&lt;/li>
&lt;li>&lt;strong>Last Sync Error&lt;/strong>: Records any errors from previous sync attempts&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Goroutines&lt;/strong>:&lt;/p></description></item><item><title>API Reference</title><link>/v1.5/docs/7_cli_api/api-ref/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/7_cli_api/api-ref/</guid><description>&lt;h2 id="packages">Packages&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="#porchkptdevv1alpha1">porch.kpt.dev/v1alpha1&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="porchkptdevv1alpha1">porch.kpt.dev/v1alpha1&lt;/h2>&lt;h4 id="condition">Condition&lt;/h4>&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#packagerevisionstatus">PackageRevisionStatus&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Validation&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>status&lt;/code> &lt;em>
&lt;a href="#conditionstatus">ConditionStatus&lt;/a>&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>reason&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>message&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="conditionstatus">ConditionStatus&lt;/h4>&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#condition">Condition&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>True&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>False&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Unknown&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="field">Field&lt;/h4>&lt;p>Field references a field in a resource&lt;/p>
&lt;p>&lt;em>Appears in:&lt;/em>&lt;/p>
&lt;ul>
&lt;li>
&lt;a href="#resultitem">ResultItem&lt;/a>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Validation&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>path&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>Path is the field path. This field is required.&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>currentValue&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>CurrentValue is the current field value&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>proposedValue&lt;/code> &lt;em>string&lt;/em>&lt;/td>
 &lt;td>ProposedValue is the proposed value of the field to fix an issue.&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="file">File&lt;/h4>&lt;p>File references a file containing a resource&lt;/p></description></item><item><title>Cache</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/cache/</guid><description>&lt;p>Porch supports two caching mechanisms to store package metadata and improve performance.&lt;/p>
&lt;h2 id="cache-types">Cache Types&lt;/h2>&lt;h3 id="cr-cache-default">CR Cache (Default)&lt;/h3>&lt;p>By default, Porch uses Custom Resource (CR) cache, which stores cache data as Kubernetes Custom Resources.&lt;/p>
&lt;p>&lt;strong>Advantages:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>No additional infrastructure required&lt;/li>
&lt;li>Automatic backup with cluster backups&lt;/li>
&lt;li>Simple setup and maintenance&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Use when:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Getting started with Porch&lt;/li>
&lt;li>Small to medium deployments&lt;/li>
&lt;li>Simplicity is preferred&lt;/li>
&lt;/ul>
&lt;h3 id="database-cache">Database Cache&lt;/h3>&lt;p>Database cache uses PostgreSQL to store cache data, providing better performance for large deployments.&lt;/p></description></item><item><title>Cache Design</title><link>/v1.5/docs/5_architecture_and_components/package-cache/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/design/</guid><description>&lt;h2 id="cache-interface">Cache Interface&lt;/h2>&lt;p>The Package Cache provides a unified interface that abstracts the underlying storage mechanism. Both the CR Cache and DB Cache implementations conform to this common interface, allowing the CaDEngine to work with either implementation without knowing which is in use.&lt;/p>
&lt;p>&lt;strong>Repository Operations:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Open repository connections from Repository CR specifications&lt;/li>
&lt;li>Close repositories and clean up resources&lt;/li>
&lt;li>Retrieve list of all open repositories&lt;/li>
&lt;li>Get specific repository by key&lt;/li>
&lt;li>Update repository metadata&lt;/li>
&lt;li>Check repository connectivity&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Repository Interface Delegation:&lt;/strong>&lt;/p></description></item><item><title>Caching Behavior</title><link>/v1.5/docs/5_architecture_and_components/package-cache/functionality/caching-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/functionality/caching-behavior/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Package Cache optimizes performance by storing repository data in memory (CR Cache) or database (DB Cache) to avoid redundant Git operations. The caching system uses lazy loading, version-based refresh, and concurrency control to balance performance with data freshness.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Caching System │
&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">│ │ Cache │ │ Version │ │ Git │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Population │ ───&amp;gt; │ Tracking │ ───&amp;gt; │ Repo │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Lazy Load │ │ • Compare │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Refresh │ │ • Refresh │ │ │ │
&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">│ │ Cache Structure │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Maps │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutex │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Consistency │ │
&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;h2 id="cache-population">Cache Population&lt;/h2>&lt;p>The cache uses lazy loading and version-based refresh to minimize Git operations:&lt;/p></description></item><item><title>Catalog Deployment</title><link>/v1.5/docs/6_configuration_and_deployments/deployments/catalog-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/deployments/catalog-deployment/</guid><description>&lt;p>This guide covers deploying Porch in production environments using the 
&lt;a href="https://github.com/nephio-project/catalog/tree/main/nephio/core/porch" target="_blank">Nephio catalog&lt;/a>.&lt;/p>
&lt;h2 id="configuration-planning">Configuration Planning&lt;/h2>&lt;p>Before deploying Porch, determine which features you need:&lt;/p>
&lt;h3 id="optional-pre-deployment-configuration">Optional Pre-deployment Configuration&lt;/h3>&lt;p>These &lt;strong>optional&lt;/strong> features must be configured &lt;strong>before&lt;/strong> deployment if you need them:&lt;/p>
&lt;h4 id="porch-server">Porch Server&lt;/h4>&lt;ul>
&lt;li>
&lt;a href="/v1.5/docs/6_configuration_and_deployments/configurations/cache/">Cache Configuration&lt;/a> - Switch to database cache (requires deployment args)&lt;/li>
&lt;li>
&lt;a href="/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/cert-manager-webhooks/">Cert-Manager Webhooks&lt;/a> - Enable cert-manager webhook integration (requires deployment env vars)&lt;/li>
&lt;li>
&lt;a href="/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/jaeger-tracing/">Jaeger Tracing&lt;/a> - Enable distributed tracing (requires deployment env vars)&lt;/li>
&lt;li>
&lt;a href="/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/git-authentication/#3-httpstls-configuration">Git Custom TLS&lt;/a> - Enable custom TLS certificates for Git repositories (requires &lt;code>--use-git-cabundle=true&lt;/code> arg)&lt;/li>
&lt;/ul>
&lt;h4 id="function-runner">Function Runner&lt;/h4>&lt;ul>
&lt;li>
&lt;a href="/v1.5/docs/6_configuration_and_deployments/configurations/components/function-runner-config/private-registries-config/">Private Registries&lt;/a> - Configure private container registries (requires deployment args and volume mounts)&lt;/li>
&lt;/ul>
&lt;h3 id="post-deployment-configuration">Post-deployment Configuration&lt;/h3>&lt;p>These features can be configured &lt;strong>after&lt;/strong> deployment:&lt;/p></description></item><item><title>Cert Manager Webhooks</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/cert-manager-webhooks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/cert-manager-webhooks/</guid><description>&lt;p>Porch includes validating webhooks that require TLS certificates. By default, Porch generates self-signed certificates, but you can configure it to use cert-manager for automatic certificate management.&lt;/p>
&lt;h2 id="porch-webhooks">Porch Webhooks&lt;/h2>&lt;p>Porch uses two validating webhooks:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PackageRevision Deletion Webhook&lt;/strong> - Validates PackageRevision deletion requests&lt;/li>
&lt;li>&lt;strong>Repository Validation Webhook&lt;/strong> - Validates Repository creation and updates&lt;/li>
&lt;/ol>
&lt;h2 id="using-the-catalog-package">Using the Catalog Package&lt;/h2>&lt;p>The Nephio catalog provides a ready-to-use package for Porch with cert-manager integration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Register the catalog repository (if not already done)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">porchctl repo register &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace default &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://github.com/nephio-project/catalog.git &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name&lt;span class="o">=&lt;/span>catalog
&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 class="c1"># Clone the cert-manager webhook package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">porchctl rpkg clone &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> catalog.nephio.optional.porch-cert-manager-webhook.main &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> porch-cert-manager &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --repository&lt;span class="o">=&lt;/span>deployment-repo &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace&lt;span class="o">=&lt;/span>default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This package includes:&lt;/p></description></item><item><title>CRD Reference</title><link>/v1.5/docs/7_cli_api/crd-ref/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/7_cli_api/crd-ref/</guid><description>&lt;iframe
 src="https://doc.crds.dev/github.com/nephio-project/porch@v1.5.7"
 width="100%"
 style="min-height:98vh; border:none;"/></description></item><item><title>Design</title><link>/v1.5/docs/5_architecture_and_components/porch-apiserver/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/porch-apiserver/design/</guid><description>&lt;h2 id="rest-storage-interface">REST Storage Interface&lt;/h2>&lt;p>See 
&lt;a href="/v1.5/docs/5_architecture_and_components/porch-apiserver/functionality/#rest-storage-implementation">Functionality&lt;/a> for detailed CRUD operations and storage implementations.&lt;/p>
&lt;p>The Porch API Server implements Kubernetes&amp;rsquo; REST storage interface to provide custom storage backends for Porch resources. Unlike standard Kubernetes resources that store data in etcd, Porch resources delegate to the Engine which manages package data in Git repositories through the Cache.&lt;/p>
&lt;p>&lt;strong>Storage interface characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Implements standard Kubernetes storage.Interface&lt;/li>
&lt;li>Provides CRUD operations (Create, Get, List, Update, Delete)&lt;/li>
&lt;li>Supports Watch for real-time change notifications&lt;/li>
&lt;li>Delegates all operations to CaD Engine&lt;/li>
&lt;li>No direct etcd storage - packages stored in Git&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Storage implementations:&lt;/strong>&lt;/p></description></item><item><title>Engine Design</title><link>/v1.5/docs/5_architecture_and_components/engine/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/design/</guid><description>&lt;h2 id="cad-engine-architecture">CaD Engine Architecture&lt;/h2>&lt;p>The Engine follows a &lt;strong>layered architecture&lt;/strong> with clear separation of concerns:&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">│ CaDEngine Interface │ ← Public 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">│ cadEngine Implementation │ ← Orchestration Logic
&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">│ │ Cache │ Task │ Watcher │ │ ← Dependencies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ Handler │ 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;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key architectural patterns:&lt;/strong>&lt;/p>
&lt;h3 id="dependency-injection-via-functional-options">Dependency Injection via Functional Options&lt;/h3>&lt;p>The engine is constructed using a &lt;strong>functional options pattern&lt;/strong> that allows flexible configuration of dependencies:&lt;/p></description></item><item><title>Function Runner Design</title><link>/v1.5/docs/5_architecture_and_components/function-runner/design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/function-runner/design/</guid><description>&lt;h2 id="architectural-context">Architectural Context&lt;/h2>&lt;p>The Function Runner is &lt;strong>one of several function execution mechanisms&lt;/strong> in Porch. The Task Handler uses a &lt;strong>Function Runtime&lt;/strong> interface that can be implemented by:&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">Task Handler (in Porch)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Function Runtime
&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">Builtin gRPC Multi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Runtime Runtime Runtime
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">In-Process Function Chains
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Go Code Runner Runtimes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (External)
&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"> Pod Executable Multi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Evaluator Evaluator Evaluator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Function Cached Fallback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Pods Binaries Chain
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Function Runtime implementations:&lt;/strong>&lt;/p></description></item><item><title>Installing Porch</title><link>/v1.5/docs/3_getting_started/installing-porch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/3_getting_started/installing-porch/</guid><description>&lt;h2 id="deploying-porch-on-a-cluster">Deploying Porch on a cluster&lt;/h2>&lt;p>Create a new directory for the kpt package and navigate into it:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir porch-1.5.7 &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> porch-1.5.7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Download the latest Porch kpt package blueprint:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LO &lt;span class="s2">&amp;#34;https://github.com/nephio-project/porch/releases/download/v1.5.7/porch_blueprint.tar.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Extract the Porch kpt package contents:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tar -xzf porch_blueprint.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Initialize and apply the Porch kpt package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kpt live init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> kpt live apply
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="verify-installation">Verify Installation&lt;/h2>&lt;p>Check that Porch components are running:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kubectl get all -n porch-system
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A healthy Porch installation should show:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">NAME READY STATUS RESTARTS AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/function-runner-567ddc76d-7k8sj 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/function-runner-567ddc76d-x75lv 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/porch-controllers-d8dfccb4-8lc6j 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pod/porch-server-7dc5d7cd4f-smhf5 1/1 Running &lt;span class="m">0&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME TYPE CLUSTER-IP EXTERNAL-IP PORT&lt;span class="o">(&lt;/span>S&lt;span class="o">)&lt;/span> AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service/api ClusterIP 10.96.108.221 &amp;lt;none&amp;gt; 443/TCP,8443/TCP 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service/function-runner ClusterIP 10.96.237.108 &amp;lt;none&amp;gt; 9445/TCP 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME READY UP-TO-DATE AVAILABLE AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/function-runner 2/2 &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/porch-controllers 1/1 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deployment.apps/porch-server 1/1 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME DESIRED CURRENT READY AGE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/function-runner-567ddc76d &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">2&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/porch-controllers-d8dfccb4 &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replicaset.apps/porch-server-7dc5d7cd4f &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="m">1&lt;/span> 4m3s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Verify the Porch API is accessible:&lt;/p></description></item><item><title>PackageVariant Controller</title><link>/v1.5/docs/5_architecture_and_components/controllers/packagevariants/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/packagevariants/</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 Reconciliation</title><link>/v1.5/docs/5_architecture_and_components/controllers/functionality/packagevariantset-reconciliation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/functionality/packagevariantset-reconciliation/</guid><description>&lt;h2 id="overview">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. It manages bulk creation of PackageVariant CRs based on target selectors and ensures the desired set of PackageVariants matches the actual set through set-based reconciliation.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ PackageVariantSet Reconciliation System │
&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">│ │ Target │ │ Template │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Unrolling │ ──&amp;gt; │ Evaluation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Repository │ │ • CEL Exprs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ List │ │ • Context │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Repository │ │ • Dynamic │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Selector │ │ Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Object │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Selector │ │ │ │
&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">│ │ Set-Based │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Reconciliation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Desired Set │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Existing Set │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Create/Update │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Delete │ │
&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;h2 id="reconciliation-flow">Reconciliation Flow&lt;/h2>&lt;p>The controller follows a structured reconciliation process:&lt;/p></description></item><item><title>Pod Lifecycle Management</title><link>/v1.5/docs/5_architecture_and_components/function-runner/functionality/pod-lifecycle-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/function-runner/functionality/pod-lifecycle-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Pod lifecycle management orchestrates the complete lifecycle of function execution pods from creation through caching, reuse, and eventual garbage collection. The system maintains a pool of ready-to-use pods for frequently executed functions while automatically cleaning up unused pods based on time-to-live policies.&lt;/p>
&lt;p>The architecture consists of two primary components:&lt;/p>
&lt;p>&lt;strong>Pod Cache Manager&lt;/strong> - Central coordinator running in a single goroutine that manages the pod cache, handles evaluation requests, processes pod readiness notifications, and performs periodic garbage collection. Uses channels for all communication to eliminate mutex synchronization.&lt;/p></description></item><item><title>Pod Templates</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/function-runner-config/pod-templates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/function-runner-config/pod-templates/</guid><description>&lt;p>The Function Runner supports customizing the pod specifications used for KRM function evaluation through ConfigMap-based templates. This allows you to configure resource limits, security contexts, node selectors, tolerations, and other pod-level settings for function execution pods.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>By default, the Function Runner uses an inline pod template with sensible defaults. For advanced use cases requiring customization, you can provide a ConfigMap containing custom pod and service templates. The Function Runner will use these templates when creating function evaluator pods.&lt;/p></description></item><item><title>Porch Controllers</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-controllers-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-controllers-config/</guid><description>&lt;p>The Porch controllers manage the lifecycle of PackageVariants and PackageVariantSets.&lt;/p>
&lt;h2 id="available-controllers">Available Controllers&lt;/h2>&lt;p>Porch includes the following controllers:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>PackageVariant Controller&lt;/strong> - Manages PackageVariant resources&lt;/li>
&lt;li>&lt;strong>PackageVariantSet Controller&lt;/strong> - Manages PackageVariantSet resources&lt;/li>
&lt;/ul>
&lt;h2 id="configuration-options">Configuration Options&lt;/h2>&lt;h3 id="command-line-arguments">Command Line Arguments&lt;/h3>&lt;p>The controllers support these command line arguments:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">args:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- --reconcilers&lt;span class="o">=&lt;/span>packagevariants,packagevariantsets &lt;span class="c1"># Comma-separated list of controllers to enable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># OR use --reconcilers=* to enable all controllers&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="default-configuration">Default Configuration&lt;/h3>&lt;p>The controllers use these hardcoded default settings (not configurable):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Metrics bind address&lt;/strong>: &lt;code>:8080&lt;/code>&lt;/li>
&lt;li>&lt;strong>Health probe bind address&lt;/strong>: &lt;code>:8081&lt;/code>&lt;/li>
&lt;li>&lt;strong>Webhook port&lt;/strong>: &lt;code>9443&lt;/code>&lt;/li>
&lt;li>&lt;strong>Leader election&lt;/strong>: Disabled&lt;/li>
&lt;li>&lt;strong>Leader election ID&lt;/strong>: &lt;code>porch-operators.config.porch.kpt.dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="resource-limits">Resource Limits&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">resources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">requests&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">memory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;128Mi&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cpu&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;100m&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">limits&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">memory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;512Mi&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cpu&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;500m&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="health-checks">Health Checks&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">livenessProbe&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">httpGet&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/healthz&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">8081&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">initialDelaySeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">30&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">periodSeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">30&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">failureThreshold&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timeoutSeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">readinessProbe&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">httpGet&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/readyz&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">8081&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">initialDelaySeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">periodSeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">failureThreshold&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timeoutSeconds&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="rbac-requirements">RBAC Requirements&lt;/h2>&lt;p>The controllers require these permissions:&lt;/p></description></item><item><title>Repositories</title><link>/v1.5/docs/2_concepts/repositories/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/repositories/</guid><description>&lt;h2 id="what-is-a-repository-in-porch">What is a Repository in Porch?&lt;/h2>&lt;p>A &lt;strong>Repository&lt;/strong> is a Kubernetes resource that connects Porch to a Git repository where kpt packages are stored. When you
register a repository with Porch, you&amp;rsquo;re creating a Repository resource that tells Porch:&lt;/p>
&lt;ul>
&lt;li>Where the storage backend is located (Git URL)
&lt;ul>
&lt;li>including a particular branch within the repository - the deployment branch&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>How to authenticate (via references to a Kubernetes Secret containing the credentials)&lt;/li>
&lt;li>Whether it&amp;rsquo;s a deployment repository (packages ready for deployment)&lt;/li>
&lt;li>How often to sync/refresh the package revision cache&lt;/li>
&lt;/ul>
&lt;h2 id="repository-types">Repository Types&lt;/h2>&lt;p>Porch supports two storage backends:&lt;/p></description></item><item><title>Validation &amp; Business Rules</title><link>/v1.5/docs/5_architecture_and_components/engine/functionality/validation-business-rules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/functionality/validation-business-rules/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine enforces validation and business rules to ensure package revisions are created and modified correctly. These rules prevent invalid operations, enforce naming constraints, and maintain referential integrity across packages and revisions.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Validation &amp;amp; Business Rules │
&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">│ │ Pre-Operation │ │ Constraint │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Validation │ ───&amp;gt; │ Enforcement │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Lifecycle │ │ • Uniqueness │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Tasks │ │ • Path Overlap │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Resources │ │ • Clone Rules │ │
&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">│ │ Optimistic │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Locking │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Resource Ver │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Conflict Det │ │
&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;h2 id="lifecycle-validation">Lifecycle Validation&lt;/h2>&lt;p>The Engine validates lifecycle values during package revision creation and updates:&lt;/p></description></item><item><title>Creating Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/creating-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/creating-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Initialize a new package revision&lt;/li>
&lt;li>Pull the package revision locally&lt;/li>
&lt;li>Modify the package revision contents&lt;/li>
&lt;li>Push changes back to Porch&lt;/li>
&lt;li>Propose the package revision for review&lt;/li>
&lt;li>Approve or reject the package revision&lt;/li>
&lt;/ol>
&lt;hr>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Please note the tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
We recommended to use this for simpler copy pasting of commands otherwise replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the below commands.

&lt;/div>

&lt;h2 id="step-1-initialize-your-first-package-revision">Step 1: Initialize Your First Package Revision&lt;/h2>&lt;p>Create a new package revision in Porch using the &lt;code>init&lt;/code> command:&lt;/p></description></item><item><title>Custom Resource Cache</title><link>/v1.5/docs/5_architecture_and_components/package-cache/cr-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/cr-cache/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>Custom Resource (CR) Cache&lt;/strong> is the default cache implementation in Porch. It stores package metadata using a Kubernetes Custom Resources while keeping repository data in memory. This implementation is designed for standard Porch deployments where Kubernetes &lt;code>etcd&lt;/code> provides sufficient storage and performance.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Default implementation&lt;/strong>: Used when no cache type is explicitly configured&lt;/li>
&lt;li>&lt;strong>Hybrid storage&lt;/strong>: In-memory repository cache + CR-based metadata storage&lt;/li>
&lt;li>&lt;strong>RDBMS-independent&lt;/strong>: No RDBMS (such as Posgres) required, leverages the Kubernetes API, &lt;code>etcd&lt;/code>, and Git for persistence&lt;/li>
&lt;li>&lt;strong>Suitable for&lt;/strong>: Small to medium deployments with moderate package counts&lt;/li>
&lt;li>&lt;strong>No external dependencies&lt;/strong>: Only requires a Kubernetes cluster&lt;/li>
&lt;li>&lt;strong>Git interaction&lt;/strong>: Interacts with Git at every stage of package revision lifecycle for presistence&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="storage-architecture">Storage Architecture&lt;/h3>&lt;p>The CR Cache uses a two-tier storage model:&lt;/p></description></item><item><title>Draft-Commit Workflow Orchestration</title><link>/v1.5/docs/5_architecture_and_components/engine/functionality/draft-commit-orchestration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/functionality/draft-commit-orchestration/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine orchestrates a draft-commit workflow for all package revision modifications. This pattern ensures atomicity - either all changes succeed and are persisted, or none are. The workflow uses mutable drafts for changes and immutable package revisions for storage.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Draft-Commit Workflow Orchestration │
&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">│ │ Draft Phase │ │ Commit Phase │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Open Draft │ │ • Close Draft │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Apply Changes │ │ • Persist │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Validate │ │ • Immutable │ │
&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">│ │ Rollback │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Mechanism │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │• Trigger On Error│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │• Does Cleanup │ │
&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;h2 id="draft-commit-pattern">Draft-Commit Pattern&lt;/h2>&lt;p>The Engine uses a two-phase workflow for all package revision modifications:&lt;/p></description></item><item><title>Functionality</title><link>/v1.5/docs/5_architecture_and_components/porch-apiserver/functionality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/porch-apiserver/functionality/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Porch API Server provides the Kubernetes API interface for Porch resources. It implements custom REST storage backends that delegate to the Engine, enforces validation and admission policies through strategies, and manages real-time watch streams for clients.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ API Server Functionality │
&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">│ │ REST Storage │ │ Strategies │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • CRUD Ops │ │ • Validation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Watch Streams │ │ • Admission │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Engine Deleg │ │ • Table Conv │ │
&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">│ │ Background │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Operations │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Repo Sync │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Cleanup │ │
&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;h2 id="rest-storage-implementation">REST Storage Implementation&lt;/h2>&lt;p>See 
&lt;a href="/v1.5/docs/5_architecture_and_components/porch-apiserver/design/#rest-storage-interface">Design&lt;/a> for the design rationale behind custom REST storage.&lt;/p></description></item><item><title>Getting Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/inspecting-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/inspecting-packages/</guid><description>&lt;hr>
&lt;h2 id="basic-operations">Basic Operations&lt;/h2>&lt;p>These operations cover the fundamental commands for viewing and inspecting package revisions in Porch.&lt;/p>
&lt;h3 id="getting-all-package-revisions">Getting All Package Revisions&lt;/h3>&lt;p>Get all package revisions across all repositories in a namespace:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl rpkg get --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>What this does:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Queries Porch for all PackageRevisions in the specified namespace&lt;/li>
&lt;li>Displays a summary table with key information&lt;/li>
&lt;li>Shows PackageRevisions from all registered repositories&lt;/li>
&lt;/ul>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;p>&lt;code>porchctl rpkg list&lt;/code> is an alias for &lt;code>porchctl rpkg get&lt;/code> and can be used interchangeably:&lt;/p></description></item><item><title>Image and Registry Management</title><link>/v1.5/docs/5_architecture_and_components/function-runner/functionality/image-registry-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/function-runner/functionality/image-registry-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Function Runner manages container image metadata and registry authentication to optimize pod creation and support private registries. The system caches image metadata (digest and entrypoint) to avoid repeated registry calls, handles authentication for private registries using Docker config format, and supports TLS configuration for secure registry connections.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Image and Registry Management │
&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">│ │ Image │ │ Registry │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Metadata │ ───&amp;gt; │ Authentication │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Caching │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ • Default │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Digest │ │ • Custom Auth │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Entrypoint │ │ • TLS Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • In-Memory │ │ │ │
&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">│ │ Secret │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Management │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Creation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Synchronization│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Pod Injection │ │
&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;h2 id="image-metadata-caching">Image Metadata Caching&lt;/h2>&lt;p>The pod manager caches image metadata to avoid repeated registry API calls during pod creation.&lt;/p></description></item><item><title>Jaeger Tracing</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/jaeger-tracing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/porch-server-config/jaeger-tracing/</guid><description>&lt;p>Jaeger tracing provides distributed tracing capabilities for the Porch Server, allowing you to monitor and debug package operations. This is particularly useful for development and troubleshooting.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Jaeger tracing is currently only supported for the Porch Server component. Function Runner and Porch Controllers do not support tracing.

&lt;/div>

&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Porch Server supports OpenTelemetry tracing that can be exported to Jaeger for visualization. When enabled, Porch Server will generate traces for:&lt;/p>
&lt;ul>
&lt;li>Package operations (create, update, delete)&lt;/li>
&lt;li>Git repository interactions&lt;/li>
&lt;li>Function execution requests&lt;/li>
&lt;li>API requests and responses&lt;/li>
&lt;/ul>
&lt;h2 id="deployment-setup">Deployment Setup&lt;/h2>&lt;h3 id="deploy-jaeger-to-kubernetes">Deploy Jaeger to Kubernetes&lt;/h3>&lt;p>Porch includes a ready-to-use Jaeger deployment:&lt;/p></description></item><item><title>Lifecycle Management</title><link>/v1.5/docs/5_architecture_and_components/engine/functionality/lifecycle-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/functionality/lifecycle-management/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine enforces a strict lifecycle state machine for package revisions that governs their mutability, visibility, and progression from draft to published state. The lifecycle system ensures that package revisions follow a controlled workflow from creation through approval to deployment, with appropriate constraints at each stage.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Lifecycle Management System │
&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">│ │ State Machine │ │ Validation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ───&amp;gt; │ &amp;amp; Enforcement │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Draft │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Proposed │ │ • Creation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Published │ │ • Transition │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Deletion │ │ • Mutation │ │
&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">│ │ State-Based │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Constraints │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Mutability │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Operations │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Audit Trail │ │
&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;h2 id="lifecycle-state-machine">Lifecycle State Machine&lt;/h2>&lt;p>The lifecycle state machine defines four states that a package revision can be in:&lt;/p></description></item><item><title>Local Development Environment</title><link>/v1.5/docs/6_configuration_and_deployments/deployments/local-dev-env-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/deployments/local-dev-env-deployment/</guid><description>&lt;p>This guide provides instructions for setting up a local development environment using Kind (Kubernetes in Docker) for developing, testing, and exploring Porch.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>
&lt;a href="https://docs.docker.com/get-docker/" target="_blank">Docker&lt;/a> - For running containers and Kind cluster&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" target="_blank">kubectl&lt;/a> - Kubernetes command-line tool&lt;/li>
&lt;li>
&lt;a href="https://kind.sigs.k8s.io/docs/user/quick-start/#installation" target="_blank">kind&lt;/a> - Local Kubernetes clusters using Docker&lt;/li>
&lt;/ul>
&lt;h2 id="setup">Setup&lt;/h2>&lt;h3 id="1-create-kind-cluster">1. Create Kind Cluster&lt;/h3>&lt;p>From the Porch repository root directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./scripts/setup-dev-env.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This script:&lt;/p>
&lt;ul>
&lt;li>Creates a Kind cluster named &lt;code>porch-test&lt;/code>&lt;/li>
&lt;li>Installs MetalLB load balancer&lt;/li>
&lt;li>Deploys Gitea Git server&lt;/li>
&lt;li>Generates PKI resources for testing&lt;/li>
&lt;li>Builds the &lt;code>porchctl&lt;/code> CLI binary&lt;/li>
&lt;/ul>
&lt;h3 id="2-deploy-porch">2. Deploy Porch&lt;/h3>&lt;p>Choose your cache backend:&lt;/p></description></item><item><title>Mutation Application</title><link>/v1.5/docs/5_architecture_and_components/controllers/functionality/mutation-application/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/functionality/mutation-application/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The PackageVariant controller applies mutations to downstream package revisions to customize them based on the PackageVariant specification. Mutations are systematic transformations applied to package resources after cloning or upgrading from upstream, enabling configuration injection, function pipeline modification, and dynamic resource generation.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Mutation Application System │
&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">│ │ Package │ │ KRM │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Context │ ───&amp;gt; │ Functions │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • ConfigMap │ │ • Prepend │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Data │ │ • Naming │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Add/Remove │ │ • Pipeline │ │
&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">│ │ Config │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Injection │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Annotation │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Selector │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Field Copy │ │
&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;h2 id="mutation-orchestration">Mutation Orchestration&lt;/h2>&lt;p>Mutations are applied in a specific order during package revision processing:&lt;/p></description></item><item><title>Package Revisions</title><link>/v1.5/docs/2_concepts/package-revisions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/package-revisions/</guid><description>&lt;h2 id="what-is-a-package-revision">What is a Package Revision?&lt;/h2>&lt;p>A &lt;strong>package revision&lt;/strong> is the actual working unit in Porch. While users may often refer to &amp;ldquo;working with a package&amp;rdquo;, they
are actually working with a specific revision of that package.&lt;/p>
&lt;p>Think of it like Git commits:&lt;/p>
&lt;ul>
&lt;li>A Git repository contains a project&lt;/li>
&lt;li>Each commit is a specific version of that project&lt;/li>
&lt;li>You work with commits, not the abstract &amp;ldquo;project&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Similarly in Porch:&lt;/p>
&lt;ul>
&lt;li>A Repository contains kpt packages&lt;/li>
&lt;li>Each package revision is a specific version of a kpt package&lt;/li>
&lt;li>You work with package revisions, not the abstract &amp;ldquo;package&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="published-package-revision-numbering">Published Package Revision Numbering&lt;/h2>&lt;p>Package revisions use simple integer sequence versioning (&lt;code>1&lt;/code>, &lt;code>2&lt;/code>, &lt;code>3&lt;/code>, etc.):&lt;/p></description></item><item><title>PackageVariantSet Controller</title><link>/v1.5/docs/5_architecture_and_components/controllers/packagevariantsets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/packagevariantsets/</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>Registering Repositories</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-registration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-registration/</guid><description>&lt;p>Registering a repository connects Porch to your Git storage backend, allowing it to discover and manage packages. You can register repositories with various authentication methods and configuration options.&lt;/p>
&lt;h3 id="register-a-git-repository">Register a Git Repository&lt;/h3>&lt;p>Register a Git repository with Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo register https://github.com/example/porch-test.git &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --namespace default &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name&lt;span class="o">=&lt;/span>porch-test &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --description&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Blueprint packages&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --branch&lt;span class="o">=&lt;/span>main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>What this does:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Registers the Git repository with Porch&lt;/li>
&lt;li>Creates a Repository resource in Kubernetes&lt;/li>
&lt;li>Begins synchronizing packages from the repository&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example output:&lt;/strong>&lt;/p></description></item><item><title>Uninstalling Porch</title><link>/v1.5/docs/3_getting_started/uninstalling-porch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/3_getting_started/uninstalling-porch/</guid><description>&lt;h2 id="uninstalling-porch-server">Uninstalling Porch Server&lt;/h2>&lt;p>Navigate to the directory where you installed Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> porch-1.5.7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Remove Porch components using kpt:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">kpt live destroy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will delete all Porch resources from your cluster, including:&lt;/p>
&lt;ul>
&lt;li>Porch server deployment&lt;/li>
&lt;li>Function runner deployment&lt;/li>
&lt;li>Porch controllers deployment&lt;/li>
&lt;li>Services, ConfigMaps, and Secrets&lt;/li>
&lt;li>Custom Resource Definitions (CRDs)&lt;/li>
&lt;/ul>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>

 Destroying Porch will &lt;strong>not&lt;/strong> delete your Git repositories or the packages stored in them. However, PackageRevision and Repository resources in your cluster will be removed.

&lt;/div>

&lt;h2 id="verify-uninstallation">Verify Uninstallation&lt;/h2>&lt;p>Check that Porch components are removed:&lt;/p></description></item><item><title>Copying Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/copying-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/copying-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Find a PackageRevision to copy&lt;/li>
&lt;li>Copy a PackageRevision to create a new revision&lt;/li>
&lt;li>Modify the copied PackageRevision&lt;/li>
&lt;li>Propose and approve the new revision&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 The tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
We recommended to use this for simpler copy pasting of commands otherwise replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the below commands.

&lt;/div>

&lt;hr>
&lt;h2 id="key-concepts">Key Concepts&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Copy&lt;/strong>: Creates a new independent PackageRevision within the same repository&lt;/li>
&lt;li>&lt;strong>Source PackageRevision&lt;/strong>: The original PackageRevision being copied&lt;/li>
&lt;li>&lt;strong>Target PackageRevision&lt;/strong>: The new PackageRevision created by the copy operation&lt;/li>
&lt;li>&lt;strong>Workspace&lt;/strong>: Must be unique within the package for the target&lt;/li>
&lt;li>&lt;strong>Same-repository operation&lt;/strong>: Copy only works within a single repository&lt;/li>
&lt;li>&lt;strong>Immutability&lt;/strong>: Published PackageRevisions cannot be modified, only copied&lt;/li>
&lt;li>&lt;strong>Clone vs Copy&lt;/strong>: Use clone for cross-repository operations, copy for same-repository versions&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="understanding-copy-operations">Understanding Copy Operations&lt;/h2>&lt;p>Copying creates a new PackageRevision based on an existing one &lt;strong>within the same repository&lt;/strong>. The copied PackageRevision is completely &lt;strong>independent with no upstream link&lt;/strong> to the source.&lt;/p></description></item><item><title>Database Cache</title><link>/v1.5/docs/5_architecture_and_components/package-cache/db-cache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/db-cache/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The &lt;strong>Database (DB) Cache&lt;/strong> is an alternative cache implementation in Porch designed for larger deployments. It stores both package metadata and repository data in a PostgreSQL database rather than in memory or Kubernetes Custom Resources. This implementation provides better scalability and persistence characteristics for production environments with high package counts.&lt;/p>
&lt;p>&lt;strong>Key characteristics:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Alternative implementation&lt;/strong>: Used when explicitly configured with database connection details&lt;/li>
&lt;li>&lt;strong>Database-backed storage&lt;/strong>: All repository, package, and package revision data stored in PostgreSQL&lt;/li>
&lt;li>&lt;strong>External dependency&lt;/strong>: Requires PostgreSQL database instance&lt;/li>
&lt;li>&lt;strong>Suitable for&lt;/strong>: Large deployments with thousands of packages and package revisions&lt;/li>
&lt;li>&lt;strong>Better persistence&lt;/strong>: Survives Porch server restarts without re-fetching from Git&lt;/li>
&lt;li>&lt;strong>Git interaction&lt;/strong>: Interacts with Git only during approval/publish and sync operations&lt;/li>
&lt;/ul>
&lt;h2 id="implementation-details">Implementation Details&lt;/h2>&lt;h3 id="storage-architecture">Storage Architecture&lt;/h3>&lt;p>The DB Cache uses a database-centric storage model:&lt;/p></description></item><item><title>Engine Interactions</title><link>/v1.5/docs/5_architecture_and_components/engine/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/interactions/</guid><description>&lt;h2 id="overall-interaction-overview">Overall Interaction Overview&lt;/h2>&lt;p>&lt;img src="/v1.5/images/porch/engine-component-interaction.drawio.svg" alt="Engine Interaction Architecture" />&lt;/p>
&lt;h2 id="cache-integration">Cache Integration&lt;/h2>&lt;p>The Engine relies heavily on the Package Cache as its primary interface to repositories:&lt;/p>
&lt;h3 id="opening-repositories">Opening Repositories&lt;/h3>&lt;p>All repository access goes through the cache:&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">Engine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OpenRepository(repositorySpec)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Package Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Repository Adapter (Git)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Process:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Engine receives a Repository CR specification&lt;/li>
&lt;li>Calls &lt;code>cache.OpenRepository(ctx, repositorySpec)&lt;/code>&lt;/li>
&lt;li>Cache returns a Repository interface implementation&lt;/li>
&lt;li>Engine uses the repository abstraction for all operations&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Benefits of cache-mediated access:&lt;/strong>&lt;/p></description></item><item><title>Function Runner Interactions</title><link>/v1.5/docs/5_architecture_and_components/function-runner/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/function-runner/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Function Runner is a &lt;strong>separate gRPC service&lt;/strong> that interacts with multiple systems: the Task Handler (via gRPC), Kubernetes API (for pod management), container registries (for image metadata), and wrapper servers (for function execution). It operates independently from the Porch server, enabling isolated function execution.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Function Runner Service │
&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">│ │ Task Handler │ ───&amp;gt; │ gRPC │ ───&amp;gt; │ Eval │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (in Porch) │ │ Server │ │uators│ │
&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">│ └──────────────│ Kubernetes │ │Image │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ API │ │Cache │ │
&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">│ │ Function Pods│ │Registry │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ + Services │ │ APIs │ │
&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;h2 id="task-handler-integration">Task Handler Integration&lt;/h2>&lt;p>The Function Runner integrates with the Task Handler through the gRPC Runtime:&lt;/p></description></item><item><title>Interactions</title><link>/v1.5/docs/5_architecture_and_components/porch-apiserver/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/porch-apiserver/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Porch API Server acts as the integration point between Kubernetes clients and Porch&amp;rsquo;s internal components. It translates Kubernetes API requests into Engine operations, manages watch streams, and coordinates background synchronization tasks.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Porch API Server │
&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">│ │ Clients │ ───&amp;gt; │ REST │ ───&amp;gt; │Engine│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ (kubectl, │ │ Storage │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ kpt, etc) │ │ │ │ │ │
&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">│ └──────────────│ Watcher │ │Cache │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ 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;/code>&lt;/pre>&lt;/div>&lt;h2 id="engine-integration">Engine Integration&lt;/h2>&lt;p>The API Server delegates all package operations to the CaD Engine:&lt;/p></description></item><item><title>OpenTelemetry Configuration</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/opentelemetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/opentelemetry/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Porch supports OpenTelemetry observability through the 
&lt;a href="https://pkg.go.dev/go.opentelemetry.io/contrib/exporters/autoexport" target="_blank">autoexport package&lt;/a>, which provides automatic configuration of metrics and traces exporters via environment variables. This enables seamless integration with various observability backends including OTLP collectors, Prometheus, and Jaeger.&lt;/p>
&lt;p>All Porch components (porch-server, porch-controllers, function-runner, and wrapper-server) support OpenTelemetry configuration through standardized environment variables as defined by the 
&lt;a href="https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/" target="_blank">OpenTelemetry specification&lt;/a>.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;strong>Current Implementation Status&lt;/strong>: Porch currently implements metrics and traces export. Logs export is not supported.

&lt;/div>

&lt;h2 id="traces-configuration">Traces Configuration&lt;/h2>&lt;h3 id="otlp-trace-export">OTLP Trace Export&lt;/h3>&lt;p>Export traces to an OpenTelemetry Protocol (OTLP) collector using either HTTP or gRPC protocols.&lt;/p></description></item><item><title>Private Registries</title><link>/v1.5/docs/6_configuration_and_deployments/configurations/components/function-runner-config/private-registries-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/6_configuration_and_deployments/configurations/components/function-runner-config/private-registries-config/</guid><description>&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 KPT functions and KRM functions are synonymous terms referring to the same containerized functions.

&lt;/div>

&lt;p>Configure the Function Runner to access private container registries for KRM functions.&lt;/p>
&lt;h2 id="use-cases">Use Cases&lt;/h2>&lt;p>Private registries are commonly used for:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Enterprise environments&lt;/strong> - Internal Harbor or JFrog registries&lt;/li>
&lt;li>&lt;strong>Cloud providers&lt;/strong> - GitHub Container Registry (GHCR), AWS ECR, Azure ACR&lt;/li>
&lt;li>&lt;strong>Custom functions&lt;/strong> - Organization-specific KRM functions&lt;/li>
&lt;/ul>
&lt;h2 id="default-public-registries">Default Public Registries&lt;/h2>&lt;p>By default, Function Runner uses public registries:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ghcr.io/kptdev/krm-functions-catalog&lt;/code> - GitHub Container Registry for KRM functions&lt;/li>
&lt;li>Other public registries as configured&lt;/li>
&lt;/ul>
&lt;h2 id="private-registry-authentication">Private Registry Authentication&lt;/h2>&lt;p>To use private container registries for KRM functions, configure authentication in the Function Runner.&lt;/p></description></item><item><title>Repositories Basic Usage</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-basic-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-basic-usage/</guid><description>&lt;h2 id="basic-operations">Basic Operations&lt;/h2>&lt;p>These operations cover the fundamental commands for viewing and managing registered repositories.&lt;/p>
&lt;h3 id="list-registered-repositories">List Registered Repositories&lt;/h3>&lt;p>View all repositories registered with Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo get --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>What this does:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Queries Porch for all registered repositories in the specified namespace&lt;/li>
&lt;li>Displays repository type, content, sync schedule, and status&lt;/li>
&lt;li>Shows the repository address&lt;/li>
&lt;/ul>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;p>&lt;code>porchctl repo list&lt;/code> is an alias for &lt;code>porchctl repo get&lt;/code> and can be used interchangeably:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo list --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>

&lt;/div>

&lt;p>&lt;strong>Using kubectl:&lt;/strong>&lt;/p></description></item><item><title>Task Coordination</title><link>/v1.5/docs/5_architecture_and_components/engine/functionality/task-coordination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/engine/functionality/task-coordination/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Engine coordinates task execution by delegating to the Task Handler. Tasks represent operations that transform package content (init, clone, edit, upgrade, render). The Engine orchestrates when and how tasks are executed, while the Task Handler implements the actual transformations.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Task Coordination System │
&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">│ │ Engine │ │ Task Handler │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Orchestration │ ───&amp;gt; │ Execution │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • When to Run │ │ • Init │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Draft Mgmt │ │ • Clone │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Error Handle │ │ • Edit │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └──────────────────┘ │ • Upgrade │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ • Render │ │
&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">│ │ Function │ ┌──────────────────┐ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Runtime │ &amp;lt;─── │ Builtin Funcs │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • gRPC │ │ • set-namespace │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ • Builtin │ │ • ensure-context│ │
&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;h2 id="task-handler-integration">Task Handler Integration&lt;/h2>&lt;p>The Engine integrates with the Task Handler through three main operations:&lt;/p></description></item><item><title>Workspace</title><link>/v1.5/docs/2_concepts/workspace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/workspace/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Important&lt;/h4>

 &lt;p>&lt;strong>Workspace is merely a unique ID for a package revision!&lt;/strong>&lt;/p>
&lt;p>The content of this page will shortly be updated to reflect this fact and moved into the PackageRevision page!&lt;/p>


&lt;/div>

&lt;h2 id="what-is-a-workspace">What is a Workspace?&lt;/h2>&lt;p>A &lt;strong>workspace&lt;/strong> is a named, isolated environment for working on a package revision in Porch. Each Draft or Proposed
package revision has a unique workspace name that identifies the specific set of changes being made to a package.&lt;/p></description></item><item><title>Cloning Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/cloning-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/cloning-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Find a PackageRevision to clone&lt;/li>
&lt;li>Clone a PackageRevision to a different repository&lt;/li>
&lt;li>Modify the cloned PackageRevision&lt;/li>
&lt;li>Propose and approve the new revision&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Please note the tutorial assumes repositories are initialized with the &amp;ldquo;blueprints&amp;rdquo; and &amp;ldquo;deployments&amp;rdquo; names.
We recommended to use these for simpler copy pasting of commands otherwise replace these values with your repository names in the below commands.

&lt;/div>

&lt;hr>
&lt;h2 id="understanding-clone-operations">Understanding Clone Operations&lt;/h2>&lt;p>Cloning creates a new PackageRevision based on an existing one and works &lt;strong>across different repositories&lt;/strong>. The cloned PackageRevision maintains an &lt;strong>upstream reference&lt;/strong> to its source, allowing it to receive updates.&lt;/p></description></item><item><title>Interactions with Porch APIs</title><link>/v1.5/docs/5_architecture_and_components/controllers/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/controllers/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><item><title>Package Revision Lifecycle</title><link>/v1.5/docs/2_concepts/package-revision-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/package-revision-lifecycle/</guid><description>&lt;h2 id="what-is-package-revision-lifecycle">What is Package Revision Lifecycle?&lt;/h2>&lt;p>The &lt;strong>lifecycle&lt;/strong> of a package revision refers to its current stage in Porch&amp;rsquo;s orchestration process. A package revision
moves through different stages from creation to publication, with approval gates between stages.&lt;/p>
&lt;h2 id="lifecycle-stages">Lifecycle Stages&lt;/h2>&lt;h3 id="draft">Draft&lt;/h3>&lt;p>A package revision in &lt;strong>Draft&lt;/strong> stage is work in progress. It is being actively edited and not ready for deployment. If
it is being cached by the 
&lt;a href="/v1.5/docs/5_architecture_and_components/package-cache/cr-cache/">CR cache&lt;/a>,
its contents are stored in a temporary branch in the Git repository (e.g., &lt;code>drafts/package-name/workspace&lt;/code>). If it is
being cached by the 
&lt;a href="/v1.5/docs/5_architecture_and_components/package-cache/db-cache/">DB cache&lt;/a>,
its contents are only stored in the database and do not appear in Git at all.&lt;/p></description></item><item><title>Synchronizing Repositories</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-synchronization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-synchronization/</guid><description>&lt;h2 id="repository-synchronization">Repository Synchronization&lt;/h2>&lt;p>Porch periodically synchronizes with registered repositories to discover new packages and updates. You can also trigger manual synchronization when you need immediate updates.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 &lt;strong>Sync Schedule Format:&lt;/strong> Cron expressions follow the format &lt;code>minute hour day month weekday&lt;/code>. For example, &lt;code>*/10 * * * *&lt;/code> means &amp;ldquo;every 10 minutes&amp;rdquo;.

&lt;/div>

&lt;h3 id="trigger-manual-sync">Trigger Manual Sync&lt;/h3>&lt;p>Force an immediate synchronization of a repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo sync porch-test --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>What this does:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Schedules a one-time sync (minimum 1-minute delay)&lt;/li>
&lt;li>Updates packages from the repository&lt;/li>
&lt;li>Independent of periodic sync schedule&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example output:&lt;/strong>&lt;/p></description></item><item><title>API Reference Generation</title><link>/v1.5/docs/12_contributing/docs-contribution/api-ref-generation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/12_contributing/docs-contribution/api-ref-generation/</guid><description>&lt;p>Porch uses &lt;code>crd-ref-docs&lt;/code> to generate API reference documentation from Go source code.&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 Only regenerate documentation when API types in &lt;code>api/porch/v1alpha1&lt;/code> are modified.

&lt;/div>

&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>Go 1.25+ installed&lt;/li>
&lt;li>Access to the Porch repository&lt;/li>
&lt;/ul>
&lt;h2 id="generate-documentation">Generate Documentation&lt;/h2>&lt;p>From the &lt;code>docs/&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">make generate-api-docs-markdown
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This runs &lt;code>scripts/generate-api-reference-md.sh&lt;/code> which:&lt;/p>
&lt;ul>
&lt;li>Installs &lt;code>crd-ref-docs&lt;/code> (v2.0.0) if not present&lt;/li>
&lt;li>Generates API reference from &lt;code>api/porch/v1alpha1&lt;/code>&lt;/li>
&lt;li>Outputs to &lt;code>docs/content/en/docs/7_cli_api/api-ref.md&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="configuration">Configuration&lt;/h2>&lt;p>&lt;strong>Config:&lt;/strong> &lt;code>docs/crd-ref-docs/config.yaml&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Excludes OCI types (not supported)&lt;/li>
&lt;li>Excludes standard Kubernetes metadata fields&lt;/li>
&lt;li>Uses Kubernetes v1.34 for API links&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Templates:&lt;/strong> &lt;code>docs/crd-ref-docs/markdown-templates/&lt;/code>&lt;/p></description></item><item><title>Cache Interactions</title><link>/v1.5/docs/5_architecture_and_components/package-cache/interactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/5_architecture_and_components/package-cache/interactions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The Package Cache acts as an intermediary layer that coordinates between the CaDEngine, Repository Adapters, and external Git repositories. It provides caching, synchronization, and change notification services while maintaining a clean separation of concerns.&lt;/p>
&lt;h3 id="high-level-architecture">High-Level Architecture&lt;/h3>&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">│ Package Cache Layer │
&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">│ │ CaDEngine │ ───&amp;gt; │ Cache │ ───&amp;gt; │ Repo │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Requests │ │ Operations │ │Adapt │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ │ │ │ ers │ │
&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">│ └──────────────│ Watcher │ │ Git │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ Notifier │ │Repos │ │
&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;h2 id="repository-adapter-integration">Repository Adapter Integration&lt;/h2>&lt;p>The cache wraps repository adapters to provide caching and synchronization services:&lt;/p></description></item><item><title>Unregistering Repositories</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-unregistration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_porch_repositories/repository-unregistration/</guid><description>&lt;h2 id="unregistering-repositories">Unregistering Repositories&lt;/h2>&lt;p>When you no longer need Porch to manage packages from a repository, you can unregister it. This removes Porch&amp;rsquo;s connection to the repository without affecting the underlying Git storage.&lt;/p>
&lt;h3 id="unregister-a-repository">Unregister a Repository&lt;/h3>&lt;p>Remove a repository from Porch:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">porchctl repo unregister porch-test --namespace default
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>What this does:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Removes the Repository resource from Kubernetes&lt;/li>
&lt;li>Stops synchronizing packages from the repository&lt;/li>
&lt;li>Removes Porch&amp;rsquo;s cached metadata for the repository&lt;/li>
&lt;li>Does not delete the underlying Git repository or its contents&lt;/li>
&lt;/ul>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>

 Unregistering a repository does not delete the underlying Git repository or its contents. It only removes Porch&amp;rsquo;s connection to it.

&lt;/div>

&lt;p>&lt;strong>Example output:&lt;/strong>&lt;/p></description></item><item><title>Upgrading Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/upgrading-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/upgrading-packages/</guid><description>&lt;p>The package upgrade feature in Porch is a powerful mechanism for keeping deployed packages (downstream) up-to-date with their source blueprints (upstream). This guide walks through the entire workflow, from creating packages to performing an upgrade, with a special focus on the different upgrade scenarios and merge strategies.&lt;/p>
&lt;p>For detailed command reference, see the 
&lt;a href="/v1.5/docs/7_cli_api/porchctl/">porchctl CLI guide&lt;/a>.&lt;/p>
&lt;h2 id="key-concepts">Key Concepts&lt;/h2>&lt;p>To understand the upgrade process, it&amp;rsquo;s essential to be familiar with the three states of a package during a merge operation:&lt;/p></description></item><item><title>Upstream &amp; Downstream</title><link>/v1.5/docs/2_concepts/upstream-downstream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/upstream-downstream/</guid><description>&lt;h2 id="what-are-upstream-and-downstream-packages">What are Upstream and Downstream Packages?&lt;/h2>&lt;p>&lt;strong>Upstream&lt;/strong> and &lt;strong>downstream&lt;/strong> describe source-to-derivation relationship between packages and package revisions in Porch.
This relationship is fundamental to package reuse, customization, upgrade control, and lifecycle management.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Upstream package&lt;/strong>: The source or template package that provides the base content&lt;/li>
&lt;li>&lt;strong>Downstream package&lt;/strong>: A derived package created by cloning or copying from an upstream package&lt;/li>
&lt;/ul>
&lt;p>This relationship enables:&lt;/p>
&lt;ul>
&lt;li>Package reuse across teams and environments&lt;/li>
&lt;li>Centralized maintenance of template packages&lt;/li>
&lt;li>Tracking of package lineage and updates&lt;/li>
&lt;li>Automated propagation of upstream changes to downstream packages&lt;/li>
&lt;/ul>
&lt;h2 id="how-the-relationship-works">How the Relationship Works&lt;/h2>&lt;p>When you create a downstream package revision from an upstream package revision, Porch establishes and tracks this relationship.
The downstream package revision maintains a record of its upstream source, including the exact version (Git commit) it was
derived from.&lt;/p></description></item><item><title>Deleting Package Revisions</title><link>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/deleting-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/4_tutorials_and_how-tos/working_with_package_revisions/deleting-packages/</guid><description>&lt;h2 id="tutorial-overview">Tutorial Overview&lt;/h2>&lt;p>You will learn how to:&lt;/p>
&lt;ol>
&lt;li>Delete Draft and Proposed PackageRevisions directly&lt;/li>
&lt;li>Propose Published PackageRevisions for deletion&lt;/li>
&lt;li>Approve or reject deletion proposals&lt;/li>
&lt;li>Understand the deletion workflow and safety mechanisms&lt;/li>
&lt;/ol>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>

 This tutorial assumes a porch repository is initialized with the &amp;ldquo;porch-test&amp;rdquo; name.
Replace any &amp;ldquo;porch-test&amp;rdquo; value with your repository&amp;rsquo;s name in the commands below.

&lt;/div>

&lt;hr>
&lt;h2 id="understanding-packagerevision-deletion">Understanding PackageRevision Deletion&lt;/h2>&lt;p>PackageRevision deletion in Porch follows different workflows depending on the lifecycle state:&lt;/p>
&lt;p>&lt;strong>Direct Deletion:&lt;/strong>&lt;/p></description></item><item><title>KRM Functions</title><link>/v1.5/docs/2_concepts/functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/functions/</guid><description>&lt;h2 id="what-are-functions-in-porch">What are Functions in Porch?&lt;/h2>&lt;p>&lt;strong>Functions&lt;/strong> in Porch are 
&lt;a href="https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md" target="_blank">KRM (Kubernetes Resource Model) functions&lt;/a> -
containerized programs that transform or validate Kubernetes resource manifests within a package&amp;rsquo;s files. Functions are
declared in a package&amp;rsquo;s Kptfile and executed by Porch when rendering the package.&lt;/p>
&lt;p>Functions enable:&lt;/p>
&lt;ul>
&lt;li>Automated resource generation and modification&lt;/li>
&lt;li>Policy enforcement and validation&lt;/li>
&lt;li>Configuration customization without manual editing&lt;/li>
&lt;li>Repeatable, auditable transformations&lt;/li>
&lt;/ul>
&lt;p>For details on how to declare and configure functions in the Kptfile pipeline, see the 
&lt;a href="https://kpt.dev/book/04-using-functions/" target="_blank">kpt functions documentation&lt;/a>.&lt;/p></description></item><item><title>Package Variants and Package Variant Sets</title><link>/v1.5/docs/2_concepts/package-variant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/v1.5/docs/2_concepts/package-variant/</guid><description>&lt;h2 id="what-are-packagevariants">What are PackageVariants?&lt;/h2>&lt;p>A &lt;strong>PackageVariant&lt;/strong> is a Kubernetes custom resource that automates the creation and maintenance of downstream package
revisions based on an upstream package. It establishes a relationship between an upstream (source) package and one or
more downstream (target) packages, automatically keeping them synchronized.&lt;/p>
&lt;p>PackageVariants enable:&lt;/p>
&lt;ul>
&lt;li>Automatic cloning of package revisions from upstream to downstream repositories&lt;/li>
&lt;li>Continuous tracking of package revisions of the upstream package&lt;/li>
&lt;li>Automated creation of new downstream revisions when a new revision of the upstream is published&lt;/li>
&lt;li>Customization of downstream package revisions through injectors, functions, and package context&lt;/li>
&lt;/ul>
&lt;h2 id="how-packagevariants-work">How PackageVariants Work&lt;/h2>&lt;p>Porch&amp;rsquo;s PackageVariant controller watches for changes to:&lt;/p></description></item></channel></rss>