From b0e7bf676e2cae7fc96a42ad2141e62fc8bed7b0 Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 14:59:18 +0300 Subject: [PATCH 1/9] Add .claude to .gitignore Change-Id: I7c112db92016ddd7bd2c93b5c404455c479bb722 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2f17b83e..6889243a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.log .vscode .venv +.claude \ No newline at end of file From fefb740e0d58776e5c361efa0971023bb82fdbf4 Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 14:59:28 +0300 Subject: [PATCH 2/9] Add IPI bootstrap flavor workaround and additionalTrustBundle support Allow overriding the bootstrap VM flavor (needed because CAPI mode uses the control-plane flavor for bootstrap). Also add additionalTrustBundle to the install-config so bootstrap VMs trust self-signed OSP TLS certs (e.g. Glance endpoint). Change-Id: I9b8c15b5797cbc2066cd1984ee64eab3d4e91a19 --- .../ipi_install_config.yml | 27 +++++++ .../tasks/ipi_bootstrap_flavor_workaround.yml | 73 +++++++++++++++++++ .../stages/roles/install/tasks/ipi_tenant.yml | 9 ++- .../templates/install-config-ipi.yaml.j2 | 21 ++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml diff --git a/collection/stages/roles/install/tasks/install_config_generation/ipi_install_config.yml b/collection/stages/roles/install/tasks/install_config_generation/ipi_install_config.yml index e376e0ee..156aeee8 100644 --- a/collection/stages/roles/install/tasks/install_config_generation/ipi_install_config.yml +++ b/collection/stages/roles/install/tasks/install_config_generation/ipi_install_config.yml @@ -1,4 +1,27 @@ --- +- name: Discover machines subnet ID by name + when: ocp_deployment_topology.machines_subnet is defined + openstack.cloud.subnets_info: + cloud: "{{ user_cloud }}" + name: "{{ ocp_deployment_topology.machines_subnet }}" + register: machines_subnet_info + +- name: Set machines subnet ID fact + when: ocp_deployment_topology.machines_subnet is defined + ansible.builtin.set_fact: + machines_subnet_id: "{{ machines_subnet_info.subnets[0].id }}" + +- name: Check if CA cert file exists + ansible.builtin.stat: + path: "{{ cacert }}" + register: _cacert_stat + +- name: Read CA cert content + when: _cacert_stat.stat.exists + ansible.builtin.command: "cat {{ cacert }}" + changed_when: false + register: _cacert_content + - name: Generate install-config.yaml from install-config-ipi.yaml.j2 template ansible.builtin.template: src: install-config-ipi.yaml.j2 @@ -22,5 +45,9 @@ installcfg_api_vips: "{{ ocp_deployment_topology.primary_ip_protocol == 'ipv6' }}" installcfg_api_floating_ip: "{{ precreated_api_fip }}" installcfg_ingress_floating_ip: "{{ precreated_ingress_fip }}" + installcfg_machines_subnet: "{{ machines_subnet_id | default(omit) }}" installcfg_cluster_network: "{{ ocp_deployment_topology[ocp_deployment_topology.primary_ip_protocol].cluster_network }}" installcfg_service_network: "{{ ocp_deployment_topology[ocp_deployment_topology.primary_ip_protocol].service_network }}" + installcfg_default_machine_platform: "{{ ocp_deployment_topology.defaultMachinePlatform | default({}) }}" + installcfg_cluster_os_image_properties: "{{ ocp_deployment_topology.platform.openstack.clusterOSImageProperties | default({}) }}" + installcfg_additional_trust_bundle: "{{ _cacert_content.stdout_lines | default(omit) }}" diff --git a/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml b/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml new file mode 100644 index 00000000..7806d54e --- /dev/null +++ b/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml @@ -0,0 +1,73 @@ +--- +# Workaround for bootstrap flavor configuration (CAPI mode) +# This allows overriding the bootstrap machine flavor by: +# 1. Creating manifests (generates cluster-api/machines/ directory) +# 2. Modifying the bootstrap OpenStackMachine manifest in cluster-api/machines/ +# 3. Running cluster creation with modified manifests +# +# Note: In CAPI-based OpenStack installs, bootstrap uses the same flavor as masters +# (from controlPlane.platform.openstack.type), NOT defaultMachinePlatform.type. +# This workaround allows using a different (typically smaller) flavor for bootstrap. + +- name: Create OpenShift manifests + ansible.builtin.shell: | + openshift-install create manifests --log-level debug --dir {{ ocp_installation_dir }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + +- name: Find bootstrap OpenStackMachine manifest (CAPI mode) + ansible.builtin.find: + paths: "{{ ocp_installation_dir }}/cluster-api/machines" + patterns: "10_inframachine_*-bootstrap.yaml" + contains: "kind: OpenStackMachine" + register: bootstrap_manifest + +- name: Fail if bootstrap manifest not found + ansible.builtin.fail: + msg: "Bootstrap OpenStackMachine manifest not found in {{ ocp_installation_dir }}/cluster-api/machines" + when: bootstrap_manifest.matched == 0 + +- name: Override bootstrap flavor in manifest + ansible.builtin.replace: + path: "{{ bootstrap_manifest.files[0].path }}" + regexp: '^(\s+flavor:\s+).*$' + replace: '\1{{ bootstrap_flavor_override }}' + when: bootstrap_flavor_override is defined and bootstrap_flavor_override | length > 0 + +- name: Display modified bootstrap manifest path + ansible.builtin.debug: + msg: "Modified bootstrap flavor in {{ bootstrap_manifest.files[0].path }} to {{ bootstrap_flavor_override }}" + when: bootstrap_flavor_override is defined and bootstrap_flavor_override | length > 0 + +- name: Install OpenShift cluster with modified manifests + block: + - name: Install Openshift + ansible.builtin.shell: | + openshift-install create cluster --log-level debug --dir {{ ocp_installation_dir }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + rescue: + - name: Use an openshift-install flag to wait until the cluster is ready + ansible.builtin.shell: | + openshift-install wait-for install-complete --log-level debug --dir {{ ocp_installation_dir }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + + - name: Remove the bootstrap resources after the OCP installation succeeded + ansible.builtin.shell: | + openshift-install destroy bootstrap --log-level debug --dir {{ ocp_installation_dir }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + + - name: Mark the openshift tests as UNSTABLE + ansible.builtin.include_role: + name: tools_stage_results + tasks_from: mark_stage_unstable.yml + vars: + unstable_msg: >- + The openshift installation passed but unexpectedly needed the wait-for flag. + More info in Jira KURYRQE-1002. diff --git a/collection/stages/roles/install/tasks/ipi_tenant.yml b/collection/stages/roles/install/tasks/ipi_tenant.yml index a5394c4c..5f1448bd 100644 --- a/collection/stages/roles/install/tasks/ipi_tenant.yml +++ b/collection/stages/roles/install/tasks/ipi_tenant.yml @@ -1,5 +1,12 @@ --- -- name: Install OpenShift cluster using openshift-install +- name: Install OpenShift cluster with bootstrap flavor workaround + ansible.builtin.include_tasks: ipi_bootstrap_flavor_workaround.yml + when: + - bootstrap_flavor_override is defined + - bootstrap_flavor_override | length > 0 + +- name: Install OpenShift cluster using openshift-install (standard) + when: bootstrap_flavor_override is not defined or bootstrap_flavor_override | length == 0 block: - name: Install Openshift ansible.builtin.shell: | diff --git a/collection/stages/roles/install/templates/install-config-ipi.yaml.j2 b/collection/stages/roles/install/templates/install-config-ipi.yaml.j2 index ea840118..b9dd21de 100644 --- a/collection/stages/roles/install/templates/install-config-ipi.yaml.j2 +++ b/collection/stages/roles/install/templates/install-config-ipi.yaml.j2 @@ -35,6 +35,19 @@ platform: openstack: cloud: "{{ user_cloud }}" region: "{{ installcfg_region }}" + {%- if installcfg_default_machine_platform.type is defined +%} + defaultMachinePlatform: + type: "{{ installcfg_default_machine_platform.type }}" + {%- endif +%} + {%- if installcfg_cluster_os_image_properties != {} +%} + clusterOSImageProperties: + {%- for key, value in installcfg_cluster_os_image_properties.items() +%} + {{ key }}: {{ value }} + {%- endfor +%} + {%- endif +%} + {%- if installcfg_machines_subnet is defined +%} + machinesSubnet: {{ installcfg_machines_subnet }} + {%- endif +%} {%- if installcfg_api_vips +%} apiVIPs: ["{{ installcfg_api_floating_ip }}"] ingressVIPs: ["{{ installcfg_ingress_floating_ip }}"] @@ -51,9 +64,17 @@ platform: externalNetwork: "{{ installcfg_external_network }}" apiFloatingIP: "{{ installcfg_api_floating_ip }}" ingressFloatingIP: "{{ installcfg_ingress_floating_ip }}" + {%- if installcfg_machines_subnet is not defined +%} externalDNS: {{ installcfg_dns_servers }} {%- endif +%} + {%- endif +%} pullSecret: | {{ ocp_pull_secret }} sshKey: | {{ ocp_public_key }} +{%- if installcfg_additional_trust_bundle is defined +%} +additionalTrustBundle: | +{% for line in installcfg_additional_trust_bundle %} + {{ line }} +{% endfor %} +{%- endif +%} From f1551ba663ff6045792e55c5ebece5893701c7f7 Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 15:07:23 +0300 Subject: [PATCH 3/9] prepare: skip flavors that only define a name Telco flavors pre-exist on the cloud and only have a 'name' field in the topology definition. Guard the flavor-creation task so it only runs when 'ram' is defined, avoiding failures when iterating over these entries. Change-Id: I88c1c19a168615306fc182741be6b6bd2e94343e --- collection/stages/roles/prepare/tasks/project.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/collection/stages/roles/prepare/tasks/project.yml b/collection/stages/roles/prepare/tasks/project.yml index b6b9c89b..2f5b7de2 100644 --- a/collection/stages/roles/prepare/tasks/project.yml +++ b/collection/stages/roles/prepare/tasks/project.yml @@ -61,4 +61,6 @@ ephemeral: "{{ item.value.ephemeral | default(omit) }}" verify: "{{ admin_verify_cacert }}" register: flavors - loop: "{{ lookup('ansible.builtin.dict', ocp_deployment_topology.flavors) }}" + loop: "{{ lookup('ansible.builtin.dict', ocp_deployment_topology.flavors, wantlist=True) }}" + # Skip flavors that only define 'name' (e.g., telco flavors that pre-exist on the cloud) + when: item.value.ram is defined From 393704fa34999b7cec7ff97fa478b961ff13303c Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 15:07:56 +0300 Subject: [PATCH 4/9] day2ops: add run_procedure_no_verify task Add a variant of the procedure runner that skips result verification, needed for setup steps that do not produce a JUnit report. Change-Id: Ib5dc76d9804c1a6b97e01fc0764392b70d226e76 --- collection/stages/roles/day2ops/tasks/main.yml | 2 +- .../day2ops/tasks/run_procedure_no_verify.yml | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml diff --git a/collection/stages/roles/day2ops/tasks/main.yml b/collection/stages/roles/day2ops/tasks/main.yml index a1e10d05..aeeb820c 100644 --- a/collection/stages/roles/day2ops/tasks/main.yml +++ b/collection/stages/roles/day2ops/tasks/main.yml @@ -40,7 +40,7 @@ mode: u=rw,g=rw,o=r - name: Run day2ops procedures sequentially - ansible.builtin.include_tasks: run_procedure.yml + ansible.builtin.include_tasks: "{{ day2ops_run_procedure_task | default('run_procedure.yml') }}" vars: procedure_task_file: "{{ item }}.yml" loop: "{{ day2ops_steps }}" diff --git a/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml b/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml new file mode 100644 index 00000000..71f07cd4 --- /dev/null +++ b/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml @@ -0,0 +1,15 @@ +--- +- name: Assert that the procedure task file exists + ansible.builtin.assert: + that: + - procedure_task_file in day2ops_available_procedures + fail_msg: | + The {{ procedure_task_file }} is not available inside this role. + Please use one of the following by setting it inside the list var + 'day2ops_step' removing the extension '.yml': + {{ day2ops_available_procedures | to_nice_json }} + success_msg: | + Running task file {{ procedure_task_file }} + +- name: Run procedure {{ procedure_task_file }} + ansible.builtin.include_tasks: "procedures/{{ procedure_task_file }}" From f89f79c385c25ba4bc3fef53c438ac9f0de1f77e Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 15:08:10 +0300 Subject: [PATCH 5/9] day2ops: add telco SR-IOV/DPDK MachineSet procedures Add procedures and templates for creating telco worker MachineSets with SR-IOV/DPDK networking, including SR-IOV operator static manifests and defaults for the machineset configuration variables. Change-Id: I223bbcf83d552cc63ff65cc8df6f8c818b6358b3 --- .../stages/roles/day2ops/defaults/main.yml | 79 +++++++++ .../sriov-dpdk-machine-config-pools.yaml | 37 ++++ .../sriov-network-operator-namespace.yaml | 19 ++ .../day2ops/files/sriov-operator-config.yaml | 12 ++ .../procedures/apply-telco-machineset.yml | 78 +++++++++ .../procedures/create-telco-machinesets.yml | 164 ++++++++++++++++++ .../templates/telco-machineset.yaml.j2 | 89 ++++++++++ 7 files changed, 478 insertions(+) create mode 100644 collection/stages/roles/day2ops/files/sriov-dpdk-machine-config-pools.yaml create mode 100644 collection/stages/roles/day2ops/files/sriov-network-operator-namespace.yaml create mode 100644 collection/stages/roles/day2ops/files/sriov-operator-config.yaml create mode 100644 collection/stages/roles/day2ops/tasks/procedures/apply-telco-machineset.yml create mode 100644 collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml create mode 100644 collection/stages/roles/day2ops/templates/telco-machineset.yaml.j2 diff --git a/collection/stages/roles/day2ops/defaults/main.yml b/collection/stages/roles/day2ops/defaults/main.yml index ddc03f6d..978d290a 100644 --- a/collection/stages/roles/day2ops/defaults/main.yml +++ b/collection/stages/roles/day2ops/defaults/main.yml @@ -5,3 +5,82 @@ day2ops_report_filename: shiftstack-qa-day2ops-results.xml # Application Credentials rotation app_credential_name: "AppCreds-{{ user_cloud }}" + +# Telco MachineSet configuration for SRIOV/DPDK workers +# Used by the create-telco-machinesets procedure +telco_machinesets: + delete_default_workers: true # Whether to delete the default worker machineset + disable_masters_schedulable: true # Set mastersSchedulable: false after adding workers + machinesets: [] # List of machinesets to create (configure in job definition) + # Example machineset configuration: + # machinesets: + # - name: sriov + # role: worker + # type: sriov + # replicas: 1 + # flavor: worker_0_numa_0 + # networks: + # - name: sriov_net_nic0 + # port_name_suffix: sriov_net_nic0_direct_worker_port + # - name: sriov_net_nic1 + # port_name_suffix: sriov_net_nic1_direct_worker_port + # - name: dpdk + # role: worker + # type: dpdk + # replicas: 1 + # flavor: worker_1_numa_1 + # networks: + # - name: dpdk_net_nic0 + # port_name_suffix: dpdk_net_nic0_normal_worker_port + # - name: dpdk_net_nic1 + # port_name_suffix: dpdk_net_nic1_normal_worker_port + +# Telco tuning configuration for SRIOV/DPDK workloads +# Used by the configure-telco-tuning procedure +telco_tuning: + sriov: + performance_profile: + cpu_isolated: "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20" + cpu_reserved: "0,1,2,3" + hugepages_size: "1G" + hugepages_count: 7 + numa_node: 0 + numa_topology_policy: "best-effort" + realtime_kernel: false + additional_kernel_args: + - nosmt + - tsc=reliable + networks: [] # List of SRIOV networks for SriovNetworkNodePolicy (configure in job definition) + # Example network configuration: + # networks: + # - name: sriov_net_nic0_9 + # resource_name: sriov9 + # device_type: vfio-pci + # num_vfs: 1 + # - name: sriov_net_nic1_10 + # resource_name: sriov10 + # device_type: vfio-pci + # num_vfs: 1 + dpdk: + performance_profile: + cpu_isolated: "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20" + cpu_reserved: "0,1,2,3" + hugepages_size: "1G" + hugepages_count: 7 + numa_node: 0 + numa_topology_policy: "best-effort" + realtime_kernel: false + additional_kernel_args: + - nosmt + - tsc=reliable + networks: [] # List of DPDK networks for SriovNetworkNodePolicy (configure in job definition) + # Example network configuration: + # networks: + # - name: dpdk_net_nic0_9 + # resource_name: dpdk9 + # device_type: vfio-pci + # num_vfs: 1 + # - name: dpdk_net_nic1_10 + # resource_name: dpdk10 + # device_type: vfio-pci + # num_vfs: 1 diff --git a/collection/stages/roles/day2ops/files/sriov-dpdk-machine-config-pools.yaml b/collection/stages/roles/day2ops/files/sriov-dpdk-machine-config-pools.yaml new file mode 100644 index 00000000..e1633d22 --- /dev/null +++ b/collection/stages/roles/day2ops/files/sriov-dpdk-machine-config-pools.yaml @@ -0,0 +1,37 @@ +--- +# MachineConfigPool for SRIOV worker nodes +apiVersion: machineconfiguration.openshift.io/v1 +kind: MachineConfigPool +metadata: + name: sriov + labels: + machineconfiguration.openshift.io/role: sriov +spec: + machineConfigSelector: + matchExpressions: + - key: machineconfiguration.openshift.io/role + operator: In + values: [sriov, worker] + paused: false + nodeSelector: + matchLabels: + node-role.kubernetes.io/sriov: "" + +--- +# MachineConfigPool for DPDK worker nodes +apiVersion: machineconfiguration.openshift.io/v1 +kind: MachineConfigPool +metadata: + name: dpdk + labels: + machineconfiguration.openshift.io/role: dpdk +spec: + machineConfigSelector: + matchExpressions: + - key: machineconfiguration.openshift.io/role + operator: In + values: [dpdk, worker] + paused: false + nodeSelector: + matchLabels: + node-role.kubernetes.io/dpdk: "" diff --git a/collection/stages/roles/day2ops/files/sriov-network-operator-namespace.yaml b/collection/stages/roles/day2ops/files/sriov-network-operator-namespace.yaml new file mode 100644 index 00000000..44997dc7 --- /dev/null +++ b/collection/stages/roles/day2ops/files/sriov-network-operator-namespace.yaml @@ -0,0 +1,19 @@ +--- +# Namespace for SRIOV Network Operator +apiVersion: v1 +kind: Namespace +metadata: + name: openshift-sriov-network-operator + annotations: + workload.openshift.io/allowed: management + +--- +# OperatorGroup for SRIOV Network Operator +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: sriov-network-operators + namespace: openshift-sriov-network-operator +spec: + targetNamespaces: + - openshift-sriov-network-operator diff --git a/collection/stages/roles/day2ops/files/sriov-operator-config.yaml b/collection/stages/roles/day2ops/files/sriov-operator-config.yaml new file mode 100644 index 00000000..4711e09e --- /dev/null +++ b/collection/stages/roles/day2ops/files/sriov-operator-config.yaml @@ -0,0 +1,12 @@ +--- +# SriovOperatorConfig for SRIOV Network Operator +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovOperatorConfig +metadata: + name: default + namespace: openshift-sriov-network-operator +spec: + enableInjector: true + enableOperatorWebhook: true + logLevel: 2 + disableDrain: false diff --git a/collection/stages/roles/day2ops/tasks/procedures/apply-telco-machineset.yml b/collection/stages/roles/day2ops/tasks/procedures/apply-telco-machineset.yml new file mode 100644 index 00000000..901b7817 --- /dev/null +++ b/collection/stages/roles/day2ops/tasks/procedures/apply-telco-machineset.yml @@ -0,0 +1,78 @@ +--- +# Helper task to apply a single telco MachineSet +# This task is included by create-telco-machinesets.yml for each machineset + +- name: "Get network details for {{ telco_machineset.networks[0].name }}" + openstack.cloud.networks_info: + cloud: "{{ user_cloud }}" + name: "{{ telco_machineset.networks[0].name }}" + register: network_0 + +- name: "Get network details for {{ telco_machineset.networks[1].name }}" + openstack.cloud.networks_info: + cloud: "{{ user_cloud }}" + name: "{{ telco_machineset.networks[1].name }}" + register: network_1 + +- name: Set the telco network and subnet IDs + ansible.builtin.set_fact: + network_id_0: "{{ network_0.networks[0].id }}" + network_subnet_id_0: "{{ network_0.networks[0].subnet_ids[0] }}" + network_id_1: "{{ network_1.networks[0].id }}" + network_subnet_id_1: "{{ network_1.networks[0].subnet_ids[0] }}" + +- name: "Generate telco MachineSet manifest for {{ telco_machineset.name }}" + ansible.builtin.template: + src: telco-machineset.yaml.j2 + dest: "{{ ocp_installation_dir }}/{{ telco_machineset.name }}-machineset.yaml" + mode: u=rw,g=rw,o=r + vars: + _infrastructure_id: "{{ infrastructure_id }}" + _machine_role: "{{ telco_machineset.role | default('worker') }}" + _machineset_type: "{{ telco_machineset.type }}" + _machineset_replicas: "{{ telco_machineset.replicas }}" + _osp_flavor: "{{ telco_machineset.flavor }}" + _api_vip_port_ip: "{{ api_ip }}" + _ingress_vip_port_ip: "{{ apps_ip }}" + _machines_subnet: "{{ machines_subnet_id }}" + _machines_network: "{{ machines_subnet_net_id }}" + _security_group: "{{ machines_security_group }}" + _subnet_id_0: "{{ network_subnet_id_0 }}" + _name_suffix_0: "{{ telco_machineset.networks[0].port_name_suffix }}" + _network_id_0: "{{ network_id_0 }}" + _subnet_id_1: "{{ network_subnet_id_1 }}" + _name_suffix_1: "{{ telco_machineset.networks[1].port_name_suffix }}" + _network_id_1: "{{ network_id_1 }}" + +- name: "Apply telco MachineSet manifest for {{ telco_machineset.name }}" + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ ocp_installation_dir }}/{{ telco_machineset.name }}-machineset.yaml" + wait: true + wait_timeout: "{{ manifests_wait_timeout }}" + +- name: "Wait for cluster health after applying {{ telco_machineset.name }} machineset" + block: + - name: Wait for MCP updates + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_mcp_updated.yml + vars: + wait_retries: 60 + wait_delay: 60 + + - name: Wait until cluster is healthy + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_is_healthy.yml + + - name: Wait until nodes are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_nodes_ready.yml + + - name: Wait until ClusterOperators are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_operators_ready.yml diff --git a/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml b/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml new file mode 100644 index 00000000..90c15669 --- /dev/null +++ b/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml @@ -0,0 +1,164 @@ +--- +# Day2ops procedure to create SRIOV/DPDK telco MachineSets +# This procedure assumes telco networks already exist in OpenStack + +- name: Discover OCP version for apiVersion selection + ansible.builtin.include_role: + name: tools_get_deploy_info + tasks_from: discover_ocp_version.yml + +- name: Get the OCP Cluster infrastructure ID + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: config.openshift.io/v1 + kind: Infrastructure + name: cluster + register: cluster_infrastructure + +- name: Set infrastructure_id fact + ansible.builtin.set_fact: + infrastructure_id: "{{ cluster_infrastructure.resources[0].status.infrastructureName }}" + +- name: Delete the default worker MachineSet + when: telco_machinesets.delete_default_workers | default(false) | bool + block: + - name: Get the current worker MachineSets + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: machine.openshift.io/v1beta1 + kind: MachineSet + namespace: openshift-machine-api + label_selectors: + - machine.openshift.io/cluster-api-machine-role=worker + register: worker_machinesets + + - name: Delete default worker MachineSets + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + api_version: machine.openshift.io/v1beta1 + kind: MachineSet + name: "{{ item.metadata.name }}" + namespace: openshift-machine-api + state: absent + wait: true + wait_timeout: "{{ manifests_wait_timeout }}" + loop: "{{ worker_machinesets.resources }}" + loop_control: + label: "{{ item.metadata.name }}" + when: + - "'sriov' not in item.metadata.name" + - "'dpdk' not in item.metadata.name" + + - name: Wait for cluster health after deleting default workers + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_is_healthy.yml + +- name: Get cluster install-config content for VIP IPs and subnet info + ansible.builtin.include_role: + name: tools_get_deploy_info + tasks_from: get_ic_content.yml + +- name: Set the API-IP, APPs-IP, and machinesSubnet from install-config + # NOTE: This assumes IPv4 mode (apiFloatingIP/ingressFloatingIP). + # IPv6 deployments use apiVIPs/ingressVIPs instead. + ansible.builtin.set_fact: + api_ip: "{{ ic_content.platform.openstack.apiFloatingIP }}" + apps_ip: "{{ ic_content.platform.openstack.ingressFloatingIP }}" + machines_subnet_name: "{{ ic_content.platform.openstack.machinesSubnet | default('') }}" + +- name: Get the machinesSubnet details from OpenStack + openstack.cloud.subnets_info: + cloud: "{{ user_cloud }}" + name: "{{ machines_subnet_name }}" + register: os_subnets + +- name: Get the security group details from OpenStack + openstack.cloud.security_group_info: + cloud: "{{ user_cloud }}" + name: "{{ infrastructure_id }}-worker" + register: os_security_group + +- name: Set the machinesSubnet network ID and security group ID + ansible.builtin.set_fact: + machines_subnet_id: "{{ os_subnets.subnets[0].id }}" + machines_subnet_net_id: "{{ os_subnets.subnets[0].network_id }}" + machines_security_group: "{{ os_security_group.security_groups[0].id }}" + +- name: Create telco MachineSets + ansible.builtin.include_tasks: apply-telco-machineset.yml + loop: "{{ telco_machinesets.machinesets }}" + loop_control: + loop_var: telco_machineset + label: "{{ telco_machineset.name }}" + +- name: Disable mastersSchedulable since we now have dedicated worker nodes + when: telco_machinesets.disable_masters_schedulable | default(true) | bool + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + api_version: config.openshift.io/v1 + kind: Scheduler + name: cluster + state: present + merge_type: merge + definition: + spec: + mastersSchedulable: false + +- name: Final cluster health check after all telco machinesets + block: + - name: Wait for MCP to finish updates + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_mcp_updated.yml + vars: + wait_retries: 60 + wait_delay: 60 + + - name: Wait until cluster is healthy + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_is_healthy.yml + + - name: Wait until all nodes are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_nodes_ready.yml + + - name: Wait until all MachineSets report availableReplicas + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: machine.openshift.io/v1beta1 + kind: MachineSet + register: _ms_status + until: >- + _ms_status.resources + | selectattr('spec.replicas', '>', 0) + | rejectattr('status.availableReplicas', 'defined') + | list | length == 0 + retries: 60 + delay: 30 + + - name: Wait until all MachineSets reach desired available replicas + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: machine.openshift.io/v1beta1 + kind: MachineSet + register: _ms_status + until: >- + _ms_status.resources + | selectattr('spec.replicas', '>', 0) + | json_query('[?spec.replicas != status.availableReplicas]') + | list | length == 0 + retries: 60 + delay: 30 + + - name: Check MachineSets health + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: check_machinesets.yml + + - name: Wait until ClusterOperators are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_operators_ready.yml diff --git a/collection/stages/roles/day2ops/templates/telco-machineset.yaml.j2 b/collection/stages/roles/day2ops/templates/telco-machineset.yaml.j2 new file mode 100644 index 00000000..61907cc4 --- /dev/null +++ b/collection/stages/roles/day2ops/templates/telco-machineset.yaml.j2 @@ -0,0 +1,89 @@ +# Telco MachineSet template for SRIOV/DPDK workers +# Ref: https://docs.openshift.com/container-platform/4.15/machine_management/creating_machinesets/creating-machineset-osp.html#machineset-yaml-osp-sr-iov-port-security_creating-machineset-osp +apiVersion: machine.openshift.io/v1beta1 +kind: MachineSet +metadata: + labels: + machine.openshift.io/cluster-api-cluster: {{ _infrastructure_id }} + machine.openshift.io/cluster-api-machine-role: {{ _machine_role }} + machine.openshift.io/cluster-api-machine-type: {{ _machine_role }} + name: {{ _infrastructure_id }}-{{ _machine_role }}-{{ _machineset_type }} + namespace: openshift-machine-api +spec: + replicas: {{ _machineset_replicas }} + selector: + matchLabels: + machine.openshift.io/cluster-api-cluster: {{ _infrastructure_id }} + machine.openshift.io/cluster-api-machineset: {{ _infrastructure_id }}-{{ _machine_role }}-{{ _machineset_type }} + template: + metadata: + labels: + machine.openshift.io/cluster-api-cluster: {{ _infrastructure_id }} + machine.openshift.io/cluster-api-machine-role: {{ _machine_role }} + machine.openshift.io/cluster-api-machine-type: {{ _machine_role }} + machine.openshift.io/cluster-api-machineset: {{ _infrastructure_id }}-{{ _machine_role }}-{{ _machineset_type }} + spec: + metadata: + labels: +{% if _machineset_type == "sriov" %} + node-role.kubernetes.io/sriov: "" +{% elif _machineset_type == "dpdk" %} + node-role.kubernetes.io/dpdk: "" +{% endif %} + providerSpec: + value: +{% if discovered_openshift_release is version('4.16', '>=') %} + apiVersion: machine.openshift.io/v1alpha1 +{% else %} + apiVersion: openstackproviderconfig.openshift.io/v1alpha1 +{% endif %} + cloudName: openstack + cloudsSecret: + name: openstack-cloud-credentials + namespace: openshift-machine-api + configDrive: true + flavor: {{ _osp_flavor }} + image: {{ _infrastructure_id }}-rhcos + kind: OpenstackProviderSpec + ports: + - allowedAddressPairs: + - ipAddress: {{ _api_vip_port_ip }} + - ipAddress: {{ _ingress_vip_port_ip }} + fixedIPs: + - subnetID: {{ _machines_subnet }} + nameSuffix: nodes + networkID: {{ _machines_network }} + securityGroups: + - {{ _security_group }} + - fixedIPs: + - subnetID: {{ _subnet_id_0 }} + nameSuffix: {{ _name_suffix_0 }} + networkID: {{ _network_id_0 }} + portSecurity: false + tags: + - openshiftClusterID={{ _infrastructure_id }} + trunk: false +{% if _machineset_type == "sriov" %} + vnicType: direct +{% endif %} + - fixedIPs: + - subnetID: {{ _subnet_id_1 }} + nameSuffix: {{ _name_suffix_1 }} + networkID: {{ _network_id_1 }} + portSecurity: false + tags: + - openshiftClusterID={{ _infrastructure_id }} + trunk: false +{% if _machineset_type == "sriov" %} + vnicType: direct +{% endif %} + primarySubnet: {{ _machines_subnet }} + serverGroupName: {{ _infrastructure_id }}-{{ _machine_role }} + serverMetadata: + Name: {{ _infrastructure_id }}-{{ _machine_role }} + openshiftClusterID: {{ _infrastructure_id }} + tags: + - openshiftClusterID={{ _infrastructure_id }} + trunk: true + userDataSecret: + name: {{ _machine_role }}-user-data From 6c5fcfb58c61a62dc370e78055c42b41fd86d2ae Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 15:09:05 +0300 Subject: [PATCH 6/9] day2ops: add telco performance tuning and DPDK test procedures Add procedures to apply performance profiles and SR-IOV network node policies, and to run testpmd-based DPDK throughput tests via ansible-performance-test. Change-Id: I58f563ed8bf5513a8729f198ecc9281c74add5d5 --- .../procedures/configure-telco-tuning.yml | 352 ++++++++++++++++++ .../tasks/procedures/run-performance-test.yml | 274 ++++++++++++++ .../day2ops/templates/perf-extra-vars.yaml.j2 | 21 ++ .../day2ops/templates/perf-inventory.ini.j2 | 8 + .../templates/performance-profile.yaml.j2 | 28 ++ .../sriov-network-node-policy.yaml.j2 | 20 + .../day2ops/templates/testpmd-dut-pod.yaml.j2 | 59 +++ 7 files changed, 762 insertions(+) create mode 100644 collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml create mode 100644 collection/stages/roles/day2ops/tasks/procedures/run-performance-test.yml create mode 100644 collection/stages/roles/day2ops/templates/perf-extra-vars.yaml.j2 create mode 100644 collection/stages/roles/day2ops/templates/perf-inventory.ini.j2 create mode 100644 collection/stages/roles/day2ops/templates/performance-profile.yaml.j2 create mode 100644 collection/stages/roles/day2ops/templates/sriov-network-node-policy.yaml.j2 create mode 100644 collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 diff --git a/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml b/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml new file mode 100644 index 00000000..0c8a5259 --- /dev/null +++ b/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml @@ -0,0 +1,352 @@ +--- +# Day2ops procedure to configure OCP telco tuning for SRIOV/DPDK workloads +# This procedure configures MachineConfigPools, PerformanceProfiles, and SRIOV Network Operator + +- name: Discover OCP version + ansible.builtin.include_role: + name: tools_get_deploy_info + tasks_from: discover_ocp_version.yml + +- name: Get the OCP Cluster infrastructure ID + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: config.openshift.io/v1 + kind: Infrastructure + name: cluster + register: cluster_infrastructure + +- name: Set infrastructure_id fact + ansible.builtin.set_fact: + infrastructure_id: "{{ cluster_infrastructure.resources[0].status.infrastructureName }}" + +# Step 1: Create MachineConfigPools for SRIOV and DPDK nodes +- name: Create MachineConfigPools for SRIOV and DPDK worker nodes + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ role_path }}/files/sriov-dpdk-machine-config-pools.yaml" + +- name: Pause to allow MachineConfigPools to synchronize + ansible.builtin.pause: + seconds: 15 + +# Step 2: Apply PerformanceProfiles for SRIOV nodes +- name: Generate SRIOV PerformanceProfile manifest + ansible.builtin.template: + src: performance-profile.yaml.j2 + dest: "{{ ocp_installation_dir }}/sriov-performance-profile.yaml" + mode: u=rw,g=rw,o=r + vars: + _profile_type: sriov + _cpu_isolated: "{{ telco_tuning.sriov.performance_profile.cpu_isolated }}" + _cpu_reserved: "{{ telco_tuning.sriov.performance_profile.cpu_reserved }}" + _hugepages_size: "{{ telco_tuning.sriov.performance_profile.hugepages_size | default('1G') }}" + _hugepages_count: "{{ telco_tuning.sriov.performance_profile.hugepages_count | default(7) }}" + _numa_node: "{{ telco_tuning.sriov.performance_profile.numa_node | default(0) }}" + _numa_topology_policy: "{{ telco_tuning.sriov.performance_profile.numa_topology_policy | default('best-effort') }}" + _realtime_kernel: "{{ telco_tuning.sriov.performance_profile.realtime_kernel | default(false) }}" + _additional_kernel_args: "{{ telco_tuning.sriov.performance_profile.additional_kernel_args | default(['nosmt', 'tsc=reliable']) }}" + +- name: Apply SRIOV PerformanceProfile + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ ocp_installation_dir }}/sriov-performance-profile.yaml" + +- name: Pause to allow MachineConfigPools to start update + ansible.builtin.pause: + seconds: 15 + +- name: Wait for MCP updates after SRIOV PerformanceProfile + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_mcp_updated.yml + vars: + wait_retries: 60 + wait_delay: 60 + +# Step 3: Apply PerformanceProfiles for DPDK nodes +- name: Generate DPDK PerformanceProfile manifest + ansible.builtin.template: + src: performance-profile.yaml.j2 + dest: "{{ ocp_installation_dir }}/dpdk-performance-profile.yaml" + mode: u=rw,g=rw,o=r + vars: + _profile_type: dpdk + _cpu_isolated: "{{ telco_tuning.dpdk.performance_profile.cpu_isolated }}" + _cpu_reserved: "{{ telco_tuning.dpdk.performance_profile.cpu_reserved }}" + _hugepages_size: "{{ telco_tuning.dpdk.performance_profile.hugepages_size | default('1G') }}" + _hugepages_count: "{{ telco_tuning.dpdk.performance_profile.hugepages_count | default(7) }}" + _numa_node: "{{ telco_tuning.dpdk.performance_profile.numa_node | default(0) }}" + _numa_topology_policy: "{{ telco_tuning.dpdk.performance_profile.numa_topology_policy | default('best-effort') }}" + _realtime_kernel: "{{ telco_tuning.dpdk.performance_profile.realtime_kernel | default(false) }}" + _additional_kernel_args: "{{ telco_tuning.dpdk.performance_profile.additional_kernel_args | default(['nosmt', 'tsc=reliable']) }}" + +- name: Apply DPDK PerformanceProfile + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ ocp_installation_dir }}/dpdk-performance-profile.yaml" + +- name: Pause to allow MachineConfigPools to start update + ansible.builtin.pause: + seconds: 15 + +- name: Wait for MCP updates after DPDK PerformanceProfile + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_mcp_updated.yml + vars: + wait_retries: 60 + wait_delay: 60 + +# Step 4: Install SRIOV Network Operator +- name: Create namespace and OperatorGroup for SRIOV Network Operator + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ role_path }}/files/sriov-network-operator-namespace.yaml" + +- name: Get SRIOV Network Operator subscription channel version + ansible.builtin.command: + cmd: > + oc get packagemanifest sriov-network-operator + -n openshift-marketplace + -o jsonpath='{.status.defaultChannel}' + environment: + KUBECONFIG: "{{ kubeconfig }}" + register: sno_channel + changed_when: false + failed_when: false + +- name: Create SRIOV Network Operator Subscription + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + definition: + apiVersion: operators.coreos.com/v1alpha1 + kind: Subscription + metadata: + name: sriov-network-operator-subscription + namespace: openshift-sriov-network-operator + spec: + channel: "{{ sno_channel.stdout | default('stable') }}" + name: sriov-network-operator + source: redhat-operators + sourceNamespace: openshift-marketplace + +- name: Wait for SRIOV Network Operator deployment + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: apps/v1 + kind: Deployment + namespace: openshift-sriov-network-operator + name: sriov-network-operator + register: sno_deployment + until: + - sno_deployment.resources | length > 0 + - sno_deployment.resources[0].status.readyReplicas is defined + - sno_deployment.resources[0].status.readyReplicas == sno_deployment.resources[0].status.replicas + retries: 30 + delay: 30 + +# Step 5: Apply SriovOperatorConfig (OCP 4.15+) +- name: Apply SriovOperatorConfig + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ role_path }}/files/sriov-operator-config.yaml" + when: discovered_openshift_release is version('4.15', '>=') + +- name: Wait for SRIOV operator pods to be ready + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Pod + namespace: openshift-sriov-network-operator + field_selectors: + - status.phase=Running + register: sno_pods + until: sno_pods.resources | length >= 1 + retries: 10 + delay: 30 + +- name: Wait for SRIOV operator webhook service to have endpoints + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Endpoints + namespace: openshift-sriov-network-operator + name: operator-webhook-service + register: sno_webhook_endpoints + until: + - sno_webhook_endpoints.resources | length > 0 + - sno_webhook_endpoints.resources[0].subsets is defined + - sno_webhook_endpoints.resources[0].subsets | length > 0 + retries: 20 + delay: 30 + +# Step 6: Label SRIOV nodes as SR-IOV capable +- name: Get SRIOV worker nodes + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Node + label_selectors: + - node-role.kubernetes.io/sriov + register: sriov_nodes + +- name: Label SRIOV nodes as SR-IOV capable + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Node + name: "{{ item.metadata.name }}" + state: present + merge_type: merge + definition: + metadata: + labels: + feature.node.kubernetes.io/network-sriov.capable: "true" + loop: "{{ sriov_nodes.resources }}" + loop_control: + label: "{{ item.metadata.name }}" + +# Step 6b: Wait for SRIOV operator to inventory SR-IOV worker nodes +- name: Wait for SriovNetworkNodeState to be created for SRIOV worker nodes + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: sriovnetwork.openshift.io/v1 + kind: SriovNetworkNodeState + namespace: openshift-sriov-network-operator + register: sriov_node_states + until: + - sriov_node_states.resources | length > 0 + - sriov_node_states.resources | selectattr('status.syncStatus', 'defined') | selectattr('status.syncStatus', 'equalto', 'Succeeded') | list | length > 0 + retries: 20 + delay: 30 + +# Step 7: Create SriovNetworkNodePolicies for SRIOV networks +- name: Get SRIOV network IDs from OpenStack + openstack.cloud.networks_info: + cloud: "{{ user_cloud }}" + name: "{{ item.name }}" + loop: "{{ telco_tuning.sriov.networks }}" + register: sriov_networks + +- name: Create SriovNetworkNodePolicies for SRIOV networks + ansible.builtin.template: + src: sriov-network-node-policy.yaml.j2 + dest: "{{ ocp_installation_dir }}/sriov-policy-{{ item.item.resource_name }}.yaml" + mode: u=rw,g=rw,o=r + vars: + _policy_name: "{{ item.item.resource_name }}" + _network_id: "{{ item.networks[0].id }}" + _resource_name: "{{ item.item.resource_name }}" + _node_selector_label: "feature.node.kubernetes.io/network-sriov.capable" + _node_selector_value: "true" + _device_type: "{{ item.item.device_type | default('vfio-pci') }}" + _num_vfs: "{{ item.item.num_vfs | default(1) }}" + loop: "{{ sriov_networks.results }}" + loop_control: + label: "{{ item.item.name }}" + +- name: Apply SriovNetworkNodePolicies for SRIOV networks + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ ocp_installation_dir }}/sriov-policy-{{ item.item.resource_name }}.yaml" + loop: "{{ sriov_networks.results }}" + loop_control: + label: "{{ item.item.name }}" + +# Step 8: Create SriovNetworkNodePolicies for DPDK networks +- name: Get DPDK network IDs from OpenStack + openstack.cloud.networks_info: + cloud: "{{ user_cloud }}" + name: "{{ item.name }}" + loop: "{{ telco_tuning.dpdk.networks }}" + register: dpdk_networks + +- name: Create SriovNetworkNodePolicies for DPDK networks + ansible.builtin.template: + src: sriov-network-node-policy.yaml.j2 + dest: "{{ ocp_installation_dir }}/dpdk-policy-{{ item.item.resource_name }}.yaml" + mode: u=rw,g=rw,o=r + vars: + _policy_name: "{{ item.item.resource_name }}" + _network_id: "{{ item.networks[0].id }}" + _resource_name: "{{ item.item.resource_name }}" + _node_selector_label: "node-role.kubernetes.io/dpdk" + _node_selector_value: "" + _device_type: "{{ item.item.device_type | default('vfio-pci') }}" + _num_vfs: "{{ item.item.num_vfs | default(1) }}" + loop: "{{ dpdk_networks.results }}" + loop_control: + label: "{{ item.item.name }}" + +- name: Apply SriovNetworkNodePolicies for DPDK networks + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + src: "{{ ocp_installation_dir }}/dpdk-policy-{{ item.item.resource_name }}.yaml" + loop: "{{ dpdk_networks.results }}" + loop_control: + label: "{{ item.item.name }}" + +# Step 9: Wait for SRIOV operator to apply policies +- name: Wait for SRIOV operator pods to be ready after policies + kubernetes.core.k8s_info: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Pod + namespace: openshift-sriov-network-operator + field_selectors: + - status.phase=Running + register: sno_pods_final + until: sno_pods_final.resources | length >= 1 + retries: 10 + delay: 30 + +# Step 10: Enforce Pod Security Standards (OCP 4.11+) +- name: Enforce Pod Security Standards on default namespace + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + api_version: v1 + kind: Namespace + name: default + state: present + merge_type: merge + definition: + metadata: + labels: + pod-security.kubernetes.io/audit: privileged + pod-security.kubernetes.io/enforce: privileged + pod-security.kubernetes.io/warn: privileged + when: discovered_openshift_release is version('4.11', '>=') + +# Final cluster health check +- name: Final cluster health check after telco tuning + block: + - name: Wait for MCP to finish updates + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_mcp_updated.yml + vars: + wait_retries: 60 + wait_delay: 60 + + - name: Wait until cluster is healthy + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_is_healthy.yml + + - name: Wait until all nodes are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_nodes_ready.yml + + - name: Wait until ClusterOperators are ready + ansible.builtin.include_role: + name: tools_cluster_checks + tasks_from: wait_until_cluster_operators_ready.yml diff --git a/collection/stages/roles/day2ops/tasks/procedures/run-performance-test.yml b/collection/stages/roles/day2ops/tasks/procedures/run-performance-test.yml new file mode 100644 index 00000000..219b5ff8 --- /dev/null +++ b/collection/stages/roles/day2ops/tasks/procedures/run-performance-test.yml @@ -0,0 +1,274 @@ +--- +# Run NFV performance tests using TRex traffic generator against testpmd DUT pods. +# Supports SRIOV and DPDK test types. +# +# Required variables: +# perf_test: dict with sriov/dpdk config (see telco_verification.yaml) + +- name: Clone ansible-nfv repository + ansible.builtin.git: + repo: "{{ perf_test.ansible_nfv_repo }}" + dest: "{{ home_dir }}/ansible-nfv" + version: "{{ perf_test.ansible_nfv_branch | default('main') }}" + force: true + +- name: Install ansible-nfv collection requirements + ansible.builtin.command: + cmd: ansible-galaxy collection install openvswitch.openvswitch -p {{ home_dir }}/.ansible/collections + changed_when: true + +- name: Create performance results directory + ansible.builtin.file: + path: "{{ artifacts_dir }}/performance" + state: directory + mode: u=rwx,g=rw,o=r + +- name: Get TRex server floating IP + ansible.builtin.shell: | + set -o pipefail + openstack floating ip list --port \ + "$(openstack port list --server {{ perf_test.trex_server }} \ + --network {{ perf_test.trex_management_network | default('management_net_management') }} \ + -c ID -f value | head -1)" \ + -c "Floating IP Address" -f value + environment: + OS_CLOUD: "{{ user_cloud }}" + register: _trex_fip + changed_when: false + +- name: Save TRex SSH key path + ansible.builtin.set_fact: + perf_trex_ssh_key: "{{ perf_test.trex_ssh_key }}" + +- name: Generate performance inventory + ansible.builtin.template: + src: perf-inventory.ini.j2 + dest: "{{ home_dir }}/perf-inventory.ini" + mode: u=rw,g=rw,o=r + +- name: Run SRIOV performance test + when: perf_test.sriov.enabled | default(true) | bool + block: + - name: Reboot TRex VM for SRIOV test + ansible.builtin.shell: | + openstack server stop {{ perf_test.trex_server }} && sleep 5 && openstack server start {{ perf_test.trex_server }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + + - name: Wait for TRex VM to become active + ansible.builtin.shell: | + openstack server show {{ perf_test.trex_server }} -c status -f value + environment: + OS_CLOUD: "{{ user_cloud }}" + register: _trex_status + until: _trex_status.stdout == 'ACTIVE' + retries: 30 + delay: 10 + changed_when: false + + - name: Wait for TRex SSH connectivity + ansible.builtin.wait_for: + host: "{{ _trex_fip.stdout }}" + port: 22 + timeout: 300 + + - name: Create SRIOV testpmd DUT pod + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + definition: "{{ lookup('template', 'testpmd-dut-pod.yaml.j2') }}" + wait: true + wait_sleep: 10 + wait_timeout: 120 + vars: + dut: "{{ perf_test.sriov }}" + + - name: Wait for SRIOV testpmd to start + ansible.builtin.pause: + seconds: 15 + + - name: Collect SRIOV DUT port MACs + ansible.builtin.shell: | + oc --kubeconfig {{ kubeconfig }} logs {{ perf_test.sriov.pod_name }} -n default | grep -E "^Port [0-9]" | grep -v "link state change" + register: _sriov_macs + retries: 10 + delay: 10 + until: _sriov_macs.stdout | length > 0 + changed_when: false + + - name: Save SRIOV DUT MACs + ansible.builtin.copy: + content: "{{ _sriov_macs.stdout }}" + dest: "{{ artifacts_dir }}/performance/sriov_dut_port_macs.conf" + mode: u=rw,g=rw,o=r + + - name: Parse SRIOV DUT MACs into comma-separated format for ansible-nfv + ansible.builtin.set_fact: + _sriov_dut_macs: >- + {{ _sriov_macs.stdout_lines + | map('regex_search', '([0-9A-Fa-f:]{17})') + | select('string') + | list + | join(',') }} + + - name: Display SRIOV DUT MACs + ansible.builtin.debug: + msg: "DUT MACs for TRex: {{ _sriov_dut_macs }}" + + - name: Generate SRIOV performance extra vars + ansible.builtin.template: + src: perf-extra-vars.yaml.j2 + dest: "{{ home_dir }}/perf-sriov-vars.yaml" + mode: u=rw,g=rw,o=r + + - name: Run SRIOV performance scenario + ansible.builtin.shell: | + cd {{ home_dir }}/ansible-nfv && ansible-playbook \ + -i {{ home_dir }}/perf-inventory.ini \ + -e @{{ home_dir }}/perf-sriov-vars.yaml \ + -e manual_run=false \ + -e binary_perf_log={{ artifacts_dir }}/performance/sriov_performance.log \ + -e dut_group=sriov_dut \ + -e dut_type=sriov \ + -e report_junitxml_junitxml_output_path={{ artifacts_dir }}/performance/sriov_perf_results.xml \ + -e testpmd_lcores={{ perf_test.sriov.testpmd_lcores | default('1,2,3') }} \ + -e trex_rate={{ perf_test.sriov.trex_rate }} \ + -e clone_traffic_gen_repo=false \ + -e launch_testpmd=false \ + -e discover_dut_macs=false \ + "-e dut_macs={{ _sriov_dut_macs }}" \ + -e private_key_fetch_location={{ perf_trex_ssh_key | dirname }}/ \ + -e python_interperter=/usr/bin/python3 \ + playbooks/packet_gen/trex/performance_scenario.yml + register: _sriov_perf_result + changed_when: true + + - name: Display SRIOV performance result + ansible.builtin.debug: + msg: "SRIOV performance test completed with rc={{ _sriov_perf_result.rc }}" + +- name: Run DPDK performance test + when: perf_test.dpdk.enabled | default(true) | bool + block: + - name: Delete SRIOV DUT pod before DPDK test + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: absent + kind: Pod + namespace: default + name: "{{ perf_test.sriov.pod_name }}" + wait: true + when: perf_test.sriov.enabled | default(true) | bool + + - name: Reboot TRex VM for DPDK test + ansible.builtin.shell: | + openstack server stop {{ perf_test.trex_server }} && sleep 5 && openstack server start {{ perf_test.trex_server }} + environment: + OS_CLOUD: "{{ user_cloud }}" + changed_when: true + + - name: Wait for TRex VM to become active + ansible.builtin.shell: | + openstack server show {{ perf_test.trex_server }} -c status -f value + environment: + OS_CLOUD: "{{ user_cloud }}" + register: _trex_status + until: _trex_status.stdout == 'ACTIVE' + retries: 30 + delay: 10 + changed_when: false + + - name: Wait for TRex SSH connectivity + ansible.builtin.wait_for: + host: "{{ _trex_fip.stdout }}" + port: 22 + timeout: 300 + + - name: Create DPDK testpmd DUT pod + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: present + definition: "{{ lookup('template', 'testpmd-dut-pod.yaml.j2') }}" + wait: true + wait_sleep: 10 + wait_timeout: 120 + vars: + dut: "{{ perf_test.dpdk }}" + + - name: Wait for DPDK testpmd to start + ansible.builtin.pause: + seconds: 15 + + - name: Collect DPDK DUT port MACs + ansible.builtin.shell: | + oc --kubeconfig {{ kubeconfig }} logs {{ perf_test.dpdk.pod_name }} -n default | grep -E "^Port [0-9]" | grep -v "link state change" + register: _dpdk_macs + retries: 10 + delay: 10 + until: _dpdk_macs.stdout | length > 0 + changed_when: false + + - name: Save DPDK DUT MACs + ansible.builtin.copy: + content: "{{ _dpdk_macs.stdout }}" + dest: "{{ artifacts_dir }}/performance/dpdk_dut_port_macs.conf" + mode: u=rw,g=rw,o=r + + - name: Parse DPDK DUT MACs into comma-separated format for ansible-nfv + ansible.builtin.set_fact: + _dpdk_dut_macs: >- + {{ _dpdk_macs.stdout_lines + | map('regex_search', '([0-9A-Fa-f:]{17})') + | select('string') + | list + | join(',') }} + + - name: Display DPDK DUT MACs + ansible.builtin.debug: + msg: "DUT MACs for TRex: {{ _dpdk_dut_macs }}" + + - name: Generate DPDK performance extra vars + ansible.builtin.template: + src: perf-extra-vars.yaml.j2 + dest: "{{ home_dir }}/perf-dpdk-vars.yaml" + mode: u=rw,g=rw,o=r + + - name: Run DPDK performance scenario + ansible.builtin.shell: | + cd {{ home_dir }}/ansible-nfv && ansible-playbook \ + -i {{ home_dir }}/perf-inventory.ini \ + -e @{{ home_dir }}/perf-dpdk-vars.yaml \ + -e manual_run=false \ + -e binary_perf_log={{ artifacts_dir }}/performance/dpdk_performance.log \ + -e dut_group=dpdk_dut \ + -e dut_type=dpdk \ + -e report_junitxml_junitxml_output_path={{ artifacts_dir }}/performance/dpdk_perf_results.xml \ + -e testpmd_lcores={{ perf_test.dpdk.testpmd_lcores | default('3,4,5') }} \ + -e trex_rate={{ perf_test.dpdk.trex_rate }} \ + -e clone_traffic_gen_repo=false \ + -e launch_testpmd=false \ + -e discover_dut_macs=false \ + "-e dut_macs={{ _dpdk_dut_macs }}" \ + -e private_key_fetch_location={{ perf_trex_ssh_key | dirname }}/ \ + -e python_interperter=/usr/bin/python3 \ + playbooks/packet_gen/trex/performance_scenario.yml + register: _dpdk_perf_result + changed_when: true + + - name: Display DPDK performance result + ansible.builtin.debug: + msg: "DPDK performance test completed with rc={{ _dpdk_perf_result.rc }}" + +- name: Cleanup DUT pods + kubernetes.core.k8s: + kubeconfig: "{{ kubeconfig }}" + state: absent + kind: Pod + namespace: default + name: "{{ item }}" + wait: true + loop: + - "{{ perf_test.sriov.pod_name }}" + - "{{ perf_test.dpdk.pod_name }}" + ignore_errors: true diff --git a/collection/stages/roles/day2ops/templates/perf-extra-vars.yaml.j2 b/collection/stages/roles/day2ops/templates/perf-extra-vars.yaml.j2 new file mode 100644 index 00000000..53cfd963 --- /dev/null +++ b/collection/stages/roles/day2ops/templates/perf-extra-vars.yaml.j2 @@ -0,0 +1,21 @@ +--- +cloud_resources: external +cloud_name: "{{ user_cloud }}" +query_cloud: "{{ user_cloud }}" +trex_lcores: "{{ perf_test.trex_lcores | default(perf_trex_lcores | default('2-10')) }}" +# master_thread_id=2, latency_thread_id=3, data threads start at 4 +# TRex VM has 11 vCPUs (0-10), so max data thread is 10 -> 7 data threads +trex_process_threads: "{{ perf_test.trex_process_threads | default(7) }}" +binary_search_disable_upward_search: true +binary_search_warmup_trial_runtime: {{ perf_warmup_runtime | default(120) }} +discover_instance_external_ip: true +ssh_key: {{ perf_trex_ssh_key | basename }} +# Use system Python instead of the ansible-nfv venv (not created when manual_run=false) +# Note: ansible-nfv uses 'python_interperter' (typo) as the override variable +python_interperter: /usr/bin/python3 +venv_path: /usr +dut_compute: "" +dynamic_instances: + - name: {{ perf_test.trex_server }} + group: trex + user: {{ perf_trex_user | default('cloud-user') }} diff --git a/collection/stages/roles/day2ops/templates/perf-inventory.ini.j2 b/collection/stages/roles/day2ops/templates/perf-inventory.ini.j2 new file mode 100644 index 00000000..a562436c --- /dev/null +++ b/collection/stages/roles/day2ops/templates/perf-inventory.ini.j2 @@ -0,0 +1,8 @@ +localhost ansible_connection=local ansible_python_interpreter=python3 +undercloud-0 ansible_connection=local ansible_python_interpreter=python3 + +[local] +localhost + +[undercloud] +undercloud-0 diff --git a/collection/stages/roles/day2ops/templates/performance-profile.yaml.j2 b/collection/stages/roles/day2ops/templates/performance-profile.yaml.j2 new file mode 100644 index 00000000..21cd57dd --- /dev/null +++ b/collection/stages/roles/day2ops/templates/performance-profile.yaml.j2 @@ -0,0 +1,28 @@ +# PerformanceProfile for {{ _profile_type }} worker nodes +# Configures CPU pinning, hugepages, and kernel args for telco workloads +apiVersion: performance.openshift.io/v2 +kind: PerformanceProfile +metadata: + name: {{ _profile_type }}-performanceprofile +spec: + cpu: + isolated: "{{ _cpu_isolated }}" + reserved: "{{ _cpu_reserved }}" + hugepages: + defaultHugepagesSize: "{{ _hugepages_size }}" + pages: + - size: "{{ _hugepages_size }}" + count: {{ _hugepages_count }} + node: {{ _numa_node }} + realTimeKernel: + enabled: {{ _realtime_kernel | default(false) | lower }} + numa: + topologyPolicy: "{{ _numa_topology_policy | default('best-effort') }}" + nodeSelector: + node-role.kubernetes.io/{{ _profile_type }}: "" +{% if _additional_kernel_args is defined and _additional_kernel_args | length > 0 %} + additionalKernelArgs: +{% for arg in _additional_kernel_args %} + - {{ arg }} +{% endfor %} +{% endif %} diff --git a/collection/stages/roles/day2ops/templates/sriov-network-node-policy.yaml.j2 b/collection/stages/roles/day2ops/templates/sriov-network-node-policy.yaml.j2 new file mode 100644 index 00000000..d6557c6e --- /dev/null +++ b/collection/stages/roles/day2ops/templates/sriov-network-node-policy.yaml.j2 @@ -0,0 +1,20 @@ +# SriovNetworkNodePolicy for {{ _policy_name }} +# Attaches OpenStack network to SRIOV-capable nodes +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovNetworkNodePolicy +metadata: + name: {{ _policy_name }} + namespace: openshift-sriov-network-operator +spec: + deviceType: {{ _device_type | default('vfio-pci') }} + nicSelector: + netFilter: openstack/NetworkID:{{ _network_id }} + nodeSelector: +{% if _node_selector_label is defined %} + {{ _node_selector_label }}: "{{ _node_selector_value | default('') }}" +{% else %} + feature.node.kubernetes.io/network-sriov.capable: "true" +{% endif %} + numVfs: {{ _num_vfs | default(1) }} + priority: {{ _priority | default(99) }} + resourceName: {{ _resource_name }} diff --git a/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 b/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 new file mode 100644 index 00000000..b645e9be --- /dev/null +++ b/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 @@ -0,0 +1,59 @@ +apiVersion: v1 +kind: Pod +metadata: + name: {{ dut.pod_name }} + namespace: default + annotations: + irq-load-balancing.crio.io: disable + cpu-load-balancing.crio.io: disable + cpu-quota.crio.io: disable +spec: + runtimeClassName: {{ dut.runtime_class }} + containers: + - name: {{ dut.pod_name }} + command: ["/bin/sh"] + args: + - "-c" + - >- + testpmd + -l $(taskset -pc 1 | cut -d: -f2) + --in-memory + --socket-mem {{ dut.socket_mem | default('1024') }} + -n 4 + -- + --nb-cores={{ dut.testpmd_nb_cores }} + --auto-start + --stats-period 10 +{% if dut.testpmd_rxd is defined %} + --rxd={{ dut.testpmd_rxd }} + --txd={{ dut.testpmd_txd }} +{% endif %} + image: {{ dut.image | default('registry.redhat.io/openshift4/dpdk-base-rhel8:v4.10.0-5') }} + securityContext: + privileged: true + runAsUser: 0 + resources: + requests: +{% for res in dut.resources %} + openshift.io/{{ res.name }}: "{{ res.count }}" +{% endfor %} + memory: {{ dut.memory }} + hugepages-{{ dut.hugepages_size | default('1Gi') }}: {{ dut.hugepages }} + cpu: '{{ dut.cpu }}' + limits: +{% for res in dut.resources %} + openshift.io/{{ res.name }}: "{{ res.count }}" +{% endfor %} + memory: {{ dut.memory }} + hugepages-{{ dut.hugepages_size | default('1Gi') }}: {{ dut.hugepages }} + cpu: '{{ dut.cpu }}' + volumeMounts: + - mountPath: /dev/hugepages + name: hugepage + readOnly: false + nodeSelector: + {{ dut.node_selector }}: "" + volumes: + - name: hugepage + emptyDir: + medium: HugePages From c2319fe557f1b61bdd34b852e4da54ec68246d2e Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Mon, 22 Jun 2026 15:09:30 +0300 Subject: [PATCH 7/9] Add telco verification job definition and NFV setup playbook Add a job definition for the telco (SR-IOV/DPDK) verification pipeline and the nfv_setup playbook that orchestrates the day2ops procedures for machineset creation, performance tuning, and test execution. Change-Id: I01690ab8206ad8ef616f7a0c19c984045f5c548d --- .../day2ops/templates/testpmd-dut-pod.yaml.j2 | 4 + jobs_definitions/telco_verification.yaml | 175 ++++++++++++++++++ playbooks/ocp_testing.yaml | 4 + playbooks/plays/nfv_setup.yaml | 31 ++++ 4 files changed, 214 insertions(+) create mode 100644 jobs_definitions/telco_verification.yaml create mode 100644 playbooks/plays/nfv_setup.yaml diff --git a/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 b/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 index b645e9be..0025f9ce 100644 --- a/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 +++ b/collection/stages/roles/day2ops/templates/testpmd-dut-pod.yaml.j2 @@ -27,6 +27,10 @@ spec: {% if dut.testpmd_rxd is defined %} --rxd={{ dut.testpmd_rxd }} --txd={{ dut.testpmd_txd }} +{% endif %} +{% if dut.testpmd_rxq is defined %} + --rxq={{ dut.testpmd_rxq }} + --txq={{ dut.testpmd_txq }} {% endif %} image: {{ dut.image | default('registry.redhat.io/openshift4/dpdk-base-rhel8:v4.10.0-5') }} securityContext: diff --git a/jobs_definitions/telco_verification.yaml b/jobs_definitions/telco_verification.yaml new file mode 100644 index 00000000..1c9f5694 --- /dev/null +++ b/jobs_definitions/telco_verification.yaml @@ -0,0 +1,175 @@ +--- +# +# * TELCO VERIFICATION * +# +# - This job will be run in integration pipeline and will be monitored by CI team. +# - It includes the stages that will exercise the OSP integration in order to +# validate the OSP candidate release with Telco (SRIOV/DPDK) workloads. +# - It will use latest stable version of OCP. +# - It is prepared to run with a full virtualized setup, so the flavors are reduced +# from the official OCP documentation to fit on the virtualized resources. +# - It is prepared to run on top of RHOSP18 OSASINFRA Validated Architecture. +# +# Environment-specific values (networks, flavors, CIDRs) must be provided via +# telco_env in the ci-framework-jobs shiftstack_test.yaml for each environment. + +# openshift_release: 4-stable # It can be "4.10", "4.11", etc. or "4-stable" +openshift_release: 4-stable # It can be "4.10", "4.11", etc. or "4-stable" +openshift_build_name: "" # It can be an empty value "" (latest nightly), a given build +installation_type: ipi +stages: + - prepare + - install + - post + - nfv_setup + +# NFV setup procedures to run before verification +nfv_setup_steps: + - create-telco-machinesets + - configure-telco-tuning + - run-performance-test + +openstack_infra: + external_network: "{{ telco_env.external_network }}" + region: regionOne + network_config: + ipv4: + dns_servers: "{{ telco_env.dns_servers }}" + +custom_network: "{{ telco_env.management_network }}" +custom_subnet: "{{ telco_env.management_network }}" + +project: + name: "{{ user_cloud }}" + user: user + password: redhat + role: member + swift_role: swiftoperator + domain_name: Default + region: 'regionOne' + os_quota: + ram: 262144 + cores: 200 + +ocp_deployment_topology: + network_type: OVNKubernetes + machines_subnet: "{{ telco_env.management_network }}" + primary_ip_protocol: ipv4 + secondary_ip_protocol: "" + defaultMachinePlatform: + type: "{{ telco_env.default_machine_platform_flavor }}" + platform: + openstack: + clusterOSImageProperties: + hw_cpu_policy: dedicated + ipv4: + ip_version: 4 + tenant_subnet: + cidr: "{{ telco_env.subnet_cidr }}" + cluster_network: + cidr: 10.128.0.0/14 + host_prefix: 23 + service_network: + - 172.30.0.0/16 + flavors: + master: + name: "{{ telco_env.master_flavor }}" + worker: + name: "worker" + replicas: + master: 3 + worker: 0 + servergroups: + master: "soft-anti-affinity" + worker: "soft-anti-affinity" + +bootstrap_flavor_override: "{{ telco_env.bootstrap_flavor }}" + +# Telco MachineSet configuration for SRIOV/DPDK workers +telco_machinesets: + delete_default_workers: true + disable_masters_schedulable: true + machinesets: + - name: sriov + role: worker + type: sriov + replicas: 1 + flavor: "{{ telco_env.sriov_worker_flavor }}" + networks: "{{ telco_env.sriov_networks }}" + - name: dpdk + role: worker + type: dpdk + replicas: 1 + flavor: "{{ telco_env.dpdk_worker_flavor }}" + networks: "{{ telco_env.dpdk_networks }}" + +# Telco tuning configuration for SRIOV/DPDK workloads +telco_tuning: + sriov: + performance_profile: + cpu_isolated: "{{ telco_env.sriov_cpu_isolated | default('4,5,6,7,8,9,10,11,12,13') }}" + cpu_reserved: "{{ telco_env.sriov_cpu_reserved | default('0,1,2,3') }}" + hugepages_size: "1G" + hugepages_count: "{{ telco_env.sriov_hugepages_count | default(7) }}" + numa_node: "{{ telco_env.sriov_numa_node | default(0) }}" + numa_topology_policy: "best-effort" + realtime_kernel: false + additional_kernel_args: + - nosmt + - tsc=reliable + networks: "{{ telco_env.sriov_tuning_networks }}" + dpdk: + performance_profile: + cpu_isolated: "{{ telco_env.dpdk_cpu_isolated | default('4,5,6,7,8,9,10,11,12,13') }}" + cpu_reserved: "{{ telco_env.dpdk_cpu_reserved | default('0,1,2,3') }}" + hugepages_size: "1G" + hugepages_count: "{{ telco_env.dpdk_hugepages_count | default(7) }}" + numa_node: "{{ telco_env.dpdk_numa_node | default(1) }}" + numa_topology_policy: "best-effort" + realtime_kernel: false + additional_kernel_args: + - nosmt + - tsc=reliable + networks: "{{ telco_env.dpdk_tuning_networks }}" + +# Performance test configuration +perf_test: + ansible_nfv_repo: "https://github.com/NFV18/ansible-nfv.git" + ansible_nfv_branch: "main" + trex_server: "{{ telco_env.trex_server | default('trex') }}" + trex_management_network: "{{ telco_env.management_network }}" + trex_ssh_key: "{{ telco_env.trex_ssh_key }}" + trex_lcores: "{{ telco_env.trex_lcores | default('2-10') }}" + trex_process_threads: "{{ telco_env.trex_process_threads | default(7) }}" + sriov: + enabled: true + pod_name: "sriov-testpmd" + image: "registry.redhat.io/openshift4/dpdk-base-rhel9:v4.20-80" + node_selector: "node-role.kubernetes.io/sriov" + runtime_class: "performance-sriov-performanceprofile" + cpu: 3 + hugepages: "7Gi" + memory: "1000Mi" + testpmd_nb_cores: 2 + testpmd_rxd: 1024 + testpmd_txd: 1024 + testpmd_lcores: "1,2,3" + resources: "{{ telco_env.sriov_perf_resources }}" + trex_rate: 15 # mpps + dpdk: + enabled: true + pod_name: "dpdk-testpmd" + image: "registry.redhat.io/openshift4/dpdk-base-rhel9:v4.20-80" + node_selector: "node-role.kubernetes.io/dpdk" + runtime_class: "performance-dpdk-performanceprofile" + cpu: 3 + hugepages: "7Gi" + memory: "1000Mi" + testpmd_nb_cores: 2 + testpmd_rxd: 1024 + testpmd_txd: 1024 + testpmd_rxq: 2 + testpmd_txq: 2 + testpmd_lcores: "3,4,5" + resources: "{{ telco_env.dpdk_perf_resources }}" + trex_rate: 2 # mpps diff --git a/playbooks/ocp_testing.yaml b/playbooks/ocp_testing.yaml index ac386333..cf2dcbef 100644 --- a/playbooks/ocp_testing.yaml +++ b/playbooks/ocp_testing.yaml @@ -76,6 +76,10 @@ ansible.builtin.import_playbook: plays/post_install.yaml when: "'post' in stages" +- name: NFV setup stage + ansible.builtin.import_playbook: plays/nfv_setup.yaml + when: "'nfv_setup' in stages" + - name: Run OpenShift Verification stage ansible.builtin.import_playbook: plays/verification.yaml when: "'verification' in stages" diff --git a/playbooks/plays/nfv_setup.yaml b/playbooks/plays/nfv_setup.yaml new file mode 100644 index 00000000..9ec1bae1 --- /dev/null +++ b/playbooks/plays/nfv_setup.yaml @@ -0,0 +1,31 @@ +--- +- name: NFV setup stage + hosts: installer + gather_facts: yes + vars_files: + - "../../configs/global.yml" + tasks: + - name: Main block + block: + - name: Run NFV setup procedures on OCP + ansible.builtin.include_role: + name: shiftstack.stages.day2ops + vars: + day2ops_steps: "{{ nfv_setup_steps }}" + day2ops_run_procedure_task: run_procedure_no_verify.yml + rescue: + - name: Set NFV setup failure info + ansible.builtin.set_fact: + nfv_setup_failed: true + nfv_setup_failed_task: "{{ ansible_failed_task.name | default('UNKNOWN') }}" + + - name: Fail the playbook + ansible.builtin.fail: + msg: > + NFV setup failed at task '{{ nfv_setup_failed_task }}'. + See ansible logs for more information. + always: + - name: Synchronize artifacts from the Ansible Managed Node to Ansible Controller + ansible.builtin.include_role: + name: shiftstack.tools.tools_ansible_inventory + tasks_from: sync_artifacts.yml From d9a7612a0a995c597810b04d9fa07f7077315eb5 Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Thu, 25 Jun 2026 13:03:01 +0300 Subject: [PATCH 8/9] Address PR review feedback from imatza-rh - Restore combine(nightly_disable_image_policy) in ipi_tenant.yml and ipi_bootstrap_flavor_workaround.yml environment blocks - Use default('stable', true) to also catch empty strings in SRIOV operator channel lookup - Change delete_default_workers default to false to prevent accidental worker deletion when machinesets list is empty - Add assert to validate machinesSubnet is defined before querying OpenStack subnets Co-Authored-By: Claude Opus 4.6 (1M context) Change-Id: Ibd252a087ae07a2defb446e6eab391176da01394 --- collection/stages/roles/day2ops/defaults/main.yml | 2 +- .../day2ops/tasks/procedures/configure-telco-tuning.yml | 2 +- .../day2ops/tasks/procedures/create-telco-machinesets.yml | 6 ++++++ .../roles/install/tasks/ipi_bootstrap_flavor_workaround.yml | 6 ++---- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/collection/stages/roles/day2ops/defaults/main.yml b/collection/stages/roles/day2ops/defaults/main.yml index 978d290a..4f6557f7 100644 --- a/collection/stages/roles/day2ops/defaults/main.yml +++ b/collection/stages/roles/day2ops/defaults/main.yml @@ -9,7 +9,7 @@ app_credential_name: "AppCreds-{{ user_cloud }}" # Telco MachineSet configuration for SRIOV/DPDK workers # Used by the create-telco-machinesets procedure telco_machinesets: - delete_default_workers: true # Whether to delete the default worker machineset + delete_default_workers: false # Whether to delete the default worker machineset disable_masters_schedulable: true # Set mastersSchedulable: false after adding workers machinesets: [] # List of machinesets to create (configure in job definition) # Example machineset configuration: diff --git a/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml b/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml index 0c8a5259..940cc0fb 100644 --- a/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml +++ b/collection/stages/roles/day2ops/tasks/procedures/configure-telco-tuning.yml @@ -130,7 +130,7 @@ name: sriov-network-operator-subscription namespace: openshift-sriov-network-operator spec: - channel: "{{ sno_channel.stdout | default('stable') }}" + channel: "{{ sno_channel.stdout | default('stable', true) }}" name: sriov-network-operator source: redhat-operators sourceNamespace: openshift-marketplace diff --git a/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml b/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml index 90c15669..0ab80412 100644 --- a/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml +++ b/collection/stages/roles/day2ops/tasks/procedures/create-telco-machinesets.yml @@ -67,6 +67,12 @@ apps_ip: "{{ ic_content.platform.openstack.ingressFloatingIP }}" machines_subnet_name: "{{ ic_content.platform.openstack.machinesSubnet | default('') }}" +- name: Verify machinesSubnet is defined in install-config + ansible.builtin.assert: + that: + - machines_subnet_name | length > 0 + fail_msg: "machinesSubnet must be defined in install-config for telco MachineSet creation" + - name: Get the machinesSubnet details from OpenStack openstack.cloud.subnets_info: cloud: "{{ user_cloud }}" diff --git a/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml b/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml index 7806d54e..c610ea1e 100644 --- a/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml +++ b/collection/stages/roles/install/tasks/ipi_bootstrap_flavor_workaround.yml @@ -12,8 +12,7 @@ - name: Create OpenShift manifests ansible.builtin.shell: | openshift-install create manifests --log-level debug --dir {{ ocp_installation_dir }} - environment: - OS_CLOUD: "{{ user_cloud }}" + environment: "{{ {'OS_CLOUD': user_cloud} | combine(nightly_disable_image_policy) }}" changed_when: true - name: Find bootstrap OpenStackMachine manifest (CAPI mode) @@ -45,8 +44,7 @@ - name: Install Openshift ansible.builtin.shell: | openshift-install create cluster --log-level debug --dir {{ ocp_installation_dir }} - environment: - OS_CLOUD: "{{ user_cloud }}" + environment: "{{ {'OS_CLOUD': user_cloud} | combine(nightly_disable_image_policy) }}" changed_when: true rescue: - name: Use an openshift-install flag to wait until the cluster is ready From dcae49ab864df09976f3ff9f04bf059c8dfd4442 Mon Sep 17 00:00:00 2001 From: eshulman2 Date: Sun, 28 Jun 2026 11:18:29 +0300 Subject: [PATCH 9/9] Add block/rescue/always to run_procedure_no_verify for error handling Keep XML report entries, must-gather collection on failure, and timing from run_procedure.yml while omitting the verification role call. Co-Authored-By: Claude Opus 4.6 (1M context) Change-Id: Ia453f0408c35400eed6d343105f8d1cb449d7990 --- .../day2ops/tasks/run_procedure_no_verify.yml | 64 ++- configs/secret.yaml | 513 +++++++++--------- jobs_definitions/telco_verification.yaml | 2 +- 3 files changed, 320 insertions(+), 259 deletions(-) diff --git a/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml b/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml index 71f07cd4..4ce6ab5b 100644 --- a/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml +++ b/collection/stages/roles/day2ops/tasks/run_procedure_no_verify.yml @@ -11,5 +11,65 @@ success_msg: | Running task file {{ procedure_task_file }} -- name: Run procedure {{ procedure_task_file }} - ansible.builtin.include_tasks: "procedures/{{ procedure_task_file }}" +- name: Run day2ops procedure {{ procedure_task_file }} (no verification) + vars: + procedure: "{{ procedure_task_file | regex_replace('\\.yml$', '') }}" + report_path: "{{ report_dir }}/{{ day2ops_report_filename }}" + block: + + - name: Create entry on report + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + + - name: Store start time on report for {{ procedure }} + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + attribute: start_time + value: "{{ lookup('pipe', 'date +%Y-%m-%dT%H:%M:%S') }}" + + - name: Run the day2ops procedure + ansible.builtin.include_tasks: "procedures/{{ procedure_task_file }}" + + - name: Write result:SUCCESS on report for {{ procedure }} + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + attribute: result + value: PASSED + + rescue: + - name: Write result:FAILED on report for {{ procedure }} + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + attribute: result + value: FAILED + + - name: Write failed_task on report for {{ procedure }} + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + attribute: failed_task + value: "{{ (ansible_failed_task is defined) | ternary(ansible_failed_task.name, 'UNKNOWN') }}" + + - name: Run must-gather + ansible.builtin.include_role: + name: tools_must-gather + vars: + must_gather_suffix: "{{ procedure }}" + + - name: Fail the playbook in a case of failure + ansible.builtin.fail: + msg: > + Failed! See logs and must-gather for more information. + The {{ procedure_task_file }} task file failed. + + always: + - name: Write end_time on report for {{ procedure }} + community.general.xml: + path: "{{ report_path }}" + xpath: /shiftstack-day2ops/{{ procedure }} + attribute: end_time + value: "{{ lookup('pipe', 'date +%Y-%m-%dT%H:%M:%S') }}" diff --git a/configs/secret.yaml b/configs/secret.yaml index 0fc7fb50..5c557002 100644 --- a/configs/secret.yaml +++ b/configs/secret.yaml @@ -1,257 +1,258 @@ $ANSIBLE_VAULT;1.1;AES256 -37363436633936393634313465353436343433653936646463633139333836346634616166646366 -6434633639653066363865373231636363653366326531310a316632663936616236636536646236 -30633764323436643237366439633334636237306339376564366365393365633931613033363735 -6561356661353962300a626164383963316437646536376432336632646164333764356430353761 -63393939303637353030313363336139373061366330343636613933383163613333323865646361 -33373633643231373635376466363831353034393131306663646161353938393334656264313863 -66333939626461346531363035383038663635346231353031636332383064626264613432343033 -39613630646266666434326261303637626334613630613031336334383337323633376335393361 -38306535346664376233643661363239613430393638386366633561303564333761386561313564 -31383266346436366362343963626231653631633431316562326564653638343633313635323663 -38323565363663646330623734613139313834396564363739623961376532303135313663663736 -31653535313662303462326333323039393632646362353162323261633861376562356165303136 -61313539393761313565383430663933383031373263326134346539323963303065323938393438 -63373634656134616538316333316539636165313265343335656265323639363938636463616639 -31633065656131616563333362343339303638336432636465623834623864626666633839636136 -37616139346631336264383036643762346330636433616365623666376166336532323837376164 -34343464373033353735303761363365303731623736353164383034303563616464323739366461 -34653934623935363465333364376135343635393037353438313630356531353931613661383564 -64353061353764303831366635646630386565633033393463353031376534383135343263343438 -37316663613430616238646438633330353037643633333165616435336634323865353235303638 -61653231326539653361623066656266646566313661353732656264636463343266393562353834 -39653066366130636330346361363536366132303039303632316237303630623632393262393832 -63323161623533356231303866383933363264356262376331613930373131653463313830323666 -36383932616532343565393862633033373030646335653462383837373935343762653561363634 -64613265346634326164613932343431653132663239313764363234313264633062636633333265 -31323238646432663033613461333638663765303333656165333637356238336261633630396533 -38343863366261383064356230353037636461643937363837303734373931363438643463306238 -30316331636565626436393333393262336237383061333735613765393230326134376637373736 -30306333653566663961306565383738636662653030363862336538316438656563613865396136 -37383738336465646333323639646161653631643032363338393265626637613236643239663631 -31383663316561346566643333623866356533623336313461643665363832636532343238333330 -36633634663366633637383964343139323938643438613639343330636138376138346338323131 -65303462386464663965656635383335393635333239636131356166373031323563666538306238 -62613434306332373731656435653366306636616135363634393862646462316630383764663566 -37653433326134636236383264623333336131333833623236303662313236643665363435376334 -39353363356337623534626466666530373132386536643037346137616531623131353238323766 -30623137363163353235363330363165656161613363386636663932613133623133656261306332 -64383239353761643566616338313966666631633532613832356237343636386534353563323732 -65356462643864303333633961323065303839396561373465653437653364656233356564663334 -34393631633262663563346137623039373466316636313666373238633136613232306663616534 -62373136333532373034643563653836393834303161633361626438313363656236386637323564 -33613131636336343762623034646634636633663863323034333531333061313430656336616130 -33643635383539643461366534393536363938313165366466633263653363386136303563383239 -39646436323932303835386536623631326231663735666463623466626433313530613036393630 -35666462386461636235316530383032643664326430343234356536643230613062636132633938 -33303634383536346366376631303965323433376638646363303431653932663734383037363562 -36343238623462376639313166646431626532373661626336636362383766633532616539363331 -34613337336635326535653064383464613562343530623263633935306539336638393137363237 -62373762616331346230616232646137623230303635323763376332373533386331383266613339 -63666262326161353363366130366363623661663338306261383262623538383566656665323637 -32623238353566333133303335353939386637613761333261333161663933623565643666623939 -37633333376234333866666438383434323331623861323236663862353732343264373235626265 -31333665373339393131333634306262313233363436663662363965623630343334323835306237 -38353034633835303863333361313434646365393566393030636166663738383665343263326164 -30356431366131333537373838353666353531663031306265643962306535653963623162633732 -31636636653535373862633230393966613563623233326264666264356534346235653665316437 -61366664343064633961383536393638316263396264316637303834656438346136393438323366 -34356239373164386365343038356366616339386532663531343533616464386661316532366431 -34636561393665653734323562353537353464303339666438323135633865653434383466323466 -64636639356561616638663261666136663835343136633866626639323935663632613731613930 -35373532623863313336613539386465633038393938313231613466383334323461366232376262 -62613064623936663263373834396332376465623732376132663131393937343066633236663338 -37666661313431383963623434643139393337316466373932346262333966386463323337323065 -31343365633465396239303365333538626537396337663236386561333431326165643465316636 -65333438616139376532376431336465366336643065323338356533386131326464396231623732 -61313763646164663133643161623761343739303132313033623932383461353138623464343533 -37353731383366303866633161643663643866383239333030636465343566323732333339313135 -62336137303431663131346663363361313366323433356265383630386166666532356165393861 -39303938313334336665643236383166323166313830623330353336376362313636323431396337 -30326137383534613439336630646464316532626465366437663431306337666236373264336639 -66336330353338626664393535376431373762633330396161396266313039356135653964316633 -36333234633130373835643763613936373962626439623537336431343730376334663634386264 -37316434373765363764646432336563316238303362343362346134373436666535343863353335 -38356264336664396164323431356466336162316665666563386130376563366261663964396130 -37346661363330643761313162383437663031303531646366343562626534363738343364653135 -38653365613961313035373465386236316533636339343338633830646264653265653532303736 -39633363313864363933646337336439653763396637393133306463613362363763386232313066 -65313562363838623632303134653133393961333130663262656463343732663733633962616666 -38383165303637383466636333643464386531383232613633643838316138636238643236316264 -32343135336666303362363261363066656636386433336334626533306165356634316138383865 -39333538366437363765393732323135343937613637333862663262656434623433613961656561 -35646233316262303139346332346664623963613066376637373763343764316632353431393334 -33383832333636313035653836336636663361396164663231633438393765306530383962663034 -38623765643062383866326363623637663130326537313765643731616435316564346161366365 -66663464383535303961346336633561373435373630623234313365636333643036663632343062 -37323737613866643437353239343462343936303531633664623561353637313632633662613365 -39383135366263623537613065643161623764363133393962616438303562663230386361346365 -64303235306531656563343064356365383564343638646466303232633835636638333039653133 -66333437346134383435623132666230313535306431363062616637353961323437343764363763 -33653262656562366533343038353266343834643039663162303135313065333433613465356133 -33313465396261623563333430363634306438336332356630366562393235313166393366343434 -35303563373061613766643538633930353264653661363134393530663664623163333061323835 -63343335303063323162623034343539396135383866653133626464336331616236373136356662 -62323831343062343634323039653832373330313135346230653431373463306532356264653538 -35653735386461653234306238303162623331353931363331653561376337373663653663386336 -64636464313635336335303363646166363766383730373138353830343637636466366336646639 -39666462323961376536383038386266373437663366343963626333306335656238313464653537 -31303764333931643866313035393636306637666531303139303134613238396233303162383661 -65303430336636633135326636356536653431346165343138373036643931376533306631306130 -33363364323233623165303238303833646635623363366164633764323638396334303135656562 -63643364363231303736316264643666646262646530336231383962373439386436323963616261 -34353865303663626431633039316435373239383537636261393933346135366132633239333134 -37313262356135633564653134626438613336623639643935616633373761663330343030666337 -36346563363334356230363133633833623031646564623363313532626236353430653638373939 -33323636616439366362376631623232303330303239663338396539386330306466653163336230 -35316661326663656235303035313135373836663262653838396434393335366332643533323566 -39316563366633643565623234626239613134646634326435643439306162626634333665363836 -62323639306364316264396337353639616262353236333632626662393937343439663839646361 -62616530396639666437663733373137356664623939343636303534386130333865393038363135 -65333062623232333135663733626139633930383265666231313663303965383738343837353539 -34373264333537636536346231666535353931373964316262343832323836613138373265326161 -35336232643932326464663264386165313666323164313635343137323361633766346561383938 -36303365616462626236326333373037623463386463623838323230363531383035643530333831 -31393632623464616463646533393664356530636538363339633431613930366535326237646237 -62643662393934393731636565333330663963353362666531633237323765313164313239343533 -36366434303861396566306261383630303564613265393734313465396631636462623036383438 -33663439343565646339663335653634663461636534353361663030646466326138643935373064 -39326331653963336662636333323237373361643233643963306638663037373334623565653533 -61323561666663373930306662613561616463613734333665633262386230613866336639653163 -37333961376338656234313965346132643531366663633637613431636634313838353265626662 -65336564346632656439613832363165656530656233363230363661643466616531613834643739 -32313733323031663562646366393638353665666163343736353733383934626365613864633463 -61363235633363323639313463343432393363666163653832343461346532643038353135303637 -37303837623238303332303865323437666437343265336665663639623463323534363531326637 -31643335393131303039623565626437343531386361326635643733663361343464646261316466 -36353731363132336431353639393130363864636364393466656666326331376665393162623063 -32653032353336376562366536326631613533626233386638613862386566313639653563333231 -61363034666130393265666166616236373635613839316361656238363035376633353064343532 -39666233613032373138386239343732343861333964306265356336343565653061326366333435 -38643030363032323230353833383239653466356338306330656666393766663663393565353036 -62366234613237623234333830616263356533383939653763383863663931376437633733613833 -38633166393138343766613832366134383966383932363963313937393164393461396134363765 -30386339303066333433336139353037626433626362323261353263663265393531373538333730 -66613664646266383633626164363433383539353166626265623939363234616434646133303762 -36323439323536383035353530336433393539346462633637306435376136613138343662373864 -38323139396464633630306365613562363132303737663736383034336431616436373238656130 -31356362643631303766393232653834613834633230336230666165636439636263353538373962 -65373662356238383039326361626265663132363362653566353735376638343035643433393538 -66393035393466316432366538646662656535396564623937383564356664643764636638353739 -65396161366430316131323966333630333063613866303765656130333332316531663164666138 -64616436373032333638333332343330383038663366373361353033323866646366336139393361 -36343934353838623761353066636630363134643962346232393464356436393132363237613431 -39353932393032663636383537323865663163346566393232326166396266626333323361376633 -38616233623033396666323839626566333761366661343935373839623037376230376133323963 -39313461336439643237646538613065363534366663613665663436316465653563386337303162 -33643736613065613733363366393131656331336431326365333338623036666638656664653462 -64616465666131643235383363326332333139626533316563636566616534626335306137393963 -32346636653931613431336533326430656235363033353762626537316538333330383531663463 -61323163323833393437393338366335613333323436363230306236346535353732363738306232 -39356437653761623532363033633662643131386236336537636366396236313465613735643334 -37383735613834393864326563623232323535633866646138303431643561633665633037373534 -62363736383764383439303666656630343036363639313432343661313533383836656134356263 -30373138366263666362383662386232353534373839383136376439323732313039376431336531 -38333733323664386363336538386134636662363936346538316533306432376539663434326536 -32333034626437383730383733323232366434343335636138323436316165386639613833666565 -64383561316630393431373231393938646666653332396564326362356638386561626261356536 -30353131363636356439363134343063393135353239333530323238383035613132333865663435 -38306333393133636365656163623461366132386337343766346161653133663534613339383034 -61616636633830383538653362653865633364386661386534636331636564343332333533613035 -30336466613439616431336234383464393837303263393136643038643633636461323765323336 -62633964313461633339386331646631653230636566373762356531376466376137663365633837 -38626631656337316235343937363861643763393439353564396631633639663964343464376631 -66336566343336303735633639653033653366626562633439343731356166633030363834386535 -34323932363335343231343535643864363766663733643132303461623437316637376639393033 -61323937386661613765346338376363323732326263663339393638623033326131633639316330 -33616237653062333633303063666366306362363138363265353466383134323334333934303934 -39363533643439356434356236383462633133636230343339636362353932353130636230613564 -31386135653437646137646465633666316430623361346430316435623339643266366134323363 -65316564326534366166323963303265336130666333613136333866363435343063626136396332 -38373865343837343364336232656164343764336435343839343332306633326664313865636163 -35613630316231356639323738383435363462386564343939663930353439396330636462636634 -62326638376364626535353333313635376135393766373663633031353738326463616664356366 -30386137623435643532313837366466653135616463333236663137646433336338663864666130 -61313233383262363366326137633439383161663636303434653862663066363265623765316231 -31303663373936396662363661653733616537633736333064353963383031663437646163323963 -33656362383634396530306238393433353434336539343163343134626263313863366630336461 -32646432373461323138663332383134396266316436643138663233343531653938616432623266 -36363530326535623965326435623135323234383331663133313036363139376237316338353966 -39336139326465306262643437323561336231646466393338363063633338353262366136316335 -30663731353762623232653964393834373338376361353239383065363333363263363661316337 -34313764623166666436316639343532363639636235383064343261326664343134633763333138 -31613038373639316462343961386333376264396231383766663631366136373262343462346239 -30336630643165383632353631656532323330306436313964653566633539653766313837333536 -32343036353433353361646631396262306535373266306532643832363834653938343135626164 -32653239323035636538353661346438373030343064613433303239306337653338646533636334 -34616134326332303630366333343866313963643233666461623764353163306562633739346332 -31616237643030303534343665336663333831306632666635393562366466363730333036343732 -36646662326533313737636163393336666133386233373363633862353131386536383966326264 -35663565396134643136393064303539663361366530653734366432633863653932633266343538 -37303233613432616666363733643432616633316635323438633561323363393061326264313265 -62636565323832633937353462663262333939633337666562626437343161326161303962346564 -38353237613931383734633438303965663334393132323338623033653836643463626135373161 -64316362613763646136643933653139333562313637323037613737363632356263356132386432 -62326464316633333566613061313031393430666538353563616331363863363631343431373462 -66643434633330656266643761376436373664313361333239303663323631343236386533336161 -66623761653561343362343163653362633733643366633233663133353032663362663232383435 -38373432386464316464663735336537316132306430373663623933623131623066656664303836 -33363166343930336436363538373731343366366336373032643663663230346435306465333263 -37393862646432623463363563356235643934616565373263316639626538386230313733373166 -33636661323532636162643534366630666461313965653862613930396234666337386461616130 -34393661326430316661633732346562663062373864653862303234663436386431306330663939 -63633533383266386133616233636565373665353262333338623364633131646331613931626638 -63343863343564326238336236343162343439363361383730613930343631393264626631333638 -39393337663738323735333130613534636335373435656366616333323239666236333231373061 -62653065643035393462306365316137353538376434636536613431316561653131373432623830 -62366466313538663235656235316632626234323432616234373831326633666666376135376561 -38333536613763653661613239633361386365366131323862663336666537356364326565353737 -32353863303030366464326636646232633066343936393565663630363934613438633264363839 -63373834633231636166313131343931353537386563636661663863373938646235393464626366 -38633535666335306537626636616632313165633531643231383661666363316261646334353863 -63383865306662663131343538663836323039373264393763386163633332346564393964616638 -37326566646331353339346163666639333263623731336539633135386535316236366335656464 -38663137626561313664643639343033663337336131383831353239353661353330303631656464 -61663162636662633064653964663162376134366630336533373062396665616431643761363336 -33373733343837646266383832346539336133613831353564636565336132373163316434313133 -34396161316433373337323363663133363961396461343161393665353836356564646131636537 -37323438336531373830383530623165396532313431633536396531653264396137333832643939 -39313864663434313532393761396564346431666435326463353030663435393432643462653663 -36383630323665313732633364373137663665343065613463343532346234376236626235336232 -65316637646461313765316330346461323739396535316330646163366363626235383037306236 -66376339313336303630383536393433623933666534633061353465323432646332653564363639 -38616565306363303037653666396662336538656534313631343838386639353065343535303132 -33626130383136303934646536613036363534363632633133323830376330646532393562376639 -32633436333764353339383135343837663461643639663965643564393461643138363163626638 -33356533633431353066616537323236343563643764393764316236663037363463393265313832 -38623961313166346238353063623937396165313265373834643434623137313964376337386462 -61346334333530333134646562633062343663666161353963353533313865376138366134353238 -37333831383662613536323565636139383963663064353035316465353630376437646364663535 -39616366633765633131303133373130653666633533376464643961333066653565643430313936 -65623264616435323437373236663438313963353762653138626362626666616138666461393530 -39393465326136623863346366613732613738393337313464333636373933643765653536643062 -32613334326532626261376235353839356461343733633438313465633166653835663539656663 -31316637306237346230373961323166386361313664666233303639633766383636653037366266 -33653530623835663330326337626232623237636130623739633364353366303332623362313234 -35336339616430663335383639306132636362326330333233303361663437303661383739323963 -33303761393639633564383234373133633236333930306533326238396338373331636632353264 -66323764363334303164333339626430633432316561373164336239613764333832336337666437 -64353730363831393230363330613438383662363234613533336338623637633236653564626333 -39353134313466373430353864303031326161326539333231363137363238616535653661393461 -36353338316330636435303663393936643361303433643935306465356562333763646365623831 -65613434613339623266666266346130396462636666363466666339393632333138373666356432 -32353563373734356539643739376337356435343338383139393731326531663435313666633038 -32363263303566303430356131393265356333653333636635373934303733653661346631626263 -61633862383864313464386337346433643633323033643263633938393665313365626366323064 -30633262656535366234646635343039623933386631323839303163393736336665386637343238 -62653336306461613232333161613434343335646333313065363830363936326138363431376265 -66336638323435643234306566613635383439353938303530323536333236343965613431373863 -35626431653333346337623962643935316161326632323661663535633638323133393366306163 -64396639393034313533626161643732636138373934653337663534623838646436646635346136 -35653837356533373732623434353733393538393433306639353937383139376161303435636464 -35343665323632386661623934383632656366346665646330626635316661393031623764343232 -31613136646165336561306166643031663335653761306336376136643639656635653233323936 -31326662613037626137373431376130633066376665386566386562626261396130653762623930 -64613366616365336431376565373166646132383963653663313434613861333163343034383433 -32393139326431616637643536313939643862366630643334393638343766393066653739356539 -33353464623237386132 +33336439653862303936383364313733656565323066623462613061623533363437396265393566 +3431633635336263346162343164306230336538663563650a343861383930643430633730653366 +66323137366439316666326533363335393966376164323534336532613238363738383565313830 +3666623231333633300a656164656261386563353830656538326563363633343134666334633035 +31306631656665393463646535623137353465616637303039653165366664366238613536666364 +33333937333432333035343638373566323061353132316633393365656462653531666466313730 +61323934343737646361653961303565643566646165313135363737656337356332353135326136 +64376436393331323036356238363164376366663636326235373965663338323134336663653762 +64333837316130656365303136366634393063616436376161303937653032616165323530383430 +36333631306433383930353264366334643038383464383730383837343631393765303563313566 +66633032633834326364313235376434343234653633333661353164636335613633386434386463 +64363134313664373961353635333033653531353231393565316436376665386531373461653436 +34333730333264626564663862643935366565616266633531396330653963646339303232303763 +63636361323866343434333630613162326132363633363461646163303861383539663939336562 +63356665663333333232386361393035613934353961643336383831366561353563373234623030 +35656635303330383236663231633766333139646238313230323639386366636462643063666236 +65316233636539646439316532363762346334393932346364653834353766656238333734306536 +63353030613832346233306639356339366266323764313534633662363736363536306634343131 +37303431313463326438323662336534336434616465333530626334386336353132393766333164 +33383130363830313637376334376164396263383536393232616665393837306234306433613638 +64393661663035656133323037636531396366373732663731323033393639313539336136333730 +35643338346433633866393562306263663239643461656365316431333662353966313864343361 +35303037613836616233643266336434633934376266393539303962386331613363623133306163 +62666361623831313063376238343734626136383334326661393963613333376232393738666461 +39303162623430396561353536373862363539656631376132376363333336636262636231666235 +39653934313161323032666232366130626432613236653639323838616138353731376532646637 +31396639383638626536343061353734373032336538313833643439333164646337643566656338 +63373866636465633065376465313230373565666565616136396564653861393464353036366434 +39666439313435653131353436613663646238316531376538643733386137393034353665643533 +31663238323737333661373963326331393439363062333438653538396137323235626633386662 +64383365323862316161303764396535633032633837663338336432303761636166303063323731 +34316230623965323762396333616635383035616436646665386436323463313038646137333831 +37396564633066356137666232396536393737383135346639633066333231373365303239396531 +33356238386363616465393464623532366462363437616430303963356462326666373339333932 +36666166623034306535396263373631643435386430363036653438636632626633636435333364 +32396339396566333438373061653462306631626234393961383962383966303531343837383330 +36303631393964636239383938363730343634326232376562616166363031653263643135333965 +34396133363130396236666532343338366336626137613866636537323133366532353062646138 +66636636386262356432383836666663376364376133643230343133373836616336383135386334 +36306534323932356639333665323038626234343064386662643262616662626131643438383464 +39623432356637393138333865623363386265653238366665613735373233636635313266386466 +32613462613166303038653333333763356331323865326539366534346136336262626164386237 +39613630303837326237616136396333373666313731656365346234363866613665336130346561 +64393866363261636536653130346534323236343438363266346162633435353931666435383731 +34313263383733323039653362353032626439633235663963313866313332643839323834396434 +32303863643732633261303634323763613339663139633964343766636338306561643832306566 +39633066323235313939356364353330326666643539616431383835356433633764633632386537 +61356437346562346561643338376134646665313035313936616237353230376664303033383965 +61363133656636646364323866393032303635326261333562636135666335616536653539363732 +63326532623533663566363265613035633635336662633662623236313338663262323932326430 +30623538626462373663316438346335363239346465363032613963653932373334383666363865 +38363366346532383230663934303830363765616537393430346138633761316464343339303161 +62386564353164333130333861303934666333373461336335366630643731613730653137356366 +63333939323465623538333165373339346535636161643837373161333737663939323538386565 +66363962363039643337643538343733386131333536316163353434313439643439646135616438 +61663965343638633933663639343536663332343938316638356562313839343161313132393733 +64343665643065396361346366333739663735633732643762656334303537656561313730353034 +62373161346565643436656332653337393565373130386637646534336636346636333066643538 +37313865346565616530353463313063623666623363653530393161356430623338623635623761 +35383764643534633936396535306637643063626232623365396431633261396662333964623961 +65613930643431313662333538343239633932386637346333323765366437326531346361633164 +65383439613166363832333435363661646363373439633534343234326130666335616239616465 +39363437656564393866313362363134393861303266623461666235663061373536333663313362 +39323337336139393737383930623263336136366633336462333532396233376662633937396562 +36323331343764386666356361306262323761393132393937646532636136636233643161393131 +31346339336530393831306162386232393465353663376136636233383964393633616136396439 +61366537316364393438363637653361653534383639366666656263303232323430326239663762 +30393231613463303438343465323038326461633230653435646366366638376636313834636436 +64393733666330303763633633373835386130393365333935643035646664653634306336383034 +35353030363762383365353063653962633637363231333330346466353363343164623666643865 +34636161653230626133386135306262313164313565653863373738653564623533353535653065 +37383262653238663337333030353763346461393530313436366438663436316266616635376332 +30313165326263343936333238623134363063333132343964643733653164666264356538333838 +30313932386233663930383761653135633132373962623331646162386361373066656362613637 +36623434313538303238393566363133343637643165356662366665306661376164383765663263 +62373930666161393835613466313932363834336438633331376365663061363739643339356432 +65613130653366376439393866636463393363333666353438313038336531613635303636333066 +64313866623638646265623539326563663664646530383230663133663038353963336462366334 +35396235666365303131373133626365653066333664396138343362653737303331626134333663 +33363639666530636562346163656564353262306632343465616666646364376364383331633033 +34383638306464613236316332626132353131396666356439363865353761623761313466316637 +32366637616237353731633732393330383237663461653634653534363963376133336234653763 +39323362633339303334376338366263353364306363646239366665343735636465313134653836 +63666331343764653032636562343233336635393762643061343336613639396538313831393764 +31633137366566646666656132356365356462633434393430663238343932616565313762383839 +65363933613064336334343139333235646137343061326162333962663462396338393032636461 +62363666653133623930333536646231313635663930383836333065353337633739336132316366 +33346431386131336437313363303337613130336235363231353063303935396330376636653931 +31633837363963666435636130653830623930663664323231393163383039333461663262396464 +36366266323065323439366433386238306137316636326663386631396363616436333435343035 +61393830383466613561356134366130313364353764313938663637373961316266313134653335 +33396366626632323564633930383631393138313931386163323238383362663533613933643166 +37316433626535363163346164613365663139313062613838323539393933343035333661356664 +38666335643039313665373761666331346236646639623230303561303161306432366238613035 +34623437383964333734623366303836633139326537376532386432303362356234623564333266 +32636332333365323464633433326563613433366138333563393331333834663239306565303261 +62326537303932303262386133343761366563353437653137636633316139316439643734633238 +61373635626136383636633466313234656430626334323162323764616535633733346539333465 +33393665393561313432633137613363303435306138353533373035316163376566626535613366 +36646664633937353263333133323931346665613430656334386439613535613731623065383232 +62323136623137613862396531353661633461616465356265346434313137376261383931633766 +35653733393730336337323861646464383138623665653932346437353766376336393862336162 +30343131636266316665643961656561383836643134623133653563396661663934343831316561 +63353832383161623866323661356361613766613538356233663938336165343338336137626338 +63373462646131303063363461313337363166356164396534313161383931626264653537323030 +30346565303062313063336666393062386136626230653961623035386630633930303161383166 +64353464383137326336313666386261316532383530306666623131326465643535646564633432 +63623130643661643138646435646431326337346661363066333233626431373037663531346232 +31313134653130323562633766353531626665393634393564303733306436303561663062363663 +62346264643736666436373564333835643230313231383730663036356432393535333033336364 +32623731333561373838623639653166393939623538393064303164376139353561326634333963 +62303865636431386566623762326138333062303564376364656236663162356432366330313337 +31316138383465373462323430306238663932363663646664396634326139356561616231626266 +62643630333864636430613635363562383566663136613339313836386438313331356433383836 +30396264333036333836396634383465363132306663633837333033323166376163363364666337 +61353730643438363035333339376261633436386361316463343033353136366138383834323035 +66363133393136383332656566373239323833663466373138323262666132343332623064323038 +33316262383938626538396536646261323032636531623130636630643565396165616236393265 +35353833616432373735386130663139663339656565616330343637343637373838346263396565 +62623836356432613261623565643933323161363063336433613037336431623939376463363565 +61393735313236306238303565306463626636656534383231633661353835613065333531366133 +61653662363236346231656236313463666233326633386534306663366635313438666265323261 +36346266633331396239326531633338376435343434303031616131656439353233623737623238 +35376132656135366535366137643330643932306531663430376238366462373630326431646462 +35663763653632326565623730393130396163333662386238373836313166333935613063353037 +61363861643430663431633135656465376661356330396639376265326439653430646539653932 +63623434346365653333353033666532313233643037306336376633366637386439646361623333 +35363238646331623366623438316531313162613437356232323566366532633462663039626161 +31313639386163633666616634353839646532393662303233373438303730386136383034396664 +31366663333465633063326464363631353337636238373431303130643265313536346639353038 +33346266663036343037646431663036313765363439333430383030623130346666323838363333 +34396133656566366466663066303630356365396663653331623639626432653834353163393038 +35346235386139393133393235383437303063383733386535346539616339633331616133646631 +31376637666463643862376239656238333431623763396134396262643734373062383933626334 +34303733663730323865646462623862633136316332383436306430653835343963363831373930 +64643336656639363637666233303233396238323832396133393964336637656432653665393962 +61666436646666313437363631346431333938366564363863653738316465393233383063376334 +65663631646630653738306535383531646561366166633164613538323038666435356261643165 +66316139623936663633373630616533626532626239656561663765303137396462386435623565 +30366239613165663932376561363739376635313962613436356238393839623735646263643334 +30363539343665303865623939646235353530333436623165656162336266333132326534623039 +61363662666132626538366261613731626265326566356461616434326339353930633539643134 +66316165373138333763316130613964353638326665323332356536316535633634313236613733 +34643834353337313862643736396431393130666564623536383466343236316431373830376562 +35326266613564316366623535363635303661363763313134353830313838383132363466353365 +35386363323139633366646162613861346436333934323130383936353865396364353734343337 +64313166303137333830366164643832323937333661346266393365356533653265613466396161 +37633234343034353830316661326234626163653439666532393230633864356439636135356564 +39303036313135626336636363646230313364363337343561303931636434666635623366616135 +62333131373766376539333630643738633039623331313639393864313337366662656434303862 +33343165346439616135363164316230633333383961663537393838663264393165383264363632 +61303530366231353236303364363062313663666635646162646562663338386264613739633365 +66356234396132633937666337393037303762396462313765353166313039386665323233346164 +62303439383436326539313536636633636634353864303930313132636663306230306537616666 +33383633646335353531323462323335633263646431323265646537336536633733336661373938 +31666436356161383238383062386632643766316234656632366437306136316133646665626362 +61333634646635626138346632643564646663346234653363303535653766316630326162653939 +39383731663263323435316534393039343766663336303535613530343535313965616466663166 +36643038306236393365346337343466323335343139356436333162643932393934656261656636 +38643935303638646564306239326562613230386137386533626531373130363134643266656466 +61383339396439666136633738363737343234356331393433383666353861343830363630323036 +63353764613765626231653666366232626563666365633361333231383439666164643132643239 +63333262366462616338653930313766313934353532663138623133343638346361643038646339 +39386534313339363033636262643966333030383665613863326466333933666630343763393736 +33366465656338633838326163333835303561623930653664623766626539376536323464313732 +39626234373934356164363338613538373661623663343730353336326564373532373861303563 +35633961613062633765613332353865303233643731626137373232366664653966393739623931 +31633661346234653837393761666537373063616231656565633062356463356430326637393364 +33386436393062323537656266386637636361366433326434383834643163643261623132383238 +31363032376561336133393030386533393239343164383564356532346334356262616537336466 +32396333313063623935353331376633396266343961626638663562323864636666313362643865 +34653165666236343234343430626339623365313366353932393762313839383230343335316132 +65336433623330363561316233653133336663336135316633643332306237313032326531333363 +30613164646363356434343666336537623036623763303335613735376331356263656132653961 +62333038323265353564363464303038353136626537363265376637613563363061613635646465 +39336166626530363632656266616230646333663431356266386362333635383937386238303463 +30653834373634343039306363333862343862383531373439356463663962356235643764376533 +33643032303863373432666632633762366531333839303962363066633437316431363731363633 +30376561353934336439366665656364383238303436383339356235346165356161323431366561 +62306439346131343961363439386235343931323266363961366561363561626432666163373936 +31613635623633386263336362643634336632363433666437326337326331623031636137316432 +34356134303432313231323831333234336434666239313561653631346335613761613561343337 +65663732356362663636613436616234336465333465336465393937376464326337653337363735 +36366538393962373836636661633931666361616337366262343862333637306539656239646461 +37363365303361623161643764633433346430343531323334623438376262333835383130636537 +62613636386139383636666166396131623866343965613039333939653739393864633863383038 +35323333353763663635643364306239363934636361663062663662646666343536316466623637 +66323666323363306438373636653731393339393432613462333264346563353133356630393930 +33633065666438326134666266346138643461616537363465643636396635643933393630396439 +31303534663531383565313738373130353566643438303438656566316337333538373139636432 +61393334313464363265323364616235353063386231636637353930663764643732653434333266 +64643032663663393662326334313430613534303832663332333166343663383632383633663366 +36333365303536343732623439653136313965343231376532326232396637646465366462366635 +62653530356335643336323038633063313731366533613562633462323165373062393565313134 +64366135336332303038313630386366653664633333316162393538626231306466343430396263 +38383131613661386331393836616161366636316336616337393366353938643939366234326236 +63306563383665646133616333386534373664363238376630376663353834303931373535346661 +65303531663965363639363735613134396463666530613033363631636330313932313134623038 +33613738623062383139316263333730356234646236343037303934313032626230636163353866 +37633035623365326537393062313232303963363063343764316133383936303834333538323866 +32663839333337393465303236326538366162323736643662363935356436666538613264383537 +65643865343636306330386536373663376434643136633466363338353530663063306136643738 +62366637663630346239346461646565343030376231653037343863656265633062333865383564 +39393033613466326638643434393665663838383939653938623064353338373830336332303865 +32356537363761373339663232343461613637636666633463636666613032663761386164613735 +62656663653566383363303661343763376233646231623937376534643366353634376262623035 +62666537636465323466643036316266336664373535363966376537386335646365643731626565 +33306661366565326633303732626530343536333864326336623064303634336533643261316362 +63386530643330306535643833323362623363643261646336626431653537663365396366303062 +36346336326465373639306436613961633364336130653962636437323061306262646234383639 +65643733633562623563313964353766643762373862613466313032363636663730633833363765 +30316262613162663637323764613364393664393765623531336361653434386130373266613136 +65393335346333393739653330623531303365346536653238393461633765396563343934386363 +30356433333230363638363164616261383039306163646332396265346534366163376236396165 +63323133396337366463303038616336303965623164316236343934383166326132386637656632 +33353661323465623431623233613638373763636232393538666632623933633466336632386233 +32393639643363396135353766363833366239353663373938396532363832346466333364616532 +30616664623430633539366238323266346431363037343031633030393763333062356464326666 +63653734613139633964333234313630373433303531343166353461636233653036633932363565 +64616464373939323466393837636437346135633838303632633431646466626439383738313732 +35356539306664313261666264323036646637343438366530343635656663316130363862666630 +65393037613366353261643666643336663436666264663538616261353238393632646136346465 +30336539343265376264633862373863643864633761653537653661383031623935623065643934 +32653161633833313331386532376237313831393630323439326161316262323139653836663532 +63353631303637313631373538373830633431633135313064656165393061373738666333643936 +65633533623464393062306166623064323465363064613937356232656439616631623866383862 +66336466303636393532343734343064366237323362366137663334643636343130663762393966 +36306364343565333034356635303139383162326363393035363331303634376331636537643564 +36663232393338373732616330663364373864626335643762623962623563303066623139663439 +63643531336161663139336464653739613065663862336361356466663939366135313365336561 +36393437633836313533663338323065336137306466633732386534323565623031316261373939 +39383531336261363630333637336636353434386137373465386264613838656231653637303238 +31356136383638633130343930623064303431653234353538623963646536663162663334643233 +33356566333430653365333335623430343932353039656231663664303532363063373138653039 +37326638643533353836386332313139353835623632313736633334646434393334613736303437 +31353661313661376362623464303062363161343261386462613034346561313266343064626134 +35623361346566316133363733303933646563633938303738653031373135393832653238313361 +35363962356464613534336366353930353737633163356631656166383138356261363230313265 +31613537326234313866383935316462643039303437346134366161656530663839363239333730 +63383531303666616661613364303532313439643931643434373036626132613137303061663537 +35356564613533656662636237313936383366623535623661336561663831353965313932346466 +34346263636563393434653539303639363466383262353831663364373665666432356264346164 +31303133646133306436376139613264613366303135303965373361356465666330613466656230 +30336163616566663365396566353161376364323965383164613063366461613737373866623437 +61393162373030626661313961636566366431623863653437303633663536633831633937623638 +62353733663262653663356431326339633261383230643838396633316463336230323263636532 +30346330313065376531373039356534386134383365396630353539313962656462663061666138 +30353938663864393436323038323864643462326434346563626537383638386635336164393336 +37396333303139646537333833383965613632663863653037646261363834396430616465633863 +31386631366538383539623361333134386637613462356261316632386431306361363331353836 +62376263373530363266323830626265376561383631666535393537393661643064396663353164 +39333834343662396538346362396332323863326131353962306466643831363062643262346564 +62633066353334663664363964663331363037326534656431653564626632396235383334323936 +33623765666463343930356435343731666164626666346632623065623131356137373461333039 +32343632313738383230396664353437383039373062366430646632613536393165316239303866 +64323833326537653530653661306331323662376531663231623762353832303639393734323436 +33376532376538353036666538326538666531623962626135376436353634333766 diff --git a/jobs_definitions/telco_verification.yaml b/jobs_definitions/telco_verification.yaml index 1c9f5694..171d2674 100644 --- a/jobs_definitions/telco_verification.yaml +++ b/jobs_definitions/telco_verification.yaml @@ -42,7 +42,7 @@ custom_subnet: "{{ telco_env.management_network }}" project: name: "{{ user_cloud }}" user: user - password: redhat + password: "{{ telco_project_pass }}" role: member swift_role: swiftoperator domain_name: Default