Skip to content

Commit e2cf5fa

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

2 files changed

Lines changed: 62 additions & 16 deletions

File tree

internal/controllers/registeredlimit/actuator.go

Lines changed: 56 additions & 13 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,67 @@ 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+
RegionID: ptr.Deref(resourceSpec.RegionID, ""),
95+
ServiceID: ptr.Deref(service.Status.ID, ""),
7996
}
8097

81-
return actuator.osClient.ListRegisteredLimits(ctx, listOpts), true
98+
return actuator.listOSResources(ctx, filters, listOpts), true
8299
}
83100

84101
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
102+
var reconcileStatus progress.ReconcileStatus
103+
104+
service, rs := dependency.FetchDependency[*orcv1alpha1.Service](
105+
ctx, actuator.k8sClient, obj.Namespace, filter.ServiceRef, "Service",
106+
orcv1alpha1.IsAvailable,
107+
)
108+
reconcileStatus = reconcileStatus.WithReconcileStatus(rs)
109+
110+
if needsReschedule, _ := reconcileStatus.NeedsReschedule(); needsReschedule {
111+
return nil, reconcileStatus
112+
}
113+
114+
var filters []osclients.ResourceFilter[osResourceT]
115+
116+
// Add client-side filters
117+
if filter.Description != nil {
118+
filters = append(filters, func(f *registeredlimits.RegisteredLimit) bool {
119+
return f.Description == *filter.Description
120+
})
121+
}
88122

89123
listOpts := registeredlimits.ListOpts{
90-
// TODO(scaffolding): Add import filters
124+
ResourceName: ptr.Deref(filter.ResourceName, ""),
125+
RegionID: ptr.Deref(filter.RegionID, ""),
126+
ServiceID: ptr.Deref(service.Status.ID, ""),
91127
}
92128

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

96137
func (actuator registeredlimitActuator) CreateResource(ctx context.Context, obj orcObjectPT) (*osResourceT, progress.ReconcileStatus) {
@@ -115,9 +156,11 @@ func (actuator registeredlimitActuator) CreateResource(ctx context.Context, obj
115156
return nil, reconcileStatus
116157
}
117158
createOpts := registeredlimits.CreateOpts{
118-
Description: ptr.Deref(resource.Description, ""),
119-
ServiceID: serviceID,
120-
// TODO(scaffolding): Add more fields
159+
ServiceID: serviceID,
160+
ResourceName: resource.ResourceName,
161+
DefaultLimit: resource.DefaultLimit,
162+
Description: ptr.Deref(resource.Description, ""),
163+
RegionID: ptr.Deref(resource.RegionID, ""),
121164
}
122165
batchCreateOpts := registeredlimits.BatchCreateOpts{
123166
createOpts,

internal/controllers/registeredlimit/status.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,13 @@ 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)
53+
WithServiceID(osResource.ServiceID).
54+
WithDefaultLimit(osResource.DefaultLimit).
55+
WithResourceName(osResource.ResourceName)
5456

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
57+
if osResource.RegionID != "" {
58+
resourceStatus.WithRegionID(osResource.RegionID)
59+
}
5760

5861
if osResource.Description != "" {
5962
resourceStatus.WithDescription(osResource.Description)

0 commit comments

Comments
 (0)