Skip to content

Commit e3fa3e5

Browse files
committed
test(e2e): cover region in providerID clusterv1 machine object
1 parent 1a38f1b commit e3fa3e5

14 files changed

+239
-33
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ e2e-templates: $(addprefix $(E2E_NO_ARTIFACT_TEMPLATES_DIR)/, \
176176
cluster-template-flatcar.yaml \
177177
cluster-template-k8s-upgrade.yaml \
178178
cluster-template-flatcar-sysext.yaml \
179-
cluster-template-no-bastion.yaml)
179+
cluster-template-no-bastion.yaml \
180+
cluster-template-providerID-with-region-override.yaml \
181+
cluster-template-providerID-with-region-default.yaml)
180182
# Currently no templates that require CI artifacts
181183
# $(addprefix $(E2E_TEMPLATES_DIR)/, add-templates-here.yaml) \
182184
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
resources:
4+
- ../default
5+
6+
patches:
7+
- path: patch-machine-template-identity-ref.yaml
8+
target:
9+
kind: OpenStackCluster
10+
- path: patch-kubeadm-config-template-provider-id.yaml
11+
target:
12+
kind: KubeadmConfigTemplate
13+
- path: patch-kubeadm-control-plane-provider-id.yaml
14+
target:
15+
kind: KubeadmControlPlane
16+
#- path: patch-openstack-machine-template-identityRef.yaml
17+
# target:
18+
# kind: OpenStackMachineTemplate
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- op: replace
3+
path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
4+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
5+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
- op: replace
3+
path: /spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
4+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
5+
- op: replace
6+
path: /spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
7+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
8+
9+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
- op: add
3+
path: /spec/identityRef/region
4+
value: ${CAPO_REGION}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
- op: add
3+
path: /spec/template/spec/identityRef
4+
value:
5+
cloudName: ${OPENSTACK_CLOUD}
6+
name: ${CLUSTER_NAME}-cloud-config
7+
region: ${CAPO_REGION}
8+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
resources:
4+
- ../default
5+
6+
patches:
7+
#- path: patch-machine-template-identity-ref.yaml
8+
# target:
9+
# kind: OpenStackCluster
10+
- path: patch-kubeadm-config-template-provider-id.yaml
11+
target:
12+
kind: KubeadmConfigTemplate
13+
- path: patch-kubeadm-control-plane-provider-id.yaml
14+
target:
15+
kind: KubeadmControlPlane
16+
- path: patch-openstack-machine-template-identityRef.yaml
17+
target:
18+
kind: OpenStackMachineTemplate
19+
#- path: patch-no-bastion.yaml
20+
# target:
21+
# kind: OpenStackCluster
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- op: replace
3+
path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
4+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
5+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
- op: replace
3+
path: /spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
4+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
5+
- op: replace
6+
path: /spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/provider-id
7+
value: "openstack://${CAPO_REGION}/{{ instance_id }}"
8+
9+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
- op: add
3+
path: /spec/identityRef/region
4+
value: ${CAPO_REGION}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- op: replace
3+
path: /spec/bastion/enabled
4+
value: false
5+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
- op: add
3+
path: /spec/template/spec/identityRef
4+
value:
5+
cloudName: ${OPENSTACK_CLOUD}
6+
name: ${CLUSTER_NAME}-cloud-config
7+
region: ${CAPO_REGION}
8+

test/e2e/shared/defaults.go

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,35 @@ import (
3434
)
3535

3636
const (
37-
DefaultSSHKeyPairName = "cluster-api-provider-openstack-sigs-k8s-io"
38-
KubeContext = "KUBE_CONTEXT"
39-
KubernetesVersion = "KUBERNETES_VERSION"
40-
CCMPath = "CCM"
41-
CCMResources = "CCM_RESOURCES"
42-
OpenStackBastionFlavorAlt = "OPENSTACK_BASTION_MACHINE_FLAVOR_ALT"
43-
OpenStackCloudYAMLFile = "OPENSTACK_CLOUD_YAML_FILE"
44-
OpenStackCloud = "OPENSTACK_CLOUD"
45-
OpenStackCloudCACertB64 = "OPENSTACK_CLOUD_CACERT_B64"
46-
OpenStackCloudAdmin = "OPENSTACK_CLOUD_ADMIN"
47-
OpenStackFailureDomain = "OPENSTACK_FAILURE_DOMAIN" //nolint:gosec // Linter thinks this could be credentials...
48-
OpenStackFailureDomainAlt = "OPENSTACK_FAILURE_DOMAIN_ALT"
49-
OpenStackVolumeTypeAlt = "OPENSTACK_VOLUME_TYPE_ALT"
50-
OpenStackImageName = "OPENSTACK_IMAGE_NAME"
51-
OpenStackNodeMachineFlavor = "OPENSTACK_NODE_MACHINE_FLAVOR"
52-
SSHUserMachine = "SSH_USER_MACHINE"
53-
FlavorDefault = ""
54-
FlavorNoBastion = "no-bastion"
55-
FlavorWithoutLB = "without-lb"
56-
FlavorMultiNetwork = "multi-network"
57-
FlavorMultiAZ = "multi-az"
58-
FlavorV1alpha7 = "v1alpha7"
59-
FlavorMDRemediation = "md-remediation"
60-
FlavorKCPRemediation = "kcp-remediation"
61-
FlavorFlatcar = "flatcar"
62-
FlavorKubernetesUpgrade = "k8s-upgrade"
63-
FlavorFlatcarSysext = "flatcar-sysext"
37+
DefaultSSHKeyPairName = "cluster-api-provider-openstack-sigs-k8s-io"
38+
KubeContext = "KUBE_CONTEXT"
39+
KubernetesVersion = "KUBERNETES_VERSION"
40+
CCMPath = "CCM"
41+
CCMResources = "CCM_RESOURCES"
42+
OpenStackBastionFlavorAlt = "OPENSTACK_BASTION_MACHINE_FLAVOR_ALT"
43+
OpenStackCloudYAMLFile = "OPENSTACK_CLOUD_YAML_FILE"
44+
OpenStackCloud = "OPENSTACK_CLOUD"
45+
OpenStackCloudCACertB64 = "OPENSTACK_CLOUD_CACERT_B64"
46+
OpenStackCloudAdmin = "OPENSTACK_CLOUD_ADMIN"
47+
OpenStackFailureDomain = "OPENSTACK_FAILURE_DOMAIN" //nolint:gosec // Linter thinks this could be credentials...
48+
OpenStackFailureDomainAlt = "OPENSTACK_FAILURE_DOMAIN_ALT"
49+
OpenStackVolumeTypeAlt = "OPENSTACK_VOLUME_TYPE_ALT"
50+
OpenStackImageName = "OPENSTACK_IMAGE_NAME"
51+
OpenStackNodeMachineFlavor = "OPENSTACK_NODE_MACHINE_FLAVOR"
52+
SSHUserMachine = "SSH_USER_MACHINE"
53+
FlavorDefault = ""
54+
FlavorNoBastion = "no-bastion"
55+
FlavorWithoutLB = "without-lb"
56+
FlavorProviderIDWithRegionOverride = "providerID-with-region-override"
57+
FlavorProviderIDWithRegionDefault = "providerID-with-region-default"
58+
FlavorMultiNetwork = "multi-network"
59+
FlavorMultiAZ = "multi-az"
60+
FlavorV1alpha7 = "v1alpha7"
61+
FlavorMDRemediation = "md-remediation"
62+
FlavorKCPRemediation = "kcp-remediation"
63+
FlavorFlatcar = "flatcar"
64+
FlavorKubernetesUpgrade = "k8s-upgrade"
65+
FlavorFlatcarSysext = "flatcar-sysext"
6466
)
6567

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

test/e2e/suites/e2e/e2e_test.go

Lines changed: 111 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,108 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
679679
})
680680
})
681681

682+
Describe("Workload cluster providerID identityRef.Region field per OpenStackMachineTemplate override OpenStackCluster identityRef.Region field", func() {
683+
It("should create machines with identityRef.Region field which override CLuster one", func(ctx context.Context) {
684+
shared.Logf("Creating a cluster")
685+
clusterName := fmt.Sprintf("cluster-%s", namespace.Name)
686+
configCluster := defaultConfigCluster(clusterName, namespace.Name)
687+
configCluster.ControlPlaneMachineCount = ptr.To(int64(1))
688+
configCluster.WorkerMachineCount = ptr.To(int64(0))
689+
configCluster.Flavor = shared.FlavorProviderIDWithRegionOverride
690+
createCluster(ctx, configCluster, clusterResources)
691+
md := clusterResources.MachineDeployments
692+
693+
workerMachines := framework.GetMachinesByMachineDeployments(ctx, framework.GetMachinesByMachineDeploymentsInput{
694+
Lister: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
695+
ClusterName: clusterName,
696+
Namespace: namespace.Name,
697+
MachineDeployment: *md[0],
698+
})
699+
controlPlaneMachines := framework.GetControlPlaneMachinesByCluster(ctx, framework.GetControlPlaneMachinesByClusterInput{
700+
Lister: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
701+
ClusterName: clusterName,
702+
Namespace: namespace.Name,
703+
})
704+
Expect(workerMachines).To(HaveLen(0))
705+
Expect(controlPlaneMachines).To(HaveLen(1))
706+
707+
shared.Logf("Creating MachineDeployment with identityRef Region field defined")
708+
testSecurityGroupName := "testSecGroup"
709+
// create required test security group
710+
var securityGroupCleanup func(ctx context.Context)
711+
securityGroupCleanup, err = shared.CreateOpenStackSecurityGroup(ctx, e2eCtx, testSecurityGroupName, "Test security group")
712+
Expect(err).To(BeNil())
713+
postClusterCleanup = append(postClusterCleanup, securityGroupCleanup)
714+
715+
_, clientOpts, _, err := shared.GetTenantProviderClient(e2eCtx)
716+
Expect(err).To(BeNil(), "Cannot create providerClient")
717+
718+
controlPlaneMachine := controlPlaneMachines[0]
719+
720+
shared.Logf("Fetching serverID control plane")
721+
allControlPlaneServers, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Name: controlPlaneMachine.Name})
722+
Expect(err).To(BeNil())
723+
Expect(allControlPlaneServers).To(HaveLen(1))
724+
controlPlaneServerID := allControlPlaneServers[0].ID
725+
Expect(err).To(BeNil())
726+
727+
Expect(*(controlPlaneMachine.Spec.ProviderID)).To(
728+
Equal(fmt.Sprintf("openstack://%s/%s", clientOpts.RegionName, controlPlaneServerID)),
729+
fmt.Sprintf("ControlPlane machine should have providerID string `openstack://%s/uuid`", clientOpts.RegionName))
730+
})
731+
})
732+
733+
Describe("Workload cluster providerID identityRef.Region field herited from OpenStackCluster identityRef.Region field", func() {
734+
It("should create machines without identityRef.Region field and herit from Cluster object", func(ctx context.Context) {
735+
shared.Logf("Creating a cluster")
736+
clusterName := fmt.Sprintf("cluster-%s", namespace.Name)
737+
configCluster := defaultConfigCluster(clusterName, namespace.Name)
738+
configCluster.ControlPlaneMachineCount = ptr.To(int64(1))
739+
configCluster.WorkerMachineCount = ptr.To(int64(0))
740+
configCluster.Flavor = shared.FlavorProviderIDWithRegionDefault
741+
createCluster(ctx, configCluster, clusterResources)
742+
md := clusterResources.MachineDeployments
743+
744+
workerMachines := framework.GetMachinesByMachineDeployments(ctx, framework.GetMachinesByMachineDeploymentsInput{
745+
Lister: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
746+
ClusterName: clusterName,
747+
Namespace: namespace.Name,
748+
MachineDeployment: *md[0],
749+
})
750+
controlPlaneMachines := framework.GetControlPlaneMachinesByCluster(ctx, framework.GetControlPlaneMachinesByClusterInput{
751+
Lister: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
752+
ClusterName: clusterName,
753+
Namespace: namespace.Name,
754+
})
755+
Expect(workerMachines).To(HaveLen(0))
756+
Expect(controlPlaneMachines).To(HaveLen(1))
757+
758+
shared.Logf("Creating MachineDeployment with identityRef Region field defined")
759+
testSecurityGroupName := "testSecGroup"
760+
// create required test security group
761+
var securityGroupCleanup func(ctx context.Context)
762+
securityGroupCleanup, err = shared.CreateOpenStackSecurityGroup(ctx, e2eCtx, testSecurityGroupName, "Test security group")
763+
Expect(err).To(BeNil())
764+
postClusterCleanup = append(postClusterCleanup, securityGroupCleanup)
765+
766+
_, clientOpts, _, err := shared.GetTenantProviderClient(e2eCtx)
767+
Expect(err).To(BeNil(), "Cannot create providerClient")
768+
769+
controlPlaneMachine := controlPlaneMachines[0]
770+
771+
shared.Logf("Fetching serverID control plane")
772+
allControlPlaneServers, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Name: controlPlaneMachine.Name})
773+
Expect(err).To(BeNil())
774+
Expect(allControlPlaneServers).To(HaveLen(1))
775+
controlPlaneServerID := allControlPlaneServers[0].ID
776+
Expect(err).To(BeNil())
777+
778+
Expect(*(controlPlaneMachine.Spec.ProviderID)).To(
779+
Equal(fmt.Sprintf("openstack://%s/%s", clientOpts.RegionName, controlPlaneServerID)),
780+
fmt.Sprintf("ControlPlane machine should have providerID string `openstack://%s/uuid`", clientOpts.RegionName))
781+
})
782+
})
783+
682784
Describe("Workload cluster (multiple attached networks)", func() {
683785
var (
684786
clusterName string
@@ -815,7 +917,7 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
815917
Creator: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
816918
MachineDeployment: makeMachineDeployment(namespace.Name, mdInvalidAZName, clusterName, "invalid-az", 1),
817919
BootstrapConfigTemplate: makeJoinBootstrapConfigTemplate(namespace.Name, mdInvalidAZName),
818-
InfraMachineTemplate: makeOpenStackMachineTemplate(namespace.Name, clusterName, mdInvalidAZName),
920+
InfraMachineTemplate: makeOpenStackMachineTemplate(namespace.Name, clusterName, mdInvalidAZName, ""),
819921
})
820922

821923
shared.Logf("Looking for failure event to be reported")
@@ -1035,9 +1137,11 @@ func getInstanceIDForMachine(machine *clusterv1.Machine) string {
10351137
providerID := machine.Spec.ProviderID
10361138
Expect(providerID).NotTo(BeNil())
10371139

1038-
providerIDSplit := strings.SplitN(*providerID, ":///", 2)
1140+
providerIDSplit := strings.SplitN(*providerID, "://", 2)
10391141
Expect(providerIDSplit[0]).To(Equal("openstack"))
1040-
return providerIDSplit[1]
1142+
providerIDPathSplit := strings.SplitN(providerIDSplit[1], "/", 2)
1143+
// providerIDPathSplit[0] contain region name, could be empty
1144+
return providerIDPathSplit[1]
10411145
}
10421146

10431147
func isErrorEventExists(namespace, machineDeploymentName, eventReason, errorMsg string, eList *corev1.EventList) bool {
@@ -1072,7 +1176,7 @@ func isErrorEventExists(namespace, machineDeploymentName, eventReason, errorMsg
10721176
return len(openStackMachineList.Items) == eventMachinesCnt
10731177
}
10741178

1075-
func makeOpenStackMachineTemplate(namespace, clusterName, name string) *infrav1.OpenStackMachineTemplate {
1179+
func makeOpenStackMachineTemplate(namespace, clusterName, name, regionName string) *infrav1.OpenStackMachineTemplate {
10761180
return &infrav1.OpenStackMachineTemplate{
10771181
ObjectMeta: metav1.ObjectMeta{
10781182
Name: name,
@@ -1091,14 +1195,15 @@ func makeOpenStackMachineTemplate(namespace, clusterName, name string) *infrav1.
10911195
IdentityRef: &infrav1.OpenStackIdentityReference{
10921196
Name: fmt.Sprintf("%s-cloud-config", clusterName),
10931197
CloudName: e2eCtx.E2EConfig.GetVariable(shared.OpenStackCloud),
1198+
Region: regionName,
10941199
},
10951200
},
10961201
},
10971202
},
10981203
}
10991204
}
11001205

1101-
func makeOpenStackMachineTemplateWithPortOptions(namespace, clusterName, name string, portOpts *[]infrav1.PortOpts, machineTags []string) *infrav1.OpenStackMachineTemplate {
1206+
func makeOpenStackMachineTemplateWithPortOptions(namespace, clusterName, name, regionName string, portOpts *[]infrav1.PortOpts, machineTags []string) *infrav1.OpenStackMachineTemplate {
11021207
return &infrav1.OpenStackMachineTemplate{
11031208
ObjectMeta: metav1.ObjectMeta{
11041209
Name: name,
@@ -1117,6 +1222,7 @@ func makeOpenStackMachineTemplateWithPortOptions(namespace, clusterName, name st
11171222
IdentityRef: &infrav1.OpenStackIdentityReference{
11181223
Name: fmt.Sprintf("%s-cloud-config", clusterName),
11191224
CloudName: e2eCtx.E2EConfig.GetVariable(shared.OpenStackCloud),
1225+
Region: regionName,
11201226
},
11211227
Ports: *portOpts,
11221228
Tags: machineTags,

0 commit comments

Comments
 (0)