Skip to content

Commit 3ccf17c

Browse files
committed
RegisteredLimit Actuator mutability
On-behalf-of: SAP nils.gondermann@sap.com
1 parent 1d30f13 commit 3ccf17c

4 files changed

Lines changed: 78 additions & 14 deletions

File tree

api/v1alpha1/registeredlimit_types.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,18 @@ type RegisteredLimitResourceSpec struct {
2626

2727
// serviceRef is a reference to the ORC Service which this resource is associated with.
2828
// +required
29-
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="serviceRef is immutable"
3029
ServiceRef KubernetesNameRef `json:"serviceRef,omitempty"`
3130

3231
// resourceName is name of the resource to be limited.
3332
// +kubebuilder:validation:MinLength:=1
3433
// +kubebuilder:validation:MaxLength:=255
3534
// +required
36-
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="resourceName is immutable"
3735
ResourceName string `json:"resourceName,omitempty"`
3836

3937
// defaultLimit is limit of the specified resource in the given context.
4038
// +kubebuilder:validation:Minimum=-1
4139
// +kubebuilder:validation:Maximum=2147483647
4240
// +required
43-
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="defaultLimit is immutable"
4441
DefaultLimit *int32 `json:"defaultLimit,omitempty"`
4542
}
4643

config/crd/bases/openstack.k-orc.cloud_registeredlimits.yaml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,6 @@ spec:
162162
maximum: 2147483647
163163
minimum: -1
164164
type: integer
165-
x-kubernetes-validations:
166-
- message: defaultLimit is immutable
167-
rule: self == oldSelf
168165
description:
169166
description: description is a human-readable description for the
170167
resource.
@@ -176,18 +173,12 @@ spec:
176173
maxLength: 255
177174
minLength: 1
178175
type: string
179-
x-kubernetes-validations:
180-
- message: resourceName is immutable
181-
rule: self == oldSelf
182176
serviceRef:
183177
description: serviceRef is a reference to the ORC Service which
184178
this resource is associated with.
185179
maxLength: 253
186180
minLength: 1
187181
type: string
188-
x-kubernetes-validations:
189-
- message: serviceRef is immutable
190-
rule: self == oldSelf
191182
required:
192183
- defaultLimit
193184
- resourceName

internal/controllers/registeredlimit/actuator.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,9 @@ func (actuator registeredlimitActuator) updateResource(ctx context.Context, obj
190190
updateOpts := registeredlimits.UpdateOpts{}
191191

192192
handleDescriptionUpdate(&updateOpts, resource, osResource)
193-
194-
// TODO(scaffolding): add handler for all fields supporting mutability
193+
handleResourceNameUpdate(&updateOpts, resource, osResource)
194+
handleDefaultLimitUpdate(&updateOpts, resource, osResource)
195+
handleServiceUpdate(&updateOpts, resource, osResource)
195196

196197
needsUpdate, err := needsUpdate(updateOpts)
197198
if err != nil {
@@ -236,6 +237,27 @@ func handleDescriptionUpdate(updateOpts *registeredlimits.UpdateOpts, resource *
236237
}
237238
}
238239

240+
func handleResourceNameUpdate(updateOpts *registeredlimits.UpdateOpts, resource *resourceSpecT, osResource *osResourceT) {
241+
resourceName := resource.ResourceName
242+
if osResource.ResourceName != resourceName {
243+
updateOpts.ResourceName = resourceName
244+
}
245+
}
246+
247+
func handleDefaultLimitUpdate(updateOpts *registeredlimits.UpdateOpts, resource *resourceSpecT, osResource *osResourceT) {
248+
defaultLimit := int(resource.DefaultLimit)
249+
if osResource.DefaultLimit != defaultLimit {
250+
updateOpts.DefaultLimit = &defaultLimit
251+
}
252+
}
253+
254+
func handleServiceUpdate(updateOpts *registeredlimits.UpdateOpts, resource *resourceSpecT, osResource *osResourceT) {
255+
serviceRef := resource.ServiceRef
256+
if osResource.ServiceID != string(serviceRef) {
257+
updateOpts.ServiceID = string(serviceRef)
258+
}
259+
}
260+
239261
func (actuator registeredlimitActuator) GetResourceReconcilers(ctx context.Context, orcObject orcObjectPT, osResource *osResourceT, controller interfaces.ResourceController) ([]resourceReconciler, progress.ReconcileStatus) {
240262
return []resourceReconciler{
241263
actuator.updateResource,

internal/controllers/registeredlimit/actuator_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,60 @@ func TestNeedsUpdate(t *testing.T) {
5252
}
5353
}
5454

55+
func TestHandleResourceNameUpdate(t *testing.T) {
56+
testCases := []struct {
57+
name string
58+
newValue *string
59+
existingValue string
60+
expectChange bool
61+
}{
62+
{name: "Identical", newValue: ptr.To("same-resourceName"), existingValue: "same-resourceName", expectChange: false},
63+
{name: "Different", newValue: ptr.To("new-resourceName"), existingValue: "same-resourceName", expectChange: true},
64+
}
65+
66+
for _, tt := range testCases {
67+
t.Run(tt.name, func(t *testing.T) {
68+
resource := &orcv1alpha1.RegisteredLimitResourceSpec{ResourceName: ptr.Deref(tt.newValue, "")}
69+
osResource := &osResourceT{ResourceName: tt.existingValue}
70+
71+
updateOpts := registeredlimits.UpdateOpts{}
72+
handleResourceNameUpdate(&updateOpts, resource, osResource)
73+
74+
got, _ := needsUpdate(updateOpts)
75+
if got != tt.expectChange {
76+
t.Errorf("Expected change: %v, got: %v", tt.expectChange, got)
77+
}
78+
})
79+
}
80+
}
81+
82+
func TestHandleDefaultLimitUpdate(t *testing.T) {
83+
testCases := []struct {
84+
name string
85+
newValue int
86+
existingValue int
87+
expectChange bool
88+
}{
89+
{name: "Identical", newValue: 1, existingValue: 1, expectChange: false},
90+
{name: "Different", newValue: 2, existingValue: 1, expectChange: true},
91+
}
92+
93+
for _, tt := range testCases {
94+
t.Run(tt.name, func(t *testing.T) {
95+
resource := &orcv1alpha1.RegisteredLimitResourceSpec{DefaultLimit: int32(tt.newValue)}
96+
osResource := &osResourceT{DefaultLimit: tt.existingValue}
97+
98+
updateOpts := registeredlimits.UpdateOpts{}
99+
handleDefaultLimitUpdate(&updateOpts, resource, osResource)
100+
101+
got, _ := needsUpdate(updateOpts)
102+
if got != tt.expectChange {
103+
t.Errorf("Expected change: %v, got: %v", tt.expectChange, got)
104+
}
105+
})
106+
}
107+
}
108+
55109
func TestHandleDescriptionUpdate(t *testing.T) {
56110
ptrToDescription := ptr.To[string]
57111
testCases := []struct {

0 commit comments

Comments
 (0)