<?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 IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/lifecycle/</link><description>Recent content in Lifecycle on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/lifecycle/index.xml" rel="self" type="application/rss+xml"/><item><title>Patching</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/lifecycle/patching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/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/substrate/lifecycle/inventory-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/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/substrate/lifecycle/omada-controller-upgrade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/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/policies/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/substrate/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">
 &lt;p>&lt;strong>An upgrade is one-way.&lt;/strong> 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

 &lt;a href="#2-record-stop-snapshot">step 2&lt;/a>, so that step is not optional.&lt;/p></description></item></channel></rss>