Skip to content

Commit 10e4d47

Browse files
committed
Application Credential support
Adds the end-to-end support for consuming Keystone ApplicationCredentials (AC) in the ironic-operator, enabling IronicAPI,Conductor, Inspector NeutronAGent pods to use AC-based authentication when available. Signed-off-by: Veronika Fisarova <vfisarov@redhat.com>
1 parent a412b2c commit 10e4d47

37 files changed

+943
-36
lines changed

api/bases/ironic.openstack.org_ironicapis.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ spec:
5757
description: APITimeout for HAProxy, Apache
5858
minimum: 10
5959
type: integer
60+
auth:
61+
description: Auth - Parameters related to authentication (inherited
62+
from parent Ironic CR)
63+
properties:
64+
applicationCredentialSecret:
65+
description: ApplicationCredentialSecret - Secret containing Application
66+
Credential ID and Secret
67+
type: string
68+
type: object
6069
containerImage:
6170
description: ContainerImage - Ironic API Container Image
6271
type: string

api/bases/ironic.openstack.org_ironicconductors.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ spec:
5252
spec:
5353
description: IronicConductorSpec defines the desired state of IronicConductor
5454
properties:
55+
auth:
56+
description: Auth - Parameters related to authentication (inherited
57+
from parent Ironic CR)
58+
properties:
59+
applicationCredentialSecret:
60+
description: ApplicationCredentialSecret - Secret containing Application
61+
Credential ID and Secret
62+
type: string
63+
type: object
5564
conductorGroup:
5665
description: ConductorGroup - Ironic Conductor conductor group.
5766
type: string

api/bases/ironic.openstack.org_ironicinspectors.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ spec:
5757
description: APITimeout for HAProxy, Apache
5858
minimum: 10
5959
type: integer
60+
auth:
61+
description: Auth - Parameters related to authentication
62+
properties:
63+
applicationCredentialSecret:
64+
description: ApplicationCredentialSecret - Secret containing Application
65+
Credential ID and Secret
66+
type: string
67+
type: object
6068
containerImage:
6169
description: ContainerImage - Ironic Inspector Container Image
6270
type: string

api/bases/ironic.openstack.org_ironicneutronagents.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ spec:
5454
description: IronicNeutronAgentSpec defines the desired state of ML2 baremetal
5555
- ironic-neutron-agent agents
5656
properties:
57+
auth:
58+
description: Auth - Parameters related to authentication (inherited
59+
from parent Ironic CR)
60+
properties:
61+
applicationCredentialSecret:
62+
description: ApplicationCredentialSecret - Secret containing Application
63+
Credential ID and Secret
64+
type: string
65+
type: object
5766
containerImage:
5867
description: ContainerImage - ML2 baremtal - Ironic Neutron Agent
5968
Image

api/bases/ironic.openstack.org_ironics.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ spec:
5353
description: APITimeout for HAProxy, Apache
5454
minimum: 10
5555
type: integer
56+
auth:
57+
description: Auth - Parameters related to authentication (shared by
58+
IronicAPI, IronicConductor, and IronicNeutronAgent)
59+
properties:
60+
applicationCredentialSecret:
61+
description: ApplicationCredentialSecret - Secret containing Application
62+
Credential ID and Secret
63+
type: string
64+
type: object
5665
customServiceConfig:
5766
default: '# add your customization here'
5867
description: |-
@@ -621,6 +630,14 @@ spec:
621630
description: IronicInspector - Spec definition for the inspector service
622631
of this Ironic deployment
623632
properties:
633+
auth:
634+
description: Auth - Parameters related to authentication
635+
properties:
636+
applicationCredentialSecret:
637+
description: ApplicationCredentialSecret - Secret containing
638+
Application Credential ID and Secret
639+
type: string
640+
type: object
624641
customServiceConfig:
625642
default: '# add your customization here'
626643
description: |-

api/go.mod

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.24.4
44

55
require (
66
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251223124749-eedb97238c5f
7+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20251206133124-593df0a7a9e1
78
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251230215914-6ba873b49a35
89
k8s.io/api v0.31.14
910
k8s.io/apimachinery v0.31.14
@@ -16,7 +17,6 @@ require (
1617
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1718
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
1819
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
19-
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
2020
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
2121
github.com/fsnotify/fsnotify v1.9.0 // indirect
2222
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
@@ -31,6 +31,7 @@ require (
3131
github.com/google/go-cmp v0.7.0 // indirect
3232
github.com/google/gofuzz v1.2.0 // indirect
3333
github.com/google/uuid v1.6.0 // indirect
34+
github.com/gophercloud/gophercloud/v2 v2.8.0 // indirect
3435
github.com/imdario/mergo v0.3.16 // indirect
3536
github.com/josharian/intern v1.0.0 // indirect
3637
github.com/json-iterator/go v1.1.12 // indirect
@@ -39,6 +40,8 @@ require (
3940
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
4041
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
4142
github.com/openshift/api v3.9.0+incompatible // indirect
43+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251122131503-b76943960b6c // indirect
44+
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20251122131503-b76943960b6c // indirect
4245
github.com/pkg/errors v0.9.1 // indirect
4346
github.com/prometheus/client_golang v1.22.0 // indirect
4447
github.com/prometheus/client_model v0.6.2 // indirect
@@ -94,3 +97,5 @@ replace k8s.io/component-base => k8s.io/component-base v0.31.14 //allow-merging
9497
replace github.com/rabbitmq/cluster-operator/v2 => github.com/openstack-k8s-operators/rabbitmq-cluster-operator/v2 v2.6.1-0.20250929174222-a0d328fa4dec //allow-merging
9598

9699
replace k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20250627150254-e9823e99808e //allow-merging
100+
101+
replace github.com/openstack-k8s-operators/keystone-operator/api => github.com/Deydra71/keystone-operator/api v0.0.0-20251211085602-3e1a3e022c81

api/go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/Deydra71/keystone-operator/api v0.0.0-20251211085602-3e1a3e022c81 h1:plax+NFgJJL1SrERyXAnf3jOHRhLTtBlJ2oc7d84EoU=
2+
github.com/Deydra71/keystone-operator/api v0.0.0-20251211085602-3e1a3e022c81/go.mod h1:b98Jl8eyUw8V07l9YiuQnoMlnWC748oV8IhXH15NCC4=
13
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
24
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
35
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -48,6 +50,8 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J
4850
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
4951
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5052
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
53+
github.com/gophercloud/gophercloud/v2 v2.8.0 h1:of2+8tT6+FbEYHfYC8GBu8TXJNsXYSNm9KuvpX7Neqo=
54+
github.com/gophercloud/gophercloud/v2 v2.8.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk=
5155
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
5256
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
5357
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -84,6 +88,10 @@ github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251223124749-e
8488
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20251223124749-eedb97238c5f/go.mod h1:ex8ou6/3ms6ovR+CMXD6XhTlNakm1GhB6UZgagVRNW8=
8589
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251230215914-6ba873b49a35 h1:pF3mJ3nwq6r4qwom+rEWZNquZpcQW/iftHlJ1KPIDsk=
8690
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20251230215914-6ba873b49a35/go.mod h1:kycZyoe7OZdW1HUghr2nI3N7wSJtNahXf6b/ypD14f4=
91+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251122131503-b76943960b6c h1:l7FO+XoQRnD4aT5p/JXVY2uezQLdC7D50KrwrTmzCfg=
92+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251122131503-b76943960b6c/go.mod h1:zOX7Y05keiSppIvLabuyh42QHBMhCcoskAtxFRbwXKo=
93+
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20251122131503-b76943960b6c h1:dVIaDL5BeIdJjERGaN/XlcvZVplfkzh0uUfiVUHj/6Q=
94+
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20251122131503-b76943960b6c/go.mod h1:fy1lvz3uuzzh01DKKdgroXvmJgMpJBsvl2r9eTtAll0=
8795
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8896
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8997
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

api/v1beta1/common_types.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20-
corev1 "k8s.io/api/core/v1"
2120
topologyv1 "github.com/openstack-k8s-operators/infra-operator/apis/topology/v1beta1"
21+
corev1 "k8s.io/api/core/v1"
2222
"k8s.io/apimachinery/pkg/util/validation/field"
2323
)
2424

@@ -78,6 +78,14 @@ type KeystoneEndpoints struct {
7878
Public string `json:"public"`
7979
}
8080

81+
// AuthSpec defines authentication parameters
82+
type AuthSpec struct {
83+
// +kubebuilder:validation:Optional
84+
// +operator-sdk:csv:customresourcedefinitions:type=spec
85+
// ApplicationCredentialSecret - Secret containing Application Credential ID and Secret
86+
ApplicationCredentialSecret string `json:"applicationCredentialSecret,omitempty"`
87+
}
88+
8189
// ValidateTopology -
8290
func (instance *IronicServiceTemplate) ValidateTopology(
8391
basePath *field.Path,

api/v1beta1/ironic_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ type IronicSpecCore struct {
143143
// require oslo.messaging transport when not in standalone mode.
144144
RPCTransport string `json:"rpcTransport"`
145145

146+
// +kubebuilder:validation:Optional
147+
// +operator-sdk:csv:customresourcedefinitions:type=spec
148+
// Auth - Parameters related to authentication (shared by IronicAPI, IronicConductor, and IronicNeutronAgent)
149+
Auth AuthSpec `json:"auth,omitempty"`
150+
146151
// +kubebuilder:validation:Optional
147152
// NodeSelector to target subset of worker nodes running this service. Setting
148153
// NodeSelector here acts as a default value and can be overridden by service

api/v1beta1/ironic_webhook.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"strings"
2424

2525
topologyv1 "github.com/openstack-k8s-operators/infra-operator/apis/topology/v1beta1"
26+
keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1"
2627
"github.com/openstack-k8s-operators/lib-common/modules/common/service"
2728
"github.com/openstack-k8s-operators/lib-common/modules/common/util"
2829
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -573,6 +574,15 @@ func (spec *IronicSpecCore) Default() {
573574
if spec.RPCTransport == "" {
574575
spec.RPCTransport = "json-rpc"
575576
}
577+
// Default ApplicationCredentialSecret to standard AC secret name if not specified
578+
// Set it in the parent spec for IronicAPI, IronicConductor, and IronicNeutronAgent (all use "ironic" user)
579+
if spec.Auth.ApplicationCredentialSecret == "" {
580+
spec.Auth.ApplicationCredentialSecret = keystonev1.GetACSecretName("ironic")
581+
}
582+
// IronicInspector uses its own keystone user "ironic-inspector"
583+
if spec.IronicInspector.Auth.ApplicationCredentialSecret == "" {
584+
spec.IronicInspector.Auth.ApplicationCredentialSecret = keystonev1.GetACSecretName("ironic-inspector")
585+
}
576586
}
577587

578588
// ValidateIronicTopology - Returns an ErrorList if the Topology is referenced

0 commit comments

Comments
 (0)