From 37dfd862c334dda801964f6b3c71086ecff5a352 Mon Sep 17 00:00:00 2001 From: Daniel Pawlik Date: Mon, 23 Feb 2026 17:23:03 +0100 Subject: [PATCH] [reproducer] Overwrite Zuul vars with current CI job vars when ZIronic After calling reproducer role using ZIronic tool, when the bootstrap phase has been completed, it generates a file "reproducer-variables.yml" that contains all variables done in the CI job. The problem here is, that "testing" phase might have other variables than what was in the bootstrap phase. It means, that we need to overwrite the variables with current CI job vars. Signed-off-by: Daniel Pawlik --- reproducer.yml | 13 ++++ .../reproducer/tasks/overwrite_zuul_vars.yml | 59 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 roles/reproducer/tasks/overwrite_zuul_vars.yml diff --git a/reproducer.yml b/reproducer.yml index 5dee7c8e30..b4d7262893 100644 --- a/reproducer.yml +++ b/reproducer.yml @@ -108,6 +108,19 @@ name: firewalld state: restarted + # NOTE(dpawlik): After calling reproducer role using ZIronic tool, + # when the bootstrap phase has been completed, it generates a file + # "reproducer-variables.yml" that contains all variables done in the + # CI job. The problem here is, that "testing" phase might have other + # variables than what was in the bootstrap phase. It means, that + # we need to overwrite the variables with current CI job vars. + - name: Overwrite reproducer-variables.yml when ZIronic bootstrap + when: + - not cifmw_deploy_reproducer_env | default(true) | bool + ansible.builtin.include_role: + name: reproducer + tasks_from: overwrite_zuul_vars.yml + - name: Run deployment if instructed to when: - cifmw_deploy_architecture | default(false) | bool diff --git a/roles/reproducer/tasks/overwrite_zuul_vars.yml b/roles/reproducer/tasks/overwrite_zuul_vars.yml new file mode 100644 index 0000000000..e9bf552d94 --- /dev/null +++ b/roles/reproducer/tasks/overwrite_zuul_vars.yml @@ -0,0 +1,59 @@ +--- +# FIXME(dpawlik): Most variables are available, +# but we can not parse variables that were not dumped into +# reproducer-variables.yml or they are unknown. +# Get desired variables necessary during the bootstrap, like: +# cifmw_discovered_image_url even when it is not needed, because +# nodes that require that var are already deployed. +# Find a way to parse vars with undefined vars with combine. +- name: Get latest image for future reference + ansible.builtin.import_role: + role: discover_latest_image + +# Based on: roles/cifmw_setup/tasks/bootstrap.yml +- name: Get customized parameters + ansible.builtin.set_fact: + zuul_job_overwrite_vars: >- + {{ + hostvars[cifmw_target_host | default('hypervisor')] | + dict2items | + selectattr("key", "match", + "^(cifmw|pre|post)_(?!install_yamls|openshift_token|openshift_login|openshift_kubeconfig).*") | + list | items2dict + }} + no_log: "{{ cifmw_nolog | default(true) | bool }}" + +- name: Overwrite reproducer-variables.yml when ZIronic used + block: + # NOTE: To avoid situation, that reproducer-variables.yml contains + # undefined variable, because not always all variables can be resolved + # (sometimes vars are defined in scenarios in later stage), it might + # fail because of that. Better is to set as a fact, and dump to a file, + # especially that the reproducer-variables.yml is taken as an argument + # var when calling nested ansible. + - name: Fetch reproducer-variables.yml to hypervisor + ansible.builtin.fetch: + src: "{{ cifmw_basedir }}/parameters/reproducer-variables.yml" + dest: /tmp/reproducer-variables.yml + flat: true + delegate_to: controller-0 + + - name: Read reproducer-variables.yml + ansible.builtin.slurp: + src: /tmp/reproducer-variables.yml + register: reproducer_original + no_log: "{{ cifmw_nolog | default(true) | bool }}" + + - name: Deep merge and write back + ansible.builtin.copy: + content: >- + {{ + (reproducer_original.content | b64decode | from_yaml) + | combine(zuul_job_overwrite_vars, recursive=true) + | to_nice_yaml + }} + dest: "{{ cifmw_basedir }}/parameters/reproducer-variables.yml" + mode: '0644' + backup: true + no_log: "{{ cifmw_nolog | default(true) | bool }}" + delegate_to: controller-0