Skip to content

Commit ae527bb

Browse files
committed
feat(manager): add region to openStackMachineSpec.ProviderID field from crd identityRef
To made CAPO compatible with OCCM multi-cloud deployment we need to manage providerID format with region code as introduced [here](kubernetes/cloud-provider-openstack#1900) (`openstack://region/instance_uuid`). Add Region field to OpenStackIdentityReference type to define region name in providerID string. If specified, it overrides any value in clouds.yaml. An empty or undefined Region field permit to be fully backward compatible. Signed-off-by: MatthieuFin <[email protected]>
1 parent 91b7ccf commit ae527bb

18 files changed

+141
-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
@@ -28,6 +28,13 @@ type OpenStackIdentityReference struct {
2828
// CloudName specifies the name of the entry in the clouds.yaml file to use.
2929
// +kubebuilder:validation:Required
3030
CloudName string `json:"cloudName"`
31+
32+
// Region specifies an OpenStack region to use. If specified, it overrides
33+
// any value in clouds.yaml. If specified for an OpenStackMachine, its
34+
// value will be included in providerID.
35+
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="region is immutable"
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: 18 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: 18 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: 9 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: 9 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: 9 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: 9 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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ 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+
openStackMachine.Spec.ProviderID = ptr.To(fmt.Sprintf("openstack://%s/%s", openStackMachine.Spec.IdentityRef.Region, *openStackServer.Status.InstanceID))
426426
openStackMachine.Status.InstanceID = openStackServer.Status.InstanceID
427427
openStackMachine.Status.Ready = true
428428
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)