Skip to content

Commit 803ec60

Browse files
Deydra71cursoragent
authored andcommitted
Application Credential support
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 89e4bc0 commit 803ec60

35 files changed

+849
-196
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: 4 additions & 2 deletions
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.20260128074606-03b808364e4a
7+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959
78
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260128142552-e2c25eccae5a
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,15 +31,17 @@ 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
3738
github.com/mailru/easyjson v0.9.0 // indirect
3839
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3940
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
4041
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
41-
github.com/onsi/ginkgo/v2 v2.27.5 // indirect
4242
github.com/openshift/api v3.9.0+incompatible // indirect
43+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35 // indirect
44+
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20251230215914-6ba873b49a35 // indirect
4345
github.com/pkg/errors v0.9.1 // indirect
4446
github.com/prometheus/client_golang v1.22.0 // indirect
4547
github.com/prometheus/client_model v0.6.2 // indirect

api/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J
4848
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
4949
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
5050
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
51+
github.com/gophercloud/gophercloud/v2 v2.8.0 h1:of2+8tT6+FbEYHfYC8GBu8TXJNsXYSNm9KuvpX7Neqo=
5152
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
5253
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
5354
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -82,8 +83,11 @@ github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e h1:E1OdwSpqWuDPCedyU
8283
github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
8384
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260128074606-03b808364e4a h1:uJL923hT6ZJE1fKq+/FA0mVX46AgE3H+OClpL2DXq4Y=
8485
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260128074606-03b808364e4a/go.mod h1:ZXwFlspJCdZEUjMbmaf61t5AMB4u2vMyAMMoe/vJroE=
86+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260126175636-114b4c65a959 h1:8FSpTYAoLq27ElDGe3igPl2QUq9IYD6RJGu2Xu+Ymus=
8587
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260128142552-e2c25eccae5a h1:97OfmmJgoIKTfbED2SfyjoPkivoiMHg4jfbrTuwSGQw=
8688
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260128142552-e2c25eccae5a/go.mod h1:ndqfy1KbVorHH6+zlUFPIrCRhMSxO3ImYJUGaooE0x0=
89+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20251230215914-6ba873b49a35 h1:IdcI8DFvW8rXtchONSzbDmhhRp1YyO2YaBJDBXr44Gk=
90+
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20251230215914-6ba873b49a35 h1:8WZYfCt1VJHa5sJRX0UhpmoXud/fn8LHQhXsakdYXuQ=
8791
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8892
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8993
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)