provisioning/docs/book/development/TASKSERV_QUICK_GUIDE.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

436 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>Taskserv Quick Guide - 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/TASKSERV_QUICK_GUIDE.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="taskserv-quick-guide"><a class="header" href="#taskserv-quick-guide">Taskserv Quick Guide</a></h1>
<h2 id="-quick-start"><a class="header" href="#-quick-start">🚀 Quick Start</a></h2>
<h3 id="create-a-new-taskserv-interactive"><a class="header" href="#create-a-new-taskserv-interactive">Create a New Taskserv (Interactive)</a></h3>
<pre><code class="language-bash">nu provisioning/tools/create-taskserv-helper.nu interactive
</code></pre>
<h3 id="create-a-new-taskserv-direct"><a class="header" href="#create-a-new-taskserv-direct">Create a New Taskserv (Direct)</a></h3>
<pre><code class="language-bash">nu provisioning/tools/create-taskserv-helper.nu create my-api \
--category development \
--port 8080 \
--description "My REST API service"
</code></pre>
<h2 id="-5-minute-setup"><a class="header" href="#-5-minute-setup">📋 5-Minute Setup</a></h2>
<h3 id="1-choose-your-method"><a class="header" href="#1-choose-your-method">1. Choose Your Method</a></h3>
<ul>
<li><strong>Interactive</strong>: <code>nu provisioning/tools/create-taskserv-helper.nu interactive</code></li>
<li><strong>Command Line</strong>: Use the direct command above</li>
<li><strong>Manual</strong>: Follow the structure guide below</li>
</ul>
<h3 id="2-basic-structure"><a class="header" href="#2-basic-structure">2. Basic Structure</a></h3>
<pre><code>my-service/
├── kcl/
│ ├── kcl.mod # Package definition
│ ├── my-service.k # Main schema
│ └── version.k # Version info
├── default/
│ ├── defs.toml # Default config
│ └── install-*.sh # Install script
└── README.md # Documentation
</code></pre>
<h3 id="3-essential-files"><a class="header" href="#3-essential-files">3. Essential Files</a></h3>
<p><strong>kcl.mod</strong> (package definition):</p>
<pre><code class="language-toml">[package]
name = "my-service"
version = "1.0.0"
description = "My service"
[dependencies]
k8s = { oci = "oci://ghcr.io/kcl-lang/k8s", tag = "1.30" }
</code></pre>
<p><strong>my-service.k</strong> (main schema):</p>
<pre><code class="language-kcl">schema MyService {
name: str = "my-service"
version: str = "latest"
port: int = 8080
replicas: int = 1
}
my_service_config: MyService = MyService {}
</code></pre>
<h3 id="4-test-your-taskserv"><a class="header" href="#4-test-your-taskserv">4. Test Your Taskserv</a></h3>
<pre><code class="language-bash"># Discover your taskserv
nu -c "use provisioning/core/nulib/taskservs/discover.nu *; get-taskserv-info my-service"
# Test layer resolution
nu -c "use provisioning/workspace/tools/layer-utils.nu *; test_layer_resolution my-service wuji upcloud"
# Deploy with check
provisioning/core/cli/provisioning taskserv create my-service --infra wuji --check
</code></pre>
<h2 id="-common-patterns"><a class="header" href="#-common-patterns">🎯 Common Patterns</a></h2>
<h3 id="web-service"><a class="header" href="#web-service">Web Service</a></h3>
<pre><code class="language-kcl">schema WebService {
name: str
version: str = "latest"
port: int = 8080
replicas: int = 1
ingress: {
enabled: bool = true
hostname: str
tls: bool = false
}
resources: {
cpu: str = "100m"
memory: str = "128Mi"
}
}
</code></pre>
<h3 id="database-service"><a class="header" href="#database-service">Database Service</a></h3>
<pre><code class="language-kcl">schema DatabaseService {
name: str
version: str = "latest"
port: int = 5432
persistence: {
enabled: bool = true
size: str = "10Gi"
storage_class: str = "ssd"
}
auth: {
database: str = "app"
username: str = "user"
password_secret: str
}
}
</code></pre>
<h3 id="background-worker"><a class="header" href="#background-worker">Background Worker</a></h3>
<pre><code class="language-kcl">schema BackgroundWorker {
name: str
version: str = "latest"
replicas: int = 1
job: {
schedule?: str # Cron format for scheduled jobs
parallelism: int = 1
completions: int = 1
}
resources: {
cpu: str = "500m"
memory: str = "512Mi"
}
}
</code></pre>
<h2 id="-cli-shortcuts"><a class="header" href="#-cli-shortcuts">🛠️ CLI Shortcuts</a></h2>
<h3 id="discovery"><a class="header" href="#discovery">Discovery</a></h3>
<pre><code class="language-bash"># List all taskservs
nu -c "use provisioning/core/nulib/taskservs/discover.nu *; discover-taskservs | select name group"
# Search taskservs
nu -c "use provisioning/core/nulib/taskservs/discover.nu *; search-taskservs redis"
# Show stats
nu -c "use provisioning/workspace/tools/layer-utils.nu *; show_layer_stats"
</code></pre>
<h3 id="development"><a class="header" href="#development">Development</a></h3>
<pre><code class="language-bash"># Check KCL syntax
kcl check provisioning/extensions/taskservs/{category}/{name}/kcl/{name}.k
# Generate configuration
provisioning/core/cli/provisioning taskserv generate {name} --infra {infra}
# Version management
provisioning/core/cli/provisioning taskserv versions {name}
provisioning/core/cli/provisioning taskserv check-updates
</code></pre>
<h3 id="testing"><a class="header" href="#testing">Testing</a></h3>
<pre><code class="language-bash"># Dry run deployment
provisioning/core/cli/provisioning taskserv create {name} --infra {infra} --check
# Layer resolution debug
nu -c "use provisioning/workspace/tools/layer-utils.nu *; test_layer_resolution {name} {infra} {provider}"
</code></pre>
<h2 id="-categories-reference"><a class="header" href="#-categories-reference">📚 Categories Reference</a></h2>
<div class="table-wrapper"><table><thead><tr><th>Category</th><th>Examples</th><th>Use Case</th></tr></thead><tbody>
<tr><td><strong>container-runtime</strong></td><td>containerd, crio, podman</td><td>Container runtime engines</td></tr>
<tr><td><strong>databases</strong></td><td>postgres, redis</td><td>Database services</td></tr>
<tr><td><strong>development</strong></td><td>coder, gitea, desktop</td><td>Development tools</td></tr>
<tr><td><strong>infrastructure</strong></td><td>kms, webhook, os</td><td>System infrastructure</td></tr>
<tr><td><strong>kubernetes</strong></td><td>kubernetes</td><td>Kubernetes orchestration</td></tr>
<tr><td><strong>networking</strong></td><td>cilium, coredns, etcd</td><td>Network services</td></tr>
<tr><td><strong>storage</strong></td><td>rook-ceph, external-nfs</td><td>Storage solutions</td></tr>
</tbody></table>
</div>
<h2 id="-troubleshooting"><a class="header" href="#-troubleshooting">🔧 Troubleshooting</a></h2>
<h3 id="taskserv-not-found"><a class="header" href="#taskserv-not-found">Taskserv Not Found</a></h3>
<pre><code class="language-bash"># Check if discovered
nu -c "use provisioning/core/nulib/taskservs/discover.nu *; discover-taskservs | where name == my-service"
# Verify kcl.mod exists
ls provisioning/extensions/taskservs/{category}/my-service/kcl/kcl.mod
</code></pre>
<h3 id="layer-resolution-issues"><a class="header" href="#layer-resolution-issues">Layer Resolution Issues</a></h3>
<pre><code class="language-bash"># Debug resolution
nu -c "use provisioning/workspace/tools/layer-utils.nu *; test_layer_resolution my-service wuji upcloud"
# Check template exists
ls provisioning/workspace/templates/taskservs/{category}/my-service.k
</code></pre>
<h3 id="kcl-syntax-errors"><a class="header" href="#kcl-syntax-errors">KCL Syntax Errors</a></h3>
<pre><code class="language-bash"># Check syntax
kcl check provisioning/extensions/taskservs/{category}/my-service/kcl/my-service.k
# Format code
kcl fmt provisioning/extensions/taskservs/{category}/my-service/kcl/
</code></pre>
<h2 id="-pro-tips"><a class="header" href="#-pro-tips">💡 Pro Tips</a></h2>
<ol>
<li><strong>Use existing taskservs as templates</strong> - Copy and modify similar services</li>
<li><strong>Test with check first</strong> - Always use dry run before actual deployment</li>
<li><strong>Follow naming conventions</strong> - Use kebab-case for consistency</li>
<li><strong>Document thoroughly</strong> - Good docs save time later</li>
<li><strong>Version your schemas</strong> - Include version.k for compatibility tracking</li>
</ol>
<h2 id="-next-steps"><a class="header" href="#-next-steps">🔗 Next Steps</a></h2>
<ol>
<li>Read the full <a href="./TASKSERV_DEVELOPER_GUIDE.html">Taskserv Developer Guide</a></li>
<li>Explore existing taskservs in <code>provisioning/extensions/taskservs/</code></li>
<li>Check out templates in <code>provisioning/workspace/templates/taskservs/</code></li>
<li>Join the development community for support</li>
</ol>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../development/TASKSERV_DEVELOPER_GUIDE.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/COMMAND_HANDLER_GUIDE.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/TASKSERV_DEVELOPER_GUIDE.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/COMMAND_HANDLER_GUIDE.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>