two/main/architecture/vue-densemble.html
2026-09-09 22:07:27 +00:00

573 lines
No EOL
28 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr" data-content_root="../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Vue d’ensemble &#8212; Documentation two 0.1.0</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
</script>
<!--
this give us a css class that will be invisible only if js is disabled
-->
<noscript>
<style>
.pst-js-only { display: none !important; }
</style>
</noscript>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=8f2a1f02" />
<link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=3c74b3bc" />
<!-- So that users can add custom icons -->
<script src="../_static/scripts/fontawesome.js?digest=8878045cc6db502f8baf"></script>
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf" />
<script src="../_static/documentation_options.js?v=57395fb6"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/scripts/sphinx-book-theme.js?v=fab101a9"></script>
<script src="../_static/translations.js?v=e6b791cb"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'architecture/vue-densemble';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.16.1';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '../switcher.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'main';
DOCUMENTATION_OPTIONS.show_version_warning_banner =
false;
</script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Recherche" href="../search.html" />
<link rel="next" title="Schéma des clés" href="stockage.html" />
<link rel="prev" title="Architecture" href="index.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="fr"/>
<meta name="docsearch:version" content="0.1" />
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Passer au contenu principal</a></div>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>Haut de page</button>
<dialog id="pst-search-dialog">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
placeholder="Search..."
aria-label="Search..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form>
</dialog>
<div class="pst-async-banner-revealer d-none">
<aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Alerte de version"></aside>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<dialog id="pst-primary-sidebar-modal"></dialog>
<div id="pst-primary-sidebar" class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<a class="navbar-brand logo" href="../index.html">
<p class="title logo__title">Documentation two 0.1.0</p>
</a></div>
<div class="sidebar-primary-item"><ul class="navbar-icon-links"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://git.g3e.fr/syonad/two" title="Dépôt" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-solid fa-code-branch fa-lg" aria-hidden="true"></i>
<span class="sr-only">Dépôt</span></a>
</li>
</ul></div>
<div class="sidebar-primary-item">
<div class="version-switcher__container dropdown pst-js-only">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div></div>
<div class="sidebar-primary-item">
<button class="btn search-button-field search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Recherche</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button></div>
<div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
<div class="bd-toc-item navbar-nav active">
<ul class="nav bd-sidenav bd-sidenav__home-link">
<li class="toctree-l1">
<a class="reference internal" href="../index.html">
two
</a>
</li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Mise en œuvre</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../demarrage/index.html">Démarrage</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/installation.html">Installation d’un hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/premier-vpc.html">Premier VPC, premier subnet, première VM</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../deploiement/index.html">Déploiement d’un cluster</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/architecture-cluster.html">Architecture du cluster</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/image-qcow2.html">Construction de l’image qcow2</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/routeurs.html">Routeurs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/premier-hyperviseur.html">Premier hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/route-reflector.html">VM route reflector</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Exploitation</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../exploitation/index.html">Exploitation</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/configuration.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/services.html">Services systemd</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../exploitation/api-agent/index.html">API de l’agent</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l3"><a class="reference internal" href="../exploitation/api-agent/asynchronisme.html">Modèle asynchrone et codes de retour</a></li>
<li class="toctree-l3"><a class="reference internal" href="../exploitation/api-agent/reference.html">Référence</a></li>
</ul>
</details></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/observabilite.html">Observabilité</a></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/diagnostic.html">Diagnostic</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Interne</span></p>
<ul class="current nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../concepts/index.html">Concepts</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../concepts/vpc-subnet-vm.html">VPC, subnet et VM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/modes-reseau.html">Modes réseau</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/cycle-de-vie.html">Cycle de vie des ressources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/metadata-cloud-init.html">Metadata et cloud-init</a></li>
</ul>
</details></li>
<li class="toctree-l1 current active has-children"><a class="reference internal" href="index.html">Architecture</a><details open="open"><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul class="current">
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Vue d’ensemble</a></li>
<li class="toctree-l2"><a class="reference internal" href="stockage.html">Schéma des clés</a></li>
<li class="toctree-l2"><a class="reference internal" href="contraintes.html">Invariants et pièges</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../versions/index.html">Versions</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../versions/0.2.0.html">Bael</a></li>
<li class="toctree-l2"><a class="reference internal" href="../versions/0.1.0.html">Michael</a></li>
</ul>
</details></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
<div class="sidebar-primary-item">
<div id="ethical-ad-placement"
class="flat"
data-ea-publisher="readthedocs"
data-ea-type="readthedocs-sidebar"
data-ea-manual="true">
</div></div>
</div>
</div>
<main id="main-content" class="bd-main" role="main">
<div class="sbt-scroll-pixel-helper"></div>
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article d-print-none">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-bars"></span>
</button></div>
</div>
<div class="header-article-items__end">
<div class="header-article-item">
<div class="article-header-buttons">
<button onclick="toggleFullScreen()"
class="btn btn-sm btn-fullscreen-button pst-navbar-icon"
title="Mode plein écran"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-expand"></i>
</span>
</button>
<button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button pst-js-only" aria-label="Thème" data-bs-title="Thème" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light" title="Clair"></i>
<i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark" title="Sombre"></i>
<i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto" title="Paramètres système"></i>
</button>
<button class="btn btn-sm pst-navbar-icon search-button search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
</button>
<button class="sidebar-toggle secondary-toggle btn btn-sm pst-navbar-icon" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-list"></span>
</button>
</div></div>
</div>
</div>
</div>
<div id="jb-print-docs-body" class="onlyprint">
<h1>Vue d’ensemble</h1>
<!-- Table of contents -->
<div id="print-main-content">
<div id="jb-print-toc">
<div>
<h2> Contenu </h2>
</div>
<nav aria-label="Page">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#cycle-d-une-requete">Cycle d’une requête</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#paquets">Paquets</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#ajouter-un-type-de-ressource">Ajouter un type de ressource</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#stubs-de-plateforme">Stubs de plateforme</a></li>
</ul>
</nav>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="vue-d-ensemble">
<h1>Vue d’ensemble<a class="headerlink" href="#vue-d-ensemble" title="Lien vers cette rubrique">#</a></h1>
<section id="cycle-d-une-requete">
<h2>Cycle d’une requête<a class="headerlink" href="#cycle-d-une-requete" title="Lien vers cette rubrique">#</a></h2>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>HTTP → internal/api/agent → Dispatcher.Prepare() → Dispatcher.Dispatch() → worker.Queue → Command.Execute()
</pre></div>
</div>
<dl class="simple">
<dt><strong>Prepare</strong> (synchrone, dans le handler HTTP)</dt><dd><p>valide l’état, écrit l’état initial (<code class="docutils literal notranslate"><span class="pre">creating</span></code> / <code class="docutils literal notranslate"><span class="pre">deleting</span></code>) en base, et retourne 202 ou
une erreur.</p>
</dd>
<dt><strong>Dispatch</strong> (asynchrone)</dt><dd><p>place la commande sur un canal bufferisé ; une goroutine worker appelle <code class="docutils literal notranslate"><span class="pre">Execute</span></code>. C’est
<code class="docutils literal notranslate"><span class="pre">Dispatch</span></code>, et lui seul, qui marque la ressource en <code class="docutils literal notranslate"><span class="pre">error</span></code> si <code class="docutils literal notranslate"><span class="pre">Execute</span></code> échoue.</p>
</dd>
<dt><strong>Execute</strong></dt><dd><p>effectue le travail réseau (netns, netif, VXLAN, veth, bridge, DHCP), puis met l’état à
<code class="docutils literal notranslate"><span class="pre">running</span></code> / <code class="docutils literal notranslate"><span class="pre">deleted</span></code>.</p>
</dd>
</dl>
</section>
<section id="paquets">
<h2>Paquets<a class="headerlink" href="#paquets" title="Lien vers cette rubrique">#</a></h2>
<div class="pst-scrollable-table-container"><table class="table">
<colgroup>
<col style="width: 32.0%" />
<col style="width: 68.0%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>Chemin</p></th>
<th class="head"><p>Rôle</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/api/agent</span></code></p></td>
<td><p>handlers HTTP de <code class="docutils literal notranslate"><span class="pre">/vpcs</span></code>, <code class="docutils literal notranslate"><span class="pre">/subnets</span></code> et <code class="docutils literal notranslate"><span class="pre">/vms</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/dispatcher/agent</span></code></p></td>
<td><p>interface <code class="docutils literal notranslate"><span class="pre">Command</span></code> (<code class="docutils literal notranslate"><span class="pre">Prepare</span></code>/<code class="docutils literal notranslate"><span class="pre">Execute</span></code>/<code class="docutils literal notranslate"><span class="pre">Key</span></code>) et commandes concrètes</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/state</span></code></p></td>
<td><p>énumération des états, <code class="docutils literal notranslate"><span class="pre">CanDelete</span></code>/<code class="docutils literal notranslate"><span class="pre">IsTransient</span></code>, seul point d’écriture des états</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/migration</span></code></p></td>
<td><p>migrations idempotentes jouées au démarrage de l’agent</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/vpc</span></code>, <code class="docutils literal notranslate"><span class="pre">internal/subnet</span></code></p></td>
<td><p>création et suppression bas niveau (netns + netif)</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/netns</span></code></p></td>
<td><p>network namespaces : create/enter/delete/call</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/netif</span></code></p></td>
<td><p>netlink : bridge, veth, vxlan, tap, routes, adresses</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/ebtables</span></code>, <code class="docutils literal notranslate"><span class="pre">internal/iptables</span></code></p></td>
<td><p>wrappers dédiés ; ne pas appeler ces binaires ailleurs</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/qemu</span></code>, <code class="docutils literal notranslate"><span class="pre">internal/qmp</span></code></p></td>
<td><p>lancement de QEMU et client QMP sur socket Unix</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/vm</span></code></p></td>
<td><p>cycle de vie d’une VM : tap, iptables, metadata, qemu</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/dhcp</span></code></p></td>
<td><p>plan d’adressage ip → mac, et configurations dnsmasq du backend historique</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/metadata</span></code></p></td>
<td><p>serveur de metadata cloud-init et ses templates</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/watchdog</span></code></p></td>
<td><p>vérification périodique en lecture seule</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">internal/config/agent</span></code></p></td>
<td><p>chargement par viper — tags <code class="docutils literal notranslate"><span class="pre">mapstructure</span></code>, jamais <code class="docutils literal notranslate"><span class="pre">yaml</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">internal/prometheus/agent</span></code></p></td>
<td><p>collector des métriques <code class="docutils literal notranslate"><span class="pre">syonad_*</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">pkg/db/kv</span></code></p></td>
<td><p>wrapper Badger ; toutes les valeurs sont des chaînes plates</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">pkg/worker</span></code></p></td>
<td><p>pool de goroutines sur canal</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">pkg/systemd</span></code></p></td>
<td><p>client D-Bus systemd</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">pkg/logger</span></code>, <code class="docutils literal notranslate"><span class="pre">pkg/prometheus</span></code></p></td>
<td><p>journalisation <code class="docutils literal notranslate"><span class="pre">slog</span></code> et serveur de métriques</p></td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="ajouter-un-type-de-ressource">
<h2>Ajouter un type de ressource<a class="headerlink" href="#ajouter-un-type-de-ressource" title="Lien vers cette rubrique">#</a></h2>
<ol class="arabic simple">
<li><p>ajouter les helpers KV dans <code class="docutils literal notranslate"><span class="pre">pkg/db/kv</span></code> si nécessaire ;</p></li>
<li><p>définir <code class="docutils literal notranslate"><span class="pre">Create&lt;X&gt;</span></code> / <code class="docutils literal notranslate"><span class="pre">Delete&lt;X&gt;</span></code> dans un nouveau paquet <code class="docutils literal notranslate"><span class="pre">internal/&lt;x&gt;/</span></code> ;</p></li>
<li><p>ajouter <code class="docutils literal notranslate"><span class="pre">Create&lt;X&gt;Command</span></code> / <code class="docutils literal notranslate"><span class="pre">Delete&lt;X&gt;Command</span></code> dans <code class="docutils literal notranslate"><span class="pre">internal/dispatcher/agent/</span></code>, dont
<code class="docutils literal notranslate"><span class="pre">Key()</span></code> qui retourne <code class="docutils literal notranslate"><span class="pre">&lt;x&gt;/&lt;name&gt;</span></code> et le contrôle <code class="docutils literal notranslate"><span class="pre">state.CanDelete</span></code> dans
<code class="docutils literal notranslate"><span class="pre">Delete&lt;X&gt;Command.Prepare</span></code> ;</p></li>
<li><p>ajouter les handlers HTTP dans <code class="docutils literal notranslate"><span class="pre">internal/api/agent/</span></code> et les routes dans <code class="docutils literal notranslate"><span class="pre">server.go</span></code>.</p></li>
</ol>
</section>
<section id="stubs-de-plateforme">
<h2>Stubs de plateforme<a class="headerlink" href="#stubs-de-plateforme" title="Lien vers cette rubrique">#</a></h2>
<p>Les fichiers <code class="docutils literal notranslate"><span class="pre">_linux.go</span></code> portent l’implémentation netlink/netns réelle ; les <code class="docutils literal notranslate"><span class="pre">_other.go</span></code>
correspondants retournent une erreur « not supported on this platform ». Tous les paquets
<strong>compilent</strong> sur macOS, ce qui permet d’y tester la logique qui ne touche ni netlink ni netns.</p>
<p>Deux exceptions à connaître : les stubs de <code class="docutils literal notranslate"><span class="pre">netns</span></code> exécutent <code class="docutils literal notranslate"><span class="pre">fn</span></code> <strong>sans changer de
namespace</strong> — <code class="docutils literal notranslate"><span class="pre">netns.Call</span></code> réussit donc hors Linux — et <code class="docutils literal notranslate"><span class="pre">netif</span></code> compile partout parce que
netlink fournit une implémentation « unspecified ».</p>
</section>
</section>
</article>
<footer class="prev-next-footer d-print-none">
<div class="prev-next-area">
<a class="left-prev"
href="index.html"
title="page précédente">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">précédent</p>
<p class="prev-next-title">Architecture</p>
</div>
</a>
<a class="right-next"
href="stockage.html"
title="page suivante">
<div class="prev-next-info">
<p class="prev-next-subtitle">suivant</p>
<p class="prev-next-title">Schéma des clés</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<dialog id="pst-secondary-sidebar-modal"></dialog>
<div id="pst-secondary-sidebar" class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item"><div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> Contenu
</div>
<nav id="pst-page-toc-nav" class="page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#cycle-d-une-requete">Cycle d’une requête</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#paquets">Paquets</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#ajouter-un-type-de-ressource">Ajouter un type de ressource</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#stubs-de-plateforme">Stubs de plateforme</a></li>
</ul>
</nav></div>
</div></div>
</div>
<footer class="bd-footer-content">
<div class="bd-footer-content__inner container">
<div class="footer-item">
<p class="component-author">
Par Nicolas Boufidjeline
</p>
</div>
<div class="footer-item">
<p class="copyright">
© Copyright 2026, Nicolas Boufidjeline.
<br/>
</p>
</div>
<div class="footer-item">
</div>
<div class="footer-item">
</div>
</div>
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script defer src="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf"></script>
<script defer src="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf"></script>
<footer class="bd-footer">
</footer>
</body>
</html>