Skip to content

Commit 6543a62

Browse files
authored
Merge pull request #2193 from MatthieuFin/main
feat(manager): ✨ add region to openStackMachineSpec.ProviderID field from crd identityRef
2 parents 28cccb9 + 05c5cad commit 6543a62

19 files changed

+181
-11
lines changed

api/v1alpha6/conversion_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ func TestFuzzyConversion(t *testing.T) {
9191
}
9292
},
9393

94+
func(identityRef *infrav1.OpenStackIdentityReference, c fuzz.Continue) {
95+
c.FuzzNoCustom(identityRef)
96+
97+
// None of the following identityRef fields have ever been set in v1alpha6
98+
identityRef.Region = ""
99+
},
100+
94101
func(spec *OpenStackMachineSpec, c fuzz.Continue) {
95102
c.FuzzNoCustom(spec)
96103

api/v1alpha6/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha7/conversion_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ func TestFuzzyConversion(t *testing.T) {
8989
}
9090
}
9191
},
92+
93+
func(identityRef *infrav1.OpenStackIdentityReference, c fuzz.Continue) {
94+
c.FuzzNoCustom(identityRef)
95+
96+
// None of the following identityRef fields have ever been set in v1alpha7
97+
identityRef.Region = ""
98+
},
9299
}
93100

94101
return slices.Concat(v1alpha7FuzzerFuncs, testhelpers.InfraV1FuzzerFuncs())

api/v1alpha7/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/identity_types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package v1beta1
1818

1919
// OpenStackIdentityReference is a reference to an infrastructure
2020
// provider identity to be used to provision cluster resources.
21+
// +kubebuilder:validation:XValidation:rule="(!has(self.region) && !has(oldSelf.region)) || self.region == oldSelf.region",message="region is immutable"
2122
type OpenStackIdentityReference struct {
2223
// Name is the name of a secret in the same namespace as the resource being provisioned.
2324
// The secret must contain a key named `clouds.yaml` which contains an OpenStack clouds.yaml file.
@@ -28,6 +29,12 @@ type OpenStackIdentityReference struct {
2829
// CloudName specifies the name of the entry in the clouds.yaml file to use.
2930
// +kubebuilder:validation:Required
3031
CloudName string `json:"cloudName"`
32+
33+
// Region specifies an OpenStack region to use. If specified, it overrides
34+
// any value in clouds.yaml. If specified for an OpenStackMachine, its
35+
// value will be included in providerID.
36+
// +optional
37+
Region string `json:"region,omitempty"`
3138
}
3239

3340
// IdentityRefProvider is an interface for obtaining OpenStack credentials from an API object

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackfloatingippools.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackservers.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controllers/openstackmachine_controller.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,11 @@ func (r *OpenStackMachineReconciler) reconcileMachineState(scope *scope.WithLogg
422422
conditions.MarkTrue(openStackMachine, infrav1.InstanceReadyCondition)
423423

424424
// Set properties required by CAPI machine controller
425-
openStackMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("openstack:///%s", *openStackServer.Status.InstanceID))
425+
var region string
426+
if openStackMachine.Spec.IdentityRef != nil {
427+
region = openStackMachine.Spec.IdentityRef.Region
428+
}
429+
openStackMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("openstack://%s/%s", region, *openStackServer.Status.InstanceID))
426430
openStackMachine.Status.InstanceID = openStackServer.Status.InstanceID
427431
openStackMachine.Status.Ready = true
428432
case infrav1.InstanceStateError:

docs/book/src/api/v1beta1/api.md

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hack/codegen/openapi/zz_generated.openapi.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/generated/applyconfiguration/api/v1beta1/openstackidentityreference.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/generated/applyconfiguration/internal/internal.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/scope/provider.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ func (f *providerScopeFactory) NewClientScopeFromObject(ctx context.Context, ctr
8181
}
8282

8383
if f.clientCache == nil {
84-
return NewProviderScope(cloud, caCert, logger)
84+
return NewProviderScope(cloud, identityRef.Region, caCert, logger)
8585
}
8686

87-
return NewCachedProviderScope(f.clientCache, cloud, caCert, logger)
87+
return NewCachedProviderScope(f.clientCache, cloud, identityRef.Region, caCert, logger)
8888
}
8989

9090
func getScopeCacheKey(cloud clientconfig.Cloud) (string, error) {
@@ -102,8 +102,8 @@ type providerScope struct {
102102
projectID string
103103
}
104104

105-
func NewProviderScope(cloud clientconfig.Cloud, caCert []byte, logger logr.Logger) (Scope, error) {
106-
providerClient, clientOpts, projectID, err := NewProviderClient(cloud, caCert, logger)
105+
func NewProviderScope(cloud clientconfig.Cloud, regionName string, caCert []byte, logger logr.Logger) (Scope, error) {
106+
providerClient, clientOpts, projectID, err := NewProviderClient(cloud, regionName, caCert, logger)
107107
if err != nil {
108108
return nil, err
109109
}
@@ -115,7 +115,7 @@ func NewProviderScope(cloud clientconfig.Cloud, caCert []byte, logger logr.Logge
115115
}, nil
116116
}
117117

118-
func NewCachedProviderScope(cache *cache.LRUExpireCache, cloud clientconfig.Cloud, caCert []byte, logger logr.Logger) (Scope, error) {
118+
func NewCachedProviderScope(cache *cache.LRUExpireCache, cloud clientconfig.Cloud, regionName string, caCert []byte, logger logr.Logger) (Scope, error) {
119119
key, err := getScopeCacheKey(cloud)
120120
if err != nil {
121121
return nil, fmt.Errorf("compute cloud config cache key: %w", err)
@@ -126,7 +126,7 @@ func NewCachedProviderScope(cache *cache.LRUExpireCache, cloud clientconfig.Clou
126126
return scope.(Scope), nil
127127
}
128128

129-
scope, err := NewProviderScope(cloud, caCert, logger)
129+
scope, err := NewProviderScope(cloud, regionName, caCert, logger)
130130
if err != nil {
131131
return nil, err
132132
}
@@ -175,18 +175,20 @@ func (s *providerScope) ExtractToken() (*tokens.Token, error) {
175175
return tokens.Get(context.TODO(), client, s.providerClient.Token()).ExtractToken()
176176
}
177177

178-
func NewProviderClient(cloud clientconfig.Cloud, caCert []byte, logger logr.Logger) (*gophercloud.ProviderClient, *clientconfig.ClientOpts, string, error) {
178+
func NewProviderClient(cloud clientconfig.Cloud, regionName string, caCert []byte, logger logr.Logger) (*gophercloud.ProviderClient, *clientconfig.ClientOpts, string, error) {
179179
clientOpts := new(clientconfig.ClientOpts)
180180

181181
// We explicitly disable reading auth data from env variables by setting an invalid EnvPrefix.
182182
// By doing this, we make sure that the data from clouds.yaml is enough to authenticate.
183183
// For more information: https://github.com/gophercloud/utils/v2/blob/8677e053dcf1f05d0fa0a616094aace04690eb94/openstack/clientconfig/requests.go#L508
184184
clientOpts.EnvPrefix = "NO_ENV_VARIABLES_"
185-
185+
if regionName == "" {
186+
regionName = cloud.RegionName
187+
}
186188
if cloud.AuthInfo != nil {
187189
clientOpts.AuthInfo = cloud.AuthInfo
188190
clientOpts.AuthType = cloud.AuthType
189-
clientOpts.RegionName = cloud.RegionName
191+
clientOpts.RegionName = regionName
190192
clientOpts.EndpointType = cloud.EndpointType
191193
}
192194

test/e2e/shared/openstack.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ func getProviderClient(e2eCtx *E2EContext, openstackCloud string) (*gophercloud.
667667
clouds := getParsedOpenStackCloudYAML(openStackCloudYAMLFile)
668668
cloud := clouds.Clouds[openstackCloud]
669669

670-
providerClient, clientOpts, projectID, err := scope.NewProviderClient(cloud, nil, logr.Discard())
670+
providerClient, clientOpts, projectID, err := scope.NewProviderClient(cloud, "", nil, logr.Discard())
671671
if err != nil {
672672
return nil, nil, nil, err
673673
}

0 commit comments

Comments
 (0)