<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Get Started on Crossplane</title><link>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/</link><description>Recent content in Get Started on Crossplane</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/index.xml" rel="self" type="application/rss+xml"/><item><title>Install Crossplane</title><link>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/install/</link><pubDate/><guid>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/install/</guid><description>&lt;p>Crossplane installs into an existing Kubernetes cluster, creating the
Crossplane pod.&lt;/p>
&lt;p>Installing Crossplane enables the installation of Crossplane &lt;em>Provider&lt;/em>,
&lt;em>Function&lt;/em>, and &lt;em>Configuration&lt;/em> resources.&lt;/p>
&lt;div class="admonition tip d-flex flex-column mx-4 p-0">
&lt;div class="admonition-title">
&lt;svg class="bi flex-shrink-0" role="img" aria-label="tip:">&lt;use
xlink:href="#check"/>&lt;/svg>
&lt;span class="ps-1">Tip&lt;/span>
&lt;/div>
&lt;div class="admonition-content">
If you don&amp;rsquo;t have a Kubernetes cluster create one locally with &lt;a href="https://kind.sigs.k8s.io/">Kind&lt;/a>.
&lt;/div>
&lt;/div>
&lt;h2 id="prerequisites">Prerequisites &lt;a class="anchor-link" id="prerequisites" href="#prerequisites" aria-label="Link to this section: Prerequisites">&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>An actively &lt;a href="https://kubernetes.io/releases/patch-releases/#support-period">supported Kubernetes version&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://helm.sh/docs/intro/install/">Helm&lt;/a> version &lt;code>v3.2.0&lt;/code> or later&lt;/li>
&lt;/ul>
&lt;!-- vale Google.Headings = NO -->
&lt;!-- vale Microsoft.Headings = NO -->
&lt;h2 id="install-crossplane">Install Crossplane &lt;a class="anchor-link" id="install-crossplane" href="#install-crossplane" aria-label="Link to this section: Install Crossplane">&lt;/a>&lt;/h2>
&lt;!-- vale Google.Headings = YES -->
&lt;!-- vale Microsoft.Headings = YES -->
&lt;p>Install Crossplane using the &lt;em>Helm chart&lt;/em>.&lt;/p></description></item><item><title>Get Started With Composition</title><link>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-composition/</link><pubDate/><guid>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-composition/</guid><description>&lt;p>This guide shows how to create a new kind of custom resource named &lt;code>App&lt;/code>. When a
user calls the custom resource API to create an &lt;code>App&lt;/code>, Crossplane creates a
&lt;code>Deployment&lt;/code> and a &lt;code>Service&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Crossplane calls this &lt;em>composition&lt;/em>.&lt;/strong> The &lt;code>App&lt;/code> is &lt;em>composed of&lt;/em> the
&lt;code>Deployment&lt;/code> and the &lt;code>Service&lt;/code>.&lt;/p>
&lt;div class="admonition tip d-flex flex-column mx-4 p-0">
&lt;div class="admonition-title">
&lt;svg class="bi flex-shrink-0" role="img" aria-label="tip:">&lt;use
xlink:href="#check"/>&lt;/svg>
&lt;span class="ps-1">Tip&lt;/span>
&lt;/div>
&lt;div class="admonition-content">
The guide shows how to configure composition using YAML, YAML+CEL, templated
YAML, Python, and KCL. You can pick your preferred language.
&lt;/div>
&lt;/div>
&lt;p>An &lt;code>App&lt;/code> custom resource looks like this:&lt;/p></description></item><item><title>Get Started With Managed Resources</title><link>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-managed-resources/</link><pubDate/><guid>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-managed-resources/</guid><description>&lt;p>This guide shows how to install and use a new kind of custom resource called
&lt;code>Bucket&lt;/code>. When a user calls the custom resource API to create a &lt;code>Bucket&lt;/code>,
Crossplane creates a bucket in AWS S3.&lt;/p>
&lt;p>&lt;strong>Crossplane calls this a &lt;em>managed resource&lt;/em>&lt;/strong>. A managed resource is a
ready-made custom resource that manages something outside of the control plane.&lt;/p>
&lt;p>A &lt;code>Bucket&lt;/code> managed resource looks like this:&lt;/p>
&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="ln" id="hl-0-1">&lt;a class="lnlinks" href="#hl-0-1">1&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">s3.aws.m.upbound.io/v1beta1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-2">&lt;a class="lnlinks" href="#hl-0-2">2&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Bucket&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-3">&lt;a class="lnlinks" href="#hl-0-3">3&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&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="ln" id="hl-0-4">&lt;a class="lnlinks" href="#hl-0-4">4&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-5">&lt;a class="lnlinks" href="#hl-0-5">5&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">crossplane-bucket-example&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-6">&lt;a class="lnlinks" href="#hl-0-6">6&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&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="ln" id="hl-0-7">&lt;a class="lnlinks" href="#hl-0-7">7&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">forProvider&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="ln" id="hl-0-8">&lt;a class="lnlinks" href="#hl-0-8">8&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">us-east-2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="admonition note d-flex flex-column mx-4 p-0">
&lt;div class="admonition-title">
&lt;svg class="bi flex-shrink-0" role="img" aria-label="note:">&lt;use
xlink:href="#info"/>&lt;/svg>
&lt;span class="ps-1">Note&lt;/span>
&lt;/div>
&lt;div class="admonition-content">
Kubernetes calls third party API resources &lt;em>custom resources&lt;/em>.
&lt;/div>
&lt;/div>
&lt;h2 id="prerequisites">Prerequisites &lt;a class="anchor-link" id="prerequisites" href="#prerequisites" aria-label="Link to this section: Prerequisites">&lt;/a>&lt;/h2>
&lt;p>This guide requires:&lt;/p></description></item><item><title>Get Started With Operations</title><link>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-operations/</link><pubDate/><guid>https://deploy-preview-1077--crossplane.netlify.app/latest/get-started/get-started-with-operations/</guid><description>&lt;p>This guide shows how to use Crossplane Operations to automate day-two
operational tasks. You create an &lt;code>Operation&lt;/code> that checks SSL certificate
expiry for a website.&lt;/p>
&lt;p>&lt;strong>Crossplane calls this &lt;em>Operations&lt;/em>.&lt;/strong> Operations run function pipelines to
perform tasks that don&amp;rsquo;t fit the typical resource creation pattern - like
certificate monitoring, rolling upgrades, or scheduled maintenance.&lt;/p>
&lt;p>An &lt;code>Operation&lt;/code> looks like this:&lt;/p>
&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="ln" id="hl-0-1">&lt;a class="lnlinks" href="#hl-0-1"> 1&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ops.crossplane.io/v1alpha1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-2">&lt;a class="lnlinks" href="#hl-0-2"> 2&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Operation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-3">&lt;a class="lnlinks" href="#hl-0-3"> 3&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&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="ln" id="hl-0-4">&lt;a class="lnlinks" href="#hl-0-4"> 4&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">check-cert-expiry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-5">&lt;a class="lnlinks" href="#hl-0-5"> 5&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&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="ln" id="hl-0-6">&lt;a class="lnlinks" href="#hl-0-6"> 6&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Pipeline&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-7">&lt;a class="lnlinks" href="#hl-0-7"> 7&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pipeline&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="ln" id="hl-0-8">&lt;a class="lnlinks" href="#hl-0-8"> 8&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">step&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">check-certificate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-9">&lt;a class="lnlinks" href="#hl-0-9"> 9&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">functionRef&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="ln" id="hl-0-10">&lt;a class="lnlinks" href="#hl-0-10">10&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">crossplane-contrib-function-python&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-11">&lt;a class="lnlinks" href="#hl-0-11">11&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">input&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="ln" id="hl-0-12">&lt;a class="lnlinks" href="#hl-0-12">12&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">python.fn.crossplane.io/v1beta1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-13">&lt;a class="lnlinks" href="#hl-0-13">13&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Script&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-14">&lt;a class="lnlinks" href="#hl-0-14">14&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-15">&lt;a class="lnlinks" href="#hl-0-15">15&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> import ssl
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-16">&lt;a class="lnlinks" href="#hl-0-16">16&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> import socket
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-17">&lt;a class="lnlinks" href="#hl-0-17">17&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> from datetime import datetime
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-18">&lt;a class="lnlinks" href="#hl-0-18">18&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-19">&lt;a class="lnlinks" href="#hl-0-19">19&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> from crossplane.function import request, response
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-20">&lt;a class="lnlinks" href="#hl-0-20">20&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-21">&lt;a class="lnlinks" href="#hl-0-21">21&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> def operate(req, rsp):
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-22">&lt;a class="lnlinks" href="#hl-0-22">22&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> hostname = &amp;#34;google.com&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-23">&lt;a class="lnlinks" href="#hl-0-23">23&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> port = 443
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-24">&lt;a class="lnlinks" href="#hl-0-24">24&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-25">&lt;a class="lnlinks" href="#hl-0-25">25&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> # Get SSL certificate info
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-26">&lt;a class="lnlinks" href="#hl-0-26">26&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> context = ssl.create_default_context()
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-27">&lt;a class="lnlinks" href="#hl-0-27">27&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> with socket.create_connection((hostname, port)) as sock:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-28">&lt;a class="lnlinks" href="#hl-0-28">28&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> with context.wrap_socket(sock, server_hostname=hostname) as ssock:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-29">&lt;a class="lnlinks" href="#hl-0-29">29&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> cert = ssock.getpeercert()
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-30">&lt;a class="lnlinks" href="#hl-0-30">30&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-31">&lt;a class="lnlinks" href="#hl-0-31">31&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> # Parse expiration date
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-32">&lt;a class="lnlinks" href="#hl-0-32">32&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> expiry_date = datetime.strptime(cert[&amp;#39;notAfter&amp;#39;], &amp;#39;%b %d %H:%M:%S %Y %Z&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-33">&lt;a class="lnlinks" href="#hl-0-33">33&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> days_until_expiry = (expiry_date - datetime.now()).days
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-34">&lt;a class="lnlinks" href="#hl-0-34">34&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-35">&lt;a class="lnlinks" href="#hl-0-35">35&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> # Return results in operation output
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-36">&lt;a class="lnlinks" href="#hl-0-36">36&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> response.set_output(rsp, {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-37">&lt;a class="lnlinks" href="#hl-0-37">37&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> &amp;#34;hostname&amp;#34;: hostname,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-38">&lt;a class="lnlinks" href="#hl-0-38">38&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> &amp;#34;certificateExpires&amp;#34;: cert[&amp;#39;notAfter&amp;#39;],
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-39">&lt;a class="lnlinks" href="#hl-0-39">39&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> &amp;#34;daysUntilExpiry&amp;#34;: days_until_expiry,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-40">&lt;a class="lnlinks" href="#hl-0-40">40&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> &amp;#34;status&amp;#34;: &amp;#34;warning&amp;#34; if days_until_expiry &amp;lt; 30 else &amp;#34;ok&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln" id="hl-0-41">&lt;a class="lnlinks" href="#hl-0-41">41&lt;/a>&lt;/span>&lt;span class="cl">&lt;span class="sd"> })&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- vale Crossplane.Spelling = NO -->
&lt;p>&lt;strong>The &lt;code>Operation&lt;/code> runs once to completion, like a Kubernetes &lt;code>Job&lt;/code>.&lt;/strong>&lt;/p></description></item></channel></rss>