<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lifecycle on Deevnet Infrastructure Platform</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/</link><description>Recent content in Lifecycle on Deevnet Infrastructure Platform</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/index.xml" rel="self" type="application/rss+xml"/><item><title>Patching</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/patching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/patching/</guid><description>&lt;h1 id="patching">
 Patching
 &lt;a class="anchor" href="#patching">#&lt;/a>
&lt;/h1>
&lt;p>Day 2 maintenance and security updates for substrate hosts.&lt;/p>
&lt;hr>
&lt;h2 id="status-planned">
 Status: Planned
 &lt;a class="anchor" href="#status-planned">#&lt;/a>
&lt;/h2>
&lt;p>This section will document:&lt;/p>
&lt;ul>
&lt;li>Online patching (hosts with internet access)&lt;/li>
&lt;li>Offline patching (air-gapped site)&lt;/li>
&lt;li>Local dnf mirror setup for full air-gap&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="decision-required">
 Decision Required
 &lt;a class="anchor" href="#decision-required">#&lt;/a>
&lt;/h2>
&lt;p>Post-install updates currently require internet access. Options:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Option&lt;/th>
 &lt;th>Pros&lt;/th>
 &lt;th>Cons&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Accept internet required&lt;/td>
 &lt;td>Simple, no extra storage&lt;/td>
 &lt;td>Not true air-gap&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Full local dnf mirror&lt;/td>
 &lt;td>True air-gap&lt;/td>
 &lt;td>~200GB per Fedora release&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hybrid (security only)&lt;/td>
 &lt;td>Balanced&lt;/td>
 &lt;td>Complex to maintain&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="current-state">
 Current State
 &lt;a class="anchor" href="#current-state">#&lt;/a>
&lt;/h2>
&lt;p>Install-time packages come from ISO/cdrom (air-gap ready).&lt;/p></description></item><item><title>Inventory Lifecycle</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/inventory-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/inventory-lifecycle/</guid><description>&lt;h1 id="inventory--lifecycle-management">
 Inventory &amp;amp; Lifecycle Management
 &lt;a class="anchor" href="#inventory--lifecycle-management">#&lt;/a>
&lt;/h1>
&lt;p>Documents how &lt;strong>infrastructure assets are tracked, managed, and retired&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="scope">
 Scope
 &lt;a class="anchor" href="#scope">#&lt;/a>
&lt;/h2>
&lt;p>This section includes:&lt;/p>
&lt;ul>
&lt;li>Host identity and inventory sources of truth&lt;/li>
&lt;li>Hardware lifecycle stages (active, standby, retired)&lt;/li>
&lt;li>Image and configuration lifecycle expectations&lt;/li>
&lt;li>Decommissioning and cleanup principles&lt;/li>
&lt;/ul>
&lt;p>This section ensures infrastructure ages intentionally, not accidentally.&lt;/p>
&lt;hr>
&lt;h2 id="lifecycle-stages">
 Lifecycle Stages
 &lt;a class="anchor" href="#lifecycle-stages">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Stage&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Provisioning&lt;/strong>&lt;/td>
 &lt;td>Host being set up, not yet in service&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Active&lt;/strong>&lt;/td>
 &lt;td>In production use&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Standby&lt;/strong>&lt;/td>
 &lt;td>Available but not currently assigned&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Maintenance&lt;/strong>&lt;/td>
 &lt;td>Temporarily offline for updates/repairs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Retired&lt;/strong>&lt;/td>
 &lt;td>Decommissioned, removed from inventory&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="inventory-sources-of-truth">
 Inventory Sources of Truth
 &lt;a class="anchor" href="#inventory-sources-of-truth">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>ansible-inventory-deevnet&lt;/strong> - Canonical host identity&lt;/li>
&lt;li>&lt;strong>OPNsense&lt;/strong> - Authoritative DNS/DHCP (production)&lt;/li>
&lt;li>&lt;strong>Bootstrap node&lt;/strong> - Authoritative DNS/DHCP (during provisioning)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="decommissioning">
 Decommissioning
 &lt;a class="anchor" href="#decommissioning">#&lt;/a>
&lt;/h2>
&lt;p>When retiring a host:&lt;/p></description></item><item><title>Omada Controller Upgrade</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/omada-controller-upgrade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/lifecycle/omada-controller-upgrade/</guid><description>&lt;h1 id="omada-controller-upgrade">
 Omada Controller Upgrade
 &lt;a class="anchor" href="#omada-controller-upgrade">#&lt;/a>
&lt;/h1>
&lt;p>How the Omada controller on the builder is upgraded to a new version in place, keeping its
data. Each upgrade is a change: open a 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/change-management/change-record-template/">change record&lt;/a>
of type &lt;strong>Upgrade&lt;/strong>. Its steps are the ones below.&lt;/p>
&lt;p>If an upgrade goes wrong, or the controller&amp;rsquo;s data is damaged, see

 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/recovery/omada-controller-recovery/">Omada Controller Recovery&lt;/a>.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Runs as&lt;/td>
 &lt;td>&lt;code>mbentley/omada-controller&lt;/code> under podman, &lt;code>omada-controller.service&lt;/code>, on &lt;code>dv00bld001p01&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Data&lt;/td>
 &lt;td>&lt;code>/opt/omada-controller&lt;/code> (&lt;code>data&lt;/code>, &lt;code>work&lt;/code>, &lt;code>logs&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Snapshots&lt;/td>
 &lt;td>&lt;code>/opt/omada-controller-backup/&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Images&lt;/td>
 &lt;td>Tarballs on the artifact server, declared in &lt;code>artifacts_podman_images&lt;/code> (&lt;code>group_vars/artifact_servers.yml&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Version pin&lt;/td>
 &lt;td>&lt;code>omada_image_tag&lt;/code> in &lt;code>group_vars/network_controllers/vars.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote class="book-hint danger">
 
**An upgrade is one-way.** The first start on a new version upgrades the database, and an
older controller cannot open it afterwards. The only way back is the snapshot taken in
[step 2](#2-record-stop-snapshot), so that step is not optional.

Do **not** use `playbooks/upgrade-omada.yml` in the builder collection. It hard-codes a fresh
install and deletes the data directories.

&lt;/blockquote>

&lt;hr>
&lt;h2 id="choosing-the-version">
 Choosing the version
 &lt;a class="anchor" href="#choosing-the-version">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Pin the build, not a tag family.&lt;/strong> Use the exact version tag (for example &lt;code>6.3.0.45&lt;/code>), not
&lt;code>6.3&lt;/code> and never &lt;code>latest&lt;/code>, so a rebuild restores what was verified.&lt;/li>
&lt;li>&lt;strong>Check what the devices need.&lt;/strong> Switch and AP release notes name a recommended controller
version. Read them before choosing a target.&lt;/li>
&lt;li>&lt;strong>A controller major version can bring a MongoDB major upgrade.&lt;/strong> Controller 5 to 6 did, and
the image documents a separate migration for it. This procedure covers upgrades within a
MongoDB major version only. Compare &lt;code>mongod --version&lt;/code> in the old and new images first.&lt;/li>
&lt;li>&lt;strong>A new release is a risk of its own.&lt;/strong> When the target is only days old, stage the
previous mature release as a fallback as well, so the way back does not have to be fetched
on the day.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="1-stage-the-image">
 1. Stage the image
 &lt;a class="anchor" href="#1-stage-the-image">#&lt;/a>
&lt;/h2>
&lt;p>Declare the image in &lt;code>artifacts_podman_images&lt;/code> and pull it while the controller is still
running, so the outage covers only the swap:&lt;/p></description></item></channel></rss>