provisioning/docs/book/development/kcl/KCL_DEPENDENCY_PATTERNS.html
Jesús Pérez 6a59d34bb1
chore: update provisioning configuration and documentation
Update configuration files, templates, and internal documentation
for the provisioning repository system.

Configuration Updates:
- KMS configuration modernization
- Plugin system settings
- Service port mappings
- Test cluster topologies
- Installation configuration examples
- VM configuration defaults
- Cedar authorization policies

Documentation Updates:
- Library module documentation
- Extension API guides
- AI system documentation
- Service management guides
- Test environment setup
- Plugin usage guides
- Validator configuration documentation

All changes are backward compatible.
2025-12-11 21:50:42 +00:00

412 lines
20 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="en" class="ayu sidebar-visible" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>KCL Dependency Patterns - Provisioning Platform Documentation</title>
<!-- Custom HTML head -->
<meta name="description" content="Complete documentation for the Provisioning Platform - Infrastructure automation with Nushell, KCL, and Rust">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="../../favicon.svg">
<link rel="shortcut icon" href="../../favicon.png">
<link rel="stylesheet" href="../../css/variables.css">
<link rel="stylesheet" href="../../css/general.css">
<link rel="stylesheet" href="../../css/chrome.css">
<link rel="stylesheet" href="../../css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="../../fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" id="highlight-css" href="../../highlight.css">
<link rel="stylesheet" id="tomorrow-night-css" href="../../tomorrow-night.css">
<link rel="stylesheet" id="ayu-highlight-css" href="../../ayu-highlight.css">
<!-- Custom theme stylesheets -->
<!-- Provide site root and default themes to javascript -->
<script>
const path_to_root = "../../";
const default_light_theme = "ayu";
const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../../toc.js"></script>
</head>
<body>
<div id="mdbook-help-container">
<div id="mdbook-help-popup">
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
<div>
<p>Press <kbd></kbd> or <kbd></kbd> to navigate between chapters</p>
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
<p>Press <kbd>?</kbd> to show this help</p>
<p>Press <kbd>Esc</kbd> to hide this help</p>
</div>
</div>
</div>
<div id="body-container">
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
let theme = localStorage.getItem('mdbook-theme');
let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
html.classList.remove('ayu')
html.classList.add(theme);
html.classList.add("js");
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
let sidebar = null;
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<!-- populated by js -->
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
<noscript>
<iframe class="sidebar-iframe-outer" src="../../toc.html"></iframe>
</noscript>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">Provisioning Platform Documentation</h1>
<div class="right-buttons">
<a href="../../print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
<a href="https://github.com/provisioning/provisioning-platform" title="Git repository" aria-label="Git repository">
<i id="git-repository-button" class="fa fa-github"></i>
</a>
<a href="https://github.com/provisioning/provisioning-platform/edit/main/provisioning/docs/src/development/kcl/KCL_DEPENDENCY_PATTERNS.md" title="Suggest an edit" aria-label="Suggest an edit">
<i id="git-edit-button" class="fa fa-edit"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script>
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h1 id="kcl-module-dependency-patterns---quick-reference"><a class="header" href="#kcl-module-dependency-patterns---quick-reference">KCL Module Dependency Patterns - Quick Reference</a></h1>
<h2 id="kclmod-templates"><a class="header" href="#kclmod-templates">kcl.mod Templates</a></h2>
<h3 id="standard-category-taskserv-depth-2"><a class="header" href="#standard-category-taskserv-depth-2">Standard Category Taskserv (Depth 2)</a></h3>
<p>Location: <code>provisioning/extensions/taskservs/{category}/{taskserv}/kcl/kcl.mod</code></p>
<pre><code class="language-toml">[package]
name = "{taskserv-name}"
edition = "v0.11.2"
version = "0.0.1"
[dependencies]
provisioning = { path = "../../../../kcl", version = "0.0.1" }
taskservs = { path = "../..", version = "0.0.1" }
</code></pre>
<h3 id="sub-category-taskserv-depth-3"><a class="header" href="#sub-category-taskserv-depth-3">Sub-Category Taskserv (Depth 3)</a></h3>
<p>Location: <code>provisioning/extensions/taskservs/{category}/{subcategory}/{taskserv}/kcl/kcl.mod</code></p>
<pre><code class="language-toml">[package]
name = "{taskserv-name}"
edition = "v0.11.2"
version = "0.0.1"
[dependencies]
provisioning = { path = "../../../../../kcl", version = "0.0.1" }
taskservs = { path = "../../..", version = "0.0.1" }
</code></pre>
<h3 id="category-root-eg-kubernetes"><a class="header" href="#category-root-eg-kubernetes">Category Root (e.g., kubernetes)</a></h3>
<p>Location: <code>provisioning/extensions/taskservs/{category}/kcl/kcl.mod</code></p>
<pre><code class="language-toml">[package]
name = "{category}"
edition = "v0.11.2"
version = "0.0.1"
[dependencies]
provisioning = { path = "../../../kcl", version = "0.0.1" }
taskservs = { path = "..", version = "0.0.1" }
</code></pre>
<h2 id="import-patterns"><a class="header" href="#import-patterns">Import Patterns</a></h2>
<h3 id="in-taskserv-schema-files"><a class="header" href="#in-taskserv-schema-files">In Taskserv Schema Files</a></h3>
<pre><code class="language-kcl"># Import core provisioning schemas
import provisioning.settings
import provisioning.server
import provisioning.version
# Import taskserv utilities
import taskservs.version as schema
# Use imported schemas
config = settings.Settings { ... }
version = schema.TaskservVersion { ... }
</code></pre>
<h2 id="version-schema-pattern"><a class="header" href="#version-schema-pattern">Version Schema Pattern</a></h2>
<h3 id="standard-version-file"><a class="header" href="#standard-version-file">Standard Version File</a></h3>
<p>Location: <code>{taskserv}/kcl/version.k</code></p>
<pre><code class="language-kcl">import taskservs.version as schema
_version = schema.TaskservVersion {
name = "{taskserv-name}"
version = schema.Version {
current = "latest" # or specific version like "1.31.0"
source = "https://api.github.com/repos/{org}/{repo}/releases"
tags = "https://api.github.com/repos/{org}/{repo}/tags"
site = "https://{project-site}"
check_latest = False
grace_period = 86400
}
dependencies = [] # list of other taskservs this depends on
}
_version
</code></pre>
<h3 id="internal-component-no-upstream"><a class="header" href="#internal-component-no-upstream">Internal Component (no upstream)</a></h3>
<pre><code class="language-kcl">_version = schema.TaskservVersion {
name = "{taskserv-name}"
version = schema.Version {
current = "latest"
site = "Internal provisioning component"
check_latest = False
grace_period = 86400
}
dependencies = []
}
</code></pre>
<h2 id="path-calculation"><a class="header" href="#path-calculation">Path Calculation</a></h2>
<h3 id="from-taskserv-kcl-to-core-kcl"><a class="header" href="#from-taskserv-kcl-to-core-kcl">From Taskserv KCL to Core KCL</a></h3>
<div class="table-wrapper"><table><thead><tr><th>Taskserv Location</th><th>Path to provisioning/kcl</th></tr></thead><tbody>
<tr><td><code>{cat}/{task}/kcl/</code></td><td><code>../../../../kcl</code></td></tr>
<tr><td><code>{cat}/{subcat}/{task}/kcl/</code></td><td><code>../../../../../kcl</code></td></tr>
<tr><td><code>{cat}/kcl/</code></td><td><code>../../../kcl</code></td></tr>
</tbody></table>
</div>
<h3 id="from-taskserv-kcl-to-taskservs-root"><a class="header" href="#from-taskserv-kcl-to-taskservs-root">From Taskserv KCL to Taskservs Root</a></h3>
<div class="table-wrapper"><table><thead><tr><th>Taskserv Location</th><th>Path to taskservs root</th></tr></thead><tbody>
<tr><td><code>{cat}/{task}/kcl/</code></td><td><code>../..</code></td></tr>
<tr><td><code>{cat}/{subcat}/{task}/kcl/</code></td><td><code>../../..</code></td></tr>
<tr><td><code>{cat}/kcl/</code></td><td><code>..</code></td></tr>
</tbody></table>
</div>
<h2 id="validation"><a class="header" href="#validation">Validation</a></h2>
<h3 id="test-single-schema"><a class="header" href="#test-single-schema">Test Single Schema</a></h3>
<pre><code class="language-bash">cd {taskserv}/kcl
kcl run {schema-name}.k
</code></pre>
<h3 id="test-all-schemas-in-taskserv"><a class="header" href="#test-all-schemas-in-taskserv">Test All Schemas in Taskserv</a></h3>
<pre><code class="language-bash">cd {taskserv}/kcl
for file in *.k; do kcl run "$file"; done
</code></pre>
<h3 id="validate-entire-category"><a class="header" href="#validate-entire-category">Validate Entire Category</a></h3>
<pre><code class="language-bash">find provisioning/extensions/taskservs/{category} -name "*.k" -type f | while read f; do
echo "Validating: $f"
kcl run "$f"
done
</code></pre>
<h2 id="common-issues--fixes"><a class="header" href="#common-issues--fixes">Common Issues &amp; Fixes</a></h2>
<h3 id="issue-name-provisioning-is-not-defined"><a class="header" href="#issue-name-provisioning-is-not-defined">Issue: “name provisioning is not defined”</a></h3>
<p><strong>Cause:</strong> Wrong path in kcl.mod
<strong>Fix:</strong> Check relative path depth and adjust</p>
<h3 id="issue-name-schema-is-not-defined"><a class="header" href="#issue-name-schema-is-not-defined">Issue: “name schema is not defined”</a></h3>
<p><strong>Cause:</strong> Missing import or wrong alias
<strong>Fix:</strong> Add <code>import taskservs.version as schema</code></p>
<h3 id="issue-instance-check-failed-on-version"><a class="header" href="#issue-instance-check-failed-on-version">Issue: “Instance check failed” on Version</a></h3>
<p><strong>Cause:</strong> Empty or missing required field
<strong>Fix:</strong> Ensure <code>current</code> is non-empty (use “latest” if no version)</p>
<h3 id="issue-compileerror-on-long-lines"><a class="header" href="#issue-compileerror-on-long-lines">Issue: CompileError on long lines</a></h3>
<p><strong>Cause:</strong> Line too long
<strong>Fix:</strong> Use line continuation with <code>\</code></p>
<pre><code class="language-kcl">long_condition, \
"error message"
</code></pre>
<h2 id="examples-by-category"><a class="header" href="#examples-by-category">Examples by Category</a></h2>
<h3 id="container-runtime"><a class="header" href="#container-runtime">Container Runtime</a></h3>
<pre><code class="language-bash">provisioning/extensions/taskservs/container-runtime/containerd/kcl/
├── kcl.mod # depth 2 pattern
├── containerd.k
├── dependencies.k
└── version.k
</code></pre>
<h3 id="polkadot-sub-category"><a class="header" href="#polkadot-sub-category">Polkadot (Sub-category)</a></h3>
<pre><code class="language-bash">provisioning/extensions/taskservs/infrastructure/polkadot/bootnode/kcl/
├── kcl.mod # depth 3 pattern
├── polkadot-bootnode.k
└── version.k
</code></pre>
<h3 id="kubernetes-root--items"><a class="header" href="#kubernetes-root--items">Kubernetes (Root + Items)</a></h3>
<pre><code class="language-bash">provisioning/extensions/taskservs/kubernetes/
├── kcl/
│ ├── kcl.mod # root pattern
│ ├── kubernetes.k
│ ├── dependencies.k
│ └── version.k
└── kubectl/
└── kcl/
├── kcl.mod # depth 2 pattern
└── kubectl.k
</code></pre>
<h2 id="quick-commands"><a class="header" href="#quick-commands">Quick Commands</a></h2>
<pre><code class="language-bash"># Find all kcl.mod files
find provisioning/extensions/taskservs -name "kcl.mod"
# Validate all KCL files
find provisioning/extensions/taskservs -name "*.k" -exec kcl run {} \;
# Check dependencies
grep -r "path =" provisioning/extensions/taskservs/*/kcl/kcl.mod
# List taskservs
ls -d provisioning/extensions/taskservs/*/* | grep -v kcl
</code></pre>
<hr />
<p><strong>Reference:</strong> Based on fixes applied 2025-10-03
<strong>See:</strong> KCL_MODULE_FIX_REPORT.md for detailed analysis</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../../development/kcl/KCL_QUICK_REFERENCE.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="../../development/kcl/KCL_GUIDELINES_IMPLEMENTATION.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="../../development/kcl/KCL_QUICK_REFERENCE.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="../../development/kcl/KCL_GUIDELINES_IMPLEMENTATION.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<!-- Livereload script (if served using the cli tool) -->
<script>
const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
const wsAddress = wsProtocol + "//" + location.host + "/" + "__livereload";
const socket = new WebSocket(wsAddress);
socket.onmessage = function (event) {
if (event.data === "reload") {
socket.close();
location.reload();
}
};
window.onbeforeunload = function() {
socket.close();
}
</script>
<script>
window.playground_copyable = true;
</script>
<script src="../../elasticlunr.min.js"></script>
<script src="../../mark.min.js"></script>
<script src="../../searcher.js"></script>
<script src="../../clipboard.min.js"></script>
<script src="../../highlight.js"></script>
<script src="../../book.js"></script>
<!-- Custom JS scripts -->
</div>
</body>
</html>