<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deevnet Terraform Provider</title><link>https://deevnet.github.io/terraform-provider-deevnet/</link><description>Recent content on Deevnet Terraform Provider</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/terraform-provider-deevnet/index.xml" rel="self" type="application/rss+xml"/><item><title>Install</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/install/</guid><description>&lt;h1 id="install-the-provider">
 Install the provider
 &lt;a class="anchor" href="#install-the-provider">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>The provider is not in the public Terraform Registry.&lt;/strong> It goes into Terraform&amp;rsquo;s implicit
local mirror, and &lt;code>terraform init&lt;/code> finds it there:&lt;/p>
&lt;pre tabindex="0">&lt;code>~/.terraform.d/plugins/registry.terraform.io/deevnet/deevnet/&amp;lt;version&amp;gt;/&amp;lt;os&amp;gt;_&amp;lt;arch&amp;gt;/
&lt;/code>&lt;/pre>&lt;p>The source address is &lt;code>deevnet/deevnet&lt;/code> all the same, so a tenant&amp;rsquo;s &lt;code>required_providers&lt;/code>
block reads as it would for a registry provider.&lt;/p>
&lt;h2 id="at-a-deevnet-site">
 At a Deevnet site
 &lt;a class="anchor" href="#at-a-deevnet-site">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>On the tenant developer network, the site&amp;rsquo;s download server is the fastest route.&lt;/strong> It also
installs the &lt;code>grafana&lt;/code> provider, for dashboards as code.&lt;/p></description></item><item><title>Provider</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/provider/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/provider/</guid><description>&lt;h1 id="deevnet-provider">
 deevnet Provider
 &lt;a class="anchor" href="#deevnet-provider">#&lt;/a>
&lt;/h1>
&lt;p>Builds tenants through the Deevnet API: their network, workloads and published names.&lt;/p>
&lt;p>A tenant holds one credential, its Deevnet token, and no substrate credential. The

 &lt;a href="https://deevnet.github.io/terraform-provider-deevnet/terraform-provider-deevnet/docs/guides/install/">Install&lt;/a> guide puts the provider where &lt;code>terraform init&lt;/code> finds it.&lt;/p>
&lt;h2 id="example-usage">
 Example Usage
 &lt;a class="anchor" href="#example-usage">#&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-terraform" data-lang="terraform">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">terraform&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">required_providers&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">deevnet&lt;/span> = {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">source&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;deevnet/deevnet&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">version&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;~&amp;gt; 0.6&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Every argument falls back to an environment variable, so the block is
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># usually empty and nothing about the site is written into the code.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">provider&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deevnet&amp;#34;&lt;/span> {&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # endpoint = DEEVNET_API_ENDPOINT
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # token = DEEVNET_API_TOKEN
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # ca_certificate = DEEVNET_API_CACERT
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- schema generated by tfplugindocs -->
&lt;h2 id="schema">
 Schema
 &lt;a class="anchor" href="#schema">#&lt;/a>
&lt;/h2>
&lt;h3 id="optional">
 Optional
 &lt;a class="anchor" href="#optional">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>ca_certificate&lt;/code> (String) Path to the site CA certificate the API&amp;rsquo;s TLS certificate comes from. Defaults to &lt;code>DEEVNET_API_CACERT&lt;/code>; empty uses the system trust store.&lt;/li>
&lt;li>&lt;code>endpoint&lt;/code> (String) The API&amp;rsquo;s base URL, e.g. &lt;code>https://api.mobile.deevnet.net&lt;/code>. Defaults to &lt;code>DEEVNET_API_ENDPOINT&lt;/code>.&lt;/li>
&lt;li>&lt;code>token&lt;/code> (String, Sensitive) The bearer token: the tenant&amp;rsquo;s own token, or the single-use enrollment token it was admitted with. Defaults to &lt;code>DEEVNET_API_TOKEN&lt;/code>.&lt;/li>
&lt;/ul></description></item><item><title>What a Tenant Holds</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/tenant-credential/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/tenant-credential/</guid><description>&lt;h1 id="what-a-tenant-holds">
 What a tenant holds
 &lt;a class="anchor" href="#what-a-tenant-holds">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>A tenant holds one credential: its Deevnet token.&lt;/strong> Nothing else about the substrate
reaches the tenant: no hypervisor credential, no vault access.&lt;/p>
&lt;h2 id="enrollment">
 Enrollment
 &lt;a class="anchor" href="#enrollment">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>The first apply trades a single-use enrollment token for the tenant&amp;rsquo;s own token.&lt;/strong> The
substrate admits a tenant name and issues the enrollment token, delivered encrypted into the
tenant&amp;rsquo;s repository. The first &lt;code>terraform apply&lt;/code> spends it and receives the tenant&amp;rsquo;s own
token, which every later call uses
(
 &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/decisions/tenant-model/0015-tenant-onboarding-through-api/">ADR-0015&lt;/a>).&lt;/p></description></item><item><title>Restore Instead of Recreate</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/guides/restore/</guid><description>&lt;h1 id="restore-instead-of-recreate">
 Restore instead of recreate
 &lt;a class="anchor" href="#restore-instead-of-recreate">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>When the API no longer holds an object, the provider restores it from state instead of
creating a new one.&lt;/strong> The usual advice for a remote object that is gone is to drop it from
state and let the next plan create another. For the resources that carry secrets or addressing
that would be a loss: a new tenant would mean new keys, and a new workload would mean a new
address.&lt;/p></description></item><item><title>Release Notes</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/release-notes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/release-notes/</guid><description>&lt;h1 id="release-notes">
 Release Notes
 &lt;a class="anchor" href="#release-notes">#&lt;/a>
&lt;/h1>
&lt;p>Every release of the &lt;code>deevnet/deevnet&lt;/code> provider, newest first. Versions are
&lt;code>MAJOR.MINOR.PATCH&lt;/code>; until 1.0 a minor release may change behavior, and the notes say so
under &lt;strong>Upgrading&lt;/strong>.&lt;/p>
&lt;p>A resource needs an API that serves it. Each release names the

 &lt;a href="https://deevnet.github.io/deevnet-provisioning-api/docs/release-notes/">Deevnet API&lt;/a> version its
new resources and attributes need.&lt;/p>
&lt;h2 id="070-2026-10-11">
 0.7.0 (2026-10-11)
 &lt;a class="anchor" href="#070-2026-10-11">#&lt;/a>
&lt;/h2>
&lt;p>Needs API v0.11.0 for &lt;code>deevnet_certificate&lt;/code>.&lt;/p>
&lt;h3 id="added">
 Added
 &lt;a class="anchor" href="#added">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>deevnet_certificate&lt;/code>&lt;/strong>: a server certificate for one of the tenant&amp;rsquo;s own services, for a name
in the tenant&amp;rsquo;s own zone, signed by the site&amp;rsquo;s Tenant Service CA (ADR-0037). You make the key,
with the &lt;code>tls&lt;/code> provider, and it never goes to the API; this resource takes a signing request.
It chains to the Deevnet Root CA. Once fewer than sixty days remain, a plan shows the resource
changing and the apply renews it.&lt;/li>
&lt;li>A documentation site, 
 &lt;a href="https://deevnet.github.io/terraform-provider-deevnet/">https://deevnet.github.io/terraform-provider-deevnet/&lt;/a>. The resource
reference is generated from the schemas, and CI fails when it is stale.&lt;/li>
&lt;li>A description on every attribute. The &lt;code>tenant&lt;/code> argument had none on five resources.&lt;/li>
&lt;li>An example for the provider block and for each resource, under &lt;code>examples/&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading">
 Upgrading
 &lt;a class="anchor" href="#upgrading">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>A certificate expires after a year and nothing renews it but an apply. A tenant that holds one
should plan at least every ten months; the plan shows the renewal when it is due.&lt;/li>
&lt;li>&lt;code>deevnet_certificate&lt;/code> needs the &lt;code>hashicorp/tls&lt;/code> provider beside this one, for the key and the
signing request.&lt;/li>
&lt;/ul>
&lt;h2 id="060-2026-10-06">
 0.6.0 (2026-10-06)
 &lt;a class="anchor" href="#060-2026-10-06">#&lt;/a>
&lt;/h2>
&lt;p>Needs API v0.10.0 for &lt;code>deevnet_iot_address&lt;/code>.&lt;/p></description></item><item><title>deevnet_certificate</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/certificate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/certificate/</guid><description>&lt;h1 id="deevnet_certificate-resource">
 deevnet_certificate (Resource)
 &lt;a class="anchor" href="#deevnet_certificate-resource">#&lt;/a>
&lt;/h1>
&lt;p>A server certificate for one of the tenant&amp;rsquo;s own services, for a name in the tenant&amp;rsquo;s own zone, signed by the site&amp;rsquo;s Tenant Service CA. It chains to the Deevnet Root CA, which every client on a site already trusts.&lt;/p>
&lt;p>&lt;strong>You make the key and keep it.&lt;/strong> This resource takes a signing request, not a key: make both with the &lt;code>tls&lt;/code> provider (&lt;code>tls_private_key&lt;/code>, &lt;code>tls_cert_request&lt;/code>). The key stays in your state and on your workload, and never goes to the API.&lt;/p></description></item><item><title>deevnet_dns_record</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/dns_record/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/dns_record/</guid><description>&lt;h1 id="deevnet_dns_record-resource">
 deevnet_dns_record (Resource)
 &lt;a class="anchor" href="#deevnet_dns_record-resource">#&lt;/a>
&lt;/h1>
&lt;p>A name in the tenant&amp;rsquo;s zone, with its PTR.&lt;/p>
&lt;h2 id="example-usage">
 Example Usage
 &lt;a class="anchor" href="#example-usage">#&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-terraform" data-lang="terraform">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># A second name for a workload, with its PTR.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">resource&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deevnet_dns_record&amp;#34;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;api&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tenant&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;api&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">address&lt;/span> = &lt;span style="color:#a6e22e">deevnet_workload&lt;/span>.&lt;span style="color:#a6e22e">web&lt;/span>.&lt;span style="color:#a6e22e">address&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- schema generated by tfplugindocs -->
&lt;h2 id="schema">
 Schema
 &lt;a class="anchor" href="#schema">#&lt;/a>
&lt;/h2>
&lt;h3 id="required">
 Required
 &lt;a class="anchor" href="#required">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>address&lt;/code> (String) An address in the tenant&amp;rsquo;s own subnet.&lt;/li>
&lt;li>&lt;code>name&lt;/code> (String) A DNS label under the tenant&amp;rsquo;s zone.&lt;/li>
&lt;li>&lt;code>tenant&lt;/code> (String) The tenant this record belongs to: the &lt;code>name&lt;/code> of a &lt;code>deevnet_tenant&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="read-only">
 Read-Only
 &lt;a class="anchor" href="#read-only">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>fqdn&lt;/code> (String) The published name.&lt;/li>
&lt;li>&lt;code>present&lt;/code> (Boolean) Whether the API still holds this name.&lt;/li>
&lt;/ul></description></item><item><title>deevnet_iot_address</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_address/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_address/</guid><description>&lt;h1 id="deevnet_iot_address-resource">
 deevnet_iot_address (Resource)
 &lt;a class="anchor" href="#deevnet_iot_address-resource">#&lt;/a>
&lt;/h1>
&lt;p>A fixed address for a registered device on its trust class&amp;rsquo;s network.&lt;/p>
&lt;p>The device gets the same address every time it joins, and the API publishes &lt;code>&amp;lt;device&amp;gt;.&amp;lt;tenant zone&amp;gt;&lt;/code> for it. The device must be a &lt;code>deevnet_iot_device&lt;/code> with a &lt;code>mac&lt;/code>: the address is reserved for that MAC.&lt;/p>
&lt;p>The network is shared by every tenant, so the API picks the address: the lowest free one in the range set aside for tenants. This state remembers it, and a rebuilt API is asked for the same one again.&lt;/p></description></item><item><title>deevnet_iot_broker_account</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_broker_account/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_broker_account/</guid><description>&lt;h1 id="deevnet_iot_broker_account-resource">
 deevnet_iot_broker_account (Resource)
 &lt;a class="anchor" href="#deevnet_iot_broker_account-resource">#&lt;/a>
&lt;/h1>
&lt;p>An MQTT account on the platform broker, for one of the tenant&amp;rsquo;s devices or workloads.&lt;/p>
&lt;p>Configure the client with &lt;code>username&lt;/code> and &lt;code>password&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Replacing this resource issues a new password, and anything already holding the old one stops connecting.&lt;/strong> A rebuilt API does not do that: it restores the account from this state. Use &lt;code>-replace&lt;/code> only when you mean to revoke.&lt;/p>
&lt;h2 id="example-usage">
 Example Usage
 &lt;a class="anchor" href="#example-usage">#&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-terraform" data-lang="terraform">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">resource&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deevnet_iot_broker_account&amp;#34;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;stand&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tenant&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;stand-1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">device&lt;/span> = &lt;span style="color:#a6e22e">deevnet_iot_device&lt;/span>.&lt;span style="color:#a6e22e">stand&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # Relative to the tenant. The API writes the &amp;#34;tdemo/&amp;#34; prefix itself, which is
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # what confines a tenant to its own topics.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">publish&lt;/span> = [&lt;span style="color:#e6db74">&amp;#34;lightstand/+/telemetry&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">subscribe&lt;/span> = [&lt;span style="color:#e6db74">&amp;#34;lightstand/+/command&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">&amp;#34;broker&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">value&lt;/span> = {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">username&lt;/span> = &lt;span style="color:#a6e22e">deevnet_iot_broker_account&lt;/span>.&lt;span style="color:#a6e22e">stand&lt;/span>.&lt;span style="color:#a6e22e">username&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">password&lt;/span> = &lt;span style="color:#a6e22e">deevnet_iot_broker_account&lt;/span>.&lt;span style="color:#a6e22e">stand&lt;/span>.&lt;span style="color:#a6e22e">password&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # What the broker actually enforces, prefix and all.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">publish&lt;/span> = &lt;span style="color:#a6e22e">deevnet_iot_broker_account&lt;/span>.&lt;span style="color:#a6e22e">stand&lt;/span>.&lt;span style="color:#a6e22e">granted_publish&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">sensitive&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- schema generated by tfplugindocs -->
&lt;h2 id="schema">
 Schema
 &lt;a class="anchor" href="#schema">#&lt;/a>
&lt;/h2>
&lt;h3 id="required">
 Required
 &lt;a class="anchor" href="#required">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>name&lt;/code> (String) A label for the account, unique within the tenant.&lt;/li>
&lt;li>&lt;code>tenant&lt;/code> (String) The tenant this broker account belongs to: the &lt;code>name&lt;/code> of a &lt;code>deevnet_tenant&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="optional">
 Optional
 &lt;a class="anchor" href="#optional">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>device&lt;/code> (String) A device in the tenant&amp;rsquo;s registry, in trust class &lt;code>iot&lt;/code>. Omit for an account a tenant workload uses. &lt;code>iot_vendor&lt;/code> is refused: the standard forbids those devices reaching the broker at all, so the account could never be used.&lt;/li>
&lt;li>&lt;code>publish&lt;/code> (List of String) Topic patterns this account may publish to, &lt;strong>relative to the tenant&lt;/strong>: write &lt;code>lightstand/+/scene&lt;/code>, not &lt;code>eds/lightstand/+/scene&lt;/code>. The API writes the prefix, which is what confines a tenant to its own topics.&lt;/li>
&lt;/ul>
&lt;p>May be omitted for an account that only subscribes. Omitting both is an error: the account could do nothing.&lt;/p></description></item><item><title>deevnet_iot_device</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_device/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_device/</guid><description>&lt;h1 id="deevnet_iot_device-resource">
 deevnet_iot_device (Resource)
 &lt;a class="anchor" href="#deevnet_iot_device-resource">#&lt;/a>
&lt;/h1>
&lt;p>A device in the tenant&amp;rsquo;s registry.&lt;/p>
&lt;p>The entry &lt;strong>is&lt;/strong> the device&amp;rsquo;s identity: an application-owned device takes no substrate host record and is named in its owner&amp;rsquo;s own zone. It leases from its trust class&amp;rsquo;s pool unless a &lt;code>deevnet_iot_address&lt;/code> reserves it a fixed address.&lt;/p>
&lt;p>&lt;strong>Registering a device grants it nothing.&lt;/strong> It is identity, not authorization. Flash devices with a &lt;code>deevnet_iot_wifi_key&lt;/code> to put them on the air; that key is per tenant, and does not reference this resource.&lt;/p></description></item><item><title>deevnet_iot_wifi_key</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_wifi_key/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/iot_wifi_key/</guid><description>&lt;h1 id="deevnet_iot_wifi_key-resource">
 deevnet_iot_wifi_key (Resource)
 &lt;a class="anchor" href="#deevnet_iot_wifi_key-resource">#&lt;/a>
&lt;/h1>
&lt;p>A Wi-Fi key for the tenant&amp;rsquo;s IoT devices, bound to its trust class&amp;rsquo;s VLAN.&lt;/p>
&lt;p>Flash devices with &lt;code>ssid&lt;/code> and &lt;code>psk&lt;/code>. One key serves every device the tenant flashes with it.&lt;/p>
&lt;p>&lt;strong>Replacing this resource issues a new key, and every device already flashed with the old one stops associating until it is reflashed.&lt;/strong> A rebuilt API does not do that: it restores the key from this state. Use &lt;code>-replace&lt;/code> only when you mean to revoke.&lt;/p></description></item><item><title>deevnet_tenant</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/tenant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/tenant/</guid><description>&lt;h1 id="deevnet_tenant-resource">
 deevnet_tenant (Resource)
 &lt;a class="anchor" href="#deevnet_tenant-resource">#&lt;/a>
&lt;/h1>
&lt;p>A tenant: its index and numbering, its DNS zone and key, its state-store credential, and its own API token. Everything but the name is issued by the API.&lt;/p>
&lt;h2 id="example-usage">
 Example Usage
 &lt;a class="anchor" href="#example-usage">#&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-terraform" data-lang="terraform">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">resource&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deevnet_tenant&amp;#34;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;this&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;tdemo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">&amp;#34;subnet&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">value&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">subnet&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># What the API issued this tenant. This state is the authoritative copy.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">&amp;#34;state_credentials&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">value&lt;/span> = {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">endpoint&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">state_endpoint&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">bucket&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">state_bucket&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">key_prefix&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">state_key_prefix&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">access_key&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">state_access_key&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">secret_key&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">state_secret_key&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">sensitive&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- schema generated by tfplugindocs -->
&lt;h2 id="schema">
 Schema
 &lt;a class="anchor" href="#schema">#&lt;/a>
&lt;/h2>
&lt;h3 id="required">
 Required
 &lt;a class="anchor" href="#required">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>name&lt;/code> (String) 1-8 lowercase alphanumerics, starting with a letter: the SDN zone id, a DNS label and a state-store user.&lt;/li>
&lt;/ul>
&lt;h3 id="read-only">
 Read-Only
 &lt;a class="anchor" href="#read-only">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>api_token&lt;/code> (String, Sensitive) The tenant&amp;rsquo;s own API token, for every later call it makes.&lt;/li>
&lt;li>&lt;code>controller_id&lt;/code> (String) EVPN controller the tenant&amp;rsquo;s zone attaches to.&lt;/li>
&lt;li>&lt;code>dashboard_org_id&lt;/code> (Number) The tenant&amp;rsquo;s own Grafana organization. The &lt;code>grafana&lt;/code> provider ignores its provider-level &lt;code>org_id&lt;/code> under basic auth, so set this as &lt;code>org_id&lt;/code> on each &lt;code>grafana_folder&lt;/code> and &lt;code>grafana_dashboard&lt;/code>.&lt;/li>
&lt;li>&lt;code>dashboard_password&lt;/code> (String, Sensitive) The Grafana login&amp;rsquo;s password. Issued by the API, which keeps it sealed, so a reconcile can hand it back. The organization&amp;rsquo;s three log data sources have fixed UIDs - &lt;code>deevnet-logs-workloads&lt;/code>, &lt;code>deevnet-logs-platform&lt;/code>, &lt;code>deevnet-logs-devices&lt;/code> - the same on every site and on the take-home Pi.&lt;/li>
&lt;li>&lt;code>dashboard_url&lt;/code> (String) The tenant&amp;rsquo;s Grafana, empty at a site with none (ADR-0024). Feed it to the &lt;code>grafana&lt;/code> provider as &lt;code>GRAFANA_URL&lt;/code>.&lt;/li>
&lt;li>&lt;code>dashboard_username&lt;/code> (String) The tenant&amp;rsquo;s Grafana login: an Editor in its own organization and a member of no other.&lt;/li>
&lt;li>&lt;code>dns_reverse_zone&lt;/code> (String) The tenant&amp;rsquo;s reverse DNS zone.&lt;/li>
&lt;li>&lt;code>dns_update_server&lt;/code> (String) Where RFC 2136 updates go, if the tenant publishes names itself.&lt;/li>
&lt;li>&lt;code>dns_zone&lt;/code> (String) The tenant&amp;rsquo;s forward DNS zone.&lt;/li>
&lt;li>&lt;code>gateway&lt;/code> (String) The anycast gateway address workloads use on the overlay subnet.&lt;/li>
&lt;li>&lt;code>index&lt;/code> (Number) The tenant index every identifier derives from (ADR-0002).&lt;/li>
&lt;li>&lt;code>log_account_id&lt;/code> (Number) The tenant&amp;rsquo;s partition family: project 0 is what its workloads ship, 1 what the substrate publishes about it, 2 its devices&amp;rsquo; logs from MQTT.&lt;/li>
&lt;li>&lt;code>log_endpoint&lt;/code> (String) The log store this tenant ships to, empty at a site with none (ADR-0027).&lt;/li>
&lt;li>&lt;code>log_ingest_token&lt;/code> (String, Sensitive) Writes this tenant&amp;rsquo;s own log partition. Issued by the API, which keeps it sealed - unlike the API token, so a reconcile can hand it back.&lt;/li>
&lt;li>&lt;code>log_read_token&lt;/code> (String, Sensitive) Reads this tenant&amp;rsquo;s three log partitions, and no other tenant&amp;rsquo;s.&lt;/li>
&lt;li>&lt;code>log_select_header&lt;/code> (String) The header a reader sends to choose a partition, for example &lt;code>X-Deevnet-Partition: 2-1&lt;/code>. Without it a read returns project 0. It selects only among this tenant&amp;rsquo;s partitions: the proxy sets the store&amp;rsquo;s own headers itself.&lt;/li>
&lt;li>&lt;code>node&lt;/code> (String) Hypervisor the tenant&amp;rsquo;s workloads land on.&lt;/li>
&lt;li>&lt;code>present&lt;/code> (Boolean) Whether the API still holds this tenant. False after the API&amp;rsquo;s registry is lost, which makes the next apply restore it from this state rather than create a new one.&lt;/li>
&lt;li>&lt;code>secrets_stored&lt;/code> (Boolean) Whether the API can still read the secrets it holds for this tenant. False after its Transit key is rebuilt or rotated past them, which makes the next apply send this state&amp;rsquo;s copies again - they are the authoritative ones.&lt;/li>
&lt;li>&lt;code>state_access_key&lt;/code> (String) State store access key.&lt;/li>
&lt;li>&lt;code>state_bucket&lt;/code> (String) The state store bucket this tenant writes to.&lt;/li>
&lt;li>&lt;code>state_endpoint&lt;/code> (String) S3 endpoint of the state store (ADR-0007).&lt;/li>
&lt;li>&lt;code>state_key_prefix&lt;/code> (String) The prefix this tenant may write.&lt;/li>
&lt;li>&lt;code>state_secret_key&lt;/code> (String, Sensitive) State store secret key. This state is its authoritative copy (ADR-0015 §4).&lt;/li>
&lt;li>&lt;code>status&lt;/code> (String) &lt;code>provisioning&lt;/code> or &lt;code>ready&lt;/code>.&lt;/li>
&lt;li>&lt;code>subnet&lt;/code> (String) The tenant&amp;rsquo;s overlay subnet, in CIDR form.&lt;/li>
&lt;li>&lt;code>tsig_algorithm&lt;/code> (String) Algorithm of the TSIG key.&lt;/li>
&lt;li>&lt;code>tsig_key_name&lt;/code> (String) Name of the TSIG key that may update the tenant&amp;rsquo;s zones.&lt;/li>
&lt;li>&lt;code>tsig_secret&lt;/code> (String, Sensitive) TSIG secret. This state is its authoritative copy (ADR-0015 §4).&lt;/li>
&lt;li>&lt;code>vnet_vni_base&lt;/code> (Number) First VXLAN id of the tenant&amp;rsquo;s VNets, derived from the index.&lt;/li>
&lt;li>&lt;code>vrf_vni&lt;/code> (Number) VXLAN id of the tenant&amp;rsquo;s VRF, derived from the index.&lt;/li>
&lt;/ul></description></item><item><title>deevnet_workload</title><link>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/workload/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/terraform-provider-deevnet/docs/resources/workload/</guid><description>&lt;h1 id="deevnet_workload-resource">
 deevnet_workload (Resource)
 &lt;a class="anchor" href="#deevnet_workload-resource">#&lt;/a>
&lt;/h1>
&lt;p>A VM in the tenant&amp;rsquo;s network. Its name is published in the tenant&amp;rsquo;s zone.&lt;/p>
&lt;h2 id="example-usage">
 Example Usage
 &lt;a class="anchor" href="#example-usage">#&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-terraform" data-lang="terraform">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">resource&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deevnet_workload&amp;#34;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tenant&lt;/span> = &lt;span style="color:#a6e22e">deevnet_tenant&lt;/span>.&lt;span style="color:#a6e22e">this&lt;/span>.&lt;span style="color:#a6e22e">name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">cores&lt;/span> = &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">memory_mb&lt;/span> = &lt;span style="color:#ae81ff">2048&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # The public half; the private key never leaves you.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">ssh_keys&lt;/span> = [file(&lt;span style="color:#e6db74">&amp;#34;~/.ssh/id_ed25519.pub&amp;#34;&lt;/span>)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">&amp;#34;login&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">value&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;ssh &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">deevnet_workload&lt;/span>.&lt;span style="color:#a6e22e">web&lt;/span>.&lt;span style="color:#a6e22e">login_user&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">@&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">deevnet_workload&lt;/span>.&lt;span style="color:#a6e22e">web&lt;/span>.&lt;span style="color:#a6e22e">fqdn&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- schema generated by tfplugindocs -->
&lt;h2 id="schema">
 Schema
 &lt;a class="anchor" href="#schema">#&lt;/a>
&lt;/h2>
&lt;h3 id="required">
 Required
 &lt;a class="anchor" href="#required">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>name&lt;/code> (String) A DNS label under the tenant&amp;rsquo;s zone, 1-20 lowercase alphanumerics or dashes.&lt;/li>
&lt;li>&lt;code>tenant&lt;/code> (String) The tenant this workload belongs to.&lt;/li>
&lt;/ul>
&lt;h3 id="optional">
 Optional
 &lt;a class="anchor" href="#optional">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>cores&lt;/code> (Number) Virtual CPU cores. Defaults to 2.&lt;/li>
&lt;li>&lt;code>disk_gb&lt;/code> (Number) Grows the template&amp;rsquo;s disk. It is never shrunk.&lt;/li>
&lt;li>&lt;code>memory_mb&lt;/code> (Number) Memory in MiB. Defaults to 2048.&lt;/li>
&lt;li>&lt;code>ssh_keys&lt;/code> (List of String) Public keys that may log in as &lt;code>login_user&lt;/code>. Only the public half: the private key stays on your machine. Written when the workload is built; to change them, replace the workload (&lt;code>terraform apply -replace=...&lt;/code>).&lt;/li>
&lt;/ul>
&lt;h3 id="read-only">
 Read-Only
 &lt;a class="anchor" href="#read-only">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;code>address&lt;/code> (String) Address in the tenant&amp;rsquo;s subnet.&lt;/li>
&lt;li>&lt;code>fqdn&lt;/code> (String) The name published for it.&lt;/li>
&lt;li>&lt;code>login_user&lt;/code> (String) The account &lt;code>ssh_keys&lt;/code> land on: &lt;code>ssh &amp;lt;login_user&amp;gt;@&amp;lt;fqdn&amp;gt;&lt;/code>.&lt;/li>
&lt;li>&lt;code>mac&lt;/code> (String) MAC, derived from the VMID.&lt;/li>
&lt;li>&lt;code>ordinal&lt;/code> (Number) The workload&amp;rsquo;s number within its tenant; the VMID and address derive from it.&lt;/li>
&lt;li>&lt;code>present&lt;/code> (Boolean) Whether the API still holds this workload.&lt;/li>
&lt;li>&lt;code>status&lt;/code> (String) &lt;code>provisioning&lt;/code> or &lt;code>ready&lt;/code>.&lt;/li>
&lt;li>&lt;code>vmid&lt;/code> (Number) Proxmox VMID.&lt;/li>
&lt;/ul></description></item></channel></rss>