611e971295
codecentric/keycloak(18.4.0, WildFly 기반, appVersion 17.0.1-legacy)이 bitnami/postgresql 서브차트를 조건부 의존성으로 포함해 bitnami 무료 배포 정책 변경 문제가 그대로 전이됐다. codecentric은 이 WildFly 차트를 더 이상 갱신하지 않고 Quarkus 기반 Keycloak(17+)용 별도 차트 keycloakx를 제공하며, keycloakx는 서브차트 의존성이 전혀 없어(Chart.yaml에 dependencies 없음) 문제가 근본적으로 해소된다. 실제 소비자가 없어(문서 예시 표 한 줄 외 참조 없음) phased 전환 없이 keycloak/18.4.0을 같은 커밋에서 제거했다. custom-values.yaml 작성 시 확인한 핵심 사항 — 이 차트의 http.relativePath 기본값이 구버전 WildFly Keycloak 호환용 "/auth"라, 명시적으로 "/"로 오버라이드해야 한다(안 하면 OIDC issuer/admin API 경로가 소비 앱들의 경로 접미사 없음 가정과 어긋난다). database.existingSecret/existingSecretKey 로 kubernetes.io/basic-auth 시크릿을 그대로 참조 가능함도 helm template로 확인했다. Closes #1 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
68 lines
2.4 KiB
YAML
68 lines
2.4 KiB
YAML
{{- if .Values.test.enabled }}
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: {{ include "keycloak.fullname" . }}-test
|
|
namespace: {{ include "keycloak.namespace" . }}
|
|
labels:
|
|
{{- include "keycloak.labels" . | nindent 4 }}
|
|
annotations:
|
|
helm.sh/hook: test
|
|
helm.sh/hook-delete-policy: hook-succeeded
|
|
data:
|
|
test.sh: |
|
|
#!/usr/bin/env bash
|
|
set -eu
|
|
|
|
if ! python3 -c 'import selenium' &> /dev/null; then
|
|
echo 'Installing selenium module...'
|
|
python3 -m venv /tmp/test-venv
|
|
/tmp/test-venv/bin/pip install -q selenium
|
|
exec /tmp/test-venv/bin/python "$(dirname "$0")/test.py"
|
|
fi
|
|
|
|
python3 "$(dirname "$0")/test.py"
|
|
test.py: |
|
|
import os
|
|
from selenium import webdriver
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.chrome.options import Options
|
|
from selenium.webdriver.support import expected_conditions
|
|
|
|
print('Creating chrome driver in headless mode')
|
|
chrome_options = Options()
|
|
chrome_options.add_argument("--headless")
|
|
chrome_options.add_argument('--no-sandbox')
|
|
chrome_options.add_argument('--disable-dev-shm-usage')
|
|
driver = webdriver.Chrome(options=chrome_options)
|
|
|
|
base_url = 'http://{{ include "keycloak.fullname" . }}-http{{ if ne 80 (int .Values.service.httpPort) }}:{{ .Values.service.httpPort }}{{ end }}'
|
|
|
|
print('Opening Keycloak...')
|
|
driver.get('{0}{{ tpl .Values.http.relativePath . | trimSuffix "/" }}/admin/'.format(base_url))
|
|
|
|
username = os.environ['KEYCLOAK_USER']
|
|
password = os.environ['KEYCLOAK_PASSWORD']
|
|
|
|
username_input = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "username")))
|
|
password_input = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "password")))
|
|
login_button = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "kc-login")))
|
|
|
|
print('Entering username...')
|
|
username_input.send_keys(username)
|
|
|
|
print('Entering password...')
|
|
password_input.send_keys(password)
|
|
|
|
print('Clicking login button...')
|
|
login_button.click()
|
|
|
|
WebDriverWait(driver, 30).until(lambda driver: '{{ tpl .Values.http.relativePath . | trimSuffix "/" }}/admin/master/console/' in driver.current_url)
|
|
|
|
print('Admin console visible. Login successful.')
|
|
|
|
driver.quit()
|
|
|
|
{{- end }}
|