You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by gi...@apache.org on 2026/05/01 21:40:23 UTC
(superset-kubernetes-operator) 01/01: Deployed d7b7fc5 with MkDocs version: 1.6.1
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/superset-kubernetes-operator.git
commit de6a204493bfcfc04aff38b5980dc38dd944fa46
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Fri May 1 21:40:16 2026 +0000
Deployed d7b7fc5 with MkDocs version: 1.6.1
---
.nojekyll | 0
404.html | 568 ++
api-reference/index.html | 5516 ++++++++++++++++
architecture/index.html | 1413 +++++
assets/images/favicon.png | Bin 0 -> 1870 bytes
assets/javascripts/bundle.79ae519e.min.js | 16 +
assets/javascripts/bundle.79ae519e.min.js.map | 7 +
assets/javascripts/lunr/min/lunr.ar.min.js | 1 +
assets/javascripts/lunr/min/lunr.da.min.js | 18 +
assets/javascripts/lunr/min/lunr.de.min.js | 18 +
assets/javascripts/lunr/min/lunr.du.min.js | 18 +
assets/javascripts/lunr/min/lunr.el.min.js | 1 +
assets/javascripts/lunr/min/lunr.es.min.js | 18 +
assets/javascripts/lunr/min/lunr.fi.min.js | 18 +
assets/javascripts/lunr/min/lunr.fr.min.js | 18 +
assets/javascripts/lunr/min/lunr.he.min.js | 1 +
assets/javascripts/lunr/min/lunr.hi.min.js | 1 +
assets/javascripts/lunr/min/lunr.hu.min.js | 18 +
assets/javascripts/lunr/min/lunr.hy.min.js | 1 +
assets/javascripts/lunr/min/lunr.it.min.js | 18 +
assets/javascripts/lunr/min/lunr.ja.min.js | 1 +
assets/javascripts/lunr/min/lunr.jp.min.js | 1 +
assets/javascripts/lunr/min/lunr.kn.min.js | 1 +
assets/javascripts/lunr/min/lunr.ko.min.js | 1 +
assets/javascripts/lunr/min/lunr.multi.min.js | 1 +
assets/javascripts/lunr/min/lunr.nl.min.js | 18 +
assets/javascripts/lunr/min/lunr.no.min.js | 18 +
assets/javascripts/lunr/min/lunr.pt.min.js | 18 +
assets/javascripts/lunr/min/lunr.ro.min.js | 18 +
assets/javascripts/lunr/min/lunr.ru.min.js | 18 +
assets/javascripts/lunr/min/lunr.sa.min.js | 1 +
.../lunr/min/lunr.stemmer.support.min.js | 1 +
assets/javascripts/lunr/min/lunr.sv.min.js | 18 +
assets/javascripts/lunr/min/lunr.ta.min.js | 1 +
assets/javascripts/lunr/min/lunr.te.min.js | 1 +
assets/javascripts/lunr/min/lunr.th.min.js | 1 +
assets/javascripts/lunr/min/lunr.tr.min.js | 18 +
assets/javascripts/lunr/min/lunr.vi.min.js | 1 +
assets/javascripts/lunr/min/lunr.zh.min.js | 1 +
assets/javascripts/lunr/tinyseg.js | 206 +
assets/javascripts/lunr/wordcut.js | 6708 ++++++++++++++++++++
assets/javascripts/workers/search.2c215733.min.js | 42 +
.../javascripts/workers/search.2c215733.min.js.map | 7 +
assets/stylesheets/main.484c7ddc.min.css | 1 +
assets/stylesheets/main.484c7ddc.min.css.map | 1 +
assets/stylesheets/palette.ab4e12ef.min.css | 1 +
assets/stylesheets/palette.ab4e12ef.min.css.map | 1 +
developer-guide/index.html | 2574 ++++++++
downloads/index.html | 856 +++
index.html | 850 +++
installation/index.html | 1016 +++
internals/index.html | 2280 +++++++
search/search_index.json | 1 +
security/index.html | 1330 ++++
sitemap.xml | 39 +
sitemap.xml.gz | Bin 0 -> 280 bytes
user-guide/index.html | 2620 ++++++++
57 files changed, 26340 insertions(+)
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..e277921
--- /dev/null
+++ b/404.html
@@ -0,0 +1,568 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <meta name="description" content="Kubernetes operator for deploying and managing Apache Superset">
+
+
+
+
+
+
+
+
+
+ <link rel="icon" href="/superset-kubernetes-operator/assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
+
+
+
+ <title>Apache Superset Kubernetes Operator</title>
+
+
+
+ <link rel="stylesheet" href="/superset-kubernetes-operator/assets/stylesheets/main.484c7ddc.min.css">
+
+
+ <link rel="stylesheet" href="/superset-kubernetes-operator/assets/stylesheets/palette.ab4e12ef.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("/superset-kubernetes-operator/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+ </head>
+
+
+
+
+
+
+
+
+
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href="/superset-kubernetes-operator/." title="Apache Superset Kubernetes Operator" class="md-header__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Apache Superset Kubernetes Operator
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <form class="md-header__option" data-md-component="palette">
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
+
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
+
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+</form>
+
+
+
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.get [...]
+
+
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+
+ <div class="md-header__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href="/superset-kubernetes-operator/." title="Apache Superset Kubernetes Operator" class="md-nav__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ Apache Superset Kubernetes Operator
+ </label>
+
+ <div class="md-nav__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/." class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Home
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/installation/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Installation
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/downloads/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Downloads
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/user-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ User Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/architecture/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Architecture
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/internals/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Internals
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/api-reference/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ API Reference
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/security/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Security
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/superset-kubernetes-operator/developer-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Developer Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+
+ <article class="md-content__inner md-typeset">
+
+ <h1>404 - Not found</h1>
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
+ Back to top
+</button>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+
+
+
+ <script id="__config" type="application/json">{"annotate": null, "base": "/superset-kubernetes-operator/", "features": ["content.code.copy", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight"], "search": "/superset-kubernetes-operator/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search [...]
+
+
+ <script src="/superset-kubernetes-operator/assets/javascripts/bundle.79ae519e.min.js"></script>
+
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/api-reference/index.html b/api-reference/index.html
new file mode 100644
index 0000000..0c79800
--- /dev/null
+++ b/api-reference/index.html
@@ -0,0 +1,5516 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <meta name="description" content="Kubernetes operator for deploying and managing Apache Superset">
+
+
+
+ <link rel="canonical" href="https://apache.github.io/superset-kubernetes-operator/api-reference/">
+
+
+ <link rel="prev" href="../internals/">
+
+
+ <link rel="next" href="../security/">
+
+
+
+
+
+ <link rel="icon" href="../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
+
+
+
+ <title>API Reference - Apache Superset Kubernetes Operator</title>
+
+
+
+ <link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
+
+
+ <link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+ </head>
+
+
+
+
+
+
+
+
+
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#api-reference" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href=".." title="Apache Superset Kubernetes Operator" class="md-header__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Apache Superset Kubernetes Operator
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ API Reference
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <form class="md-header__option" data-md-component="palette">
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
+
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
+
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+</form>
+
+
+
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.get [...]
+
+
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+
+ <div class="md-header__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href=".." title="Apache Superset Kubernetes Operator" class="md-nav__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ Apache Superset Kubernetes Operator
+ </label>
+
+ <div class="md-nav__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href=".." class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Home
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../installation/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Installation
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../downloads/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Downloads
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../user-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ User Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../architecture/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Architecture
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../internals/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Internals
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="__toc">
+
+
+
+ <span class="md-ellipsis">
+
+
+ API Reference
+
+
+
+ </span>
+
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+
+ <span class="md-ellipsis">
+
+
+ API Reference
+
+
+
+ </span>
+
+
+
+ </a>
+
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#packages" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Packages
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetapacheorgv1alpha1" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ superset.apache.org/v1alpha1
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="superset.apache.org/v1alpha1">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#resource-types" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Resource Types
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Resource Types">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#adminuserspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ AdminUserSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#autoscalingspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ AutoscalingSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celerybeatcomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryBeatComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celeryflowercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryFlowerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celeryworkercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryWorkerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#childcomponentstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ChildComponentStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentrefstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentRefStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentservicespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentServiceSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentstatusmap" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentStatusMap
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#containertemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ContainerTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#deploymenttemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ DeploymentTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#flatcomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ FlatComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gatewayspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ GatewaySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#imageoverridespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ImageOverrideSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#imagespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ImageSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingresshost" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressHost
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingresspath" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressPath
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingressspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#initspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ InitSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#inittaskstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ InitTaskStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#mcpservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ McpServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#metastorespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ MetastoreSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#monitoringspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ MonitoringSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#networkpolicyspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ NetworkPolicySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#networkingspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ NetworkingSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#pdbspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PDBSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#podretentionspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PodRetentionSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#podtemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PodTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#scalablecomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ScalableComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#serviceaccountspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ServiceAccountSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#servicemonitorspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ServiceMonitorSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#superset" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Superset
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeat" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeat
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeatspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeatSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeatstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeatStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflower" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlower
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflowerspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlowerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflowerstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlowerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworker" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorker
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworkerspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorkerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworkerstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorkerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinit" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInit
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinitspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInitSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinitstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInitStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeycachespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyCacheSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyceleryspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyCelerySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyresultsbackendspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyResultsBackendSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeysslspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeySSLSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#webservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ WebServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#websocketservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ WebsocketServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../security/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Security
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../developer-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Developer Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#packages" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Packages
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetapacheorgv1alpha1" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ superset.apache.org/v1alpha1
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="superset.apache.org/v1alpha1">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#resource-types" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Resource Types
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Resource Types">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#adminuserspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ AdminUserSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#autoscalingspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ AutoscalingSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celerybeatcomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryBeatComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celeryflowercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryFlowerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#celeryworkercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CeleryWorkerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#childcomponentstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ChildComponentStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentrefstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentRefStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentservicespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentServiceSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#componentstatusmap" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ComponentStatusMap
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#containertemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ContainerTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#deploymenttemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ DeploymentTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#flatcomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ FlatComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gatewayspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ GatewaySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#imageoverridespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ImageOverrideSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#imagespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ImageSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingresshost" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressHost
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingresspath" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressPath
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#ingressspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ IngressSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#initspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ InitSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#inittaskstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ InitTaskStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#mcpservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ McpServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#metastorespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ MetastoreSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#monitoringspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ MonitoringSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#networkpolicyspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ NetworkPolicySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#networkingspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ NetworkingSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#pdbspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PDBSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#podretentionspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PodRetentionSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#podtemplate" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ PodTemplate
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#scalablecomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ScalableComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#serviceaccountspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ServiceAccountSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#servicemonitorspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ServiceMonitorSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#superset" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Superset
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeat" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeat
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeatspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeatSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetcelerybeatstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryBeatStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflower" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlower
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflowerspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlowerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryflowerstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryFlowerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworker" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorker
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworkerspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorkerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetceleryworkerstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetCeleryWorkerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinit" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInit
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinitspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInitSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetinitstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetInitStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetmcpserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetMcpServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServer
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserverspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServerSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#supersetwebsocketserverstatus" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ SupersetWebsocketServerStatus
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeycachespec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyCacheSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyceleryspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyCelerySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyresultsbackendspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeyResultsBackendSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeysslspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeySSLSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#valkeyspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ ValkeySpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#webservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ WebServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#websocketservercomponentspec" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ WebsocketServerComponentSpec
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+
+ <article class="md-content__inner md-typeset">
+
+
+
+
+
+
+
+
+<h1 id="api-reference">API Reference<a class="headerlink" href="#api-reference" title="Permanent link">¶</a></h1>
+<h2 id="packages">Packages<a class="headerlink" href="#packages" title="Permanent link">¶</a></h2>
+<ul>
+<li><a href="#supersetapacheorgv1alpha1">superset.apache.org/v1alpha1</a></li>
+</ul>
+<h2 id="supersetapacheorgv1alpha1">superset.apache.org/v1alpha1<a class="headerlink" href="#supersetapacheorgv1alpha1" title="Permanent link">¶</a></h2>
+<p>Package v1alpha1 contains API Schema definitions for the superset v1alpha1 API group.</p>
+<h3 id="resource-types">Resource Types<a class="headerlink" href="#resource-types" title="Permanent link">¶</a></h3>
+<ul>
+<li><a href="#superset">Superset</a></li>
+<li><a href="#supersetcelerybeat">SupersetCeleryBeat</a></li>
+<li><a href="#supersetceleryflower">SupersetCeleryFlower</a></li>
+<li><a href="#supersetceleryworker">SupersetCeleryWorker</a></li>
+<li><a href="#supersetinit">SupersetInit</a></li>
+<li><a href="#supersetmcpserver">SupersetMcpServer</a></li>
+<li><a href="#supersetwebserver">SupersetWebServer</a></li>
+<li><a href="#supersetwebsocketserver">SupersetWebsocketServer</a></li>
+</ul>
+<h4 id="adminuserspec">AdminUserSpec<a class="headerlink" href="#adminuserspec" title="Permanent link">¶</a></h4>
+<p>AdminUserSpec defines admin user credentials for dev-mode initialization.</p>
+<p><em>Appears in:</em>
+- <a href="#initspec">InitSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>username</code> <em>string</em></td>
+<td>Admin username.</td>
+<td>admin</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>password</code> <em>string</em></td>
+<td>Admin password. Stored as plain-text env var in dev mode.</td>
+<td>admin</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>firstName</code> <em>string</em></td>
+<td>Admin first name.</td>
+<td>Superset</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>lastName</code> <em>string</em></td>
+<td>Admin last name.</td>
+<td>Admin</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>email</code> <em>string</em></td>
+<td>Admin email.</td>
+<td>admin@example.com</td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="autoscalingspec">AutoscalingSpec<a class="headerlink" href="#autoscalingspec" title="Permanent link">¶</a></h4>
+<p>AutoscalingSpec configures a HorizontalPodAutoscaler.</p>
+<p><em>Appears in:</em>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#flatcomponentspec">FlatComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#scalablecomponentspec">ScalableComponentSpec</a>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetspec">SupersetSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>minReplicas</code> <em>integer</em></td>
+<td>Minimum replica count (defaults to 1).</td>
+<td></td>
+<td>Minimum: 1 <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>maxReplicas</code> <em>integer</em></td>
+<td>Maximum replica count; HPA will not scale above this.</td>
+<td></td>
+<td>Maximum: 100 <br />Minimum: 1 <br /></td>
+</tr>
+<tr>
+<td><code>metrics</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#metricspec-v2-autoscaling">MetricSpec</a> array</em></td>
+<td>Metrics for the HPA. Supports CPU, memory, custom, and external metrics.<br />When empty, Kubernetes defaults to 80% average CPU utilization.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="celerybeatcomponentspec">CeleryBeatComponentSpec<a class="headerlink" href="#celerybeatcomponentspec" title="Permanent link">¶</a></h4>
+<p>CeleryBeatComponentSpec defines the celery beat component on the parent CRD.
+The controller forces replicas=1 regardless of spec.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment-level overrides (strategy, revision history). Always enforces replicas=1.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod and container template for Celery beat pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-component raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="celeryflowercomponentspec">CeleryFlowerComponentSpec<a class="headerlink" href="#celeryflowercomponentspec" title="Permanent link">¶</a></h4>
+<p>CeleryFlowerComponentSpec defines the celery flower component on the parent CRD.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-component raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration (type, port, annotations).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="celeryworkercomponentspec">CeleryWorkerComponentSpec<a class="headerlink" href="#celeryworkercomponentspec" title="Permanent link">¶</a></h4>
+<p>CeleryWorkerComponentSpec defines the celery worker component on the parent CRD.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-component raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="childcomponentstatus">ChildComponentStatus<a class="headerlink" href="#childcomponentstatus" title="Permanent link">¶</a></h4>
+<p>ChildComponentStatus reports the operational state of a child component.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetcelerybeatstatus">SupersetCeleryBeatStatus</a>
+- <a href="#supersetceleryflowerstatus">SupersetCeleryFlowerStatus</a>
+- <a href="#supersetceleryworkerstatus">SupersetCeleryWorkerStatus</a>
+- <a href="#supersetmcpserverstatus">SupersetMcpServerStatus</a>
+- <a href="#supersetwebserverstatus">SupersetWebServerStatus</a>
+- <a href="#supersetwebsocketserverstatus">SupersetWebsocketServerStatus</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="componentrefstatus">ComponentRefStatus<a class="headerlink" href="#componentrefstatus" title="Permanent link">¶</a></h4>
+<p>ComponentRefStatus holds the status summary of a child component.</p>
+<p><em>Appears in:</em>
+- <a href="#componentstatusmap">ComponentStatusMap</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>ref</code> <em>string</em></td>
+<td>Reference to the child CR.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Config checksum on the child.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="componentservicespec">ComponentServiceSpec<a class="headerlink" href="#componentservicespec" title="Permanent link">¶</a></h4>
+<p>ComponentServiceSpec defines the Service configuration for a component.</p>
+<p><em>Appears in:</em>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>type</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#servicetype-v1-core">ServiceType</a></em></td>
+<td>Service type (ClusterIP, NodePort, LoadBalancer).</td>
+<td>ClusterIP</td>
+<td>Enum: [ClusterIP NodePort LoadBalancer] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>port</code> <em>integer</em></td>
+<td>Service port exposed to clients. Defaults to the component's standard port (8088 for web server, 5555 for Flower).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>nodePort</code> <em>integer</em></td>
+<td>Fixed NodePort number when type=NodePort (30000-32767). If omitted, Kubernetes auto-assigns.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>annotations</code> <em>object (keys:string, values:string)</em></td>
+<td>Service annotations (e.g., for cloud load balancer configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>labels</code> <em>object (keys:string, values:string)</em></td>
+<td>Service labels; merged with operator-managed labels.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>gatewayPath</code> <em>string</em></td>
+<td>URL path prefix for this component's HTTPRoute rule.<br />Only used when spec.networking.gateway is set.<br />Defaults: /ws (websocket), /mcp (MCP server), /flower (Celery Flower).</td>
+<td></td>
+<td>Pattern: <code>^/[a-zA-Z0-9/_.-]+$</code> <br />Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="componentspec">ComponentSpec<a class="headerlink" href="#componentspec" title="Permanent link">¶</a></h4>
+<p>ComponentSpec defines per-component identity fields.
+Embedded by all component specs except InitSpec.</p>
+<p><em>Appears in:</em>
+- <a href="#celerybeatcomponentspec">CeleryBeatComponentSpec</a>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="componentstatusmap">ComponentStatusMap<a class="headerlink" href="#componentstatusmap" title="Permanent link">¶</a></h4>
+<p>ComponentStatusMap holds status for each component.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetstatus">SupersetStatus</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>webServer</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryWorker</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryBeat</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryFlower</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>websocketServer</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>mcpServer</code> <em><a href="#componentrefstatus">ComponentRefStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="containertemplate">ContainerTemplate<a class="headerlink" href="#containertemplate" title="Permanent link">¶</a></h4>
+<p>ContainerTemplate configures fields on the main Superset container.</p>
+<p><em>Appears in:</em>
+- <a href="#podtemplate">PodTemplate</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>resources</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#resourcerequirements-v1-core">ResourceRequirements</a></em></td>
+<td>Resource requirements (CPU, memory).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>env</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#envvar-v1-core">EnvVar</a> array</em></td>
+<td>Environment variables.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>envFrom</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#envfromsource-v1-core">EnvFromSource</a> array</em></td>
+<td>Environment variable sources (ConfigMaps, Secrets).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>volumeMounts</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#volumemount-v1-core">VolumeMount</a> array</em></td>
+<td>Volume mounts for the main container.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>ports</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#containerport-v1-core">ContainerPort</a> array</em></td>
+<td>Container ports. Replaces operator defaults when set.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>securityContext</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#securitycontext-v1-core">SecurityContext</a></em></td>
+<td>Container-level security context.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>command</code> <em>string array</em></td>
+<td>Container entrypoint override.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>args</code> <em>string array</em></td>
+<td>Container arguments override.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>livenessProbe</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#probe-v1-core">Probe</a></em></td>
+<td>Liveness probe; container is restarted when the probe fails.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>readinessProbe</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#probe-v1-core">Probe</a></em></td>
+<td>Readiness probe; pod is removed from Service endpoints when the probe fails.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>startupProbe</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#probe-v1-core">Probe</a></em></td>
+<td>Startup probe; liveness and readiness probes are deferred until this probe succeeds.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>lifecycle</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#lifecycle-v1-core">Lifecycle</a></em></td>
+<td>Lifecycle hooks for the main container.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="deploymenttemplate">DeploymentTemplate<a class="headerlink" href="#deploymenttemplate" title="Permanent link">¶</a></h4>
+<p>DeploymentTemplate configures Kubernetes Deployment-level fields for
+operator-managed Deployments. Pod and container configuration is in
+the sibling PodTemplate field.</p>
+<p><em>Appears in:</em>
+- <a href="#celerybeatcomponentspec">CeleryBeatComponentSpec</a>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#flatcomponentspec">FlatComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#scalablecomponentspec">ScalableComponentSpec</a>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetspec">SupersetSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>revisionHistoryLimit</code> <em>integer</em></td>
+<td>Number of old ReplicaSets to retain for rollback.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>minReadySeconds</code> <em>integer</em></td>
+<td>Minimum seconds a pod must be ready before considered available.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>progressDeadlineSeconds</code> <em>integer</em></td>
+<td>Maximum seconds for a deployment to make progress before considered failed.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>strategy</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#deploymentstrategy-v1-apps">DeploymentStrategy</a></em></td>
+<td>Deployment update strategy.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="flatcomponentspec">FlatComponentSpec<a class="headerlink" href="#flatcomponentspec" title="Permanent link">¶</a></h4>
+<p>FlatComponentSpec defines the common fields for all fully-resolved child specs.
+This is embedded (inlined) in each child CRD spec type.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="gatewayspec">GatewaySpec<a class="headerlink" href="#gatewayspec" title="Permanent link">¶</a></h4>
+<p>GatewaySpec defines HTTPRoute configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#networkingspec">NetworkingSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>gatewayRef</code> <em><a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference">ParentReference</a></em></td>
+<td>Reference to the Gateway resource to attach the HTTPRoute to.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>hostnames</code> <em><a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.Hostname">Hostname</a> array</em></td>
+<td>Hostnames for the HTTPRoute (e.g., "superset.example.com").</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>annotations</code> <em>object (keys:string, values:string)</em></td>
+<td>HTTPRoute annotations.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>labels</code> <em>object (keys:string, values:string)</em></td>
+<td>HTTPRoute labels.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="imageoverridespec">ImageOverrideSpec<a class="headerlink" href="#imageoverridespec" title="Permanent link">¶</a></h4>
+<p>ImageOverrideSpec allows a component to override specific image fields.
+Unset fields inherit from spec.image.</p>
+<p><em>Appears in:</em>
+- <a href="#celerybeatcomponentspec">CeleryBeatComponentSpec</a>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#componentspec">ComponentSpec</a>
+- <a href="#initspec">InitSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>tag</code> <em>string</em></td>
+<td>Override the image tag for this component; inherits from spec.image.tag if omitted.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>repository</code> <em>string</em></td>
+<td>Override the image repository for this component; inherits from spec.image.repository if omitted.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="imagespec">ImageSpec<a class="headerlink" href="#imagespec" title="Permanent link">¶</a></h4>
+<p>ImageSpec defines the container image configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#flatcomponentspec">FlatComponentSpec</a>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetspec">SupersetSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>repository</code> <em>string</em></td>
+<td>Container image repository.</td>
+<td>apachesuperset.docker.scarf.sh/apache/superset</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>tag</code> <em>string</em></td>
+<td>Image tag.</td>
+<td></td>
+<td>MinLength: 1 <br /></td>
+</tr>
+<tr>
+<td><code>pullPolicy</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#pullpolicy-v1-core">PullPolicy</a></em></td>
+<td>Image pull policy (IfNotPresent, Always, Never).</td>
+<td>IfNotPresent</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>pullSecrets</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#localobjectreference-v1-core">LocalObjectReference</a> array</em></td>
+<td>References to Secrets for pulling images from private registries.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="ingresshost">IngressHost<a class="headerlink" href="#ingresshost" title="Permanent link">¶</a></h4>
+<p>IngressHost defines a host rule for the Ingress.</p>
+<p><em>Appears in:</em>
+- <a href="#ingressspec">IngressSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>host</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>paths</code> <em><a href="#ingresspath">IngressPath</a> array</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="ingresspath">IngressPath<a class="headerlink" href="#ingresspath" title="Permanent link">¶</a></h4>
+<p>IngressPath defines a path rule for an Ingress host.</p>
+<p><em>Appears in:</em>
+- <a href="#ingresshost">IngressHost</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>path</code> <em>string</em></td>
+<td></td>
+<td>/</td>
+<td></td>
+</tr>
+<tr>
+<td><code>pathType</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#pathtype-v1-networking">PathType</a></em></td>
+<td></td>
+<td>Prefix</td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="ingressspec">IngressSpec<a class="headerlink" href="#ingressspec" title="Permanent link">¶</a></h4>
+<p>IngressSpec defines Ingress configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#networkingspec">NetworkingSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>className</code> <em>string</em></td>
+<td>IngressClass name (e.g., "nginx") that determines which controller processes this Ingress.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>host</code> <em>string</em></td>
+<td>Primary hostname for the Ingress rule (e.g., "superset.example.com").</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>annotations</code> <em>object (keys:string, values:string)</em></td>
+<td>Ingress annotations (e.g., for TLS, auth, or controller-specific configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>labels</code> <em>object (keys:string, values:string)</em></td>
+<td>Ingress labels.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>hosts</code> <em><a href="#ingresshost">IngressHost</a> array</em></td>
+<td>Additional host/path rules beyond the primary host.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>tls</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#ingresstls-v1-networking">IngressTLS</a> array</em></td>
+<td>TLS configuration (certificate secrets and hostnames).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="initspec">InitSpec<a class="headerlink" href="#initspec" title="Permanent link">¶</a></h4>
+<p>InitSpec defines initialization configuration. The init pod runs a single
+command (default: superset db upgrade && superset init) that must complete
+before any component is deployed.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod and container template for the init pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-init raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image override for init pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>command</code> <em>string array</em></td>
+<td>Command to execute during initialization. When empty, the operator<br />constructs the command from base steps (db upgrade + init) and any<br />adminUser/loadExamples options. Mutually exclusive with adminUser<br />and loadExamples.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>disabled</code> <em>boolean</em></td>
+<td>Set to true to skip initialization entirely.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>adminUser</code> <em><a href="#adminuserspec">AdminUserSpec</a></em></td>
+<td>Admin user to create during initialization. Only allowed in dev mode.<br />When set, the operator appends a superset fab create-admin step to the init command.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>loadExamples</code> <em>boolean</em></td>
+<td>Load example dashboards and data during initialization. Only allowed in dev mode.<br />When true, the operator appends a superset load-examples step to the init command.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>timeout</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#duration-v1-meta">Duration</a></em></td>
+<td>Maximum timeout for the init pod. Default: 300s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>maxRetries</code> <em>integer</em></td>
+<td>Maximum number of retries before permanent failure. Default: 3.</td>
+<td>3</td>
+<td>Minimum: 1 <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podRetention</code> <em><a href="#podretentionspec">PodRetentionSpec</a></em></td>
+<td>Pod retention policy for completed init pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="inittaskstatus">InitTaskStatus<a class="headerlink" href="#inittaskstatus" title="Permanent link">¶</a></h4>
+<p>InitTaskStatus reports the status of the init task.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetstatus">SupersetStatus</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>state</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Enum: [Pending Running Complete Failed] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>revision</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>previousRevision</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>startedAt</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta">Time</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>completedAt</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta">Time</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>duration</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>attempts</code> <em>integer</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podName</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>message</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="mcpservercomponentspec">McpServerComponentSpec<a class="headerlink" href="#mcpservercomponentspec" title="Permanent link">¶</a></h4>
+<p>McpServerComponentSpec defines the MCP server component on the parent CRD.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-component raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration (type, port, annotations).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="metastorespec">MetastoreSpec<a class="headerlink" href="#metastorespec" title="Permanent link">¶</a></h4>
+<p>MetastoreSpec defines the database connection for Superset's metastore.
+Either a URI (passthrough) or structured fields (host, database, etc.) can be used.
+They are mutually exclusive.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>uri</code> <em>string</em></td>
+<td>Full SQLAlchemy database URI. Mutually exclusive with structured fields and uriFrom.<br />In prod mode, CRD validation rejects plain text URIs — use uriFrom to reference a Kubernetes Secret.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>uriFrom</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#secretkeyselector-v1-core">SecretKeySelector</a></em></td>
+<td>Reference to a Secret key containing the full SQLAlchemy URI.<br />Mutually exclusive with uri and structured fields.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>type</code> <em>string</em></td>
+<td>Database type. Determines the SQLAlchemy driver.</td>
+<td>postgresql</td>
+<td>Enum: [postgresql mysql] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>host</code> <em>string</em></td>
+<td>Database hostname.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>port</code> <em>integer</em></td>
+<td>Database port. Defaults per driver (5432 for postgresql, 3306 for mysql).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>database</code> <em>string</em></td>
+<td>Database name.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>username</code> <em>string</em></td>
+<td>Database username.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>password</code> <em>string</em></td>
+<td>Database password. In prod mode, CRD validation rejects plain text passwords — use passwordFrom to reference a Kubernetes Secret.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>passwordFrom</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#secretkeyselector-v1-core">SecretKeySelector</a></em></td>
+<td>Reference to a Secret key containing the database password.<br />Mutually exclusive with password.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="monitoringspec">MonitoringSpec<a class="headerlink" href="#monitoringspec" title="Permanent link">¶</a></h4>
+<p>MonitoringSpec defines Prometheus monitoring configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>serviceMonitor</code> <em><a href="#servicemonitorspec">ServiceMonitorSpec</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="networkpolicyspec">NetworkPolicySpec<a class="headerlink" href="#networkpolicyspec" title="Permanent link">¶</a></h4>
+<p>NetworkPolicySpec defines network segmentation configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>extraIngress</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#networkpolicyingressrule-v1-networking">NetworkPolicyIngressRule</a> array</em></td>
+<td>Additional ingress rules appended to the operator-generated NetworkPolicy (e.g., allow traffic from monitoring namespace).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>extraEgress</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#networkpolicyegressrule-v1-networking">NetworkPolicyEgressRule</a> array</em></td>
+<td>Additional egress rules appended to the operator-generated NetworkPolicy.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="networkingspec">NetworkingSpec<a class="headerlink" href="#networkingspec" title="Permanent link">¶</a></h4>
+<p>NetworkingSpec defines external access configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>gateway</code> <em><a href="#gatewayspec">GatewaySpec</a></em></td>
+<td>Gateway API HTTPRoute configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>ingress</code> <em><a href="#ingressspec">IngressSpec</a></em></td>
+<td>Ingress configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="pdbspec">PDBSpec<a class="headerlink" href="#pdbspec" title="Permanent link">¶</a></h4>
+<p>PDBSpec configures a PodDisruptionBudget.</p>
+<p><em>Appears in:</em>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#flatcomponentspec">FlatComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#scalablecomponentspec">ScalableComponentSpec</a>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetspec">SupersetSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>minAvailable</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#intorstring-intstr-util">IntOrString</a></em></td>
+<td>Minimum pods that must remain available during voluntary disruptions. Mutually exclusive with maxUnavailable.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>maxUnavailable</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#intorstring-intstr-util">IntOrString</a></em></td>
+<td>Maximum pods allowed to be unavailable during voluntary disruptions. Mutually exclusive with minAvailable.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="podretentionspec">PodRetentionSpec<a class="headerlink" href="#podretentionspec" title="Permanent link">¶</a></h4>
+<p>PodRetentionSpec defines retention behavior for init pods.</p>
+<p><em>Appears in:</em>
+- <a href="#initspec">InitSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>policy</code> <em>string</em></td>
+<td>Retention policy: Delete removes pods after completion, Retain keeps all,<br />RetainOnFailure keeps only failed pods for debugging.</td>
+<td>Delete</td>
+<td>Enum: [Delete Retain RetainOnFailure] <br />Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="podtemplate">PodTemplate<a class="headerlink" href="#podtemplate" title="Permanent link">¶</a></h4>
+<p>PodTemplate configures Kubernetes PodSpec fields for the pod template.</p>
+<p><em>Appears in:</em>
+- <a href="#celerybeatcomponentspec">CeleryBeatComponentSpec</a>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#flatcomponentspec">FlatComponentSpec</a>
+- <a href="#initspec">InitSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#scalablecomponentspec">ScalableComponentSpec</a>
+- <a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a>
+- <a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a>
+- <a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a>
+- <a href="#supersetinitspec">SupersetInitSpec</a>
+- <a href="#supersetmcpserverspec">SupersetMcpServerSpec</a>
+- <a href="#supersetspec">SupersetSpec</a>
+- <a href="#supersetwebserverspec">SupersetWebServerSpec</a>
+- <a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>annotations</code> <em>object (keys:string, values:string)</em></td>
+<td>Pod annotations.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>labels</code> <em>object (keys:string, values:string)</em></td>
+<td>Pod labels (merged with operator-managed labels which cannot be overridden).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>affinity</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#affinity-v1-core">Affinity</a></em></td>
+<td>Pod affinity and anti-affinity rules for scheduling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>tolerations</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#toleration-v1-core">Toleration</a> array</em></td>
+<td>Tolerations for scheduling on tainted nodes.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>nodeSelector</code> <em>object (keys:string, values:string)</em></td>
+<td>Node labels for constraining pod scheduling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>topologySpreadConstraints</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#topologyspreadconstraint-v1-core">TopologySpreadConstraint</a> array</em></td>
+<td>Topology spread constraints for distributing pods across failure domains.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>hostAliases</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#hostalias-v1-core">HostAlias</a> array</em></td>
+<td>Entries added to /etc/hosts in pod containers.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podSecurityContext</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#podsecuritycontext-v1-core">PodSecurityContext</a></em></td>
+<td>Pod-level security context (runAsUser, fsGroup, seccomp, etc.).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>priorityClassName</code> <em>string</em></td>
+<td>Priority class name for pod scheduling priority and preemption.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>volumes</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#volume-v1-core">Volume</a> array</em></td>
+<td>Additional volumes for the pod (mounted via container.volumeMounts).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>sidecars</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#container-v1-core">Container</a> array</em></td>
+<td>Sidecar containers added alongside the main Superset container.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>initContainers</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#container-v1-core">Container</a> array</em></td>
+<td>Init containers run before the main container starts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>terminationGracePeriodSeconds</code> <em>integer</em></td>
+<td>Grace period for pod termination in seconds.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>dnsPolicy</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#dnspolicy-v1-core">DNSPolicy</a></em></td>
+<td>DNS policy for pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>dnsConfig</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#poddnsconfig-v1-core">PodDNSConfig</a></em></td>
+<td>Custom DNS configuration for pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>runtimeClassName</code> <em>string</em></td>
+<td>RuntimeClass for pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>shareProcessNamespace</code> <em>boolean</em></td>
+<td>Share a single process namespace between all containers in a pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>enableServiceLinks</code> <em>boolean</em></td>
+<td>Controls whether service environment variables are injected into pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>container</code> <em><a href="#containertemplate">ContainerTemplate</a></em></td>
+<td>Main container configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="scalablecomponentspec">ScalableComponentSpec<a class="headerlink" href="#scalablecomponentspec" title="Permanent link">¶</a></h4>
+<p>ScalableComponentSpec provides deployment template and scaling fields.
+Embedded by scalable components (WebServer, CeleryWorker, CeleryFlower,
+WebsocketServer, McpServer). Non-scalable components (CeleryBeat, Init)
+use DeploymentTemplate or PodTemplate directly.</p>
+<p><em>Appears in:</em>
+- <a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a>
+- <a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a>
+- <a href="#mcpservercomponentspec">McpServerComponentSpec</a>
+- <a href="#webservercomponentspec">WebServerComponentSpec</a>
+- <a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="serviceaccountspec">ServiceAccountSpec<a class="headerlink" href="#serviceaccountspec" title="Permanent link">¶</a></h4>
+<p>ServiceAccountSpec defines ServiceAccount configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>create</code> <em>boolean</em></td>
+<td>When true (default), the operator creates a ServiceAccount. When false, it references an existing one.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>name</code> <em>string</em></td>
+<td>ServiceAccount name. Created by the operator when create=true; must pre-exist when create=false.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>annotations</code> <em>object (keys:string, values:string)</em></td>
+<td>ServiceAccount annotations (e.g., for IAM role bindings on cloud platforms).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="servicemonitorspec">ServiceMonitorSpec<a class="headerlink" href="#servicemonitorspec" title="Permanent link">¶</a></h4>
+<p>ServiceMonitorSpec defines the ServiceMonitor configuration.</p>
+<p><em>Appears in:</em>
+- <a href="#monitoringspec">MonitoringSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>interval</code> <em>string</em></td>
+<td>Scrape interval (e.g., "30s"). How often Prometheus scrapes the web server metrics endpoint.</td>
+<td>30s</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>labels</code> <em>object (keys:string, values:string)</em></td>
+<td>Labels for Prometheus ServiceMonitor discovery (must match your Prometheus selector).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>scrapeTimeout</code> <em>string</em></td>
+<td>Maximum time to wait for a scrape response before timing out.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="superset">Superset<a class="headerlink" href="#superset" title="Permanent link">¶</a></h4>
+<p>Superset is the top-level resource representing a complete Superset deployment.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>Superset</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetspec">SupersetSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetstatus">SupersetStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetcelerybeat">SupersetCeleryBeat<a class="headerlink" href="#supersetcelerybeat" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryBeat is the Schema for the supersetcelerybeats API.
+It manages the Celery beat scheduler Deployment (singleton).</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetCeleryBeat</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetcelerybeatspec">SupersetCeleryBeatSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetcelerybeatstatus">SupersetCeleryBeatStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetcelerybeatspec">SupersetCeleryBeatSpec<a class="headerlink" href="#supersetcelerybeatspec" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryBeatSpec is the fully-resolved, flat spec for celery beat.
+Beat is always a singleton (1 replica).</p>
+<p><em>Appears in:</em>
+- <a href="#supersetcelerybeat">SupersetCeleryBeat</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>The fully rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Checksum for rolling restarts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetcelerybeatstatus">SupersetCeleryBeatStatus<a class="headerlink" href="#supersetcelerybeatstatus" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryBeatStatus defines the observed state of SupersetCeleryBeat.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetcelerybeat">SupersetCeleryBeat</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryflower">SupersetCeleryFlower<a class="headerlink" href="#supersetceleryflower" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryFlower is the Schema for the supersetceleryflowers API.
+It manages the Celery Flower monitoring UI Deployment and Service.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetCeleryFlower</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetceleryflowerspec">SupersetCeleryFlowerSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetceleryflowerstatus">SupersetCeleryFlowerStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryflowerspec">SupersetCeleryFlowerSpec<a class="headerlink" href="#supersetceleryflowerspec" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryFlowerSpec is the fully-resolved, flat spec for celery flower.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetceleryflower">SupersetCeleryFlower</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>The fully rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Checksum for rolling restarts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryflowerstatus">SupersetCeleryFlowerStatus<a class="headerlink" href="#supersetceleryflowerstatus" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryFlowerStatus defines the observed state of SupersetCeleryFlower.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetceleryflower">SupersetCeleryFlower</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryworker">SupersetCeleryWorker<a class="headerlink" href="#supersetceleryworker" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryWorker is the Schema for the supersetceleryworkers API.
+It manages the Celery worker Deployment.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetCeleryWorker</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetceleryworkerspec">SupersetCeleryWorkerSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetceleryworkerstatus">SupersetCeleryWorkerStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryworkerspec">SupersetCeleryWorkerSpec<a class="headerlink" href="#supersetceleryworkerspec" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryWorkerSpec is the fully-resolved, flat spec for a celery worker.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetceleryworker">SupersetCeleryWorker</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>The fully rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Checksum for rolling restarts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetceleryworkerstatus">SupersetCeleryWorkerStatus<a class="headerlink" href="#supersetceleryworkerstatus" title="Permanent link">¶</a></h4>
+<p>SupersetCeleryWorkerStatus defines the observed state of SupersetCeleryWorker.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetceleryworker">SupersetCeleryWorker</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetinit">SupersetInit<a class="headerlink" href="#supersetinit" title="Permanent link">¶</a></h4>
+<p>SupersetInit is the Schema for the supersetinits API.
+It manages the initialization lifecycle (database migrations, init commands).</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetInit</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetinitspec">SupersetInitSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetinitstatus">SupersetInitStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetinitspec">SupersetInitSpec<a class="headerlink" href="#supersetinitspec" title="Permanent link">¶</a></h4>
+<p>SupersetInitSpec defines the fully-resolved spec for initialization.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetinit">SupersetInit</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Config checksum for detecting config changes.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>maxRetries</code> <em>integer</em></td>
+<td>Maximum number of retries before permanent failure.</td>
+<td>3</td>
+<td>Minimum: 1 <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>timeout</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#duration-v1-meta">Duration</a></em></td>
+<td>Maximum timeout per init pod attempt.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podRetention</code> <em><a href="#podretentionspec">PodRetentionSpec</a></em></td>
+<td>Pod retention policy for completed init pods.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetinitstatus">SupersetInitStatus<a class="headerlink" href="#supersetinitstatus" title="Permanent link">¶</a></h4>
+<p>SupersetInitStatus reports the status of initialization.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetinit">SupersetInit</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>state</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Enum: [Pending Running Complete Failed] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podName</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>startedAt</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta">Time</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>completedAt</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#time-v1-meta">Time</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>duration</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>attempts</code> <em>integer</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>message</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Config checksum that was active when init last completed.<br />Used to detect config changes and trigger re-initialization.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetmcpserver">SupersetMcpServer<a class="headerlink" href="#supersetmcpserver" title="Permanent link">¶</a></h4>
+<p>SupersetMcpServer is the Schema for the supersetmcpservers API.
+It manages the FastMCP server Deployment and Service.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetMcpServer</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetmcpserverspec">SupersetMcpServerSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetmcpserverstatus">SupersetMcpServerStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetmcpserverspec">SupersetMcpServerSpec<a class="headerlink" href="#supersetmcpserverspec" title="Permanent link">¶</a></h4>
+<p>SupersetMcpServerSpec is the fully-resolved, flat spec for the MCP server.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetmcpserver">SupersetMcpServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>The fully rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Checksum for rolling restarts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetmcpserverstatus">SupersetMcpServerStatus<a class="headerlink" href="#supersetmcpserverstatus" title="Permanent link">¶</a></h4>
+<p>SupersetMcpServerStatus defines the observed state of SupersetMcpServer.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetmcpserver">SupersetMcpServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetspec">SupersetSpec<a class="headerlink" href="#supersetspec" title="Permanent link">¶</a></h4>
+<p>SupersetSpec defines the desired state of a Superset deployment.</p>
+<p><em>Appears in:</em>
+- <a href="#superset">Superset</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Image configuration inherited by all components.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template defaults inherited by all components (field-level merge).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template defaults inherited by all components (field-level merge).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Default replica count for all scalable components; per-component replicas override this.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Default autoscaling for all scalable components (component-level overrides this).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>Default pod disruption budget for all scalable components (component-level overrides this).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>environment</code> <em>string</em></td>
+<td>Environment mode: "dev" or "prod". Controls validation strictness.<br />In prod mode, CRD validation rejects plain text secrets (secretKey, metastore.uri, metastore.password).</td>
+<td>prod</td>
+<td>Enum: [dev prod] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>secretKey</code> <em>string</em></td>
+<td>Plain text secret key for session signing. Only allowed in dev mode.<br />In prod, use secretKeyFrom to reference a Kubernetes Secret.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>secretKeyFrom</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#secretkeyselector-v1-core">SecretKeySelector</a></em></td>
+<td>Reference to a Secret key containing the secret key for session signing.<br />Mutually exclusive with secretKey.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>metastore</code> <em><a href="#metastorespec">MetastoreSpec</a></em></td>
+<td>Metastore database connection configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>valkey</code> <em><a href="#valkeyspec">ValkeySpec</a></em></td>
+<td>Valkey cache, broker, and results backend configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Raw Python appended after operator-generated superset_config.py.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>webServer</code> <em><a href="#webservercomponentspec">WebServerComponentSpec</a></em></td>
+<td>Web server (gunicorn) component. Presence enables it; absence disables.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryWorker</code> <em><a href="#celeryworkercomponentspec">CeleryWorkerComponentSpec</a></em></td>
+<td>Celery async task worker component. Requires Valkey for broker/backend.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryBeat</code> <em><a href="#celerybeatcomponentspec">CeleryBeatComponentSpec</a></em></td>
+<td>Celery periodic task scheduler (singleton, always 1 replica). Requires Valkey.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryFlower</code> <em><a href="#celeryflowercomponentspec">CeleryFlowerComponentSpec</a></em></td>
+<td>Celery Flower monitoring UI component.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>websocketServer</code> <em><a href="#websocketservercomponentspec">WebsocketServerComponentSpec</a></em></td>
+<td>WebSocket server for real-time updates (Node.js, no Python config).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>mcpServer</code> <em><a href="#mcpservercomponentspec">McpServerComponentSpec</a></em></td>
+<td>FastMCP server component for AI tooling integration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>init</code> <em><a href="#initspec">InitSpec</a></em></td>
+<td>Initialization configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>networking</code> <em><a href="#networkingspec">NetworkingSpec</a></em></td>
+<td>Networking configuration (Ingress or Gateway API).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>monitoring</code> <em><a href="#monitoringspec">MonitoringSpec</a></em></td>
+<td>Monitoring configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>networkPolicy</code> <em><a href="#networkpolicyspec">NetworkPolicySpec</a></em></td>
+<td>Network policy configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccount</code> <em><a href="#serviceaccountspec">ServiceAccountSpec</a></em></td>
+<td>ServiceAccount configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>suspend</code> <em>boolean</em></td>
+<td>Suspend stops reconciliation when true.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>forceReload</code> <em>string</em></td>
+<td>ForceReload is an opaque string injected into all pod templates. Changing its value<br />triggers a rolling restart of all components. Use a timestamp or incrementing value<br />(e.g. "2026-04-24T12:00:00Z") to force a restart after rotating referenced Secrets.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetstatus">SupersetStatus<a class="headerlink" href="#supersetstatus" title="Permanent link">¶</a></h4>
+<p>SupersetStatus defines the observed state of Superset.</p>
+<p><em>Appears in:</em>
+- <a href="#superset">Superset</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>components</code> <em><a href="#componentstatusmap">ComponentStatusMap</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>init</code> <em><a href="#inittaskstatus">InitTaskStatus</a></em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>version</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>migrationRevision</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td></td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>phase</code> <em>string</em></td>
+<td>High-level phase.</td>
+<td></td>
+<td>Enum: [Initializing Running Degraded Suspended] <br />Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebserver">SupersetWebServer<a class="headerlink" href="#supersetwebserver" title="Permanent link">¶</a></h4>
+<p>SupersetWebServer is the Schema for the supersetwebservers API.
+It manages the Superset web server (gunicorn) Deployment.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetWebServer</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetwebserverspec">SupersetWebServerSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetwebserverstatus">SupersetWebServerStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebserverspec">SupersetWebServerSpec<a class="headerlink" href="#supersetwebserverspec" title="Permanent link">¶</a></h4>
+<p>SupersetWebServerSpec is the fully-resolved, flat spec for a web server.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetwebserver">SupersetWebServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>The fully rendered superset_config.py content.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>configChecksum</code> <em>string</em></td>
+<td>Checksum stamped as pod template annotation for rolling restarts.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebserverstatus">SupersetWebServerStatus<a class="headerlink" href="#supersetwebserverstatus" title="Permanent link">¶</a></h4>
+<p>SupersetWebServerStatus defines the observed state of SupersetWebServer.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetwebserver">SupersetWebServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebsocketserver">SupersetWebsocketServer<a class="headerlink" href="#supersetwebsocketserver" title="Permanent link">¶</a></h4>
+<p>SupersetWebsocketServer is the Schema for the supersetwebsocketservers API.
+It manages the Superset websocket server Deployment.</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>apiVersion</code> <em>string</em></td>
+<td><code>superset.apache.org/v1alpha1</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>kind</code> <em>string</em></td>
+<td><code>SupersetWebsocketServer</code></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>metadata</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#objectmeta-v1-meta">ObjectMeta</a></em></td>
+<td>Refer to Kubernetes API documentation for fields of <code>metadata</code>.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>spec</code> <em><a href="#supersetwebsocketserverspec">SupersetWebsocketServerSpec</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>status</code> <em><a href="#supersetwebsocketserverstatus">SupersetWebsocketServerStatus</a></em></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebsocketserverspec">SupersetWebsocketServerSpec<a class="headerlink" href="#supersetwebsocketserverspec" title="Permanent link">¶</a></h4>
+<p>SupersetWebsocketServerSpec is the fully-resolved, flat spec for a websocket server.
+The websocket server is a Node.js application — it does NOT use superset_config.py.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetwebsocketserver">SupersetWebsocketServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>image</code> <em><a href="#imagespec">ImageSpec</a></em></td>
+<td>Container image configuration.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count.</td>
+<td>1</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Fully-resolved deployment template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Fully-resolved pod template.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>serviceAccountName</code> <em>string</em></td>
+<td>ServiceAccountName to set on the pod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>Autoscaling configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="supersetwebsocketserverstatus">SupersetWebsocketServerStatus<a class="headerlink" href="#supersetwebsocketserverstatus" title="Permanent link">¶</a></h4>
+<p>SupersetWebsocketServerStatus defines the observed state of SupersetWebsocketServer.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetwebsocketserver">SupersetWebsocketServer</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>ready</code> <em>string</em></td>
+<td>"2/2" format showing ready vs desired replicas.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>conditions</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#condition-v1-meta">Condition</a> array</em></td>
+<td>Standard conditions.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>observedGeneration</code> <em>integer</em></td>
+<td>ObservedGeneration for leader election consistency.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="valkeycachespec">ValkeyCacheSpec<a class="headerlink" href="#valkeycachespec" title="Permanent link">¶</a></h4>
+<p>ValkeyCacheSpec tunes a Superset Flask-Caching backend backed by Valkey.</p>
+<p><em>Appears in:</em>
+- <a href="#valkeyspec">ValkeySpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>disabled</code> <em>boolean</em></td>
+<td>Disable this cache section. When true, the operator does not render<br />this config — Superset falls back to its built-in default.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>database</code> <em>integer</em></td>
+<td>Valkey database number.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>keyPrefix</code> <em>string</em></td>
+<td>Cache key prefix.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>defaultTimeout</code> <em>integer</em></td>
+<td>Default cache timeout in seconds.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="valkeyceleryspec">ValkeyCelerySpec<a class="headerlink" href="#valkeyceleryspec" title="Permanent link">¶</a></h4>
+<p>ValkeyCelerySpec tunes a Celery Valkey connection.</p>
+<p><em>Appears in:</em>
+- <a href="#valkeyspec">ValkeySpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>disabled</code> <em>boolean</em></td>
+<td>Disable this Celery backend. When true, the operator does not render this config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>database</code> <em>integer</em></td>
+<td>Valkey database number.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="valkeyresultsbackendspec">ValkeyResultsBackendSpec<a class="headerlink" href="#valkeyresultsbackendspec" title="Permanent link">¶</a></h4>
+<p>ValkeyResultsBackendSpec tunes the SQL Lab async results backend.</p>
+<p><em>Appears in:</em>
+- <a href="#valkeyspec">ValkeySpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>disabled</code> <em>boolean</em></td>
+<td>Disable the results backend. When true, the operator does not render this config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>database</code> <em>integer</em></td>
+<td>Valkey database number.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>keyPrefix</code> <em>string</em></td>
+<td>Cache key prefix for results.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="valkeysslspec">ValkeySSLSpec<a class="headerlink" href="#valkeysslspec" title="Permanent link">¶</a></h4>
+<p>ValkeySSLSpec configures TLS for the Valkey connection.</p>
+<p><em>Appears in:</em>
+- <a href="#valkeyspec">ValkeySpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>certRequired</code> <em>string</em></td>
+<td>Certificate verification mode.</td>
+<td>required</td>
+<td>Enum: [required optional none] <br />Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>keyFile</code> <em>string</em></td>
+<td>Path to the client private key file (for mTLS).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>certFile</code> <em>string</em></td>
+<td>Path to the client certificate file (for mTLS).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>caCertFile</code> <em>string</em></td>
+<td>Path to the CA certificate file for server verification.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="valkeyspec">ValkeySpec<a class="headerlink" href="#valkeyspec" title="Permanent link">¶</a></h4>
+<p>ValkeySpec configures Valkey as the shared cache backend, Celery message
+broker, and SQL Lab results backend for Superset. When set, all sections
+are enabled with sensible defaults — only host is required.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>host</code> <em>string</em></td>
+<td>Valkey server hostname.</td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td><code>port</code> <em>integer</em></td>
+<td>Valkey server port.</td>
+<td>6379</td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>password</code> <em>string</em></td>
+<td>Plain text password. Only allowed in dev mode — use passwordFrom in prod.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>passwordFrom</code> <em><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#secretkeyselector-v1-core">SecretKeySelector</a></em></td>
+<td>Reference to a Secret key containing the Valkey password.<br />Mutually exclusive with password.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>ssl</code> <em><a href="#valkeysslspec">ValkeySSLSpec</a></em></td>
+<td>SSL/TLS configuration. When set, enables SSL for the Valkey connection.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>cache</code> <em><a href="#valkeycachespec">ValkeyCacheSpec</a></em></td>
+<td>General cache (CACHE_CONFIG). Default: db=1, prefix="superset_", timeout=300s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>dataCache</code> <em><a href="#valkeycachespec">ValkeyCacheSpec</a></em></td>
+<td>Data/query results cache (DATA_CACHE_CONFIG). Default: db=2, prefix="superset_data_", timeout=86400s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>filterStateCache</code> <em><a href="#valkeycachespec">ValkeyCacheSpec</a></em></td>
+<td>Dashboard filter state cache (FILTER_STATE_CACHE_CONFIG). Default: db=3, prefix="superset_filter_", timeout=3600s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>exploreFormDataCache</code> <em><a href="#valkeycachespec">ValkeyCacheSpec</a></em></td>
+<td>Chart builder form state cache (EXPLORE_FORM_DATA_CACHE_CONFIG). Default: db=4, prefix="superset_explore_", timeout=3600s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>thumbnailCache</code> <em><a href="#valkeycachespec">ValkeyCacheSpec</a></em></td>
+<td>Thumbnail cache (THUMBNAIL_CACHE_CONFIG). Default: db=5, prefix="superset_thumbnail_", timeout=3600s.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryBroker</code> <em><a href="#valkeyceleryspec">ValkeyCelerySpec</a></em></td>
+<td>Celery broker (CeleryConfig.broker_url). Default: db=0.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>celeryResultBackend</code> <em><a href="#valkeyceleryspec">ValkeyCelerySpec</a></em></td>
+<td>Celery result backend (CeleryConfig.result_backend). Default: db=0.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>resultsBackend</code> <em><a href="#valkeyresultsbackendspec">ValkeyResultsBackendSpec</a></em></td>
+<td>SQL Lab async results backend (RESULTS_BACKEND). Default: db=6, prefix="superset_results_".</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="webservercomponentspec">WebServerComponentSpec<a class="headerlink" href="#webservercomponentspec" title="Permanent link">¶</a></h4>
+<p>WebServerComponentSpec defines the web server component on the parent CRD.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>config</code> <em>string</em></td>
+<td>Per-component raw Python appended after top-level config.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration (type, port, annotations).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+<h4 id="websocketservercomponentspec">WebsocketServerComponentSpec<a class="headerlink" href="#websocketservercomponentspec" title="Permanent link">¶</a></h4>
+<p>WebsocketServerComponentSpec defines the websocket server component on the parent CRD.</p>
+<p><em>Appears in:</em>
+- <a href="#supersetspec">SupersetSpec</a></p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+<th>Default</th>
+<th>Validation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>deploymentTemplate</code> <em><a href="#deploymenttemplate">DeploymentTemplate</a></em></td>
+<td>Deployment template (Deployment-level configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podTemplate</code> <em><a href="#podtemplate">PodTemplate</a></em></td>
+<td>Pod template (Pod and container configuration).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>replicas</code> <em>integer</em></td>
+<td>Desired replica count; overridden by autoscaling when active. Defaults to spec.replicas if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>autoscaling</code> <em><a href="#autoscalingspec">AutoscalingSpec</a></em></td>
+<td>HorizontalPodAutoscaler configuration. When set, the HPA manages replica count. Overrides spec.autoscaling.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>podDisruptionBudget</code> <em><a href="#pdbspec">PDBSpec</a></em></td>
+<td>PodDisruptionBudget for protecting availability during voluntary disruptions. Overrides spec.podDisruptionBudget.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>image</code> <em><a href="#imageoverridespec">ImageOverrideSpec</a></em></td>
+<td>Image tag and/or repository overrides; inherits from spec.image if unset.</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+<tr>
+<td><code>service</code> <em><a href="#componentservicespec">ComponentServiceSpec</a></em></td>
+<td>Service configuration (type, port, annotations).</td>
+<td></td>
+<td>Optional: {} <br /></td>
+</tr>
+</tbody>
+</table>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
+ Back to top
+</button>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+
+
+
+ <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.code.copy", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.res [...]
+
+
+ <script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
+
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/architecture/index.html b/architecture/index.html
new file mode 100644
index 0000000..dc1098c
--- /dev/null
+++ b/architecture/index.html
@@ -0,0 +1,1413 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <meta name="description" content="Kubernetes operator for deploying and managing Apache Superset">
+
+
+
+ <link rel="canonical" href="https://apache.github.io/superset-kubernetes-operator/architecture/">
+
+
+ <link rel="prev" href="../user-guide/">
+
+
+ <link rel="next" href="../internals/">
+
+
+
+
+
+ <link rel="icon" href="../assets/images/favicon.png">
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
+
+
+
+ <title>Architecture - Apache Superset Kubernetes Operator</title>
+
+
+
+ <link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
+
+
+ <link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+ </head>
+
+
+
+
+
+
+
+
+
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+
+ <a href="#superset-operator-architecture-overview" class="md-skip">
+ Skip to content
+ </a>
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+
+
+
+<header class="md-header md-header--shadow" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+ <a href=".." title="Apache Superset Kubernetes Operator" class="md-header__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ <label class="md-header__button md-icon" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
+ </label>
+ <div class="md-header__title" data-md-component="header-title">
+ <div class="md-header__ellipsis">
+ <div class="md-header__topic">
+ <span class="md-ellipsis">
+ Apache Superset Kubernetes Operator
+ </span>
+ </div>
+ <div class="md-header__topic" data-md-component="header-topic">
+ <span class="md-ellipsis">
+
+ Architecture
+
+ </span>
+ </div>
+ </div>
+ </div>
+
+
+ <form class="md-header__option" data-md-component="palette">
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
+
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+
+
+
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
+
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
+ </label>
+
+
+</form>
+
+
+
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.get [...]
+
+
+
+
+
+ <label class="md-header__button md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+ </label>
+ <div class="md-search" data-md-component="search" role="dialog">
+ <label class="md-search__overlay" for="__search"></label>
+ <div class="md-search__inner" role="search">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
+ <label class="md-search__icon md-icon" for="__search">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
+ </label>
+ <nav class="md-search__options" aria-label="Search">
+
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
+ </button>
+ </nav>
+
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="search-result">
+ <div class="md-search-result__meta">
+ Initializing search
+ </div>
+ <ol class="md-search-result__list" role="presentation"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+
+ <div class="md-header__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ </nav>
+
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href=".." title="Apache Superset Kubernetes Operator" class="md-nav__button md-logo" aria-label="Apache Superset Kubernetes Operator" data-md-component="logo">
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
+
+ </a>
+ Apache Superset Kubernetes Operator
+ </label>
+
+ <div class="md-nav__source">
+ <a href="https://github.com/apache/superset-kubernetes-operator" title="Go to repository" class="md-source" data-md-component="source">
+ <div class="md-source__icon md-icon">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 [...]
+ </div>
+ <div class="md-source__repository">
+ apache/superset-kubernetes-operator
+ </div>
+</a>
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href=".." class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Home
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../installation/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Installation
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../downloads/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Downloads
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../user-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ User Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="__toc">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Architecture
+
+
+
+ </span>
+
+
+
+ <span class="md-nav__icon md-icon"></span>
+ </label>
+
+ <a href="./" class="md-nav__link md-nav__link--active">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Architecture
+
+
+
+ </span>
+
+
+
+ </a>
+
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#two-tier-crd-architecture" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Two-Tier CRD Architecture
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Two-Tier CRD Architecture">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#why-two-tiers" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Why two tiers?
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#how-it-works" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ How it works
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#crd-hierarchy" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CRD Hierarchy
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="CRD Hierarchy">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#parent-superset" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Parent: Superset
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#children-fully-flattened-operator-managed" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Children (fully-flattened, operator-managed)
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#configuration-model" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Configuration Model
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Configuration Model">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#example-how-resources-resolve-for-celeryworker" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Example: How resources resolve for celeryWorker
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example-how-env-vars-resolve-for-webserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Example: How env vars resolve for webServer
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#config-rendering-pipeline" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Config Rendering Pipeline
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Config Rendering Pipeline">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#how-config-is-built" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ How config is built
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#secret-handling" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Secret Handling
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#config-mount-structure" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Config Mount Structure
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#init-lifecycle" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Init Lifecycle
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#checksum-driven-rollouts" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Checksum-Driven Rollouts
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#resource-ownership" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Resource Ownership
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../internals/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Internals
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../api-reference/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ API Reference
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../security/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Security
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../developer-guide/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Developer Guide
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+
+
+ <label class="md-nav__title" for="__toc">
+ <span class="md-nav__icon md-icon"></span>
+ Table of contents
+ </label>
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#two-tier-crd-architecture" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Two-Tier CRD Architecture
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Two-Tier CRD Architecture">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#why-two-tiers" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Why two tiers?
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#how-it-works" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ How it works
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#crd-hierarchy" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ CRD Hierarchy
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="CRD Hierarchy">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#parent-superset" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Parent: Superset
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#children-fully-flattened-operator-managed" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Children (fully-flattened, operator-managed)
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#configuration-model" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Configuration Model
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Configuration Model">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#example-how-resources-resolve-for-celeryworker" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Example: How resources resolve for celeryWorker
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example-how-env-vars-resolve-for-webserver" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Example: How env vars resolve for webServer
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#config-rendering-pipeline" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Config Rendering Pipeline
+
+ </span>
+ </a>
+
+ <nav class="md-nav" aria-label="Config Rendering Pipeline">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#how-config-is-built" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ How config is built
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#secret-handling" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Secret Handling
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#config-mount-structure" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Config Mount Structure
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#init-lifecycle" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Init Lifecycle
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#checksum-driven-rollouts" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Checksum-Driven Rollouts
+
+ </span>
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#resource-ownership" class="md-nav__link">
+ <span class="md-ellipsis">
+
+ Resource Ownership
+
+ </span>
+ </a>
+
+</li>
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+
+ <article class="md-content__inner md-typeset">
+
+
+
+
+
+
+
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<h1 id="superset-operator-architecture-overview">Superset Operator — Architecture Overview<a class="headerlink" href="#superset-operator-architecture-overview" title="Permanent link">¶</a></h1>
+<p>For runtime behavior details — reconciliation lifecycle, init pod state machine,
+retry semantics, and status reporting — see <a href="../internals/">Internals</a>.</p>
+<h2 id="two-tier-crd-architecture">Two-Tier CRD Architecture<a class="headerlink" href="#two-tier-crd-architecture" title="Permanent link">¶</a></h2>
+<p>The operator uses a two-tier CRD architecture. A single parent <code>Superset</code>
+resource defines the complete deployment. The parent controller resolves all
+configuration into fully-flattened child CRDs that each manage one component.</p>
+<h3 id="why-two-tiers">Why two tiers?<a class="headerlink" href="#why-two-tiers" title="Permanent link">¶</a></h3>
+<p>A single-controller design would require one reconciliation loop to manage all
+sub-resources (Deployments, Services, ConfigMaps, HPA, PDB) for every component.
+This creates a large blast radius — a bug in Celery worker reconciliation can
+block web server updates — and makes the controller harder to test and reason
+about.</p>
+<p>Splitting into dedicated child CRDs and controllers isolates each component's
+lifecycle. The web server controller only watches <code>SupersetWebServer</code> resources;
+it cannot interfere with Celery or init. Each child controller is simple and
+generic (all six share <code>ChildReconciler</code>), while the parent controller focuses
+solely on configuration resolution and child CR orchestration. This separation
+also enables independent scaling of controller watches and makes <code>kubectl get</code>
+output immediately useful — <code>kubectl get supersetwebservers</code> shows web server
+status without filtering.</p>
+<h3 id="how-it-works">How it works<a class="headerlink" href="#how-it-works" title="Permanent link">¶</a></h3>
+<p>Each child CRD contains the fully resolved spec — <code>kubectl get supersetwebserver -o yaml</code>
+shows exactly what is running with no layering to trace. Child CRDs can also
+be created directly to bypass the parent's resolution system. Because child CRs
+carry the same fields as the parent (images, commands, env vars, volumes), their
+writers should be treated as equally trusted — see the
+<a href="../security/#trust-boundaries">Security</a> for details.</p>
+<hr />
+<h2 id="crd-hierarchy">CRD Hierarchy<a class="headerlink" href="#crd-hierarchy" title="Permanent link">¶</a></h2>
+<h3 id="parent-superset">Parent: <code>Superset</code><a class="headerlink" href="#parent-superset" title="Permanent link">¶</a></h3>
+<p>The top-level resource. Users create this to deploy Superset.</p>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">superset.apache.org/v1alpha1</span>
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Superset</span>
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nt">metadata</span><span class="p">:</span>
+<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-superset</span>
+<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="nt">spec</span><span class="p">:</span>
+<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nt"> tag</span><span class="p">:</span><span class="w"> </span><span class="s">"latest"</span><span class="w"> </span><span class="p p-Indicator">}</span>
+<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">dev</span>
+<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="nt">secretKey</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">thisIsNotSecure_changeInProduction!</span>
+<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="nt">metastore</span><span class="p">:</span>
+<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="nt">uri</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">postgresql+psycopg2://superset:superset@postgres:5432/superset</span>
+</code></pre></div>
+<h3 id="children-fully-flattened-operator-managed">Children (fully-flattened, operator-managed)<a class="headerlink" href="#children-fully-flattened-operator-managed" title="Permanent link">¶</a></h3>
+<p>Components fall into two categories:</p>
+<p><strong>Scalable components</strong> support replicas, HPA, and PodDisruptionBudgets:</p>
+<table>
+<thead>
+<tr>
+<th>CRD Kind</th>
+<th>Parent field</th>
+<th>Suffix</th>
+<th>Creates</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>SupersetWebServer</code></td>
+<td><code>webServer</code></td>
+<td><code>-web-server</code></td>
+<td>Deployment, Service, ConfigMap, HPA</td>
+</tr>
+<tr>
+<td><code>SupersetCeleryWorker</code></td>
+<td><code>celeryWorker</code></td>
+<td><code>-celery-worker</code></td>
+<td>Deployment, ConfigMap, HPA</td>
+</tr>
+<tr>
+<td><code>SupersetCeleryFlower</code></td>
+<td><code>celeryFlower</code></td>
+<td><code>-celery-flower</code></td>
+<td>Deployment, Service, ConfigMap</td>
+</tr>
+<tr>
+<td><code>SupersetWebsocketServer</code></td>
+<td><code>websocketServer</code></td>
+<td><code>-websocket-server</code></td>
+<td>Deployment, Service</td>
+</tr>
+<tr>
+<td><code>SupersetMcpServer</code></td>
+<td><code>mcpServer</code></td>
+<td><code>-mcp-server</code></td>
+<td>Deployment, Service, ConfigMap</td>
+</tr>
+</tbody>
+</table>
+<p><strong>Singleton components</strong> run exactly one instance and don't support scaling:</p>
+<table>
+<thead>
+<tr>
+<th>CRD Kind</th>
+<th>Parent field</th>
+<th>Suffix</th>
+<th>Creates</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><code>SupersetInit</code></td>
+<td><code>init</code></td>
+<td><code>-init</code></td>
+<td>Pods, ConfigMap</td>
+</tr>
+<tr>
+<td><code>SupersetCeleryBeat</code></td>
+<td><code>celeryBeat</code></td>
+<td><code>-celery-beat</code></td>
+<td>Deployment, ConfigMap</td>
+</tr>
+</tbody>
+</table>
+<p><strong>Presence = enabled</strong>: Setting <code>celeryWorker: {}</code> deploys workers with
+defaults. Omitting <code>celeryWorker</code> entirely means no workers. No
+<code>enabled: true/false</code> toggles. The exception is <code>init</code>, which is enabled by
+default even when <code>spec.init</code> is nil; disable it explicitly with
+<code>spec.init.disabled: true</code>.</p>
+<hr />
+<h2 id="configuration-model">Configuration Model<a class="headerlink" href="#configuration-model" title="Permanent link">¶</a></h2>
+<p>All Deployment, Pod, and container configuration flows through two sibling
+template fields:</p>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>deploymentTemplate → DeploymentSpec-level (strategy, revisionHistoryLimit, ...)
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>podTemplate → PodSpec-level (affinity, tolerations, volumes, ...)
+<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>└── container → Container-level (resources, env, probes, ...)
+</code></pre></div>
+<p><strong>Top-level <code>deploymentTemplate</code> and <code>podTemplate</code></strong> provide defaults
+inherited by all components. <strong>Per-component</strong> values are field-level merged
+with the top-level — only specify what's different. Scaling fields
+(<code>replicas</code>, <code>autoscaling</code>, <code>podDisruptionBudget</code>) are outside the templates
+since they interact with operator logic (HPA, Beat singleton).</p>
+<p>Merge semantics per field type:</p>
+<ul>
+<li><strong>Scalars/structs</strong> (resources, affinity, securityContext, probes, etc.) — component wins if set</li>
+<li><strong>Named collections</strong> (env, volumes, volumeMounts, sidecars) — merge by name, component wins on conflict</li>
+<li><strong>Maps</strong> (annotations, labels, nodeSelector) — merge by key, component wins on conflict</li>
+<li><strong>Unnamed collections</strong> (tolerations, topologySpreadConstraints) — append</li>
+<li><strong>command/args</strong> — component-only, not inherited from top-level</li>
+<li><strong>Operator-managed labels</strong> (<code>app.kubernetes.io/*</code>) — applied last, cannot be overridden</li>
+</ul>
+<p>Init uses <code>podTemplate</code> only (no <code>deploymentTemplate</code>) since it creates bare
+Pods. See the <a href="../user-guide/#deployment-template">User Guide</a> for the full
+field reference and examples.</p>
+<h3 id="example-how-resources-resolve-for-celeryworker">Example: How resources resolve for celeryWorker<a class="headerlink" href="#example-how-resources-resolve-for-celeryworker" title="Permanent link">¶</a></h3>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="nt">spec</span><span class="p">:</span>
+<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nt">podTemplate</span><span class="p">:</span>
+<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="nt">container</span><span class="p">:</span>
+<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="nt">resources</span><span class="p">:</span>
+<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="nt">limits</span><span class="p">:</span>
+<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s">"2"</span>
+<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s">"4Gi"</span>
+<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="nt">celeryWorker</span><span class="p">:</span>
+<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="w"> </span><span class="nt">podTemplate</span><span class="p">:</span>
+<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="w"> </span><span class="nt">container</span><span class="p">:</span>
+<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="w"> </span><span class="nt">resources</span><span class="p">:</span>
+<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="w"> </span><span class="nt">limits</span><span class="p">:</span>
+<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="w"> </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s">"8"</span><span class="w"> </span><span class="c1"># component replaces entire resources struct</span>
+</code></pre></div>
+<p>Result on SupersetCeleryWorker: <code>resources.limits = {cpu: "8"}</code> (resources
+is a scalar/struct field — component replaces entirely).</p>
+<h3 id="example-how-env-vars-resolve-for-webserver">Example: How env vars resolve for webServer<a class="headerlink" href="#example-how-env-vars-resolve-for-webserver" title="Permanent link">¶</a></h3>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="nt">spec</span><span class="p">:</span>
+<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="nt">podTemplate</span><span class="p">:</span>
+<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="nt">container</span><span class="p">:</span>
+<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="nt">env</span><span class="p">:</span>
+<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nv">LOG_LEVEL</span><span class="p p-Indicator">,</span><span class="nt"> value</span><span class="p">:</span><span class="w"> </span><span class="nv">INFO</span><span class="p p-Indicator">}</span>
+<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="nt">webServer</span><span class="p">:</span>
+<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="nt">podTemplate</span><span class="p">:</span>
+<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="nt">container</span><span class="p">:</span>
+<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="nt">env</span><span class="p">:</span>
+<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">{</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nv">GUNICORN_WORKERS</span><span class="p p-Indicator">,</span><span class="nt"> value</span><span class="p">:</span><span class="w"> </span><span class="s">"4"</span><span class="p p [...]
+</code></pre></div>
+<p>Result on SupersetWebServer: both env vars present.</p>
+<hr />
+<h2 id="config-rendering-pipeline">Config Rendering Pipeline<a class="headerlink" href="#config-rendering-pipeline" title="Permanent link">¶</a></h2>
+<p>The operator generates per-component <code>superset_config.py</code> files by
+<strong>concatenating</strong> three sections in order. Both <code>spec.config</code> (base) and
+<code>spec.<component>.config</code> (component) are appended — they are not mutually
+exclusive. If both are set, the component receives all three sections:</p>
+<h3 id="how-config-is-built">How config is built<a class="headerlink" href="#how-config-is-built" title="Permanent link">¶</a></h3>
+<ol>
+<li><strong>Operator-generated configs</strong> — <code>SECRET_KEY</code> rendered from the
+ <code>SUPERSET_OPERATOR__SECRET_KEY</code> env var, <code>SQLALCHEMY_DATABASE_URI</code> rendered
+ from operator-internal env vars (both passthrough and structured metastore
+ modes), plus <code>SUPERSET_WEBSERVER_PORT</code> for the web server.</li>
+<li><strong>Valkey cache config</strong> — When <code>spec.valkey</code> is set, the operator renders
+ <code>CACHE_CONFIG</code>, <code>DATA_CACHE_CONFIG</code>, <code>FILTER_STATE_CACHE_CONFIG</code>,
+ <code>EXPLORE_FORM_DATA_CACHE_CONFIG</code>, <code>THUMBNAIL_CACHE_CONFIG</code>,
+ <code>CeleryConfig</code>, and <code>RESULTS_BACKEND</code> backed by Valkey. Connection details
+ are read from <code>SUPERSET_OPERATOR__VALKEY_*</code> env vars at Python runtime.
+ SSL/mTLS cert paths are baked directly into the rendered config.</li>
+<li><strong>Base config (<code>spec.config</code>)</strong> — Raw Python from the top-level <code>config</code>
+ field, shared by all Python components. Appended after operator-generated
+ configs.</li>
+<li><strong>Component config (<code>spec.<component>.config</code>)</strong> — Raw Python from the
+ per-component <code>config</code> field. Appended last, so it can override anything
+ above.</li>
+</ol>
+<p>For example, given a structured metastore configuration:</p>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="nt">spec</span><span class="p">:</span>
+<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span><span class="nt">metastore</span><span class="p">:</span>
+<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">db.example.com</span>
+<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">superset</span>
+<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">superset</span>
+<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="w"> </span><span class="nt">passwordFrom</span><span class="p">:</span>
+<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">db-credentials</span>
+<a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="w"> </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">password</span>
+<a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span>
+<a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="no">FEATURE_FLAGS = {"DASHBOARD_RBAC": True}</span>
+<a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="w"> </span><span class="nt">celeryWorker</span><span class="p">:</span>
+<a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span>
+<a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="w"> </span><span class="no">CELERY_ANNOTATIONS = {"tasks.add": {"rate_limit": "10/s"}}</span>
+</code></pre></div>
+<p>The celery worker's <code>superset_config.py</code> contains all three sections:</p>
+<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Operator-generated configs</span>
+<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"postgresql+psycopg2://..."</span> <span class="c1"># assembled from env vars</span>
+<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
+<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Base config (spec.config)</span>
+<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="n">FEATURE_FLAGS</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"DASHBOARD_RBAC"</span><span class="p">:</span> <span class="kc">True</span><span class="p">}</span>
+<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
+<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># Component config</span>
+<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="n">CELERY_ANNOTATIONS</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"tasks.add"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"rate_limit"</span><span class="p">:</span> <span class="s2">"10/s"</span><span class="p">}}</span>
+</code></pre></div>
+<p>Note: All operator-managed settings (<code>SECRET_KEY</code>, <code>SQLALCHEMY_DATABASE_URI</code>,
+web server port) are rendered into the config file from operator-internal
+<code>SUPERSET_OPERATOR__*</code> env vars. Both passthrough and structured metastore
+modes render <code>SQLALCHEMY_DATABASE_URI</code> from <code>SUPERSET_OPERATOR__DB_URI</code>
+(passthrough) or <code>SUPERSET_OPERATOR__DB_*</code> (structured).</p>
+<table>
+<thead>
+<tr>
+<th>Config section</th>
+<th>WebServer</th>
+<th>CeleryWorker</th>
+<th>CeleryBeat</th>
+<th>CeleryFlower</th>
+<th>McpServer</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>SECRET_KEY</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr>
+<td>Passthrough DB URI</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+</tr>
+<tr>
+<td>Structured DB URI (f-string)</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+<td>if set</td>
+</tr>
+<tr>
+<td>Web server port (8088)</td>
+<td>yes</td>
+<td></td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
+<td>Top-level config</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr>
+<td>Per-component config</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+</tbody>
+</table>
+<p><strong>WebsocketServer</strong> is Node.js-based -- it does NOT get <code>superset_config.py</code>.</p>
+<h3 id="secret-handling">Secret Handling<a class="headerlink" href="#secret-handling" title="Permanent link">¶</a></h3>
+<p>In <strong>dev mode</strong> (<code>environment: dev</code>), <code>secretKey</code>, <code>metastore.uri</code>, and
+<code>metastore.password</code> can be set as plain strings directly in the CR. The
+operator injects them as environment variables on the container spec.</p>
+<p>In <strong>prod mode</strong> (<code>environment: prod</code>, the default), CRD validation rejects
+these inline fields. Instead, use the <code>*From</code> fields to reference Kubernetes
+Secrets:</p>
+<ul>
+<li><code>secretKeyFrom</code> — references a Secret key for the Flask secret key</li>
+<li><code>metastore.uriFrom</code> — references a Secret key for the full database URI</li>
+<li><code>metastore.passwordFrom</code> — references a Secret key for the database password (structured mode)</li>
+</ul>
+<p>The operator injects the corresponding env vars (<code>SUPERSET_OPERATOR__SECRET_KEY</code>,
+<code>SUPERSET_OPERATOR__DB_URI</code>, <code>SUPERSET_OPERATOR__DB_PASS</code>) with
+<code>valueFrom.secretKeyRef</code> pointing at the referenced Secret. Secret values
+never appear in ConfigMaps or CRD status fields.</p>
+<h3 id="config-mount-structure">Config Mount Structure<a class="headerlink" href="#config-mount-structure" title="Permanent link">¶</a></h3>
+<ul>
+<li><code>/app/superset/config/</code> — ConfigMap with <code>superset_config.py</code></li>
+</ul>
+<hr />
+<h2 id="init-lifecycle">Init Lifecycle<a class="headerlink" href="#init-lifecycle" title="Permanent link">¶</a></h2>
+<p>Initialization is managed by a dedicated <code>SupersetInit</code> child CRD. The parent
+controller creates a <code>SupersetInit</code> CR, and the <code>SupersetInitReconciler</code>
+manages bare Pods (<code>restartPolicy: Never</code>) with retry, backoff, timeout, and
+retention. The default command runs <code>superset db upgrade && superset init</code>;
+it is customizable via <code>spec.init.command</code>. The init child CR inherits
+scheduling, security, volumes, and env from the top-level <code>podTemplate</code>.
+Init gates all component deployment — other child CRs are not created until
+init completes. See <a href="../internals/#init-pod-lifecycle">Internals</a>
+for the full state machine, retry semantics, and pod retention policies.</p>
+<hr />
+<h2 id="checksum-driven-rollouts">Checksum-Driven Rollouts<a class="headerlink" href="#checksum-driven-rollouts" title="Permanent link">¶</a></h2>
+<p>Each child CR carries a config checksum stamped as a pod template
+annotation. When the checksum changes (due to config or secret reference
+changes on the CR), Kubernetes triggers a rolling restart of the affected
+component. Note: rotating a referenced Secret's value without changing the
+CR does not trigger a rollout. See
+<a href="../internals/#checksum-driven-rollouts">Internals</a> for the full checksum
+table and per-component isolation details.</p>
+<hr />
+<h2 id="resource-ownership">Resource Ownership<a class="headerlink" href="#resource-ownership" title="Permanent link">¶</a></h2>
+<p>All resources use Kubernetes owner references for automatic cleanup. The parent
+<code>Superset</code> CR owns child CRDs (SupersetInit, SupersetWebServer, etc.),
+networking resources (Ingress/HTTPRoute), ServiceMonitor, and NetworkPolicies.
+Each child CR in turn owns its managed resources (Deployment, ConfigMap, Service,
+HPA, PDB for component CRDs; Pods and ConfigMap for SupersetInit). Deleting
+the parent cascades to everything. Removing a component from the parent spec
+deletes its child CR, which cascades to all owned resources.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </article>
+ </div>
+
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
+ Back to top
+</button>
+
+ </main>
+
+ <footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-copyright">
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+
+
+
+ <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.code.copy", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.res [...]
+
+
+ <script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
+
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/assets/images/favicon.png b/assets/images/favicon.png
new file mode 100644
index 0000000..1cf13b9
Binary files /dev/null and b/assets/images/favicon.png differ
diff --git a/assets/javascripts/bundle.79ae519e.min.js b/assets/javascripts/bundle.79ae519e.min.js
new file mode 100644
index 0000000..3df3e5e
--- /dev/null
+++ b/assets/javascripts/bundle.79ae519e.min.js
@@ -0,0 +1,16 @@
+"use strict";(()=>{var Zi=Object.create;var _r=Object.defineProperty;var ea=Object.getOwnPropertyDescriptor;var ta=Object.getOwnPropertyNames,Bt=Object.getOwnPropertySymbols,ra=Object.getPrototypeOf,Ar=Object.prototype.hasOwnProperty,bo=Object.prototype.propertyIsEnumerable;var ho=(e,t,r)=>t in e?_r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Ar.call(t,r)&&ho(e,r,t[r]);if(Bt)for(var r of Bt(t))bo.call(t,r)&&ho(e,r,t[r]);return e};var v [...]
+ * escape-html
+ * Copyright(c) 2012-2013 TJ Holowaychuk
+ * Copyright(c) 2015 Andreas Lubbe
+ * Copyright(c) 2015 Tiancheng "Timothy" Gu
+ * MIT Licensed
+ */var qa=/["'&<>]/;Rn.exports=Ka;function Ka(e){var t=""+e,r=qa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:o=""";break;case 38:o="&";break;case 39:o="'";break;case 60:o="<";break;case 62:o=">";break;default:continue}s!==i&&(n+=t.substring(s,i)),s=i+1,n+=o}return s!==i?n+t.substring(s,i):n}});var ao=Cr((Nt,io)=>{/*!
+ * clipboard.js v2.0.11
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */(function(t,r){typeof Nt=="object"&&typeof io=="object"?io.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Nt=="object"?Nt.ClipboardJS=r():t.ClipboardJS=r()})(Nt,function(){return(function(){var e={686:(function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(C){return!1}}var d=function(C){var _=f()(C);return u("cut"),_},v=d;function S(q){va [...]
+`+r.map(function(o,n){return n+1+") "+o.toString()}).join(`
+ `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}} [...]
+//# sourceMappingURL=bundle.79ae519e.min.js.map
+
diff --git a/assets/javascripts/bundle.79ae519e.min.js.map b/assets/javascripts/bundle.79ae519e.min.js.map
new file mode 100644
index 0000000..5cf0289
--- /dev/null
+++ b/assets/javascripts/bundle.79ae519e.min.js.map
@@ -0,0 +1,7 @@
+{
+ "version": 3,
+ "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subsc [...]
+ "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-vis [...]
+ "mappings": "2rCAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAAC,SAAUC,EAAQC,EAAS,CAC1B,OAAOH,IAAY,UAAY,OAAOC,IAAW,YAAcE,EAAQ,EACvE,OAAO,QAAW,YAAc,OAAO,IAAM,OAAOA,CAAO,EAC1DA,EAAQ,CACX,GAAEH,IAAO,UAAY,CAAE,aASrB,SAASI,EAA0BC,EAAO,CACxC,IAAIC,EAAmB,GACnBC,EAA0B,GAC1BC,EAAiC,KAEjCC,EAAsB,CACxB,KAAM,GACN,OAAQ,GACR,IAAK,GACL,IAAK,GACL,MAAO,GACP,SAAU,GACV,OAAQ,GACR,KAAM,GACN,MAAO,GACP,KAAM,GACN,KAAM,GACN,SAAU,GACV,iBAAkB,EACpB,EAOA,SAASC,EAAmBC,EAAI,CAC9B,MACE,GAAAA,GACAA,IAAO,UACPA,EAAG,WAAa,QAC [...]
+ "names": ["require_focus_visible", "__commonJSMin", "exports", "module", "global", "factory", "applyFocusVisiblePolyfill", "scope", "hadKeyboardEvent", "hadFocusVisibleRecently", "hadFocusVisibleRecentlyTimeout", "inputTypesAllowlist", "isValidFocusTarget", "el", "focusTriggersKeyboardModality", "type", "tagName", "addFocusVisibleClass", "removeFocusVisibleClass", "onKeyDown", "e", "onPointerDown", "onFocus", "onBlur", "onVisibilityChange", "addInitialPointerMoveListeners", "onInitialP [...]
+}
diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js
new file mode 100644
index 0000000..9b06c26
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ar.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.da.min.js b/assets/javascripts/lunr/min/lunr.da.min.js
new file mode 100644
index 0000000..b9d8509
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.da.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Danish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js
new file mode 100644
index 0000000..f3b5c10
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.de.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `German` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js
new file mode 100644
index 0000000..49a0f3f
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.du.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Dutch` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" c [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.el.min.js b/assets/javascripts/lunr/min/lunr.el.min.js
new file mode 100644
index 0000000..ace017b
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.el.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.el=function(){this.pipeline.reset(),void 0===this.searchPipeline&&this.pipeline. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.es.min.js b/assets/javascripts/lunr/min/lunr.es.min.js
new file mode 100644
index 0000000..2989d34
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.es.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Spanish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js
new file mode 100644
index 0000000..29f5dfc
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.fi.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Finnish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js
new file mode 100644
index 0000000..68cd009
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.fr.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `French` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.he.min.js b/assets/javascripts/lunr/min/lunr.he.min.js
new file mode 100644
index 0000000..b863d3e
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.he.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js
new file mode 100644
index 0000000..7dbc414
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hi.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js
new file mode 100644
index 0000000..ed9d909
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hu.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Hungarian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hy.min.js b/assets/javascripts/lunr/min/lunr.hy.min.js
new file mode 100644
index 0000000..b37f792
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hy.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js
new file mode 100644
index 0000000..344b6a3
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.it.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Italian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js
new file mode 100644
index 0000000..5f254eb
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ja.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.jp.min.js b/assets/javascripts/lunr/min/lunr.jp.min.js
new file mode 100644
index 0000000..c055eba
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.jp.min.js
@@ -0,0 +1 @@
+module.exports=require("./lunr.ja");
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.kn.min.js b/assets/javascripts/lunr/min/lunr.kn.min.js
new file mode 100644
index 0000000..1cef9be
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.kn.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ko.min.js b/assets/javascripts/lunr/min/lunr.ko.min.js
new file mode 100644
index 0000000..eaf9dab
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ko.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ko=function(){this.pipeline.reset(),this.pipeline.add(e.ko.trimmer,e.ko.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.multi.min.js b/assets/javascripts/lunr/min/lunr.multi.min.js
new file mode 100644
index 0000000..7debad0
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.multi.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.nl.min.js b/assets/javascripts/lunr/min/lunr.nl.min.js
new file mode 100644
index 0000000..c4a2535
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.nl.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Dutch` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.nl=function(){this.pipeline.reset(),this.pipeline.add(r.nl.trimmer,r.nl.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js
new file mode 100644
index 0000000..92bc7e4
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.no.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Norwegian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js
new file mode 100644
index 0000000..6c16996
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.pt.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Portuguese` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js
new file mode 100644
index 0000000..7277140
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ro.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Romanian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js
new file mode 100644
index 0000000..186cc48
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ru.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Russian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.sa.min.js b/assets/javascripts/lunr/min/lunr.sa.min.js
new file mode 100644
index 0000000..50ee564
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.sa.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.stemmer.support.min.js b/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
new file mode 100644
index 0000000..abd4475
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
@@ -0,0 +1 @@
+!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.met [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js
new file mode 100644
index 0000000..3e5eb64
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.sv.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Swedish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ta.min.js b/assets/javascripts/lunr/min/lunr.ta.min.js
new file mode 100644
index 0000000..a644bed
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ta.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.te.min.js b/assets/javascripts/lunr/min/lunr.te.min.js
new file mode 100644
index 0000000..9fa7a93
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.te.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js
new file mode 100644
index 0000000..dee3aac
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.th.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js
new file mode 100644
index 0000000..563f6ec
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.tr.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Turkish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js
new file mode 100644
index 0000000..22aed28
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.vi.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.t [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js
new file mode 100644
index 0000000..fda66e9
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.zh.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js
new file mode 100644
index 0000000..167fa6d
--- /dev/null
+++ b/assets/javascripts/lunr/tinyseg.js
@@ -0,0 +1,206 @@
+/**
+ * export the module via AMD, CommonJS or as a browser global
+ * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
+ */
+;(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory)
+ } else if (typeof exports === 'object') {
+ /**
+ * Node. Does not work with strict CommonJS, but
+ * only CommonJS-like environments that support module.exports,
+ * like Node.
+ */
+ module.exports = factory()
+ } else {
+ // Browser globals (root is window)
+ factory()(root.lunr);
+ }
+}(this, function () {
+ /**
+ * Just return a value to define the module export.
+ * This example returns an object, but the module
+ * can return a function as the exported value.
+ */
+
+ return function(lunr) {
+ // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
+ // (c) 2008 Taku Kudo <ta...@chasen.org>
+ // TinySegmenter is freely distributable under the terms of a new BSD licence.
+ // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
+
+ function TinySegmenter() {
+ var patterns = {
+ "[一二三四五六七八九十百千万億兆]":"M",
+ "[一-龠々〆ヵヶ]":"H",
+ "[ぁ-ん]":"I",
+ "[ァ-ヴーア-ン゙ー]":"K",
+ "[a-zA-Za-zA-Z]":"A",
+ "[0-90-9]":"N"
+ }
+ this.chartype_ = [];
+ for (var i in patterns) {
+ var regexp = new RegExp(i);
+ this.chartype_.push([regexp, patterns[i]]);
+ }
+
+ this.BIAS__ = -332
+ this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
+ this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
+ this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
+ this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
+ this.BP2__ = {"BO":60,"OO":-1762};
+ this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
+ this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
+ this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
+ this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
+ this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741," [...]
+ this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1 [...]
+ this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":65 [...]
+ this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
+ this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
+ this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
+ this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
+ this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
+ this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
+ this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
+ this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
+ this.TW1__ = {"につい":-4681,"東京都":2026};
+ this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
+ this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
+ this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
+ this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
+ this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
+ this.UC3__ = {"A":-1370,"I":2311};
+ this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
+ this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
+ this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
+ this.UP1__ = {"O":-214};
+ this.UP2__ = {"B":69,"O":935};
+ this.UP3__ = {"B":189};
+ this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
+ this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
+ this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
+ this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
+ this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978, [...]
+ this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":277 [...]
+ this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":14 [...]
+ this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区 [...]
+ this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496};
+
+ return this;
+ }
+ TinySegmenter.prototype.ctype_ = function(str) {
+ for (var i in this.chartype_) {
+ if (str.match(this.chartype_[i][0])) {
+ return this.chartype_[i][1];
+ }
+ }
+ return "O";
+ }
+
+ TinySegmenter.prototype.ts_ = function(v) {
+ if (v) { return v; }
+ return 0;
+ }
+
+ TinySegmenter.prototype.segment = function(input) {
+ if (input == null || input == undefined || input == "") {
+ return [];
+ }
+ var result = [];
+ var seg = ["B3","B2","B1"];
+ var ctype = ["O","O","O"];
+ var o = input.split("");
+ for (i = 0; i < o.length; ++i) {
+ seg.push(o[i]);
+ ctype.push(this.ctype_(o[i]))
+ }
+ seg.push("E1");
+ seg.push("E2");
+ seg.push("E3");
+ ctype.push("O");
+ ctype.push("O");
+ ctype.push("O");
+ var word = seg[3];
+ var p1 = "U";
+ var p2 = "U";
+ var p3 = "U";
+ for (var i = 4; i < seg.length - 3; ++i) {
+ var score = this.BIAS__;
+ var w1 = seg[i-3];
+ var w2 = seg[i-2];
+ var w3 = seg[i-1];
+ var w4 = seg[i];
+ var w5 = seg[i+1];
+ var w6 = seg[i+2];
+ var c1 = ctype[i-3];
+ var c2 = ctype[i-2];
+ var c3 = ctype[i-1];
+ var c4 = ctype[i];
+ var c5 = ctype[i+1];
+ var c6 = ctype[i+2];
+ score += this.ts_(this.UP1__[p1]);
+ score += this.ts_(this.UP2__[p2]);
+ score += this.ts_(this.UP3__[p3]);
+ score += this.ts_(this.BP1__[p1 + p2]);
+ score += this.ts_(this.BP2__[p2 + p3]);
+ score += this.ts_(this.UW1__[w1]);
+ score += this.ts_(this.UW2__[w2]);
+ score += this.ts_(this.UW3__[w3]);
+ score += this.ts_(this.UW4__[w4]);
+ score += this.ts_(this.UW5__[w5]);
+ score += this.ts_(this.UW6__[w6]);
+ score += this.ts_(this.BW1__[w2 + w3]);
+ score += this.ts_(this.BW2__[w3 + w4]);
+ score += this.ts_(this.BW3__[w4 + w5]);
+ score += this.ts_(this.TW1__[w1 + w2 + w3]);
+ score += this.ts_(this.TW2__[w2 + w3 + w4]);
+ score += this.ts_(this.TW3__[w3 + w4 + w5]);
+ score += this.ts_(this.TW4__[w4 + w5 + w6]);
+ score += this.ts_(this.UC1__[c1]);
+ score += this.ts_(this.UC2__[c2]);
+ score += this.ts_(this.UC3__[c3]);
+ score += this.ts_(this.UC4__[c4]);
+ score += this.ts_(this.UC5__[c5]);
+ score += this.ts_(this.UC6__[c6]);
+ score += this.ts_(this.BC1__[c2 + c3]);
+ score += this.ts_(this.BC2__[c3 + c4]);
+ score += this.ts_(this.BC3__[c4 + c5]);
+ score += this.ts_(this.TC1__[c1 + c2 + c3]);
+ score += this.ts_(this.TC2__[c2 + c3 + c4]);
+ score += this.ts_(this.TC3__[c3 + c4 + c5]);
+ score += this.ts_(this.TC4__[c4 + c5 + c6]);
+ // score += this.ts_(this.TC5__[c4 + c5 + c6]);
+ score += this.ts_(this.UQ1__[p1 + c1]);
+ score += this.ts_(this.UQ2__[p2 + c2]);
+ score += this.ts_(this.UQ3__[p3 + c3]);
+ score += this.ts_(this.BQ1__[p2 + c2 + c3]);
+ score += this.ts_(this.BQ2__[p2 + c3 + c4]);
+ score += this.ts_(this.BQ3__[p3 + c2 + c3]);
+ score += this.ts_(this.BQ4__[p3 + c3 + c4]);
+ score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
+ score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
+ score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
+ score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
+ var p = "O";
+ if (score > 0) {
+ result.push(word);
+ word = "";
+ p = "B";
+ }
+ p1 = p2;
+ p2 = p3;
+ p3 = p;
+ word += seg[i];
+ }
+ result.push(word);
+
+ return result;
+ }
+
+ lunr.TinySegmenter = TinySegmenter;
+ };
+
+}));
\ No newline at end of file
diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js
new file mode 100644
index 0000000..0d898c9
--- /dev/null
+++ b/assets/javascripts/lunr/wordcut.js
@@ -0,0 +1,6708 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(! [...]
+var _ = require("underscore");
+
+var Acceptors = {
+ creators: null,
+ current: null,
+ tag: null,
+
+ init: function() {
+ this.creators = [];
+ this.current = [];
+ this.tag = {};
+ },
+
+ reset: function() {
+ this.current = [];
+ this.tag = {}
+ },
+
+ transit: function(ch) {
+ var self = this;
+
+ self.creators.forEach(function(creator) {
+ var acceptor = creator.createAcceptor(self.tag);
+ if (acceptor)
+ self.current.push(acceptor);
+ });
+
+ var _current = [];
+ self.tag = {};
+
+ for (var i = 0; i < self.current.length; i++) {
+ var _acceptor = self.current[i]
+ , acceptor = _acceptor.transit(ch);
+
+ if (!acceptor.isError) {
+ _current.push(acceptor);
+ self.tag[acceptor.tag] = acceptor;
+ }
+ }
+ self.current = _current;
+
+ },
+
+ getFinalAcceptors: function() {
+ return this.current.filter(function(acceptor) {
+ return acceptor.isFinal;
+ });
+ }
+};
+
+module.exports = function() {
+ var acceptors = _.clone(Acceptors);
+ acceptors.init();
+ return acceptors;
+};
+
+},{"underscore":25}],2:[function(require,module,exports){
+(function (__dirname){
+
+var LEFT = 0;
+var RIGHT = 1;
+var path = require("path");
+var glob = require("glob");
+
+var WordcutDict = {
+
+
+ init: function (dictPathFile, withDefault, words) {
+ withDefault = withDefault || false
+ var defaultDict = path.normalize(__dirname + "/..") + "/data/tdict-*.txt";
+ this.dict=[]
+ var dictPathIsDefined = dictPathFile !== undefined
+ var dictPath = (withDefault || !dictPathIsDefined) ? [defaultDict]: [];
+ var dictPathFile = dictPathFile || defaultDict
+
+ if(dictPathIsDefined){
+ if (Array.isArray(dictPathFile)) {
+ dictPath.concat.apply(dictPath, dictPathFile);
+ } else {
+ dictPath.push(dictPathFile)
+ }
+ }
+
+ this.addFiles(dictPath, false)
+
+ if(words!==undefined){
+ this.addWords(words, false)
+ }
+ this.finalizeDict();
+ },
+
+ addWords: function(words, finalize){
+ finalize = finalize===undefined || finalize;
+ this.dict.push.apply(this.dict, words)
+ if(finalize){
+ this.finalizeDict();
+ }
+ },
+
+ finalizeDict: function(){
+ this.dict = this.sortuniq(this.dict);
+ },
+
+ addFiles: function(files, finalize){
+ finalize = finalize===undefined || finalize;
+
+ for (var i = 0; i < 1; i++) {
+ var words = "ก.ก.\nก.ก.น.\nก.ข.ค.\nก.ค.\nก.จ.\nก.ช.น.\nก.ฌ.\nก.ต.\nก.ต.ง.\nก.ต.ช.\nก.ตร.\nก.ท.\nก.น.ช.\nก.บช.\nก.บถ.\nก.ป.ส.\nก.พ.\nก.ม.\nก.ย.\nก.ร.\nก.ล.ต.\nก.ว.\nก.ศ.ว.\nก.ส.ท.\nก.ส.ธ.\nก.ส.อ.\nก.อ.\nกก.ตชด.\nกก.ตร.น.\nกก.ภ.จว.\nกก.รสช.\nกกบ.ขส.ทบ.\nกกล.รพน.\nกง.กห.\nกง.ทบ.\nกง.ทร.\nกซข.ป.\nกซม.ป.\nกทม.กรุงเทพมหานคร\nกบ.ทบ.\nกป.สป.\nกพ.ทบ.\nกพ.ทร.\nกพ.ทหาร\nกร.ทบ.\nกรป.กลาง\nกรอ.พอ.\nกศ.ด.\nกศ.บ.\nกศ.บป.\nกศ.ม.\nกษ.ด.\nกษ.บ.\nกษ.ม.\nกส.ด.\nกส.ทบ.\nกส.บ.\nกส.ม.\nกอ.ปค.\nกอ.รพน.\nก [...]
+ .split(/[\r\n]+/)
+ .filter(function (w) {
+ return w.length > 1;
+ })
+ this.addWords(words, false)
+ }
+ if(finalize){
+ this.finalizeDict();
+ }
+ },
+
+ dictSeek: function (l, r, ch, strOffset, pos) {
+ var ans = null;
+ while (l <= r) {
+ var m = Math.floor((l + r) / 2),
+ dict_item = this.dict[m],
+ len = dict_item.length;
+ if (len <= strOffset) {
+ l = m + 1;
+ } else {
+ var ch_ = dict_item[strOffset];
+ if (ch_ < ch) {
+ l = m + 1;
+ } else if (ch_ > ch) {
+ r = m - 1;
+ } else {
+ ans = m;
+ if (pos == LEFT) {
+ r = m - 1;
+ } else {
+ l = m + 1;
+ }
+ }
+ }
+ }
+ return ans;
+ },
+
+ isFinal: function (acceptor) {
+ return this.dict[acceptor.l].length == acceptor.strOffset;
+ },
+
+ createAcceptor: function () {
+ return {
+ l: 0,
+ r: this.dict.length - 1,
+ strOffset: 0,
+ isFinal: false,
+ dict: this,
+ transit: function (ch) {
+ return this.dict.transit(this, ch);
+ },
+ isError: false,
+ tag: "DICT",
+ w: 1,
+ type: "DICT"
+ };
+ },
+
+ transit: function (acceptor, ch) {
+ var l = this.dictSeek(acceptor.l,
+ acceptor.r,
+ ch,
+ acceptor.strOffset,
+ LEFT);
+ if (l !== null) {
+ var r = this.dictSeek(l,
+ acceptor.r,
+ ch,
+ acceptor.strOffset,
+ RIGHT);
+ acceptor.l = l;
+ acceptor.r = r;
+ acceptor.strOffset++;
+ acceptor.isFinal = this.isFinal(acceptor);
+ } else {
+ acceptor.isError = true;
+ }
+ return acceptor;
+ },
+
+ sortuniq: function(a){
+ return a.sort().filter(function(item, pos, arr){
+ return !pos || item != arr[pos - 1];
+ })
+ },
+
+ flatten: function(a){
+ //[[1,2],[3]] -> [1,2,3]
+ return [].concat.apply([], a);
+ }
+};
+module.exports = WordcutDict;
+
+}).call(this,"/dist/tmp")
+},{"glob":16,"path":22}],3:[function(require,module,exports){
+var WordRule = {
+ createAcceptor: function(tag) {
+ if (tag["WORD_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ var lch = ch.toLowerCase();
+ if (lch >= "a" && lch <= "z") {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "WORD_RULE",
+ type: "WORD_RULE",
+ w: 1};
+ }
+};
+
+var NumberRule = {
+ createAcceptor: function(tag) {
+ if (tag["NUMBER_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (ch >= "0" && ch <= "9") {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "NUMBER_RULE",
+ type: "NUMBER_RULE",
+ w: 1};
+ }
+};
+
+var SpaceRule = {
+ tag: "SPACE_RULE",
+ createAcceptor: function(tag) {
+
+ if (tag["SPACE_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" ||
+ ch == "\u00A0" || ch=="\u2003"//nbsp and emsp
+ ) {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: SpaceRule.tag,
+ w: 1,
+ type: "SPACE_RULE"};
+ }
+}
+
+var SingleSymbolRule = {
+ tag: "SINSYM",
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "SINSYM",
+ w: 1,
+ type: "SINSYM"};
+ }
+}
+
+
+var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule];
+
+module.exports = LatinRules;
+
+},{}],4:[function(require,module,exports){
+var _ = require("underscore")
+ , WordcutCore = require("./wordcut_core");
+var PathInfoBuilder = {
+
+ /*
+ buildByPartAcceptors: function(path, acceptors, i) {
+ var
+ var genInfos = partAcceptors.reduce(function(genInfos, acceptor) {
+
+ }, []);
+
+ return genInfos;
+ }
+ */
+
+ buildByAcceptors: function(path, finalAcceptors, i) {
+ var self = this;
+ var infos = finalAcceptors.map(function(acceptor) {
+ var p = i - acceptor.strOffset + 1
+ , _info = path[p];
+
+ var info = {p: p,
+ mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw),
+ w: acceptor.w + _info.w,
+ unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk,
+ type: acceptor.type};
+
+ if (acceptor.type == "PART") {
+ for(var j = p + 1; j <= i; j++) {
+ path[j].merge = p;
+ }
+ info.merge = p;
+ }
+
+ return info;
+ });
+ return infos.filter(function(info) { return info; });
+ },
+
+ fallback: function(path, leftBoundary, text, i) {
+ var _info = path[leftBoundary];
+ if (text[i].match(/[\u0E48-\u0E4E]/)) {
+ if (leftBoundary != 0)
+ leftBoundary = path[leftBoundary].p;
+ return {p: leftBoundary,
+ mw: 0,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"};
+/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") {
+ leftBoundary = path[leftBoundary].p;
+ return {p: leftBoundary,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"}; */
+ } else {
+ return {p: leftBoundary,
+ mw: _info.mw,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"};
+ }
+ },
+
+ build: function(path, finalAcceptors, i, leftBoundary, text) {
+ var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i);
+ if (basicPathInfos.length > 0) {
+ return basicPathInfos;
+ } else {
+ return [this.fallback(path, leftBoundary, text, i)];
+ }
+ }
+};
+
+module.exports = function() {
+ return _.clone(PathInfoBuilder);
+}
+
+},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){
+var _ = require("underscore");
+
+
+var PathSelector = {
+ selectPath: function(paths) {
+ var path = paths.reduce(function(selectedPath, path) {
+ if (selectedPath == null) {
+ return path;
+ } else {
+ if (path.unk < selectedPath.unk)
+ return path;
+ if (path.unk == selectedPath.unk) {
+ if (path.mw < selectedPath.mw)
+ return path
+ if (path.mw == selectedPath.mw) {
+ if (path.w < selectedPath.w)
+ return path;
+ }
+ }
+ return selectedPath;
+ }
+ }, null);
+ return path;
+ },
+
+ createPath: function() {
+ return [{p:null, w:0, unk:0, type: "INIT", mw:0}];
+ }
+};
+
+module.exports = function() {
+ return _.clone(PathSelector);
+};
+
+},{"underscore":25}],6:[function(require,module,exports){
+function isMatch(pat, offset, ch) {
+ if (pat.length <= offset)
+ return false;
+ var _ch = pat[offset];
+ return _ch == ch ||
+ (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) ||
+ (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) ||
+ (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/));
+}
+
+var Rule0 = {
+ pat: "เหก็ม",
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (isMatch(Rule0.pat, this.strOffset,ch)) {
+ this.isFinal = (this.strOffset + 1 == Rule0.pat.length);
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "THAI_RULE",
+ type: "THAI_RULE",
+ w: 1};
+ }
+};
+
+var PartRule = {
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ patterns: [
+ "แก", "เก", "ก้", "กก์", "กา", "กี", "กิ", "กืก"
+ ],
+ isFinal: false,
+ transit: function(ch) {
+ var offset = this.strOffset;
+ this.patterns = this.patterns.filter(function(pat) {
+ return isMatch(pat, offset, ch);
+ });
+
+ if (this.patterns.length > 0) {
+ var len = 1 + offset;
+ this.isFinal = this.patterns.some(function(pat) {
+ return pat.length == len;
+ });
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "PART",
+ type: "PART",
+ unk: 1,
+ w: 1};
+ }
+};
+
+var ThaiRules = [Rule0, PartRule];
+
+module.exports = ThaiRules;
+
+},{}],7:[function(require,module,exports){
+var sys = require("sys")
+ , WordcutDict = require("./dict")
+ , WordcutCore = require("./wordcut_core")
+ , PathInfoBuilder = require("./path_info_builder")
+ , PathSelector = require("./path_selector")
+ , Acceptors = require("./acceptors")
+ , latinRules = require("./latin_rules")
+ , thaiRules = require("./thai_rules")
+ , _ = require("underscore");
+
+
+var Wordcut = Object.create(WordcutCore);
+Wordcut.defaultPathInfoBuilder = PathInfoBuilder;
+Wordcut.defaultPathSelector = PathSelector;
+Wordcut.defaultAcceptors = Acceptors;
+Wordcut.defaultLatinRules = latinRules;
+Wordcut.defaultThaiRules = thaiRules;
+Wordcut.defaultDict = WordcutDict;
+
+
+Wordcut.initNoDict = function(dict_path) {
+ var self = this;
+ self.pathInfoBuilder = new self.defaultPathInfoBuilder;
+ self.pathSelector = new self.defaultPathSelector;
+ self.acceptors = new self.defaultAcceptors;
+ self.defaultLatinRules.forEach(function(rule) {
+ self.acceptors.creators.push(rule);
+ });
+ self.defaultThaiRules.forEach(function(rule) {
+ self.acceptors.creators.push(rule);
+ });
+};
+
+Wordcut.init = function(dict_path, withDefault, additionalWords) {
+ withDefault = withDefault || false;
+ this.initNoDict();
+ var dict = _.clone(this.defaultDict);
+ dict.init(dict_path, withDefault, additionalWords);
+ this.acceptors.creators.push(dict);
+};
+
+module.exports = Wordcut;
+
+},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){
+var WordcutCore = {
+
+ buildPath: function(text) {
+ var self = this
+ , path = self.pathSelector.createPath()
+ , leftBoundary = 0;
+ self.acceptors.reset();
+ for (var i = 0; i < text.length; i++) {
+ var ch = text[i];
+ self.acceptors.transit(ch);
+
+ var possiblePathInfos = self
+ .pathInfoBuilder
+ .build(path,
+ self.acceptors.getFinalAcceptors(),
+ i,
+ leftBoundary,
+ text);
+ var selectedPath = self.pathSelector.selectPath(possiblePathInfos)
+
+ path.push(selectedPath);
+ if (selectedPath.type !== "UNK") {
+ leftBoundary = i;
+ }
+ }
+ return path;
+ },
+
+ pathToRanges: function(path) {
+ var e = path.length - 1
+ , ranges = [];
+
+ while (e > 0) {
+ var info = path[e]
+ , s = info.p;
+
+ if (info.merge !== undefined && ranges.length > 0) {
+ var r = ranges[ranges.length - 1];
+ r.s = info.merge;
+ s = r.s;
+ } else {
+ ranges.push({s:s, e:e});
+ }
+ e = s;
+ }
+ return ranges.reverse();
+ },
+
+ rangesToText: function(text, ranges, delimiter) {
+ return ranges.map(function(r) {
+ return text.substring(r.s, r.e);
+ }).join(delimiter);
+ },
+
+ cut: function(text, delimiter) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+ return this
+ .rangesToText(text, ranges,
+ (delimiter === undefined ? "|" : delimiter));
+ },
+
+ cutIntoRanges: function(text, noText) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+
+ if (!noText) {
+ ranges.forEach(function(r) {
+ r.text = text.substring(r.s, r.e);
+ });
+ }
+ return ranges;
+ },
+
+ cutIntoArray: function(text) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+
+ return ranges.map(function(r) {
+ return text.substring(r.s, r.e)
+ });
+ }
+};
+
+module.exports = WordcutCore;
+
+},{}],9:[function(require,module,exports){
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// when used in node, this will actually load the util module we depend on
+// versus loading the builtin util module as happens otherwise
+// this is a bug in node module loading as far as I am concerned
+var util = require('util/');
+
+var pSlice = Array.prototype.slice;
+var hasOwn = Object.prototype.hasOwnProperty;
+
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = module.exports = ok;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({ message: message,
+// actual: actual,
+// expected: expected })
+
+assert.AssertionError = function AssertionError(options) {
+ this.name = 'AssertionError';
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ if (options.message) {
+ this.message = options.message;
+ this.generatedMessage = false;
+ } else {
+ this.message = getMessage(this);
+ this.generatedMessage = true;
+ }
+ var stackStartFunction = options.stackStartFunction || fail;
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ }
+ else {
+ // non v8 browsers so we can have a stacktrace
+ var err = new Error();
+ if (err.stack) {
+ var out = err.stack;
+
+ // try to strip useless frames
+ var fn_name = stackStartFunction.name;
+ var idx = out.indexOf('\n' + fn_name);
+ if (idx >= 0) {
+ // once we have located the function frame
+ // we need to strip out everything before it (and its line)
+ var next_line = out.indexOf('\n', idx + 1);
+ out = out.substring(next_line + 1);
+ }
+
+ this.stack = out;
+ }
+ }
+};
+
+// assert.AssertionError instanceof Error
+util.inherits(assert.AssertionError, Error);
+
+function replacer(key, value) {
+ if (util.isUndefined(value)) {
+ return '' + value;
+ }
+ if (util.isNumber(value) && !isFinite(value)) {
+ return value.toString();
+ }
+ if (util.isFunction(value) || util.isRegExp(value)) {
+ return value.toString();
+ }
+ return value;
+}
+
+function truncate(s, n) {
+ if (util.isString(s)) {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+
+function getMessage(self) {
+ return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
+ self.operator + ' ' +
+ truncate(JSON.stringify(self.expected, replacer), 128);
+}
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, !!guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+function ok(value, message) {
+ if (!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = ok;
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, '==', assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, '!=', assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'deepEqual', assert.deepEqual);
+ }
+};
+
+function _deepEqual(actual, expected) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
+ if (actual.length != expected.length) return false;
+
+ for (var i = 0; i < actual.length; i++) {
+ if (actual[i] !== expected[i]) return false;
+ }
+
+ return true;
+
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (util.isDate(actual) && util.isDate(expected)) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3 If the expected value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object with the same source and
+ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
+ } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.multiline === expected.multiline &&
+ actual.lastIndex === expected.lastIndex &&
+ actual.ignoreCase === expected.ignoreCase;
+
+ // 7.4. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!util.isObject(actual) && !util.isObject(expected)) {
+ return actual == expected;
+
+ // 7.5 For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected);
+ }
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv(a, b) {
+ if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ // if one is a primitive, the other must be same
+ if (util.isPrimitive(a) || util.isPrimitive(b)) {
+ return a === b;
+ }
+ var aIsArgs = isArguments(a),
+ bIsArgs = isArguments(b);
+ if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
+ return false;
+ if (aIsArgs) {
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b);
+ }
+ var ka = objectKeys(a),
+ kb = objectKeys(b),
+ key, i;
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key])) return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
+ }
+};
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, '===', assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as
+// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, '!==', assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (Object.prototype.toString.call(expected) == '[object RegExp]') {
+ return expected.test(actual);
+ } else if (actual instanceof expected) {
+ return true;
+ } else if (expected.call({}, actual) === true) {
+ return true;
+ }
+
+ return false;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (util.isString(expected)) {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail(actual, expected, 'Missing expected exception' + message);
+ }
+
+ if (!shouldThrow && expectedException(actual, expected)) {
+ fail(actual, expected, 'Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws.apply(this, [true].concat(pSlice.call(arguments)));
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/message) {
+ _throws.apply(this, [false].concat(pSlice.call(arguments)));
+};
+
+assert.ifError = function(err) { if (err) {throw err;}};
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+},{"util/":28}],10:[function(require,module,exports){
+'use strict';
+module.exports = balanced;
+function balanced(a, b, str) {
+ if (a instanceof RegExp) a = maybeMatch(a, str);
+ if (b instanceof RegExp) b = maybeMatch(b, str);
+
+ var r = range(a, b, str);
+
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+}
+
+function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+}
+
+balanced.range = range;
+function range(a, b, str) {
+ var begs, beg, left, right, result;
+ var ai = str.indexOf(a);
+ var bi = str.indexOf(b, ai + 1);
+ var i = ai;
+
+ if (ai >= 0 && bi > 0) {
+ begs = [];
+ left = str.length;
+
+ while (i >= 0 && !result) {
+ if (i == ai) {
+ begs.push(i);
+ ai = str.indexOf(a, i + 1);
+ } else if (begs.length == 1) {
+ result = [ begs.pop(), bi ];
+ } else {
+ beg = begs.pop();
+ if (beg < left) {
+ left = beg;
+ right = bi;
+ }
+
+ bi = str.indexOf(b, i + 1);
+ }
+
+ i = ai < bi && ai >= 0 ? ai : bi;
+ }
+
+ if (begs.length) {
+ result = [ left, right ];
+ }
+ }
+
+ return result;
+}
+
+},{}],11:[function(require,module,exports){
+var concatMap = require('concat-map');
+var balanced = require('balanced-match');
+
+module.exports = expandTop;
+
+var escSlash = '\0SLASH'+Math.random()+'\0';
+var escOpen = '\0OPEN'+Math.random()+'\0';
+var escClose = '\0CLOSE'+Math.random()+'\0';
+var escComma = '\0COMMA'+Math.random()+'\0';
+var escPeriod = '\0PERIOD'+Math.random()+'\0';
+
+function numeric(str) {
+ return parseInt(str, 10) == str
+ ? parseInt(str, 10)
+ : str.charCodeAt(0);
+}
+
+function escapeBraces(str) {
+ return str.split('\\\\').join(escSlash)
+ .split('\\{').join(escOpen)
+ .split('\\}').join(escClose)
+ .split('\\,').join(escComma)
+ .split('\\.').join(escPeriod);
+}
+
+function unescapeBraces(str) {
+ return str.split(escSlash).join('\\')
+ .split(escOpen).join('{')
+ .split(escClose).join('}')
+ .split(escComma).join(',')
+ .split(escPeriod).join('.');
+}
+
+
+// Basically just str.split(","), but handling cases
+// where we have nested braced sections, which should be
+// treated as individual members, like {a,{b,c},d}
+function parseCommaParts(str) {
+ if (!str)
+ return [''];
+
+ var parts = [];
+ var m = balanced('{', '}', str);
+
+ if (!m)
+ return str.split(',');
+
+ var pre = m.pre;
+ var body = m.body;
+ var post = m.post;
+ var p = pre.split(',');
+
+ p[p.length-1] += '{' + body + '}';
+ var postParts = parseCommaParts(post);
+ if (post.length) {
+ p[p.length-1] += postParts.shift();
+ p.push.apply(p, postParts);
+ }
+
+ parts.push.apply(parts, p);
+
+ return parts;
+}
+
+function expandTop(str) {
+ if (!str)
+ return [];
+
+ // I don't know why Bash 4.3 does this, but it does.
+ // Anything starting with {} will have the first two bytes preserved
+ // but *only* at the top level, so {},a}b will not expand to anything,
+ // but a{},b}c will be expanded to [a}c,abc].
+ // One could argue that this is a bug in Bash, but since the goal of
+ // this module is to match Bash's rules, we escape a leading {}
+ if (str.substr(0, 2) === '{}') {
+ str = '\\{\\}' + str.substr(2);
+ }
+
+ return expand(escapeBraces(str), true).map(unescapeBraces);
+}
+
+function identity(e) {
+ return e;
+}
+
+function embrace(str) {
+ return '{' + str + '}';
+}
+function isPadded(el) {
+ return /^-?0\d/.test(el);
+}
+
+function lte(i, y) {
+ return i <= y;
+}
+function gte(i, y) {
+ return i >= y;
+}
+
+function expand(str, isTop) {
+ var expansions = [];
+
+ var m = balanced('{', '}', str);
+ if (!m || /\$$/.test(m.pre)) return [str];
+
+ var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
+ var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
+ var isSequence = isNumericSequence || isAlphaSequence;
+ var isOptions = m.body.indexOf(',') >= 0;
+ if (!isSequence && !isOptions) {
+ // {a},b}
+ if (m.post.match(/,.*\}/)) {
+ str = m.pre + '{' + m.body + escClose + m.post;
+ return expand(str);
+ }
+ return [str];
+ }
+
+ var n;
+ if (isSequence) {
+ n = m.body.split(/\.\./);
+ } else {
+ n = parseCommaParts(m.body);
+ if (n.length === 1) {
+ // x{{a,b}}y ==> x{a}y x{b}y
+ n = expand(n[0], false).map(embrace);
+ if (n.length === 1) {
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+ return post.map(function(p) {
+ return m.pre + n[0] + p;
+ });
+ }
+ }
+ }
+
+ // at this point, n is the parts, and we know it's not a comma set
+ // with a single entry.
+
+ // no need to expand pre, since it is guaranteed to be free of brace-sets
+ var pre = m.pre;
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+
+ var N;
+
+ if (isSequence) {
+ var x = numeric(n[0]);
+ var y = numeric(n[1]);
+ var width = Math.max(n[0].length, n[1].length)
+ var incr = n.length == 3
+ ? Math.abs(numeric(n[2]))
+ : 1;
+ var test = lte;
+ var reverse = y < x;
+ if (reverse) {
+ incr *= -1;
+ test = gte;
+ }
+ var pad = n.some(isPadded);
+
+ N = [];
+
+ for (var i = x; test(i, y); i += incr) {
+ var c;
+ if (isAlphaSequence) {
+ c = String.fromCharCode(i);
+ if (c === '\\')
+ c = '';
+ } else {
+ c = String(i);
+ if (pad) {
+ var need = width - c.length;
+ if (need > 0) {
+ var z = new Array(need + 1).join('0');
+ if (i < 0)
+ c = '-' + z + c.slice(1);
+ else
+ c = z + c;
+ }
+ }
+ }
+ N.push(c);
+ }
+ } else {
+ N = concatMap(n, function(el) { return expand(el, false) });
+ }
+
+ for (var j = 0; j < N.length; j++) {
+ for (var k = 0; k < post.length; k++) {
+ var expansion = pre + N[j] + post[k];
+ if (!isTop || isSequence || expansion)
+ expansions.push(expansion);
+ }
+ }
+
+ return expansions;
+}
+
+
+},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){
+
+},{}],13:[function(require,module,exports){
+module.exports = function (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ var x = fn(xs[i], i);
+ if (isArray(x)) res.push.apply(res, x);
+ else res.push(x);
+ }
+ return res;
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+},{}],14:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n))
+ throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+
+ if (!this._events)
+ this._events = {};
+
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events.error ||
+ (isObject(this._events.error) && !this._events.error.length)) {
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ }
+ throw TypeError('Uncaught, unspecified "error" event.');
+ }
+ }
+
+ handler = this._events[type];
+
+ if (isUndefined(handler))
+ return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ len = arguments.length;
+ args = new Array(len - 1);
+ for (i = 1; i < len; i++)
+ args[i - 1] = arguments[i];
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ len = arguments.length;
+ args = new Array(len - 1);
+ for (i = 1; i < len; i++)
+ args[i - 1] = arguments[i];
+
+ listeners = handler.slice();
+ len = listeners.length;
+ for (i = 0; i < len; i++)
+ listeners[i].apply(this, args);
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events)
+ this._events = {};
+
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (this._events.newListener)
+ this.emit('newListener', type,
+ isFunction(listener.listener) ?
+ listener.listener : listener);
+
+ if (!this._events[type])
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ else if (isObject(this._events[type]))
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ else
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+
+ // Check for listener leak
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ var m;
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+
+ return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events || !this._events[type])
+ return this;
+
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener ||
+ (isFunction(list.listener) && list.listener === listener)) {
+ delete this._events[type];
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener ||
+ (list[i].listener && list[i].listener === listener)) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+
+ if (!this._events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!this._events.removeListener) {
+ if (arguments.length === 0)
+ this._events = {};
+ else if (this._events[type])
+ delete this._events[type];
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else {
+ // LIFO order
+ while (listeners.length)
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ delete this._events[type];
+
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ var ret;
+ if (!this._events || !this._events[type])
+ ret = [];
+ else if (isFunction(this._events[type]))
+ ret = [this._events[type]];
+ else
+ ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ var ret;
+ if (!emitter._events || !emitter._events[type])
+ ret = 0;
+ else if (isFunction(emitter._events[type]))
+ ret = 1;
+ else
+ ret = emitter._events[type].length;
+ return ret;
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+},{}],15:[function(require,module,exports){
+(function (process){
+exports.alphasort = alphasort
+exports.alphasorti = alphasorti
+exports.setopts = setopts
+exports.ownProp = ownProp
+exports.makeAbs = makeAbs
+exports.finish = finish
+exports.mark = mark
+exports.isIgnored = isIgnored
+exports.childrenIgnored = childrenIgnored
+
+function ownProp (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var path = require("path")
+var minimatch = require("minimatch")
+var isAbsolute = require("path-is-absolute")
+var Minimatch = minimatch.Minimatch
+
+function alphasorti (a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase())
+}
+
+function alphasort (a, b) {
+ return a.localeCompare(b)
+}
+
+function setupIgnores (self, options) {
+ self.ignore = options.ignore || []
+
+ if (!Array.isArray(self.ignore))
+ self.ignore = [self.ignore]
+
+ if (self.ignore.length) {
+ self.ignore = self.ignore.map(ignoreMap)
+ }
+}
+
+function ignoreMap (pattern) {
+ var gmatcher = null
+ if (pattern.slice(-3) === '/**') {
+ var gpattern = pattern.replace(/(\/\*\*)+$/, '')
+ gmatcher = new Minimatch(gpattern)
+ }
+
+ return {
+ matcher: new Minimatch(pattern),
+ gmatcher: gmatcher
+ }
+}
+
+function setopts (self, pattern, options) {
+ if (!options)
+ options = {}
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern
+ }
+
+ self.silent = !!options.silent
+ self.pattern = pattern
+ self.strict = options.strict !== false
+ self.realpath = !!options.realpath
+ self.realpathCache = options.realpathCache || Object.create(null)
+ self.follow = !!options.follow
+ self.dot = !!options.dot
+ self.mark = !!options.mark
+ self.nodir = !!options.nodir
+ if (self.nodir)
+ self.mark = true
+ self.sync = !!options.sync
+ self.nounique = !!options.nounique
+ self.nonull = !!options.nonull
+ self.nosort = !!options.nosort
+ self.nocase = !!options.nocase
+ self.stat = !!options.stat
... 16790 lines suppressed ...