@@ -70,30 +70,72 @@ func (actuator volumetypeActuator) ListOSResourcesForAdoption(ctx context.Contex
7070 return nil , false
7171 }
7272
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
73+ var filters []osclients.ResourceFilter [osResourceT ]
74+
75+ // NOTE: The API doesn't allow filtering by name or description, we'll have to do it client-side.
76+ filters = append (filters ,
77+ func (f * volumetypes.VolumeType ) bool {
78+ name := getResourceName (orcObject )
79+ // Compare non-pointer values
80+ return f .Name == name
81+ },
82+ )
83+ if resourceSpec .Description != nil {
84+ filters = append (filters , func (f * volumetypes.VolumeType ) bool {
85+ return f .Description == * resourceSpec .Description
86+ })
87+ }
88+
89+ isPublic := volumetypes .VisibilityDefault
90+ if resourceSpec .IsPublic != nil {
91+ if * resourceSpec .IsPublic {
92+ isPublic = volumetypes .VisibilityPublic
93+ } else {
94+ isPublic = volumetypes .VisibilityPrivate
95+ }
96+ }
7697
7798 listOpts := volumetypes.ListOpts {
78- Name : getResourceName (orcObject ),
79- Description : ptr .Deref (resourceSpec .Description , "" ),
99+ IsPublic : isPublic ,
80100 }
81101
82- return actuator .osClient . ListVolumeTypes (ctx , listOpts ), true
102+ return actuator .listOSResources (ctx , filters , listOpts ), true
83103}
84104
85105func (actuator volumetypeActuator ) ListOSResourcesForImport (ctx context.Context , obj orcObjectPT , filter filterT ) (iter.Seq2 [* osResourceT , error ], progress.ReconcileStatus ) {
86- // TODO(scaffolding) If you need to filter resources on fields that the List() function
87- // of gophercloud does not support, it's possible to perform client-side filtering.
88- // Check osclients.ResourceFilter
106+ var filters []osclients.ResourceFilter [osResourceT ]
107+
108+ // NOTE: The API doesn't allow filtering by name or description, we'll have to do it client-side.
109+ if filter .Name != nil {
110+ filters = append (filters , func (f * volumetypes.VolumeType ) bool {
111+ return f .Name == string (* filter .Name )
112+ })
113+ }
114+ if filter .Description != nil {
115+ filters = append (filters , func (f * volumetypes.VolumeType ) bool {
116+ return f .Description == * filter .Description
117+ })
118+ }
119+
120+ isPublic := volumetypes .VisibilityDefault
121+ if filter .IsPublic != nil {
122+ if * filter .IsPublic {
123+ isPublic = volumetypes .VisibilityPublic
124+ } else {
125+ isPublic = volumetypes .VisibilityPrivate
126+ }
127+ }
89128
90129 listOpts := volumetypes.ListOpts {
91- Name : string (ptr .Deref (filter .Name , "" )),
92- Description : string (ptr .Deref (filter .Description , "" )),
93- // TODO(scaffolding): Add more import filters
130+ IsPublic : isPublic ,
94131 }
95132
96- return actuator .osClient .ListVolumeTypes (ctx , listOpts ), nil
133+ return actuator .listOSResources (ctx , filters , listOpts ), nil
134+ }
135+
136+ func (actuator volumetypeActuator ) listOSResources (ctx context.Context , filters []osclients.ResourceFilter [osResourceT ], listOpts volumetypes.ListOptsBuilder ) iter.Seq2 [* volumetypes.VolumeType , error ] {
137+ volumetypes := actuator .osClient .ListVolumeTypes (ctx , listOpts )
138+ return osclients .Filter (volumetypes , filters ... )
97139}
98140
99141func (actuator volumetypeActuator ) CreateResource (ctx context.Context , obj orcObjectPT ) (* osResourceT , progress.ReconcileStatus ) {
@@ -107,7 +149,8 @@ func (actuator volumetypeActuator) CreateResource(ctx context.Context, obj orcOb
107149 createOpts := volumetypes.CreateOpts {
108150 Name : getResourceName (obj ),
109151 Description : ptr .Deref (resource .Description , "" ),
110- // TODO(scaffolding): Add more fields
152+ IsPublic : resource .IsPublic ,
153+ ExtraSpecs : resource .ExtraSpecs ,
111154 }
112155
113156 osResource , err := actuator .osClient .CreateVolumeType (ctx , createOpts )
@@ -139,6 +182,7 @@ func (actuator volumetypeActuator) updateResource(ctx context.Context, obj orcOb
139182
140183 handleNameUpdate (& updateOpts , obj , osResource )
141184 handleDescriptionUpdate (& updateOpts , resource , osResource )
185+ handleIsPublicUpdate (& updateOpts , resource , osResource )
142186
143187 needsUpdate , err := needsUpdate (updateOpts )
144188 if err != nil {
@@ -192,6 +236,14 @@ func handleDescriptionUpdate(updateOpts *volumetypes.UpdateOpts, resource *resou
192236 }
193237}
194238
239+ func handleIsPublicUpdate (updateOpts * volumetypes.UpdateOpts , resource * resourceSpecT , osResource * osResourceT ) {
240+ // Default is true
241+ isPublic := ptr .Deref (resource .IsPublic , true )
242+ if osResource .IsPublic != isPublic {
243+ updateOpts .IsPublic = & isPublic
244+ }
245+ }
246+
195247func (actuator volumetypeActuator ) GetResourceReconcilers (ctx context.Context , orcObject orcObjectPT , osResource * osResourceT , controller interfaces.ResourceController ) ([]resourceReconciler , progress.ReconcileStatus ) {
196248 return []resourceReconciler {
197249 actuator .updateResource ,
0 commit comments