* [PATCH 1/2] gen_hosts: refactor monolithic hosts.j2 template into per-workflow templates
2025-08-29 10:31 [PATCH 0/2] declared hosts support Luis Chamberlain
@ 2025-08-29 10:31 ` Luis Chamberlain
2025-08-29 10:36 ` Luis Chamberlain
2025-08-29 10:31 ` [PATCH 2/2] declared_hosts: add support for pre-existing infrastructure Luis Chamberlain
1 sibling, 1 reply; 5+ messages in thread
From: Luis Chamberlain @ 2025-08-29 10:31 UTC (permalink / raw)
To: Chuck Lever, Daniel Gomez, kdevops; +Cc: Luis Chamberlain
The hosts.j2 template had become unwieldy spaghetti code with all workflows
mixed together in a single file, making it difficult to read, maintain, and
extend. This was particularly problematic when attempting to add new features.
This refactoring:
- Splits the monolithic hosts.j2 into individual workflow templates under
playbooks/roles/gen_hosts/templates/workflows/
- Creates dedicated templates for each workflow (fstests, blktests, selftests,
mmtests, sysbench, ai, fio-tests, etc.)
- Converts the main hosts.j2 to use Jinja2 includes for cleaner organization
- Maintains exact same functionality with improved maintainability
- Removes workflow-specific template overrides from all workflow Makefiles
as they now all use the unified hosts.j2 template
Benefits:
- Each workflow template is now self-contained and easy to understand
- Adding new workflows no longer requires navigating through hundreds of
lines of unrelated configuration
- Template logic is easier to debug and test
- All workflows now use a consistent template system
This is a pure refactoring with no functional changes. The generated hosts
files remain identical to the previous implementation.
Generated-by: Claude AI
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
playbooks/roles/gen_hosts/tasks/main.yml | 40 ++-
playbooks/roles/gen_hosts/templates/hosts.j2 | 264 +++---------------
.../roles/gen_hosts/templates/workflows/ai.j2 | 99 +++++++
.../gen_hosts/templates/workflows/blktests.j2 | 58 ++++
.../gen_hosts/templates/workflows/cxl.j2 | 7 +
.../gen_hosts/templates/workflows/default.j2 | 62 ++++
.../templates/workflows/fio-tests.j2 | 38 +++
.../gen_hosts/templates/workflows/fstests.j2 | 72 +++++
.../gen_hosts/templates/workflows/gitr.j2 | 41 +++
.../gen_hosts/templates/workflows/ltp.j2 | 41 +++
.../gen_hosts/templates/workflows/mmtests.j2 | 77 +++++
.../gen_hosts/templates/workflows/nfstest.j2 | 41 +++
.../gen_hosts/templates/workflows/pynfs.j2 | 7 +
.../templates/workflows/reboot-limit.j2 | 33 +++
.../templates/workflows/selftests.j2 | 53 ++++
.../gen_hosts/templates/workflows/sysbench.j2 | 53 ++++
workflows/ai/Makefile | 3 +-
workflows/blktests/Makefile | 3 +-
workflows/cxl/Makefile | 3 +-
workflows/fio-tests/Makefile | 3 +-
workflows/fstests/Makefile | 3 +-
workflows/gitr/Makefile | 3 +-
workflows/linux/Makefile | 3 +-
workflows/ltp/Makefile | 3 +-
workflows/mmtests/Makefile | 3 +-
workflows/nfstest/Makefile | 3 +-
workflows/pynfs/Makefile | 3 +-
workflows/selftests/Makefile | 3 +-
workflows/sysbench/Makefile | 3 +-
29 files changed, 780 insertions(+), 245 deletions(-)
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/ai.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/blktests.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/cxl.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/default.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/fio-tests.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/fstests.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/gitr.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/ltp.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/mmtests.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/nfstest.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/pynfs.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/reboot-limit.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/selftests.j2
create mode 100644 playbooks/roles/gen_hosts/templates/workflows/sysbench.j2
diff --git a/playbooks/roles/gen_hosts/tasks/main.yml b/playbooks/roles/gen_hosts/tasks/main.yml
index fb63629a..657fd22b 100644
--- a/playbooks/roles/gen_hosts/tasks/main.yml
+++ b/playbooks/roles/gen_hosts/tasks/main.yml
@@ -10,6 +10,7 @@
skip: true
tags: vars
+
- name: Get our user
ansible.builtin.command: "whoami"
register: my_user
@@ -39,6 +40,21 @@
path: "{{ kdevops_hosts_template_full_path }}"
register: ansible_hosts_template
+- name: Generate the Ansible hosts file for declared hosts configuration
+ tags: ['hosts']
+ ansible.builtin.template:
+ src: "{{ kdevops_hosts_template }}"
+ dest: "{{ ansible_cfg_inventory }}"
+ force: true
+ trim_blocks: True
+ lstrip_blocks: True
+ mode: '0644'
+ when:
+ - kdevops_use_declared_hosts|default(false)|bool
+ - kdevops_declared_hosts is defined
+ - kdevops_declared_hosts|length > 0
+ - ansible_hosts_template.stat.exists
+
- name: Set fstests config file variable for {{ fstests_fstyp }}
ansible.builtin.set_fact:
is_fstests: true
@@ -67,6 +83,7 @@
when:
- bootlinux_builder
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file
tags: ["hosts"]
@@ -80,6 +97,7 @@
- not kdevops_workflows_dedicated_workflow
- ansible_hosts_template.stat.exists
- not kdevops_enable_nixos|default(false)|bool
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file for NixOS
tags: ['hosts']
@@ -93,6 +111,7 @@
- not kdevops_workflows_dedicated_workflow
- ansible_hosts_template.stat.exists
- kdevops_enable_nixos|default(false)|bool
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Update Ansible inventory access modification time so make sees it updated
ansible.builtin.file:
@@ -112,6 +131,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_cxl
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file for dedicated pynfs work
tags: ["hosts"]
@@ -125,6 +145,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_pynfs
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file for dedicated gitr workflow
tags: ["hosts"]
@@ -140,6 +161,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_gitr
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate an Ansible inventory file for a dedicated ltp workflow
tags: ["hosts"]
@@ -155,6 +177,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_ltp
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file for dedicated nfstest workflow
tags: ["hosts"]
@@ -170,6 +193,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_nfstest
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Set empty enabled test types list for fstests
tags: ["hosts"]
@@ -178,6 +202,7 @@
when:
- is_fstests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Check which fstests test types are enabled
register: fstests_enabled_test_types_reg
@@ -202,6 +227,7 @@
when:
- is_fstests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Now expand the list of enabled fstests for valid configuration sections
tags: ["hosts"]
@@ -213,6 +239,7 @@
when:
- is_fstests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- item.changed
- name: Generate the Ansible inventory file for a dedicated fstests setup
@@ -233,6 +260,7 @@
when:
- is_fstests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Infer enabled blktests test section types
ansible.builtin.set_fact:
@@ -247,6 +275,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_blktests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Debug inferring block test types
ansible.builtin.debug:
@@ -269,6 +298,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_blktests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Infer enabled selftests test section types
ansible.builtin.set_fact:
@@ -283,6 +313,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_selftests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible inventory file for a dedicated selftests setup
tags: ["hosts"]
@@ -296,6 +327,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_selftests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Collect dynamically supported filesystems
vars:
@@ -338,6 +370,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_sysbench
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible hosts file for a dedicated fio-tests setup
@@ -354,6 +387,7 @@
- kdevops_workflow_enable_fio_tests
- ansible_hosts_template.stat.exists
- not kdevops_enable_nixos|default(false)|bool
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Infer enabled mmtests test types
@@ -369,6 +403,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_mmtests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible hosts file for a dedicated mmtests setup
tags: ["hosts"]
@@ -382,6 +417,7 @@
- kdevops_workflows_dedicated_workflow
- kdevops_workflow_enable_mmtests
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Generate the Ansible hosts file for a dedicated reboot-limit setup
tags: ["hosts"]
@@ -395,6 +431,7 @@
- kdevops_workflows_dedicated_workflow
- workflows_reboot_limit
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Load AI nodes configuration for multi-filesystem setup
include_vars:
@@ -426,8 +463,9 @@
mode: '0644'
when:
- kdevops_workflows_dedicated_workflow
- - kdevops_workflow_enable_ai
+ - kdevops_workflow_enable_ai|default(false)|bool
- ansible_hosts_template.stat.exists
+ - not kdevops_use_declared_hosts|default(false)|bool
- name: Verify if final host file exists
ansible.builtin.stat:
diff --git a/playbooks/roles/gen_hosts/templates/hosts.j2 b/playbooks/roles/gen_hosts/templates/hosts.j2
index 0e896481..2f2f5d41 100644
--- a/playbooks/roles/gen_hosts/templates/hosts.j2
+++ b/playbooks/roles/gen_hosts/templates/hosts.j2
@@ -5,242 +5,44 @@ proper identation. We don't need identation for the ansible hosts file.
Each workflow which has its own custom ansible host file generated should use
its own jinja2 template file and define its own ansible task for its generation.
#}
-{% if kdevops_workflows_dedicated_workflow %}
+{% if kdevops_declared_hosts is defined and kdevops_declared_hosts %}
+{# Use declared hosts that skip bringup process - for bare metal or pre-existing infrastructure #}
+{% include 'workflows/declared-hosts.j2' %}
+{% elif kdevops_workflows_dedicated_workflow %}
+{# Include workflow-specific template based on enabled workflow. Each workflow has its own
+ template file under workflows/ directory for better maintainability and modularity #}
{% if workflows_reboot_limit %}
-[all]
-localhost ansible_connection=local
-{{ kdevops_host_prefix }}-reboot-limit
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-reboot-limit-dev
-{% endif %}
-
-[all:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-[baseline]
-{{ kdevops_host_prefix }}-reboot-limit
-
-[baseline:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% if kdevops_baseline_and_dev %}
-[dev]
-{{ kdevops_host_prefix }}-reboot-limit-dev
-
-[dev:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% endif %}
-[reboot-limit]
-{{ kdevops_host_prefix }}-reboot-limit
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-reboot-limit-dev
-{% endif %}
-
-[reboot-limit:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+{% include 'workflows/reboot-limit.j2' %}
{% elif kdevops_workflow_enable_fio_tests %}
-[all]
-localhost ansible_connection=local
-{{ kdevops_host_prefix }}-fio-tests
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-fio-tests-dev
-{% endif %}
-
-[all:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-[baseline]
-{{ kdevops_host_prefix }}-fio-tests
-
-[baseline:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% if kdevops_baseline_and_dev %}
-[dev]
-{{ kdevops_host_prefix }}-fio-tests-dev
-
-[dev:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% endif %}
-[fio_tests]
-{{ kdevops_host_prefix }}-fio-tests
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-fio-tests-dev
-{% endif %}
-
-[fio_tests:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-[service]
-
-[service:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% elif kdevops_workflow_enable_ai %}
-{% if ai_enable_multifs_testing|default(false)|bool %}
-{# Multi-filesystem section-based hosts #}
-[all]
-localhost ansible_connection=local
-{% for node in all_generic_nodes %}
-{{ node }}
-{% endfor %}
-
-[all:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-[baseline]
-{% for node in all_generic_nodes %}
-{% if not node.endswith('-dev') %}
-{{ node }}
-{% endif %}
-{% endfor %}
-
-[baseline:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% if kdevops_baseline_and_dev %}
-[dev]
-{% for node in all_generic_nodes %}
-{% if node.endswith('-dev') %}
-{{ node }}
-{% endif %}
-{% endfor %}
-
-[dev:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% endif %}
-[ai]
-{% for node in all_generic_nodes %}
-{{ node }}
-{% endfor %}
-
-[ai:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{# Individual section groups for multi-filesystem testing #}
-{% set section_names = [] %}
-{% for node in all_generic_nodes %}
-{% if not node.endswith('-dev') %}
-{% set section = node.replace(kdevops_host_prefix + '-ai-', '') %}
-{% if section != kdevops_host_prefix + '-ai' %}
-{% if section_names.append(section) %}{% endif %}
-{% endif %}
-{% endif %}
-{% endfor %}
-
-{% for section in section_names %}
-[ai_{{ section | replace('-', '_') }}]
-{{ kdevops_host_prefix }}-ai-{{ section }}
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-ai-{{ section }}-dev
-{% endif %}
-
-[ai_{{ section | replace('-', '_') }}:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% endfor %}
-{% else %}
-{# Single filesystem hosts (original behavior) #}
-[all]
-localhost ansible_connection=local
-{{ kdevops_host_prefix }}-ai
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-ai-dev
-{% endif %}
-
-[all:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-[baseline]
-{{ kdevops_host_prefix }}-ai
-
-[baseline:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% if kdevops_baseline_and_dev %}
-[dev]
-{{ kdevops_host_prefix }}-ai-dev
-
-[dev:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-
-{% endif %}
-[ai]
-{{ kdevops_host_prefix }}-ai
-{% if kdevops_baseline_and_dev %}
-{{ kdevops_host_prefix }}-ai-dev
-{% endif %}
-
-[ai:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% endif %}
+{% include 'workflows/fio-tests.j2' %}
+{% elif kdevops_workflow_enable_fstests %}
+{% include 'workflows/fstests.j2' %}
+{% elif kdevops_workflow_enable_blktests %}
+{% include 'workflows/blktests.j2' %}
+{% elif kdevops_workflow_enable_selftests %}
+{% include 'workflows/selftests.j2' %}
+{% elif kdevops_workflow_enable_mmtests %}
+{% include 'workflows/mmtests.j2' %}
+{% elif kdevops_workflow_enable_sysbench %}
+{% include 'workflows/sysbench.j2' %}
+{% elif kdevops_workflow_enable_cxl %}
+{% include 'workflows/cxl.j2' %}
+{% elif kdevops_workflow_enable_pynfs %}
+{% include 'workflows/pynfs.j2' %}
+{% elif kdevops_workflow_enable_gitr %}
+{% include 'workflows/gitr.j2' %}
+{% elif kdevops_workflow_enable_ltp %}
+{% include 'workflows/ltp.j2' %}
+{% elif kdevops_workflow_enable_nfstest %}
+{% include 'workflows/nfstest.j2' %}
+{% elif kdevops_workflow_enable_ai|default(false)|bool %}
+{% include 'workflows/ai.j2' %}
{% else %}
[all]
localhost ansible_connection=local
write-your-own-template-for-your-workflow-and-task
{% endif %}
{% else %}
-[all]
-localhost ansible_connection=local
-{% if kdevops_enable_nixos|default(false) %}
-{{ kdevops_host_prefix }} ansible_python_interpreter=/run/current-system/sw/bin/python3
-{% else %}
-{{ kdevops_host_prefix }}
-{% endif %}
-{% if kdevops_baseline_and_dev == True %}
-{% if kdevops_enable_nixos|default(false) %}
-{{ kdevops_host_prefix }}-dev ansible_python_interpreter=/run/current-system/sw/bin/python3
-{% else %}
-{{ kdevops_host_prefix }}-dev
-{% endif %}
-{% endif %}
-{% if kdevops_enable_iscsi %}
-{{ kdevops_host_prefix }}-iscsi
-{% endif %}
-{% if kdevops_nfsd_enable %}
-{{ kdevops_host_prefix }}-nfsd
-{% endif %}
-[all:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-[baseline]
-{% if kdevops_enable_nixos|default(false) %}
-{{ kdevops_host_prefix }} ansible_python_interpreter=/run/current-system/sw/bin/python3
-{% else %}
-{{ kdevops_host_prefix }}
-{% endif %}
-[baseline:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-[dev]
-{% if kdevops_baseline_and_dev %}
-{% if kdevops_enable_nixos|default(false) %}
-{{ kdevops_host_prefix }}-dev ansible_python_interpreter=/run/current-system/sw/bin/python3
-{% else %}
-{{ kdevops_host_prefix }}-dev
-{% endif %}
-{% endif %}
-[dev:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% if kdevops_enable_iscsi %}
-[iscsi]
-{{ kdevops_host_prefix }}-iscsi
-[iscsi:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% endif %}
-{% if kdevops_nfsd_enable %}
-[nfsd]
-{{ kdevops_host_prefix }}-nfsd
-[nfsd:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% endif %}
-[service]
-{% if kdevops_enable_iscsi %}
-{{ kdevops_host_prefix }}-iscsi
-{% endif %}
-{% if kdevops_nfsd_enable %}
-{{ kdevops_host_prefix }}-nfsd
-{% endif %}
-[service:vars]
-ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
-{% endif %}
+{# Default non-workflow template #}
+{% include 'workflows/default.j2' %}
+{% endif %}
\ No newline at end of file
diff --git a/playbooks/roles/gen_hosts/templates/workflows/ai.j2 b/playbooks/roles/gen_hosts/templates/workflows/ai.j2
new file mode 100644
index 00000000..d0914436
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/ai.j2
@@ -0,0 +1,99 @@
+{# Workflow template for AI #}
+{% if ai_enable_multifs_testing|default(false)|bool %}
+{# Multi-filesystem section-based hosts #}
+[all]
+localhost ansible_connection=local
+{% for node in all_generic_nodes %}
+{{ node }}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for node in all_generic_nodes %}
+{% if not node.endswith('-dev') %}
+{{ node }}
+{% endif %}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for node in all_generic_nodes %}
+{% if node.endswith('-dev') %}
+{{ node }}
+{% endif %}
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[ai]
+{% for node in all_generic_nodes %}
+{{ node }}
+{% endfor %}
+
+[ai:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{# Individual section groups for multi-filesystem testing #}
+{% set section_names = [] %}
+{% for node in all_generic_nodes %}
+{% if not node.endswith('-dev') %}
+{% set section = node.replace(kdevops_host_prefix + '-ai-', '') %}
+{% if section != kdevops_host_prefix + '-ai' %}
+{% if section_names.append(section) %}{% endif %}
+{% endif %}
+{% endif %}
+{% endfor %}
+
+{% for section in section_names %}
+[ai_{{ section | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-ai-{{ section }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-ai-{{ section }}-dev
+{% endif %}
+
+[ai_{{ section | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
+{% else %}
+{# Single filesystem hosts (original behavior) #}
+[all]
+localhost ansible_connection=local
+{{ kdevops_host_prefix }}-ai
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-ai-dev
+{% endif %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{{ kdevops_host_prefix }}-ai
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{{ kdevops_host_prefix }}-ai-dev
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[ai]
+{{ kdevops_host_prefix }}-ai
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-ai-dev
+{% endif %}
+
+[ai:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+{% endif %}
diff --git a/playbooks/roles/gen_hosts/templates/workflows/blktests.j2 b/playbooks/roles/gen_hosts/templates/workflows/blktests.j2
new file mode 100644
index 00000000..eea3eef3
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/blktests.j2
@@ -0,0 +1,58 @@
+{# Workflow template for blktests #}
+[all]
+localhost ansible_connection=local
+{% for test_type in blktests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for test_type in blktests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for test_type in blktests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[blktests]
+{% for test_type in blktests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+
+[blktests:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% for test_type in blktests_enabled_test_types %}
+[blktests_{{ test_type | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+
+[blktests_{{ test_type | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
+
+[service]
+
+[service:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/cxl.j2 b/playbooks/roles/gen_hosts/templates/workflows/cxl.j2
new file mode 100644
index 00000000..53790f29
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/cxl.j2
@@ -0,0 +1,7 @@
+{# Workflow template for CXL #}
+[all]
+localhost ansible_connection=local
+write-your-own-template-for-cxl-workflow
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/default.j2 b/playbooks/roles/gen_hosts/templates/workflows/default.j2
new file mode 100644
index 00000000..86619309
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/default.j2
@@ -0,0 +1,62 @@
+{# Default template for non-workflow setups #}
+[all]
+localhost ansible_connection=local
+{% if kdevops_enable_nixos|default(false) %}
+{{ kdevops_host_prefix }} ansible_python_interpreter=/run/current-system/sw/bin/python3
+{% else %}
+{{ kdevops_host_prefix }}
+{% endif %}
+{% if kdevops_baseline_and_dev == True %}
+{% if kdevops_enable_nixos|default(false) %}
+{{ kdevops_host_prefix }}-dev ansible_python_interpreter=/run/current-system/sw/bin/python3
+{% else %}
+{{ kdevops_host_prefix }}-dev
+{% endif %}
+{% endif %}
+{% if kdevops_enable_iscsi %}
+{{ kdevops_host_prefix }}-iscsi
+{% endif %}
+{% if kdevops_nfsd_enable %}
+{{ kdevops_host_prefix }}-nfsd
+{% endif %}
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+[baseline]
+{% if kdevops_enable_nixos|default(false) %}
+{{ kdevops_host_prefix }} ansible_python_interpreter=/run/current-system/sw/bin/python3
+{% else %}
+{{ kdevops_host_prefix }}
+{% endif %}
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+[dev]
+{% if kdevops_baseline_and_dev %}
+{% if kdevops_enable_nixos|default(false) %}
+{{ kdevops_host_prefix }}-dev ansible_python_interpreter=/run/current-system/sw/bin/python3
+{% else %}
+{{ kdevops_host_prefix }}-dev
+{% endif %}
+{% endif %}
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+{% if kdevops_enable_iscsi %}
+[iscsi]
+{{ kdevops_host_prefix }}-iscsi
+[iscsi:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+{% endif %}
+{% if kdevops_nfsd_enable %}
+[nfsd]
+{{ kdevops_host_prefix }}-nfsd
+[nfsd:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+{% endif %}
+[service]
+{% if kdevops_enable_iscsi %}
+{{ kdevops_host_prefix }}-iscsi
+{% endif %}
+{% if kdevops_nfsd_enable %}
+{{ kdevops_host_prefix }}-nfsd
+{% endif %}
+[service:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/fio-tests.j2 b/playbooks/roles/gen_hosts/templates/workflows/fio-tests.j2
new file mode 100644
index 00000000..548941a0
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/fio-tests.j2
@@ -0,0 +1,38 @@
+{# Workflow template for fio-tests #}
+[all]
+localhost ansible_connection=local
+{{ kdevops_host_prefix }}-fio-tests
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-fio-tests-dev
+{% endif %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{{ kdevops_host_prefix }}-fio-tests
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{{ kdevops_host_prefix }}-fio-tests-dev
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[fio_tests]
+{{ kdevops_host_prefix }}-fio-tests
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-fio-tests-dev
+{% endif %}
+
+[fio_tests:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[service]
+
+[service:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/fstests.j2 b/playbooks/roles/gen_hosts/templates/workflows/fstests.j2
new file mode 100644
index 00000000..600d125f
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/fstests.j2
@@ -0,0 +1,72 @@
+{# Workflow template for fstests #}
+[all]
+localhost ansible_connection=local
+{% for node_section in fstests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ node_section }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ node_section }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for node_section in fstests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ node_section }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for node_section in fstests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ node_section }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[fstests]
+{% for node_section in fstests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ node_section }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ node_section }}-dev
+{% endif %}
+{% endfor %}
+
+[fstests:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% for section in sections %}
+[fstests_{{ section | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-{{ section }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ section }}-dev
+{% endif %}
+
+[fstests_{{ section | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
+
+[nfsd]
+{% if kdevops_nfsd_enable %}
+{{ kdevops_host_prefix }}-nfsd
+{% endif %}
+
+[nfsd:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[service]
+{% if kdevops_enable_iscsi %}
+{{ kdevops_host_prefix }}-iscsi
+{% endif %}
+{% if kdevops_nfsd_enable %}
+{{ kdevops_host_prefix }}-nfsd
+{% endif %}
+
+[service:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/gitr.j2 b/playbooks/roles/gen_hosts/templates/workflows/gitr.j2
new file mode 100644
index 00000000..86ee9326
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/gitr.j2
@@ -0,0 +1,41 @@
+{# Workflow template for gitr #}
+[all]
+localhost ansible_connection=local
+{% for host in gitr_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for host in gitr_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for host in gitr_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[gitr]
+{% for host in gitr_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[gitr:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/ltp.j2 b/playbooks/roles/gen_hosts/templates/workflows/ltp.j2
new file mode 100644
index 00000000..fb120828
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/ltp.j2
@@ -0,0 +1,41 @@
+{# Workflow template for ltp #}
+[all]
+localhost ansible_connection=local
+{% for host in ltp_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for host in ltp_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for host in ltp_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[ltp]
+{% for host in ltp_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[ltp:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/mmtests.j2 b/playbooks/roles/gen_hosts/templates/workflows/mmtests.j2
new file mode 100644
index 00000000..d796cbe6
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/mmtests.j2
@@ -0,0 +1,77 @@
+{# Workflow template for mmtests #}
+[all]
+localhost ansible_connection=local
+{% if mmtests_enabled_test_types %}
+{% for test_type in mmtests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+{% else %}
+{{ kdevops_host_prefix }}-mmtests
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-mmtests-dev
+{% endif %}
+{% endif %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% if mmtests_enabled_test_types %}
+{% for test_type in mmtests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% endfor %}
+{% else %}
+{{ kdevops_host_prefix }}-mmtests
+{% endif %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% if mmtests_enabled_test_types %}
+{% for test_type in mmtests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endfor %}
+{% else %}
+{{ kdevops_host_prefix }}-mmtests-dev
+{% endif %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[mmtests]
+{% if mmtests_enabled_test_types %}
+{% for test_type in mmtests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+{% else %}
+{{ kdevops_host_prefix }}-mmtests
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-mmtests-dev
+{% endif %}
+{% endif %}
+
+[mmtests:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if mmtests_enabled_test_types %}
+{% for test_type in mmtests_enabled_test_types %}
+[mmtests_{{ test_type | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+
+[mmtests_{{ test_type | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
+{% endif %}
diff --git a/playbooks/roles/gen_hosts/templates/workflows/nfstest.j2 b/playbooks/roles/gen_hosts/templates/workflows/nfstest.j2
new file mode 100644
index 00000000..34aa7dfe
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/nfstest.j2
@@ -0,0 +1,41 @@
+{# Workflow template for nfstest #}
+[all]
+localhost ansible_connection=local
+{% for host in nfstest_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for host in nfstest_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for host in nfstest_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[nfstest]
+{% for host in nfstest_enabled_hosts %}
+{{ kdevops_host_prefix }}-{{ host }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ host }}-dev
+{% endif %}
+{% endfor %}
+
+[nfstest:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/pynfs.j2 b/playbooks/roles/gen_hosts/templates/workflows/pynfs.j2
new file mode 100644
index 00000000..6145b1a0
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/pynfs.j2
@@ -0,0 +1,7 @@
+{# Workflow template for pynfs #}
+[all]
+localhost ansible_connection=local
+write-your-own-template-for-pynfs-workflow
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/reboot-limit.j2 b/playbooks/roles/gen_hosts/templates/workflows/reboot-limit.j2
new file mode 100644
index 00000000..07bd6f80
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/reboot-limit.j2
@@ -0,0 +1,33 @@
+{# Workflow template for reboot-limit #}
+[all]
+localhost ansible_connection=local
+{{ kdevops_host_prefix }}-reboot-limit
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-reboot-limit-dev
+{% endif %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{{ kdevops_host_prefix }}-reboot-limit
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{{ kdevops_host_prefix }}-reboot-limit-dev
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[reboot-limit]
+{{ kdevops_host_prefix }}-reboot-limit
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-reboot-limit-dev
+{% endif %}
+
+[reboot-limit:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
diff --git a/playbooks/roles/gen_hosts/templates/workflows/selftests.j2 b/playbooks/roles/gen_hosts/templates/workflows/selftests.j2
new file mode 100644
index 00000000..4ef598c7
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/selftests.j2
@@ -0,0 +1,53 @@
+{# Workflow template for selftests #}
+[all]
+localhost ansible_connection=local
+{% for test_type in selftests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for test_type in selftests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for test_type in selftests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[selftests]
+{% for test_type in selftests_enabled_test_types %}
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+{% endfor %}
+
+[selftests:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% for test_type in selftests_enabled_test_types %}
+[selftests_{{ test_type | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-{{ test_type }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test_type }}-dev
+{% endif %}
+
+[selftests_{{ test_type | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
diff --git a/playbooks/roles/gen_hosts/templates/workflows/sysbench.j2 b/playbooks/roles/gen_hosts/templates/workflows/sysbench.j2
new file mode 100644
index 00000000..34f22a83
--- /dev/null
+++ b/playbooks/roles/gen_hosts/templates/workflows/sysbench.j2
@@ -0,0 +1,53 @@
+{# Workflow template for sysbench #}
+[all]
+localhost ansible_connection=local
+{% for test in enabled_sysbench_tests %}
+{{ kdevops_host_prefix }}-{{ test }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test }}-dev
+{% endif %}
+{% endfor %}
+
+[all:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+[baseline]
+{% for test in enabled_sysbench_tests %}
+{{ kdevops_host_prefix }}-{{ test }}
+{% endfor %}
+
+[baseline:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% if kdevops_baseline_and_dev %}
+[dev]
+{% for test in enabled_sysbench_tests %}
+{{ kdevops_host_prefix }}-{{ test }}-dev
+{% endfor %}
+
+[dev:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endif %}
+[sysbench]
+{% for test in enabled_sysbench_tests %}
+{{ kdevops_host_prefix }}-{{ test }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test }}-dev
+{% endif %}
+{% endfor %}
+
+[sysbench:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% for test in enabled_sysbench_tests %}
+[sysbench_{{ test | replace('-', '_') }}]
+{{ kdevops_host_prefix }}-{{ test }}
+{% if kdevops_baseline_and_dev %}
+{{ kdevops_host_prefix }}-{{ test }}-dev
+{% endif %}
+
+[sysbench_{{ test | replace('-', '_') }}:vars]
+ansible_python_interpreter = "{{ kdevops_python_interpreter }}"
+
+{% endfor %}
diff --git a/workflows/ai/Makefile b/workflows/ai/Makefile
index 1c297edd..27dea382 100644
--- a/workflows/ai/Makefile
+++ b/workflows/ai/Makefile
@@ -4,7 +4,8 @@ PHONY += ai-tests ai-tests-baseline ai-tests-dev
PHONY += ai-tests-results
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := hosts.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := hosts.j2
endif
export AI_DATA_TARGET := $(subst ",,$(CONFIG_AI_BENCHMARK_RESULTS_DIR))
diff --git a/workflows/blktests/Makefile b/workflows/blktests/Makefile
index 11cd9a65..97649026 100644
--- a/workflows/blktests/Makefile
+++ b/workflows/blktests/Makefile
@@ -12,7 +12,8 @@ ID=$(shell id -u)
BLKTESTS_ARGS :=
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := blktests.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := blktests.j2
endif
BLKTESTS_GIT:=$(subst ",,$(CONFIG_BLKTESTS_GIT))
diff --git a/workflows/cxl/Makefile b/workflows/cxl/Makefile
index bb130057..feabe197 100644
--- a/workflows/cxl/Makefile
+++ b/workflows/cxl/Makefile
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: copyleft-next-0.3.1
-export KDEVOPS_HOSTS_TEMPLATE := cxl.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := cxl.j2
CXL_ARGS :=
CXL_ARGS += ndctl_git='$(subst ",,$(CONFIG_NDCTL_GIT))'
diff --git a/workflows/fio-tests/Makefile b/workflows/fio-tests/Makefile
index 5eb2ccbd..20a5d192 100644
--- a/workflows/fio-tests/Makefile
+++ b/workflows/fio-tests/Makefile
@@ -1,5 +1,6 @@
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := fio-tests.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := fio-tests.j2
endif
fio-tests:
diff --git a/workflows/fstests/Makefile b/workflows/fstests/Makefile
index d2e5c636..989c564b 100644
--- a/workflows/fstests/Makefile
+++ b/workflows/fstests/Makefile
@@ -9,7 +9,8 @@ FSTESTS_BASELINE_EXTRA :=
export FSTYP:=$(subst ",,$(CONFIG_FSTESTS_FSTYP))
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := fstests.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := fstests.j2
endif
FSTESTS_ARGS += fstests_fstyp='$(FSTYP)'
diff --git a/workflows/gitr/Makefile b/workflows/gitr/Makefile
index c685395a..eadcdac1 100644
--- a/workflows/gitr/Makefile
+++ b/workflows/gitr/Makefile
@@ -1,5 +1,6 @@
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := gitr.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := gitr.j2
endif
GITR_MNT:=$(subst ",,$(CONFIG_GITR_MNT))
diff --git a/workflows/linux/Makefile b/workflows/linux/Makefile
index 30b123f9..60d755b3 100644
--- a/workflows/linux/Makefile
+++ b/workflows/linux/Makefile
@@ -14,7 +14,8 @@ TREE_CONFIG:=config-$(TREE_REF)-pure-iomap
endif
ifeq (y,$(CONFIG_BOOTLINUX_BUILDER))
-KDEVOPS_HOSTS_TEMPLATE=builder.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# KDEVOPS_HOSTS_TEMPLATE=builder.j2
endif
# Describes the Linux clone
diff --git a/workflows/ltp/Makefile b/workflows/ltp/Makefile
index 767465bc..b3c3319b 100644
--- a/workflows/ltp/Makefile
+++ b/workflows/ltp/Makefile
@@ -1,5 +1,6 @@
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := ltp.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := ltp.j2
endif
LTP_REPO:=$(subst ",,$(CONFIG_LTP_REPO))
diff --git a/workflows/mmtests/Makefile b/workflows/mmtests/Makefile
index b65d256b..186dc8cb 100644
--- a/workflows/mmtests/Makefile
+++ b/workflows/mmtests/Makefile
@@ -1,7 +1,8 @@
MMTESTS_ARGS :=
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := mmtests.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := mmtests.j2
endif
mmtests:
diff --git a/workflows/nfstest/Makefile b/workflows/nfstest/Makefile
index bbfd3f64..bc880b6d 100644
--- a/workflows/nfstest/Makefile
+++ b/workflows/nfstest/Makefile
@@ -1,5 +1,6 @@
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := nfstest.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := nfstest.j2
endif # CONFIG_WORKFLOWS_DEDICATED_WORKFLOW
ifeq (y,$(CONFIG_NFSTEST_USE_KDEVOPS_NFSD))
diff --git a/workflows/pynfs/Makefile b/workflows/pynfs/Makefile
index 2f3ff97b..b7bb12bb 100644
--- a/workflows/pynfs/Makefile
+++ b/workflows/pynfs/Makefile
@@ -1,5 +1,6 @@
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := pynfs.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := pynfs.j2
endif
PYNFS_GIT:=$(subst ",,$(CONFIG_PYNFS_GIT))
diff --git a/workflows/selftests/Makefile b/workflows/selftests/Makefile
index d3b7044c..4ec691f3 100644
--- a/workflows/selftests/Makefile
+++ b/workflows/selftests/Makefile
@@ -3,7 +3,8 @@
SELFTESTS_ARGS :=
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := selftests.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := selftests.j2
endif
SELFTESTS_DYNAMIC_RUNTIME_VARS := "kdevops_run_selftests": True
diff --git a/workflows/sysbench/Makefile b/workflows/sysbench/Makefile
index daf7bc75..5f484691 100644
--- a/workflows/sysbench/Makefile
+++ b/workflows/sysbench/Makefile
@@ -1,7 +1,8 @@
PHONY += sysbench sysbench-test sysbench-telemetry sysbench-help-menu
ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
-export KDEVOPS_HOSTS_TEMPLATE := sysbench.j2
+# After refactoring, all workflows use hosts.j2 which includes workflow-specific templates
+# export KDEVOPS_HOSTS_TEMPLATE := sysbench.j2
endif
TAGS_SYSBENCH_RUN := db_start
--
2.50.1
^ permalink raw reply related [flat|nested] 5+ messages in thread