@@ -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
84100func (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
96135func (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 }
0 commit comments