forked from openshift/openstack-test
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbz_2073398.go
More file actions
147 lines (118 loc) · 5.73 KB
/
Copy pathbz_2073398.go
File metadata and controls
147 lines (118 loc) · 5.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package openstack
import (
"encoding/json"
"fmt"
"strings"
g "github.com/onsi/ginkgo/v2"
o "github.com/onsi/gomega"
configv1 "github.com/openshift/api/config/v1"
machinev1alpha1 "github.com/openshift/api/machine/v1alpha1"
machinev1 "github.com/openshift/api/machine/v1beta1"
framework "github.com/openshift/cluster-api-actuator-pkg/pkg/framework"
"github.com/openshift/openstack-test/test/extended/openstack/client"
yaml "gopkg.in/yaml.v3"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
e2e "k8s.io/kubernetes/test/e2e/framework"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
"github.com/gophercloud/gophercloud/v2"
"github.com/gophercloud/gophercloud/v2/openstack"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
)
var _ = g.Describe("[sig-installer][Suite:openshift/openstack] Bugfix", func() {
defer g.GinkgoRecover()
var dc dynamic.Interface
var clientSet *kubernetes.Clientset
var networkClient *gophercloud.ServiceClient
g.BeforeEach(func(ctx g.SpecContext) {
g.By("preparing openshift dynamic client")
cfg, err := e2e.LoadConfig()
o.Expect(err).NotTo(o.HaveOccurred())
dc, err = dynamic.NewForConfig(cfg)
o.Expect(err).NotTo(o.HaveOccurred())
clientSet, err = e2e.LoadClientset()
o.Expect(err).NotTo(o.HaveOccurred())
skipUnlessMachineAPIOperator(ctx, dc, clientSet.CoreV1().Namespaces())
g.By("preparing the openstack client")
networkClient, err = client.GetServiceClient(ctx, openstack.NewNetworkV2)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to build the OpenStack client")
})
g.Context("bz_2073398:", func() {
g.It("[Serial] MachineSet scale-in does not leak OpenStack ports", func(ctx g.SpecContext) {
// Check the scenario at https://bugzilla.redhat.com/show_bug.cgi?id=2073398
g.By("Fetching worker machineSets")
var rawBytes []byte
var newProviderSpec machinev1alpha1.OpenstackProviderSpec
var rclient runtimeclient.Client
machineSets, err := getMachineSets(ctx, dc)
o.Expect(err).NotTo(o.HaveOccurred(), "Error getting the workers machinesets")
if len(machineSets) == 0 {
e2eskipper.Skipf("Expects at least one worker machineset. Found none.")
}
cfg, err := e2e.LoadConfig()
o.Expect(err).NotTo(o.HaveOccurred(), "Error getting cluster config")
rclient, err = runtimeclient.New(cfg, runtimeclient.Options{})
o.Expect(err).NotTo(o.HaveOccurred(), "Error creating a runtime client")
err = machinev1.AddToScheme(scheme.Scheme)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to add Machine to scheme")
err = configv1.AddToScheme(scheme.Scheme)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to add Config to scheme")
newMachinesetParams := framework.BuildMachineSetParams(ctx, rclient, 1)
rawBytes, err = json.Marshal(newMachinesetParams.ProviderSpec.Value)
o.Expect(err).NotTo(o.HaveOccurred(), "Error marshaling new MachineSet Provider Spec")
err = json.Unmarshal(rawBytes, &newProviderSpec)
o.Expect(err).NotTo(o.HaveOccurred(), "Error unmarshaling new MachineSet Provider Spec")
newProviderSpec.ServerGroupName = ""
newProviderSpec.ServerGroupID = "boo"
newMachinesetParams.Name = fmt.Sprintf("%v-%v", "bogus", RandomSuffix())
newProviderSpecJson, err := json.Marshal(newProviderSpec)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to marshal new Machineset provider spec")
newMachinesetParams.ProviderSpec.Value.Raw = newProviderSpecJson
g.By("Create a new machineSet with bogus server group ID")
ms, err := framework.CreateMachineSet(rclient, newMachinesetParams)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to create a Machineset")
defer DeleteMachinesetsDefer(rclient, ms)
err = GetMachinesetRetry(ctx, rclient, ms, true)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to get the new Machineset")
err = waitUntilNMachinesPrefix(ctx, dc, ms.Name, 1)
o.Expect(err).NotTo(o.HaveOccurred())
g.By("Deleting the new machineset")
err = framework.DeleteMachineSets(rclient, ms)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to delete Machineset")
err = GetMachinesetRetry(ctx, rclient, ms, false)
o.Expect(errors.IsNotFound(err)).To(o.BeTrue(), "Machineset %v was not deleted", ms.Name)
var config machinev1alpha1.OpenstackProviderSpec
err = yaml.Unmarshal(newProviderSpecJson, &config)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to Unmarshal the new Machineset")
subnetListOpts := subnets.ListOpts{ID: config.PrimarySubnet}
subnetAllPages, err := subnets.List(networkClient, subnetListOpts).AllPages(ctx)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to get subnets")
allSubnets, err := subnets.ExtractSubnets(subnetAllPages)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to extract subnets")
networkID := allSubnets[0].NetworkID
e2e.Logf("Subnet Name: %v", allSubnets[0].Name)
e2e.Logf("Network ID: %v", networkID)
portListOpts := ports.ListOpts{
NetworkID: networkID,
}
g.By("Checking if an orphaned port related to the delete machineset exists")
allPages, err := ports.List(networkClient, portListOpts).AllPages(ctx)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to get ports")
allPorts, err := ports.ExtractPorts(allPages)
o.Expect(err).NotTo(o.HaveOccurred(), "Failed to extract ports")
portID := ""
for _, port := range allPorts {
if strings.Contains(port.Name, newMachinesetParams.Name) {
portID = port.ID
}
}
o.Expect(portID).To(o.Equal(""))
err = waitUntilNMachinesPrefix(ctx, dc, ms.Name, 0)
o.Expect(err).NotTo(o.HaveOccurred(), "Machines from machineset %v were not deleted", ms.Name)
})
})
})