From b92b0529adddabd81cd81c5ee977804b3964ed75 Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 10:36:55 +1000 Subject: [PATCH 1/8] Fix MachineSet replicas type error Changed replica_distribution to return a proper list instead of string representation by adding | to_json | from_json filter. This ensures replicas values are passed as integers to the Kubernetes API instead of strings, fixing the 422 Invalid error when scaling MachineSets. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index 0bea8b2..deab861 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -8,7 +8,7 @@ - name: Build replica distribution list ansible.builtin.set_fact: - replica_distribution: >- + replica_distribution: | {%- set total = worker_instance_count | int -%} {%- set count = machineset_count | int -%} {%- set base = total // count -%} @@ -21,7 +21,7 @@ {%- set _ = result.append(base) -%} {%- endif -%} {%- endfor -%} - {{ result }} + {{ result | to_json | from_json }} - name: Display scaling plan ansible.builtin.debug: From 2e7f9744b1cca9c5344059097eb332a4b88ecf8d Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:07:24 +1000 Subject: [PATCH 2/8] Fix MachineSet replicas type using combine filter Use combine filter to merge integer replicas value into definition. The combine filter operates on Python dicts, allowing us to pass item.1 | int as an actual integer instead of a YAML string. This fixes the 422 error where replicas was being sent as string instead of int64 to the Kubernetes API. --- .../tasks/scale_existing_machinesets.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index deab861..5fdc65c 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -37,9 +37,14 @@ namespace: openshift-machine-api name: "{{ item.0.metadata.name }}" state: present - definition: - spec: - replicas: "{{ item.1 | int }}" + definition: "{{ base_def | combine({'spec': {'replicas': item.1 | int}}, recursive=True) }}" + vars: + base_def: + apiVersion: machine.openshift.io/v1beta1 + kind: MachineSet + metadata: + name: "{{ item.0.metadata.name }}" + namespace: openshift-machine-api loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From dd3937a728e850229c85276091f7aae3d5862892 Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:08:10 +1000 Subject: [PATCH 3/8] Simplify MachineSet scaling with inline dict Simplified to just: definition: spec: "{{ {'replicas': item.1 | int} }}" Building the dict in Jinja ensures replicas is an integer type, fixing the 422 error without needing combine filter or vars. --- .../tasks/scale_existing_machinesets.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index 5fdc65c..126b109 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -37,14 +37,8 @@ namespace: openshift-machine-api name: "{{ item.0.metadata.name }}" state: present - definition: "{{ base_def | combine({'spec': {'replicas': item.1 | int}}, recursive=True) }}" - vars: - base_def: - apiVersion: machine.openshift.io/v1beta1 - kind: MachineSet - metadata: - name: "{{ item.0.metadata.name }}" - namespace: openshift-machine-api + definition: + spec: "{{ {'replicas': item.1 | int} }}" loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From b1af7305329bc8c8c5d5d1f50e211a8b1df04651 Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:09:21 +1000 Subject: [PATCH 4/8] Use JSON serialization for spec to ensure integer type Changed to: spec: "{{ {'replicas': item.1} | to_json | from_json }}" The to_json | from_json roundtrip ensures replicas is parsed as an integer, not a string, fixing the 422 type validation error. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index 126b109..59f509e 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -38,7 +38,7 @@ name: "{{ item.0.metadata.name }}" state: present definition: - spec: "{{ {'replicas': item.1 | int} }}" + spec: "{{ {'replicas': item.1} | to_json | from_json }}" loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From 9700224b1c3d625236f86fc0d9bbfbe31563c816 Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:10:04 +1000 Subject: [PATCH 5/8] Define spec as JSON string to guarantee integer type Build spec from JSON literal: spec_json: '{"replicas": {{ item.1 }}}' spec: "{{ spec_json | from_json }}" JSON parsing guarantees replicas is an integer, not a string, fixing the Kubernetes API 422 validation error. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index 59f509e..7ac3e31 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -38,7 +38,9 @@ name: "{{ item.0.metadata.name }}" state: present definition: - spec: "{{ {'replicas': item.1} | to_json | from_json }}" + spec: "{{ spec_json | from_json }}" + vars: + spec_json: '{"replicas": {{ item.1 }}}' loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From d42fc976351ea5a297d0692036867958b2855eac Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:12:40 +1000 Subject: [PATCH 6/8] Format spec with literal block scalar Changed to: spec: | {{ {"replicas": item.1} | to_json | from_json }} Cleaner formatting using pipe literal. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index 7ac3e31..d20263a 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -38,9 +38,8 @@ name: "{{ item.0.metadata.name }}" state: present definition: - spec: "{{ spec_json | from_json }}" - vars: - spec_json: '{"replicas": {{ item.1 }}}' + spec: | + {{ {"replicas": item.1} | to_json | from_json }} loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From ba92dccfa8c6586e5385f7c55b77c1dced1e83cd Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 11:14:56 +1000 Subject: [PATCH 7/8] Remove unnecessary JSON roundtrip Simplified to: spec: | {{ {"replicas": item.1} }} The dict literal already has correct integer type, no need for to_json | from_json conversion. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index d20263a..fc8c210 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -39,7 +39,7 @@ state: present definition: spec: | - {{ {"replicas": item.1} | to_json | from_json }} + {{ {"replicas": item.1} }} loop: "{{ existing_machinesets | zip(replica_distribution) | list }}" loop_control: label: "{{ item.0.metadata.name }} -> {{ item.1 }} replicas" From 87500cae77e1c0936005d5bd4bb013bd909db034 Mon Sep 17 00:00:00 2001 From: Tyrell Reddy Date: Mon, 20 Apr 2026 13:03:23 +1000 Subject: [PATCH 8/8] Keep original >- scalar for replica_distribution Changed back to >- (folded scalar) for consistency with original. The key fix is adding | to_json | from_json, not changing >- to |. --- roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml index fc8c210..e00ab39 100644 --- a/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml +++ b/roles/scale_ocp_workers/tasks/scale_existing_machinesets.yml @@ -8,7 +8,7 @@ - name: Build replica distribution list ansible.builtin.set_fact: - replica_distribution: | + replica_distribution: >- {%- set total = worker_instance_count | int -%} {%- set count = machineset_count | int -%} {%- set base = total // count -%}