@@ -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
84101func (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
96137func (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 ,
0 commit comments