@@ -5,15 +5,15 @@ KEYCLOAK_ADMIN_USER = admin
55KEYCLOAK_ADMIN_PASSWORD = admin
66
77.PHONY : keycloak-install
8- keycloak-install : # # Install Keycloak for local development
8+ keycloak-install :
99 @echo " Installing Keycloak (dev mode using official image)..."
10- @kubectl apply -f config/keycloak/deployment.yaml
10+ @kubectl apply -f dev/ config/keycloak/deployment.yaml
1111 @echo " Applying Keycloak ingress (cert-manager will create TLS certificate)..."
12- @kubectl apply -f config/keycloak/ingress.yaml
12+ @kubectl apply -f dev/ config/keycloak/ingress.yaml
1313 @echo " Extracting cert-manager CA certificate..."
14- @mkdir -p hack /cert-manager-ca
15- @kubectl get secret selfsigned-ca-secret -n cert-manager -o jsonpath=' {.data.ca\.crt}' | base64 -d > hack /cert-manager-ca/ca.crt
16- @echo " ✅ cert-manager CA certificate extracted to hack /cert-manager-ca/ca.crt (bind-mounted to API server)"
14+ @mkdir -p _output /cert-manager-ca
15+ @kubectl get secret selfsigned-ca-secret -n cert-manager -o jsonpath=' {.data.ca\.crt}' | base64 -d > _output /cert-manager-ca/ca.crt
16+ @echo " ✅ cert-manager CA certificate extracted to _output /cert-manager-ca/ca.crt (bind-mounted to API server)"
1717 @echo " Restarting Kubernetes API server to pick up new CA..."
1818 @docker exec kubernetes-mcp-server-control-plane pkill -f kube-apiserver || \
1919 podman exec kubernetes-mcp-server-control-plane pkill -f kube-apiserver
@@ -29,23 +29,26 @@ keycloak-install: ## Install Keycloak for local development
2929 done
3030 @echo " Waiting for Keycloak to be ready..."
3131 @kubectl wait --for=condition=ready pod -l app=keycloak -n $(KEYCLOAK_NAMESPACE ) --timeout=120s || true
32+ @echo " Waiting for Keycloak HTTP endpoint to be available..."
33+ @for i in $$(seq 1 30 ) ; do \
34+ STATUS=$$(curl -sk -o /dev/null -w "%{http_code}" https://keycloak.127-0-0-1.sslip.io:8443/realms/master 2>/dev/null || echo "000" ) ; \
35+ if [ " $$ STATUS" = " 200" ]; then \
36+ echo " ✅ Keycloak HTTP endpoint ready" ; \
37+ break ; \
38+ fi ; \
39+ echo " Attempt $$ i/30: Waiting for Keycloak (status: $$ STATUS)..." ; \
40+ sleep 3; \
41+ done
42+ @echo " "
43+ @echo " Setting up OpenShift realm..."
44+ @$(MAKE ) -s keycloak-setup-realm
3245 @echo " "
33- @echo " Keycloak installed!"
34- @echo " Admin credentials: $( KEYCLOAK_ADMIN_USER) / $( KEYCLOAK_ADMIN_PASSWORD) "
46+ @echo " ✅ Keycloak installed and configured!"
3547 @echo " Access at: https://keycloak.127-0-0-1.sslip.io:8443"
3648
3749.PHONY : keycloak-uninstall
38- keycloak-uninstall : # # Uninstall Keycloak
39- @kubectl delete -f config/keycloak/deployment.yaml 2> /dev/null || true
40-
41- .PHONY : keycloak-forward
42- keycloak-forward : # # Port forward Keycloak (optional - ingress provides direct access)
43- @echo " ⚠️ Port forwarding not needed - Keycloak accessible via ingress"
44- @echo " Access at: https://keycloak.127-0-0-1.sslip.io:8443"
45- @echo " Login: $( KEYCLOAK_ADMIN_USER) / $( KEYCLOAK_ADMIN_PASSWORD) "
46- @echo " "
47- @echo " If you still want port forwarding, use:"
48- @echo " kubectl port-forward -n $( KEYCLOAK_NAMESPACE) svc/keycloak 8090:80"
50+ keycloak-uninstall :
51+ @kubectl delete -f dev/config/keycloak/deployment.yaml 2> /dev/null || true
4952
5053.PHONY : keycloak-status
5154keycloak-status : # # Show Keycloak status and connection info
@@ -78,22 +81,25 @@ keycloak-logs: ## Tail Keycloak logs
7881 @kubectl logs -n $(KEYCLOAK_NAMESPACE ) -l app=keycloak -f --tail=100
7982
8083.PHONY : keycloak-setup-realm
81- keycloak-setup-realm : # # Setup OpenShift realm with token exchange support
84+ keycloak-setup-realm :
8285 @echo " ========================================="
8386 @echo " Setting up OpenShift Realm for Token Exchange"
8487 @echo " ========================================="
8588 @echo " Using Keycloak at https://keycloak.127-0-0-1.sslip.io:8443"
8689 @echo " "
8790 @echo " Getting admin access token..."
88- @TOKEN =$$(curl -sk -X POST "https://keycloak.127-0-0-1.sslip.io:8443/realms/master/protocol/openid-connect/token" \
91+ @RESPONSE =$$(curl -sk -X POST "https://keycloak.127-0-0-1.sslip.io:8443/realms/master/protocol/openid-connect/token" \
8992 -H " Content-Type: application/x-www-form-urlencoded" \
9093 -d " username=$( KEYCLOAK_ADMIN_USER) " \
9194 -d " password=$( KEYCLOAK_ADMIN_PASSWORD) " \
9295 -d " grant_type=password" \
93- -d " client_id=admin-cli" \
94- 2> /dev/null | jq -r ' .access_token // empty' ); \
96+ -d " client_id=admin-cli" ) ; \
97+ TOKEN= $$( echo "$$RESPONSE" | jq -r '.access_token // empty' 2>/dev/null ); \
9598 if [ -z " $$ TOKEN" ] || [ " $$ TOKEN" = " null" ]; then \
96- echo " ❌ Failed to get access token. Check if:" ; \
99+ echo " ❌ Failed to get access token" ; \
100+ echo " Response was: $$ RESPONSE" | head -c 200; \
101+ echo " " ; \
102+ echo " Check if:" ; \
97103 echo " - Keycloak is running (make keycloak-install)" ; \
98104 echo " - Keycloak is accessible at https://keycloak.127-0-0-1.sslip.io:8443" ; \
99105 echo " - Admin credentials are correct: $( KEYCLOAK_ADMIN_USER) /$( KEYCLOAK_ADMIN_PASSWORD) " ; \
@@ -373,7 +379,7 @@ keycloak-setup-realm: ## Setup OpenShift realm with token exchange support
373379 fi ; \
374380 echo " " ; \
375381 echo " Setting up RBAC for mcp user..." ; \
376- kubectl apply -f config/keycloak/rbac.yaml; \
382+ kubectl apply -f dev/ config/keycloak/rbac.yaml; \
377383 echo " ✅ RBAC binding created for mcp user" ; \
378384 echo " " ; \
379385 echo " 🎉 OpenShift realm setup complete!" ; \
@@ -416,11 +422,27 @@ keycloak-setup-realm: ## Setup OpenShift realm with token exchange support
416422 echo " sts_client_secret = \" $$ CLIENT_SECRET\" " ; \
417423 echo " sts_audience = \" openshift\" " ; \
418424 echo " sts_scopes = [\" mcp:openshift\" ]" ; \
419- echo " certificate_authority = \" hack /cert-manager-ca/ca.crt\" " ; \
425+ echo " certificate_authority = \" _output /cert-manager-ca/ca.crt\" " ; \
420426 echo " ========================================" ; \
421427 echo " " ; \
422428 echo " Note: The Kubernetes API server is configured with:" ; \
423429 echo " --oidc-issuer-url=https://keycloak.127-0-0-1.sslip.io:8443/realms/openshift" ; \
424430 echo " " ; \
425431 echo " Important: The cert-manager CA certificate was extracted to:" ; \
426- echo " hack/cert-manager-ca/ca.crt"
432+ echo " _output/cert-manager-ca/ca.crt" ; \
433+ echo " " ; \
434+ echo " Writing configuration to _output/config.toml..." ; \
435+ mkdir -p _output; \
436+ printf ' %s\n' \
437+ ' require_oauth = true' \
438+ ' oauth_audience = "mcp-server"' \
439+ ' oauth_scopes = ["openid", "mcp-server"]' \
440+ ' validate_token = false' \
441+ ' authorization_url = "https://keycloak.127-0-0-1.sslip.io:8443/realms/openshift"' \
442+ ' sts_client_id = "mcp-server"' \
443+ " sts_client_secret = \" $$ CLIENT_SECRET\" " \
444+ ' sts_audience = "openshift"' \
445+ ' sts_scopes = ["mcp:openshift"]' \
446+ ' certificate_authority = "_output/cert-manager-ca/ca.crt"' \
447+ > _output/config.toml; \
448+ echo " ✅ Configuration written to _output/config.toml"
0 commit comments