Skip to content

Commit aea62dd

Browse files
committed
Add multi-network e2e test
1 parent cc4b233 commit aea62dd

File tree

5 files changed

+414
-3
lines changed

5 files changed

+414
-3
lines changed
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
---
2+
apiVersion: cluster.x-k8s.io/v1alpha4
3+
kind: Cluster
4+
metadata:
5+
name: ${CLUSTER_NAME}
6+
labels:
7+
cni: "${CLUSTER_NAME}-crs-0"
8+
spec:
9+
clusterNetwork:
10+
pods:
11+
cidrBlocks: ["192.168.0.0/16"] # CIDR block used by Calico.
12+
serviceDomain: "cluster.local"
13+
infrastructureRef:
14+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
15+
kind: OpenStackCluster
16+
name: ${CLUSTER_NAME}
17+
controlPlaneRef:
18+
kind: KubeadmControlPlane
19+
apiVersion: controlplane.cluster.x-k8s.io/v1alpha4
20+
name: ${CLUSTER_NAME}-control-plane
21+
---
22+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
23+
kind: OpenStackCluster
24+
metadata:
25+
name: ${CLUSTER_NAME}
26+
spec:
27+
cloudName: ${OPENSTACK_CLOUD}
28+
identityRef:
29+
name: ${CLUSTER_NAME}-cloud-config
30+
kind: Secret
31+
managedAPIServerLoadBalancer: true
32+
managedSecurityGroups: true
33+
nodeCidr: 10.6.0.0/24
34+
dnsNameservers:
35+
- ${OPENSTACK_DNS_NAMESERVERS}
36+
bastion:
37+
enabled: true
38+
instance:
39+
flavor: ${OPENSTACK_BASTION_MACHINE_FLAVOR}
40+
image: ${OPENSTACK_BASTION_IMAGE_NAME}
41+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
42+
externalNetworkId: ${OPENSTACK_EXTERNAL_NETWORK_ID}
43+
---
44+
kind: KubeadmControlPlane
45+
apiVersion: controlplane.cluster.x-k8s.io/v1alpha4
46+
metadata:
47+
name: "${CLUSTER_NAME}-control-plane"
48+
spec:
49+
replicas: ${CONTROL_PLANE_MACHINE_COUNT}
50+
machineTemplate:
51+
infrastructureRef:
52+
kind: OpenStackMachineTemplate
53+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
54+
name: "${CLUSTER_NAME}-control-plane"
55+
kubeadmConfigSpec:
56+
initConfiguration:
57+
nodeRegistration:
58+
name: '{{ local_hostname }}'
59+
kubeletExtraArgs:
60+
cloud-provider: openstack
61+
cloud-config: /etc/kubernetes/cloud.conf
62+
clusterConfiguration:
63+
imageRepository: k8s.gcr.io
64+
apiServer:
65+
extraArgs:
66+
cloud-provider: openstack
67+
cloud-config: /etc/kubernetes/cloud.conf
68+
extraVolumes:
69+
- name: cloud
70+
hostPath: /etc/kubernetes/cloud.conf
71+
mountPath: /etc/kubernetes/cloud.conf
72+
readOnly: true
73+
controllerManager:
74+
extraArgs:
75+
cloud-provider: openstack
76+
cloud-config: /etc/kubernetes/cloud.conf
77+
extraVolumes:
78+
- name: cloud
79+
hostPath: /etc/kubernetes/cloud.conf
80+
mountPath: /etc/kubernetes/cloud.conf
81+
readOnly: true
82+
- name: cacerts
83+
hostPath: /etc/certs/cacert
84+
mountPath: /etc/certs/cacert
85+
readOnly: true
86+
joinConfiguration:
87+
nodeRegistration:
88+
name: '{{ local_hostname }}'
89+
kubeletExtraArgs:
90+
cloud-config: /etc/kubernetes/cloud.conf
91+
cloud-provider: openstack
92+
files:
93+
- path: /etc/kubernetes/cloud.conf
94+
owner: root
95+
permissions: "0600"
96+
content: ${OPENSTACK_CLOUD_PROVIDER_CONF_B64}
97+
encoding: base64
98+
- path: /etc/certs/cacert
99+
owner: root
100+
permissions: "0600"
101+
content: ${OPENSTACK_CLOUD_CACERT_B64}
102+
encoding: base64
103+
version: "${KUBERNETES_VERSION}"
104+
---
105+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
106+
kind: OpenStackMachineTemplate
107+
metadata:
108+
name: ${CLUSTER_NAME}-control-plane
109+
spec:
110+
template:
111+
spec:
112+
flavor: ${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR}
113+
image: ${OPENSTACK_IMAGE_NAME}
114+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
115+
cloudName: ${OPENSTACK_CLOUD}
116+
identityRef:
117+
name: ${CLUSTER_NAME}-cloud-config
118+
kind: Secret
119+
ports:
120+
- description: "primary"
121+
- description: "Extra Network 1"
122+
networkId: "${CLUSTER_EXTRA_NET_1}"
123+
- description: "Extra Network 2"
124+
networkId: "${CLUSTER_EXTRA_NET_2}"
125+
---
126+
apiVersion: cluster.x-k8s.io/v1alpha4
127+
kind: MachineDeployment
128+
metadata:
129+
name: "${CLUSTER_NAME}-md-0"
130+
spec:
131+
clusterName: "${CLUSTER_NAME}"
132+
replicas: ${WORKER_MACHINE_COUNT}
133+
selector:
134+
matchLabels:
135+
template:
136+
spec:
137+
clusterName: "${CLUSTER_NAME}"
138+
version: "${KUBERNETES_VERSION}"
139+
failureDomain: ${OPENSTACK_FAILURE_DOMAIN}
140+
bootstrap:
141+
configRef:
142+
name: "${CLUSTER_NAME}-md-0"
143+
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha4
144+
kind: KubeadmConfigTemplate
145+
infrastructureRef:
146+
name: "${CLUSTER_NAME}-md-0"
147+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
148+
kind: OpenStackMachineTemplate
149+
---
150+
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
151+
kind: OpenStackMachineTemplate
152+
metadata:
153+
name: ${CLUSTER_NAME}-md-0
154+
spec:
155+
template:
156+
spec:
157+
cloudName: ${OPENSTACK_CLOUD}
158+
identityRef:
159+
name: ${CLUSTER_NAME}-cloud-config
160+
kind: Secret
161+
flavor: ${OPENSTACK_NODE_MACHINE_FLAVOR}
162+
image: ${OPENSTACK_IMAGE_NAME}
163+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
164+
ports:
165+
- description: "primary"
166+
- description: "Extra Network 1"
167+
networkId: "${CLUSTER_EXTRA_NET_1}"
168+
- description: "Extra Network 2"
169+
networkId: "${CLUSTER_EXTRA_NET_2}"
170+
---
171+
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha4
172+
kind: KubeadmConfigTemplate
173+
metadata:
174+
name: ${CLUSTER_NAME}-md-0
175+
spec:
176+
template:
177+
spec:
178+
files:
179+
- content: ${OPENSTACK_CLOUD_PROVIDER_CONF_B64}
180+
encoding: base64
181+
owner: root
182+
path: /etc/kubernetes/cloud.conf
183+
permissions: "0600"
184+
- content: ${OPENSTACK_CLOUD_CACERT_B64}
185+
encoding: base64
186+
owner: root
187+
path: /etc/certs/cacert
188+
permissions: "0600"
189+
joinConfiguration:
190+
nodeRegistration:
191+
name: '{{ local_hostname }}'
192+
kubeletExtraArgs:
193+
cloud-config: /etc/kubernetes/cloud.conf
194+
cloud-provider: openstack
195+
---
196+
apiVersion: v1
197+
kind: Secret
198+
metadata:
199+
name: ${CLUSTER_NAME}-cloud-config
200+
labels:
201+
clusterctl.cluster.x-k8s.io/move: "true"
202+
data:
203+
clouds.yaml: ${OPENSTACK_CLOUD_YAML_B64}
204+
cacert: ${OPENSTACK_CLOUD_CACERT_B64}
205+
---
206+
apiVersion: v1
207+
kind: ConfigMap
208+
metadata:
209+
name: "cni-${CLUSTER_NAME}-crs-0"
210+
data: ${CNI_RESOURCES}
211+
---
212+
apiVersion: addons.cluster.x-k8s.io/v1alpha4
213+
kind: ClusterResourceSet
214+
metadata:
215+
name: "${CLUSTER_NAME}-crs-0"
216+
spec:
217+
strategy: ApplyOnce
218+
clusterSelector:
219+
matchLabels:
220+
cni: "${CLUSTER_NAME}-crs-0"
221+
resources:
222+
- name: "cni-${CLUSTER_NAME}-crs-0"
223+
kind: ConfigMap

test/e2e/shared/common.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func DumpSpecResourcesAndCleanup(ctx context.Context, specName string, namespace
8181
}
8282

8383
func dumpMachines(ctx context.Context, e2eCtx *E2EContext, namespace *corev1.Namespace) {
84-
cluster, err := clusterForSpec(ctx, e2eCtx.Environment.BootstrapClusterProxy, namespace)
84+
cluster, err := ClusterForSpec(ctx, e2eCtx, namespace)
8585
if err != nil {
8686
_, _ = fmt.Fprintf(GinkgoWriter, "cannot dump machines, couldn't get cluster in namespace %s: %v\n", namespace.Name, err)
8787
return
@@ -109,8 +109,8 @@ func dumpMachines(ctx context.Context, e2eCtx *E2EContext, namespace *corev1.Nam
109109
}
110110
}
111111

112-
func clusterForSpec(ctx context.Context, clusterProxy framework.ClusterProxy, namespace *corev1.Namespace) (*infrav1.OpenStackCluster, error) {
113-
lister := clusterProxy.GetClient()
112+
func ClusterForSpec(ctx context.Context, e2eCtx *E2EContext, namespace *corev1.Namespace) (*infrav1.OpenStackCluster, error) {
113+
lister := e2eCtx.Environment.BootstrapClusterProxy.GetClient()
114114
list := new(infrav1.OpenStackClusterList)
115115
if err := lister.List(ctx, list, client.InNamespace(namespace.GetName())); err != nil {
116116
return nil, fmt.Errorf("error listing cluster: %v", err)

test/e2e/shared/defaults.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const (
4343
FlavorDefault = "ci-artifacts"
4444
FlavorWithoutLB = "without-lb-ci-artifacts"
4545
FlavorExternalCloudProvider = "external-cloud-provider-ci-artifacts"
46+
FlavorMultiNetwork = "multi-network-ci-artifacts"
4647
)
4748

4849
// DefaultScheme returns the default scheme to use for testing.

test/e2e/shared/openstack.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ import (
3636
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
3737
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
3838
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
39+
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
3940
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
41+
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
4042
"github.com/gophercloud/utils/openstack/clientconfig"
4143
. "github.com/onsi/ginkgo"
4244
. "github.com/onsi/gomega"
@@ -323,3 +325,57 @@ func getOpenStackCloudYAML(cloudYAML string) []byte {
323325
Expect(err).NotTo(HaveOccurred())
324326
return cloudYAMLContent
325327
}
328+
329+
func CreateOpenStackNetwork(e2eCtx *E2EContext, name, cidr string) (*networks.Network, error) {
330+
providerClient, clientOpts, err := getProviderClient(e2eCtx)
331+
if err != nil {
332+
_, _ = fmt.Fprintf(GinkgoWriter, "error creating provider client: %s\n", err)
333+
return nil, err
334+
}
335+
336+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
337+
Region: clientOpts.RegionName,
338+
})
339+
if err != nil {
340+
return nil, fmt.Errorf("error creating network client: %s", err)
341+
}
342+
343+
netCreateOpts := networks.CreateOpts{
344+
Name: name,
345+
AdminStateUp: gophercloud.Enabled,
346+
}
347+
net, err := networks.Create(networkClient, netCreateOpts).Extract()
348+
if err != nil {
349+
return net, err
350+
}
351+
352+
subnetCreateOpts := subnets.CreateOpts{
353+
Name: name,
354+
NetworkID: net.ID,
355+
IPVersion: 4,
356+
CIDR: cidr,
357+
}
358+
_, err = subnets.Create(networkClient, subnetCreateOpts).Extract()
359+
if err != nil {
360+
networks.Delete(networkClient, net.ID)
361+
return nil, err
362+
}
363+
return net, nil
364+
}
365+
366+
func DeleteOpenStackNetwork(e2eCtx *E2EContext, id string) error {
367+
providerClient, clientOpts, err := getProviderClient(e2eCtx)
368+
if err != nil {
369+
_, _ = fmt.Fprintf(GinkgoWriter, "error creating provider client: %s\n", err)
370+
return err
371+
}
372+
373+
networkClient, err := openstack.NewNetworkV2(providerClient, gophercloud.EndpointOpts{
374+
Region: clientOpts.RegionName,
375+
})
376+
if err != nil {
377+
return fmt.Errorf("error creating network client: %s", err)
378+
}
379+
380+
return networks.Delete(networkClient, id).ExtractErr()
381+
}

0 commit comments

Comments
 (0)