<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>KRM Function Developer Guide on kpt documentation</title><link>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/</link><description>Recent content in KRM Function Developer Guide on kpt documentation</description><generator>Hugo</generator><language>en</language><atom:link href="https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/index.xml" rel="self" type="application/rss+xml"/><item><title>Containerizing</title><link>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/containerizing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/containerizing/</guid><description>&lt;p&gt;KRM functions are distributed as container images. This guide covers building
and running containerized functions.&lt;/p&gt;
&lt;h2 id="dockerfile"&gt;
 Dockerfile
 &lt;a href="#dockerfile" class="anchor-link"&gt;#&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;The 
&lt;a href="https://github.com/kptdev/krm-functions-catalog" target="_blank"&gt;krm-functions-catalog&lt;/a&gt;
provides a shared Dockerfile at &lt;code&gt;build/docker/go/Dockerfile&lt;/code&gt; that all the catalog
functions use. It accepts &lt;code&gt;BUILDER_IMAGE&lt;/code&gt; and &lt;code&gt;BASE_IMAGE&lt;/code&gt; as build args.&lt;/p&gt;
&lt;p&gt;For standalone functions or local development, use a multi-stage build with a
minimal base image. The function binary should be statically linked (no CGO), so
it can run on &lt;code&gt;scratch&lt;/code&gt; or &lt;code&gt;distroless&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Interfaces</title><link>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/interfaces/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/interfaces/</guid><description>&lt;p&gt;The SDK provides two interfaces for implementing KRM functions. Choose according
to your function requirements.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; functions below call &lt;code&gt;fn.AsMain&lt;/code&gt; without &lt;code&gt;fn.WithDocs&lt;/code&gt; to keep the
interface examples focused. Production functions should embed documentation and
pass &lt;code&gt;fn.WithDocs(readme, metadata)&lt;/code&gt; — see the

&lt;a href="https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/tutorial/"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="fnrunner"&gt;
 fn.Runner
 &lt;a href="#fnrunner" class="anchor-link"&gt;#&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Use &lt;code&gt;fn.Runner&lt;/code&gt; for &lt;strong&gt;transformers&lt;/strong&gt; (mutators) and &lt;strong&gt;validators&lt;/strong&gt;. This is the
recommended interface for most functions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Runner&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;interface&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Run&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;Context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;functionConfig&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;KubeObject&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;items&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;KubeObjects&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;results&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;Results&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;bool&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Characteristics:&lt;/p&gt;</description></item><item><title>Testing</title><link>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/testing/</guid><description>&lt;p&gt;The SDK provides a golden test framework in &lt;code&gt;fn/testhelpers&lt;/code&gt; for snapshot-based
testing of KRM functions.&lt;/p&gt;
&lt;h2 id="golden-test-pattern"&gt;
 Golden Test Pattern
 &lt;a href="#golden-test-pattern" class="anchor-link"&gt;#&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Golden tests compare the function output against the expected baseline files. This
approach catches regressions and makes it easy to review output changes.&lt;/p&gt;
&lt;h3 id="directory-structure"&gt;
 Directory Structure
 &lt;a href="#directory-structure" class="anchor-link"&gt;#&lt;/a&gt;
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;testdata/
├── test-case-1/
│ ├── _expected.yaml # Expected output (full ResourceList YAML)
│ ├── _fnconfig.yaml # FunctionConfig for this test case
│ └── resources.yaml # Input KRM resources
└── test-case-2/
 ├── _expected.yaml
 ├── _fnconfig.yaml
 └── resources.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Conventions:&lt;/p&gt;</description></item><item><title>Tutorial</title><link>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/tutorial/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-4726--kptdocs.netlify.app/guides/krm-functions/tutorial/</guid><description>&lt;p&gt;This tutorial walks through the end-to-end workflow for building a KRM function
using the Go SDK. By the end, you will have a working function with embedded
documentation, golden tests, and support for &lt;code&gt;--help&lt;/code&gt;, &lt;code&gt;--doc&lt;/code&gt;, and standalone
file mode.&lt;/p&gt;
&lt;p&gt;For a complete working example, see 
&lt;a href="https://github.com/kptdev/krm-functions-sdk/tree/main/go/get-started" target="_blank"&gt;&lt;code&gt;go/get-started/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="1-create-your-function"&gt;
 1. Create Your Function
 &lt;a href="#1-create-your-function" class="anchor-link"&gt;#&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;A KRM function implements the &lt;code&gt;fn.Runner&lt;/code&gt; interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Runner&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;interface&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;Run&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;Context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;functionConfig&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;KubeObject&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;items&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;KubeObjects&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;results&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;*&lt;/span&gt;&lt;span style="color:#000"&gt;Results&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;bool&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is a minimal function that sets labels on all the resources:&lt;/p&gt;</description></item></channel></rss>