<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Substrate Operations on Deevnet IoTaaS</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/</link><description>Recent content in Substrate Operations on Deevnet IoTaaS</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/index.xml" rel="self" type="application/rss+xml"/><item><title>Tenant Admission</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/tenant-admission/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/substrate/tenant-admission/</guid><description>&lt;h1 id="tenant-admission">
 Tenant Admission
 &lt;a class="anchor" href="#tenant-admission">#&lt;/a>
&lt;/h1>
&lt;p>The operator&amp;rsquo;s half of creating a tenant. The operator &lt;strong>admits a name&lt;/strong>; the tenant then declares
everything else itself, through the Deevnet API
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/architecture/decisions/0015-tenant-onboarding-through-api/">ADR-0015&lt;/a>). The tenant&amp;rsquo;s half
is 
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/tenant/">Tenant Operations&lt;/a>.&lt;/p>
&lt;p>Admission is the only substrate act a new tenant needs. The operator never edits an inventory file
to make a tenant, and the tenant never holds a Proxmox credential, a vault password or an index.&lt;/p>
&lt;hr>
&lt;h2 id="before-you-start">
 Before you start
 &lt;a class="anchor" href="#before-you-start">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>The API&lt;/td>
 &lt;td>&lt;code>https://api.mobile.deevnet.net:8080&lt;/code>, reachable from the Builder&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>The operator token&lt;/td>
 &lt;td>&lt;code>vault_deevnet_api_token&lt;/code>, in the inventory&amp;rsquo;s &lt;code>deevnet_api&lt;/code> group vault&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>The site CA&lt;/td>
 &lt;td>&lt;code>ansible-collection-deevnet.mgmt/.openbao/site-ca.pem&lt;/code> on the control node&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>The provider&lt;/td>
 &lt;td>the tenant installs &lt;code>deevnet/deevnet&lt;/code> 0.4.x itself with &lt;code>install-provider.sh&lt;/code> from the tenant downloads (
 &lt;a href="https://deevnet.github.io/deevnet-docs/deevnet-docs/docs/runbook/tenant/getting-started/before-you-start/#getting-the-provider">Before You Start&lt;/a>). No role installs it. Before a meetup, check the downloads tree is current: the provider repo&amp;rsquo;s &lt;code>make stage&lt;/code>, the image factory&amp;rsquo;s &lt;code>make pi-backend-publish&lt;/code>, then &lt;code>deevnet.mgmt site.yml --tags tenant-downloads&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="1-admit-the-name">
 1. Admit the name
 &lt;a class="anchor" href="#1-admit-the-name">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -sS --cacert site-ca.pem &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -H &lt;span style="color:#e6db74">&amp;#34;Authorization: Bearer &lt;/span>$OPERATOR_TOKEN&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -H &lt;span style="color:#e6db74">&amp;#39;Content-Type: application/json&amp;#39;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -d &lt;span style="color:#e6db74">&amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;mabell&amp;#34;}&amp;#39;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> https://api.mobile.deevnet.net:8080/v1/admissions
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{ &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;mabell&amp;#34;&lt;/span>, &lt;span style="color:#f92672">&amp;#34;enrollment_token&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;s.…&amp;#34;&lt;/span>, &lt;span style="color:#f92672">&amp;#34;expires_at&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2026-09-26T…Z&amp;#34;&lt;/span> }
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>The name&lt;/td>
 &lt;td>&lt;code>^[a-z][a-z0-9]{0,7}$&lt;/code> — it becomes a PVE SDN zone ID, a DNS label and a state-store user&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>The token&lt;/td>
 &lt;td>single-use, expires after &lt;code>DEEVNET_ENROLLMENT_TTL&lt;/code> (72h by default)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>A name already registered&lt;/td>
 &lt;td>answers &lt;code>409&lt;/code>. Admission creates nothing; it only authorizes&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="2-hand-over-three-things">
 2. Hand over three things
 &lt;a class="anchor" href="#2-hand-over-three-things">#&lt;/a>
&lt;/h2>
&lt;p>The tenant needs exactly these, and nothing else from the substrate:&lt;/p></description></item></channel></rss>