diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index fb51f58a22..60cc2c4e7d 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -122,8 +122,16 @@ jobs:
ppc64le-integration-tests:
uses: ./.github/workflows/integration-tests-vm-type.yml
+ strategy:
+ # ensure that if one part of the matrix fails, the
+ # rest will continue
+ fail-fast: false
+ matrix:
+ vm_type:
+ - rhel-ppc64le-9
+ - rhel-ppc64le-10
with:
- vm_type: rhel-ppc64le
+ vm_type: ${{ matrix.vm_type }}
collector-tag: ${{ inputs.collector-tag }}
collector-qa-tag: ${{ inputs.collector-qa-tag }}
collector-tests-tag: ${{ inputs.collector-tests-tag }}
diff --git a/ansible/README.md b/ansible/README.md
index 3dfd434219..fca2c1b655 100644
--- a/ansible/README.md
+++ b/ansible/README.md
@@ -110,7 +110,8 @@ summarized below:
| ------------- | -------------- |
| rhel | rhel-7
rhel-8 |
| rhel-s390x | rhel-8-6-s390x |
-| rhel-ppc64le | rhel-8.8-05102023 |
+| rhel-ppc64le-9 | rhel-96-04282025 |
+| rhel-ppc64le-10 | rhel-10-04252025 |
| rhel-sap | rhel-8-4-sap-ha
rhel-8-6-sap-ha |
| cos | cos-stable
cos-beta
cos-dev |
| sles | sles-12
sles-15 |
diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 458ad80037..3ab6875f33 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -53,16 +53,21 @@ virtual_machines:
families:
- rhel-8-6-s390x
- # We have taken families name as "p" since there is a character limit for instance name
- # in ibm cloud (56 chars max)
- rhel-ppc64le:
+ rhel-ppc64le-9:
project: rhel-ppc64le-cloud
arch: ppc64le
ssh_key_file: "~/.ssh/acs-ppc64le-rsa.prv"
+ container_engine: podman
images:
- rhel-96-04282025
- - rhel-10-04252025
+
+ rhel-ppc64le-10:
+ project: rhel-ppc64le-cloud
+ arch: ppc64le
+ ssh_key_file: "~/.ssh/acs-ppc64le-rsa.prv"
container_engine: podman
+ images:
+ - rhel-10-04252025
rhel-sap:
project: rhel-sap-cloud
diff --git a/ansible/group_vars/platform_rhel-ppc64le.yml b/ansible/group_vars/platform_rhel-ppc64le.yml
deleted file mode 100644
index 7393a2a7cc..0000000000
--- a/ansible/group_vars/platform_rhel-ppc64le.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-
----
-ansible_ssh_common_args: -c aes128-ctr
-# This is a workaround for ppc64le vsi creation since there is an issue with ssh connection between ubuntu vm in azure and power vsi in IBM Cloud
-# Reference link https://askubuntu.com/questions/1229456/ssh-fails-with-connection-timed-out-in-vpn-and-hangs-here-expecting-ssh2-msg
diff --git a/ansible/group_vars/vm_arch_ppc64le.yml b/ansible/group_vars/vm_arch_ppc64le.yml
new file mode 100644
index 0000000000..cf7ca26873
--- /dev/null
+++ b/ansible/group_vars/vm_arch_ppc64le.yml
@@ -0,0 +1,2 @@
+---
+ansible_ssh_common_args: -c aes128-ctr
diff --git a/ansible/roles/create-all-vms/tasks/by-image.yml b/ansible/roles/create-all-vms/tasks/by-image.yml
index 6584ba2ed9..38b6efb535 100644
--- a/ansible/roles/create-all-vms/tasks/by-image.yml
+++ b/ansible/roles/create-all-vms/tasks/by-image.yml
@@ -12,11 +12,11 @@
- set_fact:
vm_full_name: "{{ gcp_instance_prefix }}-{{ vm_image_short }}-{{ vm_hashed_name }}"
- when: item.0.key != 'rhel-ppc64le'
+ when: arch != 'ppc64le'
- set_fact:
- vm_full_name: "{{ gcp_instance_prefix }}-rhel-ppc64le-{{ vm_hashed_name }}"
- when: item.0.key == 'rhel-ppc64le'
+ vm_full_name: "{{ gcp_instance_prefix }}-{{ item.0.key }}-{{ vm_hashed_name }}"
+ when: arch == 'ppc64le'
- set_fact:
ibm_env: "{{ s390x.env }}"
diff --git a/ansible/roles/create-vm/tasks/create-ppc64le-vm.yml b/ansible/roles/create-vm/tasks/create-ppc64le-vm.yml
index c93c9997ad..1f3f8ea8ee 100644
--- a/ansible/roles/create-vm/tasks/create-ppc64le-vm.yml
+++ b/ansible/roles/create-vm/tasks/create-ppc64le-vm.yml
@@ -1,40 +1,6 @@
- name: Fetch the variables from var file
include_vars:
file: ppc64le.yml
- collections:
- - ibm.cloudcollection
-
-- name: Check for existing SSH Key
- ibm.cloudcollection.ibm_pi_key_info:
- pi_key_name: "{{ pi_name }}-ssh-key"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- failed_when:
- - pi_ssh_key_existing_output.rc != 0
- - '"does not exist" not in pi_ssh_key_existing_output.stderr'
- register: pi_ssh_key_existing_output
-
-- set_fact:
- ssh_key_exists: "{{ pi_ssh_key_existing_output.resource.id is defined }}"
-
-- name: Save existing SSH Key as fact
- set_fact:
- cacheable: True
- pi_ssh_key: "{{ pi_ssh_key_existing_output.resource }}"
- when: ssh_key_exists
-
-- name: Add new SSH Key
- ibm.cloudcollection.ibm_pi_key:
- pi_key_name: "{{ pi_name }}-ssh-key"
- pi_ssh_key: "{{ ssh_public_key }}"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- register: pi_ssh_key_create_output
- when: not ssh_key_exists
-
-- name: Save new SSH Key as fact
- set_fact:
- cacheable: True
- pi_ssh_key: "{{ pi_ssh_key_create_output.resource }}"
- when: not ssh_key_exists
- name: Retrieve image list
ibm.cloudcollection.ibm_pi_images_info:
@@ -47,115 +13,140 @@
items2dict(key_name='name',
value_name='id') }}"
-- name: Check for existing network
- ibm.cloudcollection.ibm_pi_network_info:
- pi_network_name: "{{ pi_name }}-network"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- failed_when:
- - pi_network_existing_output.rc != 0
- - '"could not be found" not in pi_network_existing_output.stderr'
- register: pi_network_existing_output
-
-- set_fact:
- network_exists: "{{ pi_network_existing_output.resource.id is defined }}"
-
-- name: Save existing network as fact
- set_fact:
- cacheable: True
- pi_network_id: "{{ pi_network_existing_output.resource.id }}"
- when: network_exists
-
-- name: Add new network
- ibm.cloudcollection.ibm_pi_network:
- pi_network_name: "{{ pi_name }}-network"
- pi_network_type: "pub-vlan"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- register: pi_network_create_output
- when: not network_exists
-
-- name: Save new network as fact
- set_fact:
- cacheable: True
- pi_network_id: "{{ pi_network_create_output.resource.network_id }}"
- when: not network_exists
-
-- name: Check for existing Virtual Server Instance
- ibm.cloudcollection.ibm_pi_instance_info:
- pi_instance_name: "{{ pi_name }}"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- failed_when:
- - pi_instance_existing_output.rc != 0
- - '"does not exist" not in pi_instance_existing_output.stderr'
- register: pi_instance_existing_output
-
-- name: Save existing Power VSI fact
- set_fact:
- cacheable: True
- pi_instance: "{{ pi_instance_existing_output.resource }}"
- when: pi_instance_existing_output.rc == 0
-
-- name: Create a POWER Virtual Server Instance
- ibm.cloudcollection.ibm_pi_instance:
- state: available
- pi_memory: "{{ memory }}"
- pi_processors: "{{ processors }}"
- pi_instance_name: "{{ pi_name }}"
- pi_proc_type: "{{ proc_type }}"
- pi_image_id: "{{ image_dict[vm_image] }}"
- pi_volume_ids: []
- pi_network:
- - network_id: "{{ pi_network_id }}"
- pi_key_pair_name: "{{ pi_ssh_key.pi_key_name }}"
- pi_sys_type: "{{ sys_type }}"
- pi_storage_type: "{{ storage_type }}"
- pi_replication_policy: none
- pi_replication_scheme: suffix
- pi_replicants: "1"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- id: "{{ pi_instance.resource.id | default(omit) }}"
- register: pi_instance_create_output
- when: pi_instance_existing_output.rc != 0
-
-- name: Check for existing Virtual Server Instance
- ibm.cloudcollection.ibm_pi_instance_info:
- pi_instance_name: "{{ pi_name }}"
- pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
- register: pi_instance_new_output
- when: pi_instance_create_output.resource is defined
-
-- name: Save new Power VSI fact
- set_fact:
- cacheable: True
- pi_instance: "{{ pi_instance_new_output.resource }}"
- when: pi_instance_new_output.resource is defined
-
-- name: Print Public IP Address
- debug:
- var: pi_instance.networks[0].external_ip
-
-- name: Add VSI to Ansible inventory
- add_host:
- name: "{{ pi_name }}"
- ansible_host: "{{ pi_instance.networks[0].external_ip }}"
- ansible_user: root
- groups:
- - job_id_{{ job_id }}
- - platform_{{ test_platform }}
- - vm_arch_ppc64le
- - container_engine_{{ container_engine }}
- ansible_ssh_extra_args: -o StrictHostKeyChecking=no
- ansible_ssh_private_key_file: "{{ vm_ssh_key_file }}"
- vm_config: "{{ vm_config }}"
- vm_image_family: "{{ vm_family }}"
- vm_collection_method: "{{ vm_collection_method }}"
- vm_arch: "{{ vm_arch }}"
- ibm_cloud_vm: true
-
-- name: generate provisioner inventory file
- template:
- src: 'ibm-cloud-inventory.j2'
- dest: "{{ ibm_output_inventory_file }}"
- mode: '0644'
- when:
- - ibm_output_inventory_file != ""
- delegate_to: localhost
+- name: Create and register POWER Virtual Server resources
+ block:
+ - name: Check for existing SSH Key
+ ibm.cloudcollection.ibm_pi_key_info:
+ pi_key_name: "{{ pi_name }}-ssh-key"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ failed_when:
+ - pi_ssh_key_existing_output.rc != 0
+ - '"does not exist" not in pi_ssh_key_existing_output.stderr'
+ register: pi_ssh_key_existing_output
+
+ - name: Save existing SSH Key as fact
+ set_fact:
+ pi_ssh_key: "{{ pi_ssh_key_existing_output.resource }}"
+ when: pi_ssh_key_existing_output.rc == 0
+
+ - name: Add new SSH Key
+ ibm.cloudcollection.ibm_pi_key:
+ pi_key_name: "{{ pi_name }}-ssh-key"
+ pi_ssh_key: "{{ ssh_public_key }}"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ register: pi_ssh_key_create_output
+ when: pi_ssh_key_existing_output.rc != 0
+
+ - name: Save new SSH Key as fact
+ set_fact:
+ pi_ssh_key: "{{ pi_ssh_key_create_output.resource }}"
+ when: pi_ssh_key_existing_output.rc != 0
+
+ - name: Check for existing network
+ ibm.cloudcollection.ibm_pi_network_info:
+ pi_network_name: "{{ pi_name }}-network"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ failed_when:
+ - pi_network_existing_output.rc != 0
+ - '"could not be found" not in pi_network_existing_output.stderr'
+ register: pi_network_existing_output
+
+ - name: Save existing network as fact
+ set_fact:
+ pi_network_id: "{{ pi_network_existing_output.resource.id }}"
+ when: pi_network_existing_output.rc == 0
+
+ - name: Add new network
+ ibm.cloudcollection.ibm_pi_network:
+ pi_network_name: "{{ pi_name }}-network"
+ pi_network_type: "pub-vlan"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ register: pi_network_create_output
+ when: pi_network_existing_output.rc != 0
+
+ - name: Save new network as fact
+ set_fact:
+ pi_network_id: "{{ pi_network_create_output.resource.network_id }}"
+ when: pi_network_existing_output.rc != 0
+
+ - name: Check for existing Virtual Server Instance
+ ibm.cloudcollection.ibm_pi_instance_info:
+ pi_instance_name: "{{ pi_name }}"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ failed_when:
+ - pi_instance_existing_output.rc != 0
+ - '"does not exist" not in pi_instance_existing_output.stderr'
+ register: pi_instance_existing_output
+
+ - name: Save existing Power VSI fact
+ set_fact:
+ pi_instance: "{{ pi_instance_existing_output.resource }}"
+ when: pi_instance_existing_output.rc == 0
+
+ - name: Create a POWER Virtual Server Instance
+ ibm.cloudcollection.ibm_pi_instance:
+ state: available
+ pi_memory: "{{ memory }}"
+ pi_processors: "{{ processors }}"
+ pi_instance_name: "{{ pi_name }}"
+ pi_proc_type: "{{ proc_type }}"
+ pi_image_id: "{{ image_dict[vm_image] }}"
+ pi_volume_ids: []
+ pi_network:
+ - network_id: "{{ pi_network_id }}"
+ pi_key_pair_name: "{{ pi_ssh_key.pi_key_name }}"
+ pi_sys_type: "{{ sys_type }}"
+ pi_storage_type: "{{ storage_type }}"
+ pi_replication_policy: none
+ pi_replication_scheme: suffix
+ pi_replicants: "1"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ register: pi_instance_create_output
+ when: pi_instance_existing_output.rc != 0
+
+ - name: Check for existing Virtual Server Instance
+ ibm.cloudcollection.ibm_pi_instance_info:
+ pi_instance_name: "{{ pi_name }}"
+ pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
+ register: pi_instance_new_output
+ when: pi_instance_create_output.resource is defined
+
+ - name: Save new Power VSI fact
+ set_fact:
+ pi_instance: "{{ pi_instance_new_output.resource }}"
+ when: pi_instance_new_output.resource is defined
+
+ - name: Print Public IP Address
+ debug:
+ var: pi_instance.networks[0].external_ip
+ when:
+ - pi_instance is defined
+ - pi_instance.networks | length > 0
+
+ always:
+ - name: Add VSI to Ansible inventory
+ add_host:
+ name: "{{ pi_name }}"
+ ansible_host: "{{ (pi_instance.networks[0].external_ip | default('')) if (pi_instance is defined and pi_instance.networks | length > 0) else '' }}"
+ ansible_user: root
+ groups:
+ - job_id_{{ job_id }}
+ - platform_{{ test_platform }}
+ - vm_arch_ppc64le
+ - container_engine_{{ container_engine }}
+ ansible_ssh_extra_args: -o StrictHostKeyChecking=no
+ ansible_ssh_private_key_file: "{{ vm_ssh_key_file }}"
+ vm_config: "{{ vm_config }}"
+ vm_image_family: "{{ vm_family }}"
+ vm_collection_method: "{{ vm_collection_method }}"
+ vm_arch: "{{ vm_arch }}"
+ ibm_cloud_vm: true
+
+ - name: generate provisioner inventory file
+ template:
+ src: 'ibm-cloud-inventory.j2'
+ dest: "{{ ibm_output_inventory_file }}"
+ mode: '0644'
+ when:
+ - ibm_output_inventory_file != ""
+ delegate_to: localhost
diff --git a/ansible/roles/destroy-vm/tasks/destroy-ppc64le-vm.yml b/ansible/roles/destroy-vm/tasks/destroy-ppc64le-vm.yml
index b3fce5676f..8850a73e1b 100644
--- a/ansible/roles/destroy-vm/tasks/destroy-ppc64le-vm.yml
+++ b/ansible/roles/destroy-vm/tasks/destroy-ppc64le-vm.yml
@@ -1,6 +1,5 @@
---
-# Set fact that are required to destroy vsi instance
- set_fact:
hostname: "{{ inventory_hostname }}"
@@ -19,16 +18,9 @@
- name: Save existing Power VSI fact
delegate_to: localhost
set_fact:
- cacheable: True
pi_instance: "{{ pi_instance_existing_output.resource }}"
when: pi_instance_existing_output.rc == 0
-- name: Save network details
- delegate_to: localhost
- set_fact:
- public_subnet: "{{ pi_instance.networks|rejectattr('external_ip', 'equalto', '') | list | first }}"
- when: pi_instance_existing_output.rc == 0
-
- name: Delete instance by id
delegate_to: localhost
ibm.cloudcollection.ibm_pi_instance:
@@ -39,7 +31,6 @@
delay: 5
register: delete_operation
until: delete_operation is success
- ignore_errors: true
when: pi_instance_existing_output.rc == 0
- name: Check for existing network
@@ -78,15 +69,15 @@
ibm.cloudcollection.ibm_pi_key:
pi_cloud_instance_id: "{{ pi_cloud_instance_id }}"
state: absent
- pi_ssh_key: "{{ pi_ssh_key_existing_info.resource }}"
pi_key_name: "{{ hostname }}-ssh-key"
+ pi_ssh_key: "{{ pi_ssh_key_existing_info.resource.ssh_key }}"
id: "{{ pi_ssh_key_existing_info.resource.id }}"
retries: 10
delay: 30
register: pi_ssh_key_delete
- when:
+ when:
- pi_ssh_key_existing_info is success
- - pi_ssh_key_existing_info.resource is defined
+ - pi_ssh_key_existing_info.resource.id is defined
- name: Remove IBM inventory file (delete file)
delegate_to: localhost
diff --git a/ansible/roles/provision-vm/tasks/redhat.yml b/ansible/roles/provision-vm/tasks/redhat.yml
index ac8bdd1314..6b950c96ed 100644
--- a/ansible/roles/provision-vm/tasks/redhat.yml
+++ b/ansible/roles/provision-vm/tasks/redhat.yml
@@ -70,5 +70,8 @@
state: stopped
enabled: false
when: vm_arch == "ppc64le"
- ignore_errors: true
+ register: cockpit_disable
+ failed_when:
+ - cockpit_disable is failed
+ - "'Could not find the requested service' not in (cockpit_disable.msg | default(''))"