Skip to content

Commit 05a76a1

Browse files
committed
Update e2e tests with QoS policy
Update the e2e tests to add coverage for port with QoS policy set. For this: - enable q-qos neutron plugin on ci devstack - update multi-network scenario to add qos policies using ID and filter
1 parent 122c32d commit 05a76a1

File tree

4 files changed

+116
-3
lines changed

4 files changed

+116
-3
lines changed

hack/ci/cloud-init/controller.yaml.tpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
# Neutron
4040
enable_plugin neutron https://github.com/openstack/neutron stable/${OPENSTACK_RELEASE}
41-
ENABLED_SERVICES+=,q-svc,neutron-trunk,ovn-controller,ovs-vswitchd,ovn-northd,ovsdb-server,q-ovn-metadata-agent
41+
ENABLED_SERVICES+=,q-svc,neutron-trunk,ovn-controller,ovs-vswitchd,ovn-northd,ovsdb-server,q-ovn-metadata-agent,q-qos
4242

4343
DISABLED_SERVICES=q-agt,q-dhcp,q-l3,q-meta,q-metering
4444
PUBLIC_BRIDGE_MTU=${MTU}
@@ -197,6 +197,9 @@
197197
openstack quota set --secgroup-rules 1000 demo
198198
openstack quota set --secgroups 100 admin
199199
openstack quota set --secgroup-rules 1000 admin
200+
201+
# Validate qos extension is set and create a policy
202+
openstack extension list --network | grep qos
200203
- path: /root/devstack.sh
201204
permissions: "0755"
202205
content: |

test/e2e/data/kustomize/multi-network/patch-machine-template-networks.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
path: /spec/template/spec/ports
44
value:
55
- description: "primary"
6+
qosPolicy:
7+
id: "${QOS_POLICY_ID}"
68
- description: "Extra Network 1"
79
network:
810
id: "${CLUSTER_EXTRA_NET_1}"
11+
qosPolicy:
12+
id: "${QOS_POLICY_ID}"
913
- description: "Extra Network 2"
1014
network:
1115
id: "${CLUSTER_EXTRA_NET_2}"
16+
qosPolicy:
17+
id: "${QOS_POLICY_ID}"

test/e2e/shared/openstack.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
4343
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
4444
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
45+
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/qos/policies"
4546
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
4647
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules"
4748
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/trunks"
@@ -67,6 +68,11 @@ type ServerExtWithIP struct {
6768
ip string
6869
}
6970

71+
type PortWithQoS struct {
72+
ports.Port
73+
policies.QoSPolicyExt
74+
}
75+
7076
// ensureSSHKeyPair ensures A SSH key is present under the name.
7177
func ensureSSHKeyPair(e2eCtx *E2EContext) {
7278
Logf("Ensuring presence of SSH key %q in OpenStack", DefaultSSHKeyPairName)
@@ -1027,3 +1033,76 @@ func GetOpenStackServerConsoleLog(e2eCtx *E2EContext, id string) (string, error)
10271033
}
10281034
return computeClient.GetConsoleOutput(id)
10291035
}
1036+
1037+
// CreateOpenStackQoSPolicy creates a qos policy to be consumed by a nodes.
1038+
func CreateOpenStackQoSPolicy(ctx context.Context, e2eCtx *E2EContext, policyName string) (*policies.Policy, error) {
1039+
providerClient, clientOpts, _, err := GetAdminProviderClient(e2eCtx)
1040+
if err != nil {
1041+
return nil, fmt.Errorf("error creating provider client: %s", err)
1042+
}
1043+
1044+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
1045+
Region: clientOpts.RegionName,
1046+
})
1047+
if err != nil {
1048+
return nil, fmt.Errorf("error creating network client: %s", err)
1049+
}
1050+
1051+
createOpts := policies.CreateOpts{
1052+
Name: policyName,
1053+
Shared: true,
1054+
IsDefault: false,
1055+
}
1056+
1057+
policy, err := policies.Create(ctx, networkClient, createOpts).Extract()
1058+
if err != nil {
1059+
return nil, err
1060+
}
1061+
1062+
return policy, nil
1063+
}
1064+
1065+
// DeleteOpenStackQoSPolicy deletes a qos policy.
1066+
func DeleteOpenStackQoSPolicy(ctx context.Context, e2eCtx *E2EContext, policyID string) error {
1067+
providerClient, clientOpts, _, err := GetAdminProviderClient(e2eCtx)
1068+
if err != nil {
1069+
return fmt.Errorf("error creating provider client: %s", err)
1070+
}
1071+
1072+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
1073+
Region: clientOpts.RegionName,
1074+
})
1075+
if err != nil {
1076+
return fmt.Errorf("error creating network client: %s", err)
1077+
}
1078+
1079+
err = policies.Delete(ctx, networkClient, policyID).ExtractErr()
1080+
if err != nil {
1081+
return err
1082+
}
1083+
1084+
return nil
1085+
}
1086+
1087+
// GetOpenStackPortWithQoSPolicy gets a neutron port with info about the qos policy.
1088+
func GetOpenStackPortWithQoSPolicy(ctx context.Context, e2eCtx *E2EContext, portID string) (*PortWithQoS, error) {
1089+
providerClient, clientOpts, _, err := GetTenantProviderClient(e2eCtx)
1090+
if err != nil {
1091+
return nil, fmt.Errorf("error creating provider client: %s", err)
1092+
}
1093+
1094+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
1095+
Region: clientOpts.RegionName,
1096+
})
1097+
if err != nil {
1098+
return nil, fmt.Errorf("error creating network client: %s", err)
1099+
}
1100+
1101+
var port PortWithQoS
1102+
err = ports.Get(ctx, networkClient, portID).ExtractInto(&port)
1103+
if err != nil {
1104+
return nil, err
1105+
}
1106+
1107+
return &port, nil
1108+
}

test/e2e/suites/e2e/e2e_test.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
3636
"github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/monitors"
3737
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
38+
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/qos/policies"
3839
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups"
3940
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/trunks"
4041
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
@@ -680,13 +681,14 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
680681
})
681682
})
682683

683-
Describe("Workload cluster (multiple attached networks)", func() {
684+
Describe("Workload cluster (multiple attached networks and qos policies)", func() {
684685
var (
685686
clusterName string
686687
configCluster clusterctl.ConfigClusterInput
687688
md []*clusterv1.MachineDeployment
688689

689690
extraNet1, extraNet2 *networks.Network
691+
qosPolicy *policies.Policy
690692
)
691693

692694
BeforeEach(func(ctx context.Context) {
@@ -717,6 +719,19 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
717719
os.Setenv("CLUSTER_EXTRA_NET_1", extraNet1.ID)
718720
os.Setenv("CLUSTER_EXTRA_NET_2", extraNet2.ID)
719721

722+
shared.Logf("Creating qos policy")
723+
724+
qosPolicy, err = shared.CreateOpenStackQoSPolicy(ctx, e2eCtx, fmt.Sprintf("%s-qos-policy", namespace.Name))
725+
Expect(err).NotTo(HaveOccurred())
726+
postClusterCleanup = append(postClusterCleanup, func(ctx context.Context) {
727+
shared.Logf("Deleting qos policy %s", qosPolicy.ID)
728+
err := shared.DeleteOpenStackQoSPolicy(ctx, e2eCtx, qosPolicy.ID)
729+
Expect(err).NotTo(HaveOccurred())
730+
})
731+
732+
os.Setenv("QOS_POLICY_ID", qosPolicy.ID)
733+
os.Setenv("QOS_POLICY_NAME", qosPolicy.Name)
734+
720735
shared.Logf("Creating a cluster")
721736
clusterName = fmt.Sprintf("cluster-%s", namespace.Name)
722737
configCluster = defaultConfigCluster(clusterName, namespace.Name)
@@ -727,7 +742,7 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
727742
md = clusterResources.MachineDeployments
728743
})
729744

730-
It("should attach all machines to multiple networks", func(ctx context.Context) {
745+
It("should attach all machines to multiple networks and qos policy", func(ctx context.Context) {
731746
workerMachines := framework.GetMachinesByMachineDeployments(ctx, framework.GetMachinesByMachineDeploymentsInput{
732747
Lister: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
733748
ClusterName: clusterName,
@@ -756,6 +771,8 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
756771
extraNet2.ID: "Extra Network 2",
757772
}
758773

774+
expectedPolicyID := qosPolicy.ID
775+
759776
for i := range allMachines {
760777
machine := &allMachines[i]
761778
shared.Logf("Checking ports for machine %s", machine.Name)
@@ -788,6 +805,14 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
788805
}
789806
}
790807

808+
// all ports should have the same qos policy id
809+
for j := range ports {
810+
port := &ports[j]
811+
qosPort, err := shared.GetOpenStackPortWithQoSPolicy(ctx, e2eCtx, port.ID)
812+
Expect(err).NotTo(HaveOccurred())
813+
Expect(qosPort.QoSPolicyID).To(Equal(expectedPolicyID))
814+
}
815+
791816
// All IP addresses on all ports should be reported in Addresses
792817
Expect(machine.Status.Addresses).To(ContainElements(seenAddresses))
793818

0 commit comments

Comments
 (0)