Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
cd87084
feat: add keystoneauth_kubeservicetoken authentication plugin
skrobul Mar 26, 2026
8515edf
feat: add oidc-rbac component for service account issuer discovery
skrobul May 12, 2026
023f89d
feat: install keystoneauth-kubeservicetoken in OpenStack containers
skrobul May 13, 2026
7c646ae
drop! change to test OpenStack images
skrobul May 13, 2026
2612000
chore: update keystone-service-user secrets to OIDC
skrobul May 14, 2026
4c67915
chore: generate provider metadata script
skrobul May 14, 2026
b98e8f6
chore: recreate keystne-keystone-admin from ES
skrobul May 14, 2026
2e96d42
fix: try adding volume to init_container
skrobul May 14, 2026
19b99dc
oidc: change approach from init container to static CM
skrobul May 15, 2026
7eec545
keystone: add mod_oauth2 module
skrobul May 20, 2026
99723cf
keystone: enable oauth2 module on build
skrobul May 20, 2026
e377b7c
keystone: try oauth2 with ld cache refresh
skrobul May 20, 2026
7250994
keystone: switch to libapache2-mod-oauth2 provided by Ubuntu
skrobul May 20, 2026
9870cf8
keystone: create k8s service account group and roles
skrobul May 26, 2026
141aeb5
feat: create federation mapping for k8s
skrobul May 26, 2026
d86bb14
keystone: create k8s identity providers and protocols
skrobul May 26, 2026
02ab6c5
keystone: stop requiring keystone aud in mapping
skrobul May 26, 2026
c9ed5c8
keystone: setup k8s-serviceaccounts in correct domain
skrobul May 26, 2026
8a6c03a
chore: upgrade openstack to 2026.1
skrobul Jun 3, 2026
bfb252e
include v3oidcaccessfiletoken in openstack-client container
skrobul Jun 8, 2026
880a962
keystone: use stringData in generated secrets to fix base64 errors
skrobul Jun 8, 2026
e6f5e3a
keystone: add admin@Default access for k8s
skrobul Jun 8, 2026
c616b73
fix: keystone-service-user reference to ID provider
skrobul Jun 15, 2026
c5b0f1e
fix: include keystoneauth-kubeservicetoken in ironic
skrobul Jun 15, 2026
c6610b3
fix: restore project_name and project_domain_name
skrobul Jun 15, 2026
95419ea
drop! fix: set image for neutron_ironic_agent
skrobul Jun 17, 2026
dec6e5d
chore: upgrade OSH charts again
skrobul Jul 6, 2026
e5b035a
fix: missed the image upgrade for keystone
skrobul Jul 6, 2026
b722b2c
fix: update placement chart too
skrobul Jul 6, 2026
9f326dd
rax-dev-iad3-dev: upgrade nova chart
skrobul Jul 6, 2026
09aa5fd
fix the chart commit ID again
skrobul Jul 8, 2026
337cfcc
rax-dev-iad3-dev: fix stale chart version pins for a659ab8a2
skrobul Jul 8, 2026
e234660
cinder: stop double-declaring the cinder-etc-snippets volume
skrobul Jul 8, 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
47 changes: 1 addition & 46 deletions .github/workflows/containers-openstack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ jobs:
- cinder
- glance
- horizon
- neutron
- octavia
- openstack-client
- skyline
Expand All @@ -44,51 +45,5 @@ jobs:
with:
container_name: ${{ matrix.project }}
dockerfile_path: containers/${{ matrix.project }}/Dockerfile
build_args: OPENSTACK_VERSION=2025.2
latest_name: "2025.2"

placement:
uses: ./.github/workflows/build-container-reuse.yaml
secrets: inherit
with:
container_name: placement
dockerfile_path: containers/placement/Dockerfile
build_args: OPENSTACK_VERSION=2026.1
latest_name: "2026.1"

nova:
uses: ./.github/workflows/build-container-reuse.yaml
secrets: inherit
with:
container_name: nova
dockerfile_path: containers/nova/Dockerfile
build_args: OPENSTACK_VERSION=2026.1
latest_name: "2026.1"

neutron:
uses: ./.github/workflows/build-container-reuse.yaml
secrets: inherit
with:
container_name: neutron
dockerfile_path: containers/neutron/Dockerfile
build_args: OPENSTACK_VERSION=2026.1
latest_name: "2026.1"

ironic:
uses: ./.github/workflows/build-container-reuse.yaml
secrets: inherit
with:
container_name: ironic
dockerfile_path: containers/ironic/Dockerfile
build_args: OPENSTACK_VERSION=2026.1
latest_name: "2026.1"
target: final

keystone:
uses: ./.github/workflows/build-container-reuse.yaml
secrets: inherit
with:
container_name: keystone
dockerfile_path: containers/keystone/Dockerfile
build_args: OPENSTACK_VERSION=2026.1
latest_name: "2026.1"
29 changes: 29 additions & 0 deletions ansible/roles/keystone_bootstrap/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,32 @@ keystone_bootstrap_groups:
# role: member
# - project: shared-services
# role: reader

# domain in which k8s service account groups are created
keystone_bootstrap_k8s_group_domain: service

# k8s identity providers; override with your cluster issuers
keystone_k8s_identity:
providers: []

# k8s service account groups and their project role assignments
# Each group can have project_roles with an optional domain to scope the project lookup
keystone_bootstrap_k8s_groups:
- name: k8s-serviceaccounts
desc: 'Kubernetes Service Accounts'
project_roles:
- project: service
domain: service
role: admin
- project: service
domain: service
role: service
- project: baremetal
domain: infra
role: admin
- project: baremetal
domain: infra
role: service
- project: admin
domain: Default
role: admin
54 changes: 54 additions & 0 deletions ansible/roles/keystone_bootstrap/tasks/k8s.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
# Copyright (c) 2026 Rackspace Technology, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

- name: Create k8s mapping
openstack.cloud.federation_mapping:
name: k8s-mapping
rules:
- local:
- user:
name: '{0}'
group:
domain:
name: service
name: k8s-serviceaccounts
remote:
- type: HTTP_OIDC_SUB

- name: Create k8s identity providers
openstack.cloud.federation_idp:
name: "{{ item.name }}"
is_enabled: true
remote_ids:
- "{{ item.issuer }}"
loop: "{{ keystone_k8s_identity.providers }}"

- name: Create k8s openid protocols
openstack.cloud.keystone_federation_protocol:
name: openid
idp: "{{ item.name }}"
mapping: k8s-mapping
loop: "{{ keystone_k8s_identity.providers }}"

- name: Get k8s group domain info
openstack.cloud.identity_domain_info:
name: "{{ keystone_bootstrap_k8s_group_domain }}"
register: _k8s_group_domain

- name: Create k8s service account group mappings
ansible.builtin.include_tasks: k8s_group.yml
loop: "{{ keystone_bootstrap_k8s_groups }}"
loop_control:
loop_var: group_item
34 changes: 34 additions & 0 deletions ansible/roles/keystone_bootstrap/tasks/k8s_group.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
# Copyright (c) 2026 Rackspace Technology, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

- name: Create k8s group
openstack.cloud.identity_group:
name: "{{ group_item.name }}"
domain_id: "{{ _k8s_group_domain.domains[0].id }}"
description: "{{ group_item.desc }}"
state: present
register: _k8s_group

- name: Assign role to k8s group for project
openstack.cloud.role_assignment:
group: "{{ _k8s_group.group.id }}"
project: "{{ role_item.project }}"
project_domain: "{{ role_item.domain | default(omit) }}"
role: "{{ role_item.role }}"
state: present
loop: "{{ group_item.project_roles | default([]) }}"
loop_control:
loop_var: role_item
when: dont_set_roles is not defined
3 changes: 3 additions & 0 deletions ansible/roles/keystone_bootstrap/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,8 @@
- name: Define SSO
ansible.builtin.include_tasks: sso.yml

- name: Define k8s service account groups
ansible.builtin.include_tasks: k8s.yml

- name: Define misc keystone
ansible.builtin.include_tasks: misc.yml
30 changes: 30 additions & 0 deletions charts/argocd-understack/templates/application-oidc-rbac.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{{- if or (eq (include "understack.isEnabled" (list $.Values.global "oidc_rbac")) "true") (eq (include "understack.isEnabled" (list $.Values.site "oidc_rbac")) "true") }}
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: {{ printf "%s-%s" $.Release.Name "oidc-rbac" }}
finalizers:
- resources-finalizer.argocd.argoproj.io
annotations:
argocd.argoproj.io/compare-options: ServerSideDiff=true,IncludeMutationWebhook=true
{{- include "understack.appLabelsBlock" $ | nindent 2 }}
spec:
destination:
namespace: kube-system
server: {{ $.Values.cluster_server }}
project: understack-infra
sources:
- path: components/oidc-rbac
ref: understack
repoURL: {{ include "understack.understack_url" $ }}
targetRevision: {{ include "understack.understack_ref" $ }}
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- ServerSideApply=true
- RespectIgnoreDifferences=true
- ApplyOutOfSyncOnly=true
{{- end }}
40 changes: 24 additions & 16 deletions charts/argocd-understack/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
enabled: false
# -- config file to use for Nautobot scoped to either $understack or $deploy repo
# @default -- $understack/components/nautobot/nautobot_config.py
nautobot_config: '$understack/components/nautobot/nautobot_config.py'
nautobot_config: "$understack/components/nautobot/nautobot_config.py"

# -- Nautobot API token generation jobs
nautobot_api_tokens:
Expand All @@ -169,6 +169,12 @@
# @default -- 0.0.3
chartVersion: 0.0.3

# -- OIDC RBAC (ClusterRoleBindings for OIDC service account issuer discovery)
oidc_rbac:
# -- Enable/disable deploying OIDC RBAC
# @default -- false
enabled: false

# -- OpenEBS
openebs:
# -- Enable/disable deploying OpenEBS
Expand Down Expand Up @@ -229,7 +235,6 @@
# @default -- false
enabled: false


# -- This block is for setting up the UnderStack site specific ArgoCD Applications
site:
# -- Enable/disable deploying the site specific applications
Expand Down Expand Up @@ -341,9 +346,8 @@
wave: 1
# -- Chart version for Keystone
# renovate: datasource=helm depName=keystone registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2026.1.5+a2a343968
chartVersion: 2026.1.10+a659ab8a2 # -- Glance (Image Service)

Check failure on line 349 in charts/argocd-understack/values.yaml

View workflow job for this annotation

GitHub Actions / lint-test

349:39 [comments] too few spaces before comment

# -- Glance (Image Service)
glance:
# -- Enable/disable deploying Glance
# @default -- false
Expand All @@ -353,7 +357,7 @@
wave: 2
# -- Chart version for Glance
# renovate: datasource=helm depName=glance registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2026.1.5+bad57716b
chartVersion: 2026.1.11+a659ab8a2

# -- Cinder (Block Storage Service)
cinder:
Expand All @@ -365,8 +369,7 @@
wave: 2
# -- Chart version for Cinder
# renovate: datasource=helm depName=cinder registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2025.1.3+abd55b4a7

chartVersion: 2026.1.14+a659ab8a2
# -- Ironic (Bare Metal Service)
ironic:
# -- Enable/disable deploying Ironic
Expand All @@ -377,8 +380,7 @@
wave: 2
# -- Chart version for Ironic
# renovate: datasource=helm depName=ironic registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2025.2.23+ea0d1ecda

chartVersion: 2026.1.10+a659ab8a2
# -- Neutron (Networking Service)
neutron:
# -- Enable/disable deploying Neutron
Expand All @@ -389,7 +391,7 @@
wave: 2
# -- Chart version for Neutron
# renovate: datasource=helm depName=neutron registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2026.1.8+872fd69e7
chartVersion: 2026.1.15+a659ab8a2

# -- Placement (Placement Service)
placement:
Expand All @@ -401,7 +403,7 @@
wave: 2
# -- Chart version for Placement
# renovate: datasource=helm depName=placement registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2026.1.4+a2a343968
chartVersion: 2026.1.7+a659ab8a2

# -- Nova (Compute Service)
nova:
Expand All @@ -413,7 +415,7 @@
wave: 3
# -- Chart version for Nova
# renovate: datasource=helm depName=nova registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2026.1.8+a2a343968
chartVersion: 2026.1.13+a659ab8a2

# -- Octavia (Load Balancer Service)
octavia:
Expand All @@ -425,7 +427,7 @@
wave: 3
# -- Chart version for Octavia
# renovate: datasource=helm depName=octavia registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2025.2.8+01c93d867
chartVersion: 2026.1.7+a659ab8a2

# -- Horizon (Dashboard)
horizon:
Expand All @@ -437,7 +439,7 @@
wave: 4
# -- Chart version for Horizon
# renovate: datasource=helm depName=horizon registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2025.2.4+01c93d867
chartVersion: 2026.1.8+a659ab8a2

# -- Skyline (Dashboard)
skyline:
Expand All @@ -449,7 +451,7 @@
wave: 4
# -- Chart version for Skyline
# renovate: datasource=helm depName=skyline registryUrl=https://tarballs.opendev.org/openstack/openstack-helm
chartVersion: 2025.2.5+01c93d867
chartVersion: 2026.1.3+a659ab8a2

# -- Open vSwitch (Networking)
openvswitch:
Expand Down Expand Up @@ -508,6 +510,12 @@
# @default -- false
enabled: false

# -- OIDC RBAC (ClusterRoleBindings for OIDC service account issuer discovery)
oidc_rbac:
# -- Enable/disable deploying OIDC RBAC
# @default -- false
enabled: false

# -- OpenEBS
openebs:
# -- Enable/disable deploying OpenEBS
Expand Down Expand Up @@ -575,7 +583,7 @@
enabled: false
# -- config file to use for Nautobot scoped to either $understack or $deploy repo
# @default -- $understack/components/nautobot/nautobot_config.py
nautobot_config: '$understack/components/nautobot/nautobot_config.py'
nautobot_config: "$understack/components/nautobot/nautobot_config.py"

# -- Ironic hardware exporter for bare-metal hardware metrics via RabbitMQ
ironic_hardware_exporter:
Expand Down
Loading
Loading