Skip to content

Commit 56c5714

Browse files
authored
Merge pull request #908 from Nordix/test_port_options
🏃 Add test for custom port options feature
2 parents 120db21 + 58e22c8 commit 56c5714

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

test/e2e/shared/openstack.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
3535
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
3636
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
37+
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
3738
"github.com/gophercloud/utils/openstack/clientconfig"
3839
. "github.com/onsi/ginkgo"
3940
. "github.com/onsi/gomega"
@@ -123,6 +124,31 @@ func dumpOpenStackImages(providerClient *gophercloud.ProviderClient, clientOpts
123124
return nil
124125
}
125126

127+
func DumpOpenStackPorts(e2eCtx *E2EContext, filter ports.ListOpts) (*[]ports.Port, error) {
128+
providerClient, clientOpts, err := getProviderClient(e2eCtx)
129+
if err != nil {
130+
_, _ = fmt.Fprintf(GinkgoWriter, "error creating provider client: %s\n", err)
131+
return nil, err
132+
}
133+
134+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
135+
Region: clientOpts.RegionName,
136+
})
137+
if err != nil {
138+
return nil, fmt.Errorf("error creating network client: %s", err)
139+
}
140+
141+
allPages, err := ports.List(networkClient, filter).AllPages()
142+
if err != nil {
143+
return nil, fmt.Errorf("error getting ports: %s", err)
144+
}
145+
portsList, err := ports.ExtractPorts(allPages)
146+
if err != nil {
147+
return nil, fmt.Errorf("error extracting ports: %s", err)
148+
}
149+
return &portsList, nil
150+
}
151+
126152
// getOpenStackServers gets all OpenStack servers at once, to save on DescribeInstances
127153
// calls.
128154
func getOpenStackServers(e2eCtx *E2EContext) (map[string]server, error) {

test/e2e/suites/e2e/e2e_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ import (
2323
"errors"
2424
"fmt"
2525
"path/filepath"
26+
"reflect"
2627
"strings"
2728
"time"
2829

30+
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
2931
. "github.com/onsi/ginkgo"
3032
. "github.com/onsi/gomega"
3133
appsv1 "k8s.io/api/apps/v1"
@@ -129,6 +131,47 @@ var _ = Describe("e2e tests", func() {
129131
})
130132

131133
Describe("Workload cluster (without lb)", func() {
134+
It("Should create port(s) with custom options", func() {
135+
shared.Byf("Creating a cluster")
136+
clusterName := fmt.Sprintf("cluster-%s", namespace.Name)
137+
configCluster := defaultConfigCluster(clusterName, namespace.Name)
138+
configCluster.ControlPlaneMachineCount = pointer.Int64Ptr(1)
139+
configCluster.WorkerMachineCount = pointer.Int64Ptr(1)
140+
configCluster.Flavor = shared.FlavorDefault
141+
_ = createCluster(ctx, configCluster, specName)
142+
143+
shared.Byf("Creating MachineDeployment with custom port options")
144+
md3Name := clusterName + "-md-3"
145+
customPortOptions := &[]infrav1.PortOpts{
146+
{Description: "primary"},
147+
}
148+
framework.CreateMachineDeployment(ctx, framework.CreateMachineDeploymentInput{
149+
Creator: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
150+
MachineDeployment: makeMachineDeployment(namespace.Name, md3Name, clusterName, "", 1),
151+
BootstrapConfigTemplate: makeJoinBootstrapConfigTemplate(namespace.Name, md3Name),
152+
InfraMachineTemplate: makeOpenStackMachineTemplateWithPortOptions(namespace.Name, clusterName, md3Name, customPortOptions),
153+
})
154+
155+
shared.Byf("Expecting MachineDeployment to be created successfully")
156+
Eventually(func() bool {
157+
eventList := getEvents(namespace.Name)
158+
portError := "Failed to create server with custom port options"
159+
return isErrorEventExists(namespace.Name, md3Name, "FailedCreateServer", portError, eventList)
160+
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-worker-nodes")...).Should(BeFalse())
161+
162+
filterNone := ports.ListOpts{}
163+
plist1, err := shared.DumpOpenStackPorts(e2eCtx, filterNone)
164+
Expect(err).To(BeNil())
165+
Expect(plist1).NotTo(BeNil())
166+
167+
filterOne := ports.ListOpts{Description: "primary"}
168+
plist2, err := shared.DumpOpenStackPorts(e2eCtx, filterOne)
169+
Expect(err).To(BeNil())
170+
count := len(*plist2)
171+
Expect(count).To(Equal(1))
172+
found := portContainsProperty(*plist2, "Description", "primary")
173+
Expect(found).Should(BeTrue())
174+
})
132175
It("It should be creatable and deletable", func() {
133176
shared.Byf("Creating a cluster")
134177
clusterName := fmt.Sprintf("cluster-%s", namespace.Name)
@@ -294,6 +337,29 @@ func makeOpenStackMachineTemplate(namespace, clusterName, name string, subnetID
294337
}
295338
}
296339

340+
func makeOpenStackMachineTemplateWithPortOptions(namespace, clusterName, name string, portOpts *[]infrav1.PortOpts) *infrav1.OpenStackMachineTemplate {
341+
return &infrav1.OpenStackMachineTemplate{
342+
ObjectMeta: metav1.ObjectMeta{
343+
Name: name,
344+
Namespace: namespace,
345+
},
346+
Spec: infrav1.OpenStackMachineTemplateSpec{
347+
Template: infrav1.OpenStackMachineTemplateResource{
348+
Spec: infrav1.OpenStackMachineSpec{
349+
Flavor: e2eCtx.E2EConfig.GetVariable(shared.OpenStackNodeMachineFlavor),
350+
Image: e2eCtx.E2EConfig.GetVariable(shared.OpenStackImageName),
351+
SSHKeyName: shared.DefaultSSHKeyPairName,
352+
CloudName: e2eCtx.E2EConfig.GetVariable(shared.OpenStackCloud),
353+
CloudsSecret: &corev1.SecretReference{
354+
Name: fmt.Sprintf("%s-cloud-config", clusterName),
355+
},
356+
Ports: *portOpts,
357+
},
358+
},
359+
},
360+
}
361+
}
362+
297363
// makeJoinBootstrapConfigTemplate returns a KubeadmConfigTemplate which can be used
298364
// to test different error cases. As we're missing e.g. the cloud provider conf it cannot
299365
// be used to successfully add nodes to a cluster.
@@ -417,3 +483,19 @@ func isCloudProviderInitialized(taints []corev1.Taint) bool {
417483
}
418484
return true
419485
}
486+
487+
// Verifies that a Port contains a valid property with a correct value.
488+
func portContainsProperty(plist interface{}, property string, value interface{}) bool {
489+
ports := reflect.ValueOf(plist)
490+
portsCount := ports.Len()
491+
for i := 0; i < portsCount; i++ {
492+
currentPort := ports.Index(i)
493+
searchProperty := currentPort.FieldByName(property)
494+
correctValue := searchProperty.Interface() == value
495+
if correctValue {
496+
return true
497+
}
498+
}
499+
// Non-existing property or incorrect value
500+
return false
501+
}

0 commit comments

Comments
 (0)