From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D98228CF77 for ; Sat, 6 Dec 2025 18:13:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.133 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765044830; cv=none; b=IU5G+MSYfeAkUuNCVACEIMU5yHOG5BvLEBZeQSg1KlSNbKIIjEi3all2Yn+/P1oEI64oVNOrrcLtJW5+tmc+gD4UcahI28VOiUUpiH0RRWmWA8DHgff6u/9KeSQ3+M3YJnPDyXcVqb13gypGK7G3FA0DDL3L8NYyzg8qc6kD9do= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765044830; c=relaxed/simple; bh=qU2cleV4fj5zMQ18HryrXLlRoEPWBgRUDx0wBY4FAN0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=JHvgo1SwSQXTH2KrcI0hcaL2zOpnt+Nwa0789g55Lxs6LLdgWN3aS7ry1XMT7zHZiDGf/J0tN+3grOVl+Hv5FWh/Q5IyE38d418Du4H44say03SsOIsqV41DBKfRRy1g1WDKcznTJHYfV9Q78xO7qrNPd5Q8orwC9A2IxqIqe2c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=qUiw4WAw; arc=none smtp.client-ip=198.137.202.133 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="qUiw4WAw" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-Type: Content-ID:Content-Description:In-Reply-To:References; bh=V6tUgMv8In8NX2nvqkXT32Ua8eaN6dhFCUGIBonjtFg=; b=qUiw4WAwmXowvcoVlqqfq9WgTI 8Ey4ZKjpGur6jXlRlLideKZjztPtC8Evdom90FHzpC0pX+FIR5v56CLHv/K83PtDI2kiWk0jPOLUw MPf1rQVFZP/GHvcmsDxFlZbHPW6Ygkz0H6Zo3/Uh14XEzFSmnujUWmFVO1h9YGQ9XNl/evQ9niIeg tj/SoOnq8himLE6hSt9NyWaYzqXssjOO2bT0lZWKbvklgK3sx+gJBX+7lx+dWXsB5mMgo5oZVo7k+ LdOpLzrcQkTcOeR+ilC21SEXaOajgFTTymdECGFv8Tx0GBRMU1umBMqMTgC7HPACk+tVpQZPDpon7 KzNSTApg==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1vRwmx-0000000B7Rq-2KkF; Sat, 06 Dec 2025 18:13:47 +0000 From: Luis Chamberlain To: Chuck Lever , Daniel Gomez , kdevops@lists.linux.dev Cc: Luis Chamberlain Subject: [PATCH 0/2] add custom user plugin support Date: Sat, 6 Dec 2025 10:13:43 -0800 Message-ID: <20251206181346.2650230-1-mcgrof@kernel.org> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: kdevops@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: Luis Chamberlain This adds custom user plugin support to kdevops, so that users can define their own workflows without having to upstream the solution to kdevops. This lets anyone benefit from kdevops without having to contribute to it. These custom workflows can be simply silly R&D or proprietary workflows. I provide one public workflow example, my knlp project as an AI R&D project which hast custom training innovations being evaluated. To add my plugin I just do: make kdevops-plugin-add https://github.com/mcgrof/knlp And it unpacks the inferred .kdevops*.xz tarball to the user's ~/.config/kdevops/plugins/knlp/ directory in this example. To list installed plugins: make kdevops-plugin-list Installed plugins: NAME VERSION SOURCE ---- ------- ------ knlp 1.0.0 https://github.com/mcgrof/knlp While at it also update our image of what kdevops as we had not updated it for along time. Add an svg image we can later use to enhance this further as we evolve. we can use it as input with generative AI as the project adds new fautures. Luis Chamberlain (2): kdevops: Add versioned plugin system for workflows images: Update kdevops diagram with new design Kconfig | 4 + Makefile | 1 + Makefile.plugins | 66 ++ docs/kdevops-terraform.md | 62 +- docs/plugins.md | 407 ++++++++ docs/user-workflows/README.md | 148 +++ docs/user-workflows/example-knlp/Kconfig | 10 + docs/user-workflows/example-knlp/Makefile | 14 + .../defconfigs/configs/knlp.config | 11 + .../example-knlp/playbooks/knlp.yml | 10 + .../playbooks/roles/devconfig/tasks/knlp.yml | 27 + .../playbooks/roles/devconfig/tasks/main.yml | 14 + .../playbooks/roles/gen_hosts/tasks/main.yml | 17 + .../roles/gen_hosts/templates/knlp.j2 | 33 + .../playbooks/roles/gen_nodes/tasks/main.yml | 36 + .../playbooks/roles/knlp/defaults/main.yml | 8 + .../playbooks/roles/knlp/tasks/main.yml | 30 + .../example-knlp/workflows/knlp/Kconfig | 44 + .../example-knlp/workflows/knlp/Makefile | 28 + images/kdevops-diagram.png | Bin 72760 -> 813420 bytes images/kdevops-diagram.svg | 398 ++++++++ kconfigs/Kconfig.plugins_stub | 8 + kconfigs/Kconfig.user_stub | 5 + kconfigs/Kconfig.user_workflows | 90 ++ playbooks/roles/devconfig/tasks/main.yml | 19 + playbooks/roles/gen_hosts/tasks/main.yml | 19 + playbooks/roles/gen_nodes/tasks/main.yml | 19 + scripts/get_plugins_kconfig.sh | 18 + scripts/get_user_kconfig.sh | 18 + scripts/kconfig/kconfig.Makefile | 14 +- scripts/kdevops-plugin.sh | 918 ++++++++++++++++++ workflows/Makefile | 14 + 32 files changed, 2501 insertions(+), 9 deletions(-) create mode 100644 Makefile.plugins create mode 100644 docs/plugins.md create mode 100644 docs/user-workflows/README.md create mode 100644 docs/user-workflows/example-knlp/Kconfig create mode 100644 docs/user-workflows/example-knlp/Makefile create mode 100644 docs/user-workflows/example-knlp/defconfigs/configs/knlp.config create mode 100644 docs/user-workflows/example-knlp/playbooks/knlp.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/devconfig/tasks/knlp.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/devconfig/tasks/main.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/gen_hosts/tasks/main.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/gen_hosts/templates/knlp.j2 create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/gen_nodes/tasks/main.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/knlp/defaults/main.yml create mode 100644 docs/user-workflows/example-knlp/playbooks/roles/knlp/tasks/main.yml create mode 100644 docs/user-workflows/example-knlp/workflows/knlp/Kconfig create mode 100644 docs/user-workflows/example-knlp/workflows/knlp/Makefile create mode 100644 images/kdevops-diagram.svg create mode 100644 kconfigs/Kconfig.plugins_stub create mode 100644 kconfigs/Kconfig.user_stub create mode 100644 kconfigs/Kconfig.user_workflows create mode 100755 scripts/get_plugins_kconfig.sh create mode 100755 scripts/get_user_kconfig.sh create mode 100755 scripts/kdevops-plugin.sh -- 2.51.0