Merge pull request #353 from RanabirChakraborty/AMW-568

Fix downstream SSO collection errors
This commit is contained in:
Harsha Cherukuri
2026-06-20 15:43:59 -04:00
committed by GitHub
11 changed files with 109 additions and 19 deletions

View File

@@ -22,4 +22,4 @@ jobs:
root_permission_varname: 'keycloak_install_requires_become' root_permission_varname: 'keycloak_install_requires_become'
debug_verbosity: "${{ github.event.inputs.debug_verbosity }}" debug_verbosity: "${{ github.event.inputs.debug_verbosity }}"
molecule_tests: >- molecule_tests: >-
[ "debian", "quarkus", "quarkus_ha", "quarkus_ha_remote", "quarkus_ha_26.4_below", "default", "quarkus_devmode", "quarkus_upgrade", "keycloak_modules" ] [ "debian", "sso_test", "quarkus", "quarkus_ha", "quarkus_ha_remote", "quarkus_ha_26.4_below", "default", "quarkus_devmode", "quarkus_upgrade", "keycloak_modules" ]

View File

@@ -0,0 +1,22 @@
---
- name: Converge
hosts: all
vars_files:
- ../group_vars/all/vars.yml
vars:
keycloak_admin_password: "remembertochangeme"
keycloak_enable: true
keycloak_offline_install: false
roles:
- role: keycloak
- role: keycloak_realm
keycloak_url: "http://instance:8080"
keycloak_context: "/auth"
keycloak_admin_user: "admin"
keycloak_admin_password: "remembertochangeme"
keycloak_realm: TestRealm
keycloak_clients:
- name: TestClient
realm: "{{ keycloak_realm }}"
public_client: true
client_id: TestClient

View File

@@ -0,0 +1,31 @@
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: registry.access.redhat.com/ubi9/ubi-init:latest
command: /usr/sbin/init
privileged: true
pre_build_image: true
provisioner:
name: ansible
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer, yaml
ssh_connection:
pipelining: false
playbooks:
prepare: prepare.yml
converge: converge.yml
verify: verify.yml
env:
ANSIBLE_ROLES_PATH: "../../roles"
inventory:
host_vars:
instance:
ansible_user: root
verifier:
name: ansible

View File

@@ -0,0 +1,11 @@
---
- name: Prepare
hosts: all
vars_files:
- ../group_vars/all/vars.yml
gather_facts: yes
vars:
sudo_pkg_name: sudo
tasks:
- name: "Run preparation common to all scenario"
ansible.builtin.include_tasks: ../prepare.yml

View File

@@ -0,0 +1,26 @@
---
- name: Verify
hosts: all
vars:
keycloak_admin_password: "remembertochangeme"
keycloak_admin_user: "admin"
keycloak_uri: "http://localhost:8080"
keycloak_context: "/auth"
tasks:
- name: Populate service facts
ansible.builtin.service_facts:
- name: Check if keycloak service started
ansible.builtin.assert:
that:
- ansible_facts.services["keycloak.service"]["state"] == "running"
- ansible_facts.services["keycloak.service"]["status"] == "enabled"
- name: Verify token api call
ansible.builtin.uri:
url: "{{ keycloak_uri }}{{ keycloak_context }}/realms/master/protocol/openid-connect/token"
method: POST
body: "client_id=admin-cli&username={{ keycloak_admin_user }}&password={{ keycloak_admin_password }}&grant_type=password"
validate_certs: no
register: keycloak_auth_response
until: keycloak_auth_response.status == 200
retries: 2
delay: 2

View File

@@ -388,6 +388,6 @@ argument_specs:
description: "Red Hat SSO patch archive filename" description: "Red Hat SSO patch archive filename"
type: "str" type: "str"
sso_product_category: sso_product_category:
default: "core.service.rhsso" default: "CORE.SERVICE.RHSSO"
description: "JBossNetwork API category for Single Sign-On" description: "Unified Downloads API category for Single Sign-On"
type: "str" type: "str"

View File

@@ -120,7 +120,7 @@
- name: Determine install zipfile from search results - name: Determine install zipfile from search results
ansible.builtin.set_fact: ansible.builtin.set_fact:
rhn_filtered_products: "{{ rhn_products.results | selectattr('file_name', 'match', '[^/]*/' + sso_archive + '$') }}" rhn_filtered_products: "{{ rhn_products.results | selectattr('file_name', 'match', '.*rh-sso-' + sso_version.split('.')[:2] | join('.') + '.*-server-dist\\.zip$') | rejectattr('file_name', 'search', 'maven|src|license|provenance|adapter') | list }}"
delegate_to: localhost delegate_to: localhost
run_once: true run_once: true
@@ -226,7 +226,7 @@
mode: '0640' mode: '0640'
notify: notify:
- restart keycloak - restart keycloak
when: keycloak_config_override_template | length > 0 when: (keycloak_config_override_template | default('', true)) | length > 0
- name: "Deploy standalone {{ keycloak.service_name }} config to {{ keycloak_config_path_to_standalone_xml }}" - name: "Deploy standalone {{ keycloak.service_name }} config to {{ keycloak_config_path_to_standalone_xml }}"
become: "{{ keycloak_install_require_privilege_escalation | default(true) }}" become: "{{ keycloak_install_require_privilege_escalation | default(true) }}"
@@ -240,7 +240,7 @@
- restart keycloak - restart keycloak
when: when:
- not keycloak_ha_enabled - not keycloak_ha_enabled
- keycloak_config_override_template | length == 0 - (keycloak_config_override_template | default('', true)) | length == 0
- name: Create tcpping cluster node list - name: Create tcpping cluster node list
ansible.builtin.set_fact: ansible.builtin.set_fact:
@@ -269,7 +269,7 @@
when: when:
- keycloak_ha_enabled - keycloak_ha_enabled
- not keycloak_remote_cache_enabled - not keycloak_remote_cache_enabled
- keycloak_config_override_template | length == 0 - (keycloak_config_override_template | default('', true)) | length == 0
- name: "Deploy HA {{ keycloak.service_name }} config with infinispan remote cache store to {{ keycloak_config_path_to_standalone_xml }}" - name: "Deploy HA {{ keycloak.service_name }} config with infinispan remote cache store to {{ keycloak_config_path_to_standalone_xml }}"
become: "{{ keycloak_install_require_privilege_escalation | default(true) }}" become: "{{ keycloak_install_require_privilege_escalation | default(true) }}"
@@ -284,7 +284,7 @@
when: when:
- keycloak_ha_enabled - keycloak_ha_enabled
- keycloak_remote_cache_enabled - keycloak_remote_cache_enabled
- keycloak_config_override_template | length == 0 - (keycloak_config_override_template | default('', true)) | length == 0
- name: "Deploy profile.properties file to {{ keycloak_config_path_to_properties }}" - name: "Deploy profile.properties file to {{ keycloak_config_path_to_properties }}"
become: "{{ keycloak_install_require_privilege_escalation | default(true) }}" become: "{{ keycloak_install_require_privilege_escalation | default(true) }}"
@@ -296,4 +296,4 @@
mode: '0640' mode: '0640'
notify: notify:
- restart keycloak - restart keycloak
when: keycloak_features | length > 0 when: (keycloak_features | default([], true)) | length > 0

View File

@@ -2,7 +2,7 @@
- name: Validate admin console password - name: Validate admin console password
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- keycloak_admin_password | length > 12 - (keycloak_admin_password | default('', true)) | length > 12
quiet: true quiet: true
fail_msg: > fail_msg: >
The console administrator password is empty or invalid. Please set the keycloak_admin_password variable to a 12+ char long string The console administrator password is empty or invalid. Please set the keycloak_admin_password variable to a 12+ char long string
@@ -31,9 +31,9 @@
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- keycloak_jdbc_engine is defined and keycloak_jdbc_engine in [ 'postgres', 'mariadb', 'sqlserver' ] - keycloak_jdbc_engine is defined and keycloak_jdbc_engine in [ 'postgres', 'mariadb', 'sqlserver' ]
- keycloak_jdbc_url | length > 0 - (keycloak_jdbc_url | default('', true)) | length > 0
- keycloak_db_user | length > 0 - (keycloak_db_user | default('', true)) | length > 0
- keycloak_db_pass | length > 0 - (keycloak_db_pass | default('', true)) | length > 0
quiet: true quiet: true
fail_msg: "Configuration for the JDBC persistence is invalid or incomplete" fail_msg: "Configuration for the JDBC persistence is invalid or incomplete"
success_msg: "Configuring JDBC persistence using {{ keycloak_jdbc_engine }} database" success_msg: "Configuring JDBC persistence using {{ keycloak_jdbc_engine }} database"

View File

@@ -39,14 +39,14 @@
filtered_versions: "{{ rhn_products.results | map(attribute='file_name') | \ filtered_versions: "{{ rhn_products.results | map(attribute='file_name') | \
select('match', '^[^/]*/rh-sso-.*[0-9]*[.][0-9]*[.][0-9]*.*$') | \ select('match', '^[^/]*/rh-sso-.*[0-9]*[.][0-9]*[.][0-9]*.*$') | \
map('regex_replace', '[^/]*/rh-sso-([0-9]*[.][0-9]*[.][0-9]*(-[0-9])?)-.*', '\\1') | list | unique }}" map('regex_replace', '[^/]*/rh-sso-([0-9]*[.][0-9]*[.][0-9]*(-[0-9])?)-.*', '\\1') | list | unique }}"
when: sso_patch_version is not defined or sso_patch_version | length == 0 when: (sso_patch_version | default('', true)) | length == 0
delegate_to: localhost delegate_to: localhost
run_once: true run_once: true
- name: Determine latest version - name: Determine latest version
ansible.builtin.set_fact: ansible.builtin.set_fact:
sso_latest_version: "{{ filtered_versions | middleware_automation.common.version_sort | last }}" sso_latest_version: "{{ filtered_versions | middleware_automation.common.version_sort | last }}"
when: sso_patch_version is not defined or sso_patch_version | length == 0 when: (sso_patch_version | default('', true)) | length == 0
delegate_to: localhost delegate_to: localhost
run_once: true run_once: true
@@ -55,7 +55,7 @@
rhn_filtered_products: "{{ rhn_products.results | selectattr('file_name', 'match', '[^/]*/rh-sso-' + sso_latest_version + '-patch.zip$') }}" rhn_filtered_products: "{{ rhn_products.results | selectattr('file_name', 'match', '[^/]*/rh-sso-' + sso_latest_version + '-patch.zip$') }}"
patch_bundle: "rh-sso-{{ sso_latest_version }}-patch.zip" patch_bundle: "rh-sso-{{ sso_latest_version }}-patch.zip"
patch_version: "{{ sso_latest_version }}" patch_version: "{{ sso_latest_version }}"
when: sso_patch_version is not defined or sso_patch_version | length == 0 when: (sso_patch_version | default('', true)) | length == 0
delegate_to: localhost delegate_to: localhost
run_once: true run_once: true

View File

@@ -526,7 +526,7 @@
<properties> <properties>
<property name="frontendUrl" value="{{ keycloak_modcluster.frontend_url }}"/> <property name="frontendUrl" value="{{ keycloak_modcluster.frontend_url }}"/>
<property name="forceBackendUrlToFrontendUrl" value="{{ keycloak_modcluster.force_frontend_url }}"/> <property name="forceBackendUrlToFrontendUrl" value="{{ keycloak_modcluster.force_frontend_url }}"/>
{% if keycloak_modcluster.admin_url | length > 0 %} {% if (keycloak_modcluster.admin_url | default('', true)) | length > 0 %}
<property name="adminUrl" value="{{ keycloak_modcluster.admin_url }}" /> <property name="adminUrl" value="{{ keycloak_modcluster.admin_url }}" />
{% endif %} {% endif %}
</properties> </properties>
@@ -541,7 +541,7 @@
<subsystem xmlns="urn:wildfly:metrics:1.0" security-enabled="false" exposed-subsystems="*" prefix="${wildfly.metrics.prefix:jboss}"/> <subsystem xmlns="urn:wildfly:metrics:1.0" security-enabled="false" exposed-subsystems="*" prefix="${wildfly.metrics.prefix:jboss}"/>
{% if keycloak_modcluster.enabled %} {% if keycloak_modcluster.enabled %}
<subsystem xmlns="urn:jboss:domain:modcluster:5.0"> <subsystem xmlns="urn:jboss:domain:modcluster:5.0">
<proxy name="default" advertise="false" listener="ajp" proxies="{{ ['proxy_'] | product(keycloak_modcluster.reverse_proxy_urls | map(attribute='host')) | map('join') | list | join(' ') }}"> <proxy name="default" advertise="false" listener="ajp" proxies="{{ ['proxy_'] | product((keycloak_modcluster.reverse_proxy_urls | default([])) | map(attribute='host')) | map('join') | list | join(' ') }}">
<dynamic-load-provider> <dynamic-load-provider>
<load-metric type="cpu"/> <load-metric type="cpu"/>
</dynamic-load-provider> </dynamic-load-provider>

View File

@@ -564,5 +564,5 @@ argument_specs:
type: "str" type: "str"
rhbk_product_category: rhbk_product_category:
default: "RHBK" default: "RHBK"
description: "JBossNetwork API category for Red Hat Build of Keycloak" description: "Unified Downloads API category for Red Hat Build of Keycloak"
type: "str" type: "str"