@@ -22,14 +22,17 @@ import (
22
22
"net/http"
23
23
"net/http/httptest"
24
24
"reflect"
25
+ "slices"
25
26
"sort"
26
27
"testing"
27
28
28
29
"github.com/gophercloud/gophercloud/v2"
29
30
"github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
30
31
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
31
32
l3floatingips "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
33
+ "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
32
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35
+ "k8s.io/kops/cloudmock/openstack/mocknetworking"
33
36
"k8s.io/kops/pkg/apis/kops"
34
37
"k8s.io/kops/upup/pkg/fi"
35
38
"k8s.io/kops/util/pkg/vfs"
@@ -662,3 +665,114 @@ func Test_BuildClients(t *testing.T) {
662
665
})
663
666
}
664
667
}
668
+
669
+ func setupMockCloudForDeletePortsTest (portDefinitions map [string ]map [string ]int ) (* MockCloud , error ) {
670
+ cloud := InstallMockOpenstackCloud ("mock-central-1" )
671
+ cloud .MockNeutronClient = mocknetworking .CreateClient ()
672
+
673
+ for clusterName , instanceGroups := range portDefinitions {
674
+ for instanceGroup , n := range instanceGroups {
675
+ for i := 0 ; i < n ; i ++ {
676
+ port , err := cloud .CreatePort (ports.CreateOpts {
677
+ Name : fmt .Sprintf ("port-%s-%d-%s" , instanceGroup , i + 1 , clusterName ),
678
+ NetworkID : "mock-network-id" ,
679
+ })
680
+ if err != nil {
681
+ return nil , fmt .Errorf ("error creating port: %v" , err )
682
+ }
683
+
684
+ err = cloud .AppendTag (ResourceTypePort , port .ID , fmt .Sprintf ("%s=%s" , TagClusterName , clusterName ))
685
+ if err != nil {
686
+ return nil , fmt .Errorf ("error appending tag: %v" , err )
687
+ }
688
+ err = cloud .AppendTag (ResourceTypePort , port .ID , fmt .Sprintf ("%s=%s" , TagKopsInstanceGroup , instanceGroup ))
689
+ if err != nil {
690
+ return nil , fmt .Errorf ("error appending tag: %v" , err )
691
+ }
692
+ }
693
+ }
694
+ }
695
+
696
+ return cloud , nil
697
+ }
698
+
699
+ func Test_deletePorts (t * testing.T ) {
700
+ testCases := []struct {
701
+ description string
702
+ clusterName string
703
+ instanceGroup string
704
+ expectedPorts []string
705
+ }{
706
+ {
707
+ description : "Only delete ports of worker IG of my-cluster" ,
708
+ clusterName : "my-cluster" ,
709
+ instanceGroup : "worker" ,
710
+ expectedPorts : []string {
711
+ "port-control-plane-0-1-my-cluster" ,
712
+ "port-worker-2-1-my-cluster" ,
713
+ "port-worker-2-2-my-cluster" ,
714
+ "port-control-plane-0-1-my-cluster-2" ,
715
+ "port-worker-1-my-cluster-2" ,
716
+ "port-worker-2-my-cluster-2" ,
717
+ "port-worker-2-1-my-cluster-2" ,
718
+ "port-worker-2-2-my-cluster-2" ,
719
+ },
720
+ },
721
+ {
722
+ description : "Only delete ports of worker-2 IG of my-cluster" ,
723
+ clusterName : "my-cluster" ,
724
+ instanceGroup : "worker-2" ,
725
+ expectedPorts : []string {
726
+ "port-control-plane-0-1-my-cluster" ,
727
+ "port-worker-1-my-cluster" ,
728
+ "port-worker-2-my-cluster" ,
729
+ "port-control-plane-0-1-my-cluster-2" ,
730
+ "port-worker-1-my-cluster-2" ,
731
+ "port-worker-2-my-cluster-2" ,
732
+ "port-worker-2-1-my-cluster-2" ,
733
+ "port-worker-2-2-my-cluster-2" ,
734
+ },
735
+ },
736
+ }
737
+
738
+ portDefinitions := map [string ]map [string ]int {
739
+ "my-cluster" : map [string ]int {
740
+ "control-plane-0" : 1 ,
741
+ "worker" : 2 ,
742
+ "worker-2" : 2 ,
743
+ },
744
+ "my-cluster-2" : map [string ]int {
745
+ "control-plane-0" : 1 ,
746
+ "worker" : 2 ,
747
+ "worker-2" : 2 ,
748
+ },
749
+ }
750
+
751
+ for _ , testCase := range testCases {
752
+ t .Run (testCase .description , func (t * testing.T ) {
753
+ cloud , err := setupMockCloudForDeletePortsTest (portDefinitions )
754
+ if err != nil {
755
+ t .Errorf ("error while setting up test: %v" , err )
756
+ }
757
+
758
+ deletePorts (cloud , testCase .instanceGroup , testCase .clusterName )
759
+
760
+ allPorts , err := cloud .ListPorts (ports.ListOpts {})
761
+ if err != nil {
762
+ t .Errorf ("error while listing ports: %v" , err )
763
+ }
764
+
765
+ actualPorts := []string {}
766
+ for _ , port := range allPorts {
767
+ actualPorts = append (actualPorts , port .Name )
768
+ }
769
+
770
+ slices .Sort (actualPorts )
771
+ slices .Sort (testCase .expectedPorts )
772
+
773
+ if ! reflect .DeepEqual (actualPorts , testCase .expectedPorts ) {
774
+ t .Errorf ("ports differ: expected\n %+#v\n \t got:\n %+#v\n " , testCase .expectedPorts , actualPorts )
775
+ }
776
+ })
777
+ }
778
+ }
0 commit comments