Skip to content

Commit 300c45c

Browse files
authored
Merge pull request #1924 from shiftstack/filter_convert
🌱 Move filter conversions out of /api
2 parents 4ece380 + d33fee8 commit 300c45c

File tree

13 files changed

+129
-264
lines changed

13 files changed

+129
-264
lines changed

api/v1alpha6/filter_convert.go

Lines changed: 0 additions & 53 deletions
This file was deleted.

api/v1beta1/conversion.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"strings"
21+
2022
"k8s.io/utils/pointer"
2123
)
2224

@@ -69,3 +71,47 @@ func LegacyCalicoSecurityGroupRules() []SecurityGroupRuleSpec {
6971
},
7072
}
7173
}
74+
75+
// splitTags splits a comma separated list of tags into a slice of tags.
76+
// If the input is an empty string, it returns nil representing no list rather
77+
// than an empty list.
78+
func splitTags(tags string) []NeutronTag {
79+
if tags == "" {
80+
return nil
81+
}
82+
83+
var ret []NeutronTag
84+
for _, tag := range strings.Split(tags, ",") {
85+
if tag != "" {
86+
ret = append(ret, NeutronTag(tag))
87+
}
88+
}
89+
90+
return ret
91+
}
92+
93+
// JoinTags joins a slice of tags into a comma separated list of tags.
94+
func JoinTags(tags []NeutronTag) string {
95+
var b strings.Builder
96+
for i := range tags {
97+
if i > 0 {
98+
b.WriteString(",")
99+
}
100+
b.WriteString(string(tags[i]))
101+
}
102+
return b.String()
103+
}
104+
105+
func ConvertAllTagsTo(tags, tagsAny, notTags, notTagsAny string, neutronTags *FilterByNeutronTags) {
106+
neutronTags.Tags = splitTags(tags)
107+
neutronTags.TagsAny = splitTags(tagsAny)
108+
neutronTags.NotTags = splitTags(notTags)
109+
neutronTags.NotTagsAny = splitTags(notTagsAny)
110+
}
111+
112+
func ConvertAllTagsFrom(neutronTags *FilterByNeutronTags, tags, tagsAny, notTags, notTagsAny *string) {
113+
*tags = JoinTags(neutronTags.Tags)
114+
*tagsAny = JoinTags(neutronTags.TagsAny)
115+
*notTags = JoinTags(neutronTags.NotTags)
116+
*notTagsAny = JoinTags(neutronTags.NotTagsAny)
117+
}

api/v1beta1/filter_convert.go

Lines changed: 0 additions & 147 deletions
This file was deleted.

api/v1beta1/types.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ type NetworkFilter struct {
9393
FilterByNeutronTags `json:",inline"`
9494
}
9595

96+
func (networkFilter *NetworkFilter) IsEmpty() bool {
97+
return networkFilter.Name == "" &&
98+
networkFilter.Description == "" &&
99+
networkFilter.ProjectID == "" &&
100+
networkFilter.ID == "" &&
101+
len(networkFilter.Tags) == 0 &&
102+
len(networkFilter.TagsAny) == 0 &&
103+
len(networkFilter.NotTags) == 0 &&
104+
len(networkFilter.NotTagsAny) == 0
105+
}
106+
96107
type SubnetFilter struct {
97108
Name string `json:"name,omitempty"`
98109
Description string `json:"description,omitempty"`

controllers/openstackcluster_controller.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import (
5353
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
5454
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
5555
utils "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/controllers"
56+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/filterconvert"
5657
)
5758

5859
const (
@@ -633,7 +634,7 @@ func reconcilePreExistingNetworkComponents(scope *scope.WithLogger, networkingSe
633634
}
634635

635636
if !openStackCluster.Spec.Network.IsEmpty() {
636-
netOpts := openStackCluster.Spec.Network.ToListOpt()
637+
netOpts := filterconvert.NetworkFilterToListOpts(&openStackCluster.Spec.Network)
637638
networkList, err := networkingService.GetNetworksByFilter(&netOpts)
638639
if err != nil {
639640
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find network: %w", err))
@@ -859,10 +860,10 @@ func getClusterSubnets(networkingService *networking.Service, openStackCluster *
859860
return nil, fmt.Errorf("no network or subnets specified in OpenStackCluster spec")
860861
}
861862

862-
empty := &infrav1.SubnetFilter{}
863-
listOpt := empty.ToListOpt()
864-
listOpt.NetworkID = networkID
865-
clusterSubnets, err = networkingService.GetSubnetsByFilter(listOpt)
863+
listOpts := subnets.ListOpts{
864+
NetworkID: networkID,
865+
}
866+
clusterSubnets, err = networkingService.GetSubnetsByFilter(listOpts)
866867
if err != nil {
867868
err = fmt.Errorf("failed to find subnets: %w", err)
868869
if errors.Is(err, networking.ErrFilterMatch) {

controllers/openstackfloatingippool_controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
4646
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
4747
"sigs.k8s.io/cluster-api-provider-openstack/pkg/scope"
48+
filterconvert "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/filterconvert/v1alpha7"
4849
)
4950

5051
const (
@@ -401,7 +402,7 @@ func (r *OpenStackFloatingIPPoolReconciler) reconcileFloatingIPNetwork(scope *sc
401402
}
402403

403404
netListOpts := external.ListOptsExt{
404-
ListOptsBuilder: pool.Spec.FloatingIPNetwork.ToListOpt(),
405+
ListOptsBuilder: filterconvert.NetworkFilterToListOpt(&pool.Spec.FloatingIPNetwork),
405406
External: pointer.Bool(true),
406407
}
407408

pkg/cloud/services/compute/instance.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"sigs.k8s.io/cluster-api-provider-openstack/pkg/clients"
3838
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
3939
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
40+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/filterconvert"
4041
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/hash"
4142
)
4243

@@ -336,7 +337,8 @@ func (s *Service) GetImageID(image infrav1.ImageFilter) (string, error) {
336337
return image.ID, nil
337338
}
338339

339-
allImages, err := s.getImageClient().ListImages(image.ToListOpt())
340+
listOpts := filterconvert.ImageFilterToListOpts(&image)
341+
allImages, err := s.getImageClient().ListImages(listOpts)
340342
if err != nil {
341343
return "", err
342344
}

pkg/cloud/services/networking/network.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
3030
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
3131
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
32+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/filterconvert"
3233
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/names"
3334
)
3435

@@ -77,7 +78,6 @@ func (c createOpts) ToNetworkCreateMap() (map[string]interface{}, error) {
7778
// - the user has set OpenStackCluster.Spec.DisableExternalNetwork to true.
7879
func (s *Service) ReconcileExternalNetwork(openStackCluster *infrav1.OpenStackCluster) error {
7980
var listOpts external.ListOptsExt
80-
var emptyExternalnetwork infrav1.NetworkFilter
8181
var isAutoDetecting bool
8282

8383
if openStackCluster.Spec.DisableExternalNetwork {
@@ -86,9 +86,10 @@ func (s *Service) ReconcileExternalNetwork(openStackCluster *infrav1.OpenStackCl
8686
return nil
8787
}
8888

89-
if openStackCluster.Spec.ExternalNetwork.ToListOpt() != emptyExternalnetwork.ToListOpt() {
89+
externalNetworkListOpts := filterconvert.NetworkFilterToListOpts(&openStackCluster.Spec.ExternalNetwork)
90+
if externalNetworkListOpts != (networks.ListOpts{}) {
9091
listOpts = external.ListOptsExt{
91-
ListOptsBuilder: openStackCluster.Spec.ExternalNetwork.ToListOpt(),
92+
ListOptsBuilder: externalNetworkListOpts,
9293
}
9394
} else {
9495
// ExternalNetwork is not given so we'll list all networks and filter for external networks
@@ -345,16 +346,17 @@ func (s *Service) GetSubnetsByFilter(opts subnets.ListOptsBuilder) ([]subnets.Su
345346
// GetSubnetByFilter gets a single subnet specified by the given SubnetFilter.
346347
// It returns an ErrFilterMatch if no or multiple subnets are found.
347348
func (s *Service) GetSubnetByFilter(filter *infrav1.SubnetFilter) (*subnets.Subnet, error) {
348-
return s.getSubnetByFilter(filter.ToListOpt())
349+
listOpts := filterconvert.SubnetFilterToListOpts(filter)
350+
return s.getSubnetByFilter(listOpts)
349351
}
350352

351353
// GetNetworkSubnetByFilter gets a single subnet of the given network, specified by the given SubnetFilter.
352354
// It returns an ErrFilterMatch if no or multiple subnets are found.
353355
func (s *Service) GetNetworkSubnetByFilter(networkID string, filter *infrav1.SubnetFilter) (*subnets.Subnet, error) {
354-
listOpt := filter.ToListOpt()
355-
listOpt.NetworkID = networkID
356+
listOpts := filterconvert.SubnetFilterToListOpts(filter)
357+
listOpts.NetworkID = networkID
356358

357-
return s.getSubnetByFilter(listOpt)
359+
return s.getSubnetByFilter(listOpts)
358360
}
359361

360362
// getSubnetByFilter gets a single subnet specified by the given gophercloud ListOpts.

0 commit comments

Comments
 (0)