Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f433da6
Add defaultIdentityToSubject config for selfhosted IdPs (FAB-189)
mhotan Apr 2, 2026
4320fc9
Provide UserClouds client defaults in controlplane values
mhotan Mar 31, 2026
8775de3
Fix dashboard metric name mismatches and query bug
mhotan Mar 31, 2026
fd9b63a
Fix Authorizer Mode panel value mappings for case sensitivity
mhotan Mar 31, 2026
09dd0ae
Add OIDC_METADATA_URL global for configurable metadata discovery
mhotan Apr 14, 2026
0f2f808
Add OAuth2 globals for non-Okta IdP support (Entra ID, Keycloak)
mhotan Apr 16, 2026
082ca8f
Add custom OIDC test fixture for non-Okta IdP configuration
mhotan Apr 16, 2026
5465a6e
Wire OIDC_APP_SCOPE and OIDC_APP_AUDIENCE globals into chart templates
mhotan Apr 16, 2026
6b42798
Document OIDC auth config with OAuth app numbers and flow references
mhotan Apr 16, 2026
eacf7ff
Remove Terraform references from OIDC auth config comments
mhotan Apr 16, 2026
df9806a
Add OIDC_S2S_SCOPE global for service-to-service client_credentials
mhotan Apr 17, 2026
b45a4fb
Regenerate snapshots after rebase onto main
mhotan Apr 17, 2026
e9889b4
Add OIDC_S2S_SCOPE to dataplane auth config
mhotan Apr 17, 2026
b03e470
Add server-alias for intra-cluster auth on selfhosted ingress
mhotan Apr 17, 2026
cc9717f
Add gRPC identity header forwarding via configuration-snippet
mhotan Apr 17, 2026
62b6406
Add organizations service to controlplane chart
mhotan Apr 17, 2026
2a1c460
Fix organizations service connectPort in configmap
mhotan Apr 17, 2026
324ea4f
Use OIDC_S2S_SCOPE global for CP service-to-service auth scopes
mhotan Apr 17, 2026
8e91673
Move executions adminClient.connection to base values.yaml
mhotan Apr 17, 2026
f375d55
Add OIDC_BROWSER_SCOPE global for Entra browser auth
mhotan Apr 18, 2026
94d8453
Consolidate auth config into base values.yaml with globals
mhotan Apr 18, 2026
26ecbd6
Update authorizer dashboard: standardized backend metrics, identity_type
mhotan Apr 18, 2026
d93edb8
Consolidate auth config into adminServer.auth block
mhotan Apr 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
665 changes: 417 additions & 248 deletions charts/controlplane/dashboards/union-controlplane-overview.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/configmap.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds" -}}
{{- if or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") -}}
apiVersion: v1
kind: ConfigMap
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/deployment.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds" -}}
{{- if or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") -}}
apiVersion: apps/v1
kind: Deployment
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/hpa.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") .Values.union.authz.autoscaling.enabled }}
{{- if and (or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds")) .Values.union.authz.autoscaling.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/networkpolicy.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") .Values.union.authz.networkPolicy.enabled }}
{{- if and (or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds")) .Values.union.authz.networkPolicy.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/pdb.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") .Values.union.authz.pdb.enabled }}
{{- if and (or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds")) .Values.union.authz.pdb.enabled }}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/rbac.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") .Values.union.authz.serviceAccount.create -}}
{{- if and (or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds")) .Values.union.authz.serviceAccount.create -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/service.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds" -}}
{{- if or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") -}}
apiVersion: v1
kind: Service
metadata:
Expand Down
2 changes: 1 addition & 1 deletion charts/controlplane/templates/authz/serviceaccount.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{- if and (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds") .Values.union.authz.serviceAccount.create -}}
{{- if and (or (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "Union") (eq ((index .Values "services" "authorizer" "configMap" "authorizer" "type") | default "") "UserClouds")) .Values.union.authz.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
Expand Down
81 changes: 20 additions & 61 deletions charts/controlplane/values.aws.selfhosted-intracluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -108,20 +108,12 @@ global:
DATAPLANE_ENDPOINT: ""

# --- Authentication Configuration ---
# Set all values below to enable OIDC authentication.
# Supports any OAuth2/OIDC provider (Okta, Azure AD, Auth0, Keycloak, etc.)
#
# OIDC issuer URL
# Example: "https://dev-123456.okta.com/oauth2/default"
OIDC_BASE_URL: ""
# Flyteadmin OIDC client ID for browser login flow
# Example: "0oa1abc2def3ghi4j5k6"
OIDC_CLIENT_ID: ""
# CLI client ID for flytectl / uctl (public OAuth app, PKCE flow)
# Example: "0oa7mno8pqr9stu0v1w2"
CLI_CLIENT_ID: ""
# INTERNAL_CLIENT_ID and AUTH_TOKEN_URL are defined in the base values.yaml.
# Set them in your environment-specific overlay (Terraform-generated values).
# All OIDC/OAuth2 globals are defined in the base values.yaml with documentation.
# Set them in your environment-specific values overlay generated by Terraform.
# INTERNAL_CLIENT_ID and AUTH_TOKEN_URL are also in the base values.yaml.
# Set them in your environment-specific values overlay.
# INTERNAL_CLIENT_ID: OAuth2 client ID for service-to-service calls (client_credentials).
# AUTH_TOKEN_URL: Token endpoint for service-to-service authentication.

# ----------------------------------------------------------------------------
# SECTION 2: Image Tag Overrides
Expand Down Expand Up @@ -267,36 +259,8 @@ flyte:
# Subject to removal in the future
singleTenantOrgID: '{{ .Values.global.UNION_ORG }}'

# --- OIDC Authentication ---
# To enable authentication, set server.security.useAuth: true
# and configure the auth globals in Section 1 above.
# server:
# security:
# useAuth: true
auth:
httpAuthorizationHeader: "flyte-authorization"
grpcAuthorizationHeader: "flyte-authorization"
authorizedUris:
- "http://flyteadmin:80"
- 'http://flyteadmin.{{ .Release.Namespace }}.svc.cluster.local:80'
appAuth:
authServerType: "External"
externalAuthServer:
baseUrl: '{{ .Values.global.OIDC_BASE_URL }}'
thirdPartyConfig:
flyteClient:
clientId: '{{ .Values.global.CLI_CLIENT_ID }}'
redirectUri: "http://localhost:53593/callback"
scopes: ["all"]
userAuth:
openId:
baseUrl: '{{ .Values.global.OIDC_BASE_URL }}'
clientId: '{{ .Values.global.OIDC_CLIENT_ID }}'
scopes: ["profile", "openid", "offline_access"]
cookieSetting:
sameSitePolicy: "LaxMode"
domain: ""
idpQueryParameter: "idp"
# adminServer.auth is now fully configured in the base values.yaml
# using globals. No overlay-specific auth config needed.

# Enable scheduler auth secret mount so flyte-secret-auth is mounted at /etc/secrets/.
# Set clientSecret: null so the subchart does NOT create the secret — it must be
Expand Down Expand Up @@ -364,10 +328,22 @@ ingress:
- "{{ .Values.global.CONTROLPLANE_INTRA_CLUSTER_HOST }}"
secretName: "{{ .Values.global.TLS_SECRET_NAME }}"

# --- Ingress Annotations (shared across all ingress objects) ---
annotations:
# Allow the nginx controller's internal DNS to match ingress rules so that
# intra-cluster traffic (DP → CP via nginx service DNS) is routed through
# the same auth subrequest as external traffic. Without this, the :authority
# header won't match the ingress host and auth is bypassed.
nginx.ingress.kubernetes.io/server-alias: "{{ .Values.global.CONTROLPLANE_INTRA_CLUSTER_HOST }}"

# --- Protected Ingress Auth Annotations ---
# These configure nginx to validate requests via flyteadmin's /me endpoint
# and redirect unauthenticated users to /login for the OIDC flow.
# Active when OIDC authentication is enabled (server.security.useAuth: true).
#
# All protected endpoints use "https://$host/me" so the auth subrequest goes
# through nginx itself. This ensures verifyClaims runs on the access token,
# which resolves identitytype for all callers (browser, CLI, service-to-service).
protectedIngressAnnotations:
nginx.ingress.kubernetes.io/auth-url: "https://$host/me"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/login?redirect_url=$escaped_request_uri"
Expand Down Expand Up @@ -482,23 +458,6 @@ services:
# Connect to dataplane ingress controller
secureTunnelTenantURLPattern: '{{ .Values.global.DATAPLANE_ENDPOINT }}'

# Executions service configuration
executions:
configMap:
executions:
app:
adminClient:
connection:
# Flyteadmin endpoint for executions service
endpoint: '{{ .Values.global.FLYTEADMIN_ENDPOINT }}'
insecure: true
# --- Auth fields (active when OIDC is enabled) ---
authorizationHeader: "flyte-authorization"
clientId: '{{ .Values.global.INTERNAL_CLIENT_ID }}'
clientSecretLocation: "/etc/secrets/union/client_secret"
tokenUrl: '{{ .Values.global.AUTH_TOKEN_URL }}'
scopes: ["all"]

# ----------------------------------------------------------------------------
# Monitoring Configuration (AWS/EKS specific)
# ----------------------------------------------------------------------------
Expand Down
76 changes: 14 additions & 62 deletions charts/controlplane/values.gcp.selfhosted-intracluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -116,20 +116,10 @@ global:
IMAGE_REPOSITORY_PREFIX: "registry.unionai.cloud/controlplane"

# --- Authentication Configuration ---
# Set all values below to enable OIDC authentication.
# Supports any OAuth2/OIDC-compliant identity provider.
#
# OIDC issuer URL
# Example: "https://login.example.com/oauth2/default"
OIDC_BASE_URL: ""
# Flyteadmin OIDC client ID for browser login flow
# Example: "0oa1abc2def3ghi4j5k6"
OIDC_CLIENT_ID: ""
# CLI client ID for flytectl / uctl (public OAuth app, PKCE flow)
# Example: "0oa7mno8pqr9stu0v1w2"
CLI_CLIENT_ID: ""
# INTERNAL_CLIENT_ID and AUTH_TOKEN_URL are defined in the base values.yaml.
# Set them in your environment-specific overlay (Terraform-generated values).
# All OIDC/OAuth2 globals are defined in the base values.yaml with documentation.
# Set them in your environment-specific values overlay generated by Terraform.
# INTERNAL_CLIENT_ID and AUTH_TOKEN_URL are also in the base values.yaml.
# AUTH_TOKEN_URL: Token endpoint for service-to-service authentication.

# ----------------------------------------------------------------------------
# SECTION 2: Image Tag Overrides
Expand Down Expand Up @@ -297,36 +287,8 @@ flyte:
# Subject to removal in the future
singleTenantOrgID: '{{ .Values.global.UNION_ORG }}'

# --- OIDC Authentication ---
# To enable authentication, set server.security.useAuth: true
# and configure the auth globals in Section 1 above.
# server:
# security:
# useAuth: true
auth:
httpAuthorizationHeader: "flyte-authorization"
grpcAuthorizationHeader: "flyte-authorization"
authorizedUris:
- "http://flyteadmin:80"
- 'http://flyteadmin.{{ .Release.Namespace }}.svc.cluster.local:80'
appAuth:
authServerType: "External"
externalAuthServer:
baseUrl: '{{ .Values.global.OIDC_BASE_URL }}'
thirdPartyConfig:
flyteClient:
clientId: '{{ .Values.global.CLI_CLIENT_ID }}'
redirectUri: "http://localhost:53593/callback"
scopes: ["all"]
userAuth:
openId:
baseUrl: '{{ .Values.global.OIDC_BASE_URL }}'
clientId: '{{ .Values.global.OIDC_CLIENT_ID }}'
scopes: ["profile", "openid", "offline_access"]
cookieSetting:
sameSitePolicy: "LaxMode"
domain: ""
idpQueryParameter: "idp"
# adminServer.auth is now fully configured in the base values.yaml
# using globals. No overlay-specific auth config needed.

# Enable scheduler auth secret mount so flyte-secret-auth is mounted at /etc/secrets/.
# Set clientSecret: "placeholder" so the subchart renders the secret — it must be
Expand Down Expand Up @@ -394,7 +356,14 @@ ingress:
- "{{ .Values.global.CONTROLPLANE_INTRA_CLUSTER_HOST }}"
secretName: "{{ .Values.global.TLS_SECRET_NAME }}"

# Protected ingress auth annotations are now defined in the base values.yaml.
# --- Ingress Annotations (shared across all ingress objects) ---
annotations:
# Allow the nginx controller's internal DNS to match ingress rules so that
# intra-cluster traffic (DP → CP via nginx service DNS) is routed through
# the same auth subrequest as external traffic.
nginx.ingress.kubernetes.io/server-alias: "{{ .Values.global.CONTROLPLANE_INTRA_CLUSTER_HOST }}"

# Protected ingress auth annotations are defined in the base values.yaml.
# Override here only if you need to customize auth behavior for this deployment mode.

# ----------------------------------------------------------------------------
Expand Down Expand Up @@ -496,23 +465,6 @@ services:
# Connect to dataplane ingress controller
secureTunnelTenantURLPattern: '{{ .Values.global.DATAPLANE_ENDPOINT }}'

# Executions service configuration
executions:
configMap:
executions:
app:
adminClient:
connection:
# Flyteadmin endpoint for executions service
endpoint: '{{ .Values.global.FLYTEADMIN_ENDPOINT }}'
insecure: true
# --- Auth fields (active when OIDC is enabled) ---
authorizationHeader: "flyte-authorization"
clientId: '{{ .Values.global.INTERNAL_CLIENT_ID }}'
clientSecretLocation: "/etc/secrets/union/client_secret"
tokenUrl: '{{ .Values.global.AUTH_TOKEN_URL }}'
scopes: ["all"]

# ----------------------------------------------------------------------------
# SECTION 9: ScyllaDB Configuration
# ----------------------------------------------------------------------------
Expand Down
Loading
Loading