Skip to content

Commit e79d1a3

Browse files
committed
RegisteredLimit Actuator and Status
On-behalf-of: SAP nils.gondermann@sap.com
1 parent a52da8a commit e79d1a3

2 files changed

Lines changed: 57 additions & 18 deletions

File tree

internal/controllers/registeredlimit/actuator.go

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/k-orc/openstack-resource-controller/v2/internal/controllers/generic/progress"
3232
"github.com/k-orc/openstack-resource-controller/v2/internal/logging"
3333
"github.com/k-orc/openstack-resource-controller/v2/internal/osclients"
34+
"github.com/k-orc/openstack-resource-controller/v2/internal/util/dependency"
3435
orcerrors "github.com/k-orc/openstack-resource-controller/v2/internal/util/errors"
3536
)
3637

@@ -70,27 +71,65 @@ func (actuator registeredlimitActuator) ListOSResourcesForAdoption(ctx context.C
7071
return nil, false
7172
}
7273

73-
// TODO(scaffolding) If you need to filter resources on fields that the List() function
74-
// of gophercloud does not support, it's possible to perform client-side filtering.
75-
// Check osclients.ResourceFilter
74+
service, _ := dependency.FetchDependency[*orcv1alpha1.Service](
75+
ctx, actuator.k8sClient, orcObject.Namespace, &resourceSpec.ServiceRef, "Service",
76+
orcv1alpha1.IsAvailable,
77+
)
78+
79+
if service.Status.ID == nil {
80+
return nil, false
81+
}
82+
83+
var filters []osclients.ResourceFilter[osResourceT]
84+
85+
// Add client-side filters
86+
if resourceSpec.Description != nil {
87+
filters = append(filters, func(f *registeredlimits.RegisteredLimit) bool {
88+
return f.Description == *resourceSpec.Description
89+
})
90+
}
7691

7792
listOpts := registeredlimits.ListOpts{
78-
// TODO(scaffolding): Add import filters
93+
ResourceName: resourceSpec.ResourceName,
94+
ServiceID: ptr.Deref(service.Status.ID, ""),
7995
}
8096

81-
return actuator.osClient.ListRegisteredLimits(ctx, listOpts), true
97+
return actuator.listOSResources(ctx, filters, listOpts), true
8298
}
8399

84100
func (actuator registeredlimitActuator) ListOSResourcesForImport(ctx context.Context, obj orcObjectPT, filter filterT) (iter.Seq2[*osResourceT, error], progress.ReconcileStatus) {
85-
// TODO(scaffolding) If you need to filter resources on fields that the List() function
86-
// of gophercloud does not support, it's possible to perform client-side filtering.
87-
// Check osclients.ResourceFilter
101+
var reconcileStatus progress.ReconcileStatus
102+
103+
service, rs := dependency.FetchDependency[*orcv1alpha1.Service](
104+
ctx, actuator.k8sClient, obj.Namespace, filter.ServiceRef, "Service",
105+
orcv1alpha1.IsAvailable,
106+
)
107+
reconcileStatus = reconcileStatus.WithReconcileStatus(rs)
108+
109+
if needsReschedule, _ := reconcileStatus.NeedsReschedule(); needsReschedule {
110+
return nil, reconcileStatus
111+
}
112+
113+
var filters []osclients.ResourceFilter[osResourceT]
114+
115+
// Add client-side filters
116+
if filter.Description != nil {
117+
filters = append(filters, func(f *registeredlimits.RegisteredLimit) bool {
118+
return f.Description == *filter.Description
119+
})
120+
}
88121

89122
listOpts := registeredlimits.ListOpts{
90-
// TODO(scaffolding): Add import filters
123+
ResourceName: ptr.Deref(filter.ResourceName, ""),
124+
ServiceID: ptr.Deref(service.Status.ID, ""),
91125
}
92126

93-
return actuator.osClient.ListRegisteredLimits(ctx, listOpts), nil
127+
return actuator.listOSResources(ctx, filters, listOpts), nil
128+
}
129+
130+
func (actuator registeredlimitActuator) listOSResources(ctx context.Context, filters []osclients.ResourceFilter[osResourceT], listOpts registeredlimits.ListOptsBuilder) iter.Seq2[*registeredlimits.RegisteredLimit, error] {
131+
registeredLimits := actuator.osClient.ListRegisteredLimits(ctx, listOpts)
132+
return osclients.Filter(registeredLimits, filters...)
94133
}
95134

96135
func (actuator registeredlimitActuator) CreateResource(ctx context.Context, obj orcObjectPT) (*osResourceT, progress.ReconcileStatus) {
@@ -115,9 +154,10 @@ func (actuator registeredlimitActuator) CreateResource(ctx context.Context, obj
115154
return nil, reconcileStatus
116155
}
117156
createOpts := registeredlimits.CreateOpts{
118-
Description: ptr.Deref(resource.Description, ""),
119-
ServiceID: serviceID,
120-
// TODO(scaffolding): Add more fields
157+
ServiceID: serviceID,
158+
ResourceName: resource.ResourceName,
159+
DefaultLimit: int(*resource.DefaultLimit),
160+
Description: ptr.Deref(resource.Description, ""),
121161
}
122162
batchCreateOpts := registeredlimits.BatchCreateOpts{
123163
createOpts,
@@ -181,7 +221,7 @@ func needsUpdate(updateOpts registeredlimits.UpdateOpts) (bool, error) {
181221
return false, err
182222
}
183223

184-
updateMap, ok := updateOptsMap["registered_limits"].(map[string]any)
224+
updateMap, ok := updateOptsMap["registered_limit"].(map[string]any)
185225
if !ok {
186226
updateMap = make(map[string]any)
187227
}

internal/controllers/registeredlimit/status.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,9 @@ func (registeredlimitStatusWriter) ResourceAvailableStatus(orcObject *orcv1alpha
5050

5151
func (registeredlimitStatusWriter) ApplyResourceStatus(log logr.Logger, osResource *osResourceT, statusApply *statusApplyT) {
5252
resourceStatus := orcapplyconfigv1alpha1.RegisteredLimitResourceStatus().
53-
WithServiceID(osResource.ServiceID)
54-
55-
// TODO(scaffolding): add all of the fields supported in the RegisteredLimitResourceStatus struct
56-
// If a zero-value isn't expected in the response, place it behind a conditional
53+
WithServiceID(osResource.ServiceID).
54+
WithDefaultLimit(int32(osResource.DefaultLimit)).
55+
WithResourceName(osResource.ResourceName)
5756

5857
if osResource.Description != "" {
5958
resourceStatus.WithDescription(osResource.Description)

0 commit comments

Comments
 (0)