Skip to content

Commit 52a62f9

Browse files
committed
tests: e2e tests implemented
Signed-off-by: Bharath Nallapeta <[email protected]>
1 parent 7141023 commit 52a62f9

File tree

10 files changed

+66
-158
lines changed

10 files changed

+66
-158
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ e2e-templates: $(addprefix $(E2E_NO_ARTIFACT_TEMPLATES_DIR)/, \
188188
cluster-template-flatcar-sysext.yaml \
189189
cluster-template-no-bastion.yaml \
190190
cluster-template-health-monitor.yaml \
191-
cluster-template-capi-v1beta1.yaml)
191+
cluster-template-capi-v1beta1.yaml \
192+
cluster-template-cluster-identity.yaml)
192193
# Currently no templates that require CI artifacts
193194
# $(addprefix $(E2E_TEMPLATES_DIR)/, add-templates-here.yaml) \
194195

config/crd/kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ labels:
88
# It should be run by config/
99
resources:
1010
- bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
11+
- bases/infrastructure.cluster.x-k8s.io_openstackclusteridentities.yaml
1112
- bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml
1213
- bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml
1314
- bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml

controllers/openstackcluster_controller_test.go

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -180,85 +180,71 @@ var _ = Describe("OpenStackCluster controller", func() {
180180
})
181181

182182
It("should successfully create OpenStackCluster with valid identityRef", func() {
183+
testCluster.Spec.IdentityRef = infrav1.OpenStackIdentityReference{
184+
Name: "creds",
185+
CloudName: "openstack",
186+
// Type should default to "Secret"
187+
}
183188
err := k8sClient.Create(ctx, testCluster)
184189
Expect(err).To(BeNil())
185190
err = k8sClient.Create(ctx, capiCluster)
186191
Expect(err).To(BeNil())
187192

188-
c := &infrav1.OpenStackCluster{
189-
ObjectMeta: metav1.ObjectMeta{
190-
Name: "cluster-valid-identity",
191-
Namespace: testNamespace,
192-
},
193-
Spec: infrav1.OpenStackClusterSpec{
194-
IdentityRef: infrav1.OpenStackIdentityReference{
195-
Name: "creds",
196-
CloudName: "openstack",
197-
// Type should default to "Secret"
198-
},
199-
},
200-
}
201-
err = k8sClient.Create(ctx, c)
202-
Expect(err).To(Succeed())
203-
204193
// Verify the object was created and Type was defaulted
205194
created := &infrav1.OpenStackCluster{}
206-
err = k8sClient.Get(ctx, client.ObjectKey{Name: c.Name, Namespace: c.Namespace}, created)
195+
err = k8sClient.Get(ctx, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}, created)
207196
Expect(err).To(Succeed())
208197
Expect(created.Spec.IdentityRef.Type).To(Equal("Secret"))
209198
Expect(created.Spec.IdentityRef.Name).To(Equal("creds"))
210199
Expect(created.Spec.IdentityRef.CloudName).To(Equal("openstack"))
211200
})
212201

213202
It("should successfully create OpenStackCluster with ClusterIdentity type", func() {
203+
testCluster.Spec.IdentityRef = infrav1.OpenStackIdentityReference{
204+
Type: "ClusterIdentity",
205+
Name: "global-creds",
206+
CloudName: "openstack",
207+
Region: "RegionOne",
208+
}
214209
err := k8sClient.Create(ctx, testCluster)
215210
Expect(err).To(BeNil())
216211
err = k8sClient.Create(ctx, capiCluster)
217212
Expect(err).To(BeNil())
218213

219-
c := &infrav1.OpenStackCluster{
220-
ObjectMeta: metav1.ObjectMeta{
221-
Name: "cluster-clusteridentity-type",
222-
Namespace: testNamespace,
223-
},
224-
Spec: infrav1.OpenStackClusterSpec{
225-
IdentityRef: infrav1.OpenStackIdentityReference{
226-
Type: "ClusterIdentity",
227-
Name: "global-creds",
228-
CloudName: "openstack",
229-
Region: "RegionOne",
230-
},
231-
},
232-
}
233-
err = k8sClient.Create(ctx, c)
234-
Expect(err).To(Succeed())
235-
236214
// Verify all fields are preserved
237215
created := &infrav1.OpenStackCluster{}
238-
err = k8sClient.Get(ctx, client.ObjectKey{Name: c.Name, Namespace: c.Namespace}, created)
216+
err = k8sClient.Get(ctx, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}, created)
239217
Expect(err).To(Succeed())
240218
Expect(created.Spec.IdentityRef.Type).To(Equal("ClusterIdentity"))
241219
Expect(created.Spec.IdentityRef.Name).To(Equal("global-creds"))
242220
Expect(created.Spec.IdentityRef.CloudName).To(Equal("openstack"))
243221
Expect(created.Spec.IdentityRef.Region).To(Equal("RegionOne"))
244222
})
245223

246-
It("should accept cluster and default identityRef.type to Secret", func() {
247-
testCluster.Spec = infrav1.OpenStackClusterSpec{
248-
IdentityRef: infrav1.OpenStackIdentityReference{
249-
Name: "creds",
250-
CloudName: "openstack",
251-
// Type omitted -> should default to Secret
252-
},
224+
It("should fail when namespace is denied access to ClusterIdentity", func() {
225+
testCluster.SetName("identity-access-denied")
226+
testCluster.Spec.IdentityRef = infrav1.OpenStackIdentityReference{
227+
Type: "ClusterIdentity",
228+
Name: "test-cluster-identity",
229+
CloudName: "openstack",
253230
}
231+
254232
err := k8sClient.Create(ctx, testCluster)
255233
Expect(err).To(BeNil())
256234
err = k8sClient.Create(ctx, capiCluster)
257235
Expect(err).To(BeNil())
258236

259-
fetched := &infrav1.OpenStackCluster{}
260-
Expect(k8sClient.Get(ctx, types.NamespacedName{Name: testClusterName, Namespace: testNamespace}, fetched)).To(Succeed())
261-
Expect(fetched.Spec.IdentityRef.Type).To(Equal("Secret"))
237+
identityAccessErr := &scope.IdentityAccessDeniedError{
238+
IdentityName: "test-cluster-identity",
239+
RequesterNamespace: testNamespace,
240+
}
241+
mockScopeFactory.SetClientScopeCreateError(identityAccessErr)
242+
243+
req := createRequestFromOSCluster(testCluster)
244+
result, err := reconciler.Reconcile(ctx, req)
245+
246+
Expect(err).To(MatchError(identityAccessErr))
247+
Expect(result).To(Equal(reconcile.Result{}))
262248
})
263249

264250
It("should reject updates that modify identityRef.region (immutable)", func() {

test/e2e/data/e2e_conf.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ providers:
170170
- sourcePath: "../data/shared/provider/metadata.yaml"
171171
- sourcePath: "./infrastructure-openstack-no-artifact/cluster-template.yaml"
172172
- sourcePath: "./infrastructure-openstack-no-artifact/cluster-template-without-lb.yaml"
173+
- sourcePath: "./infrastructure-openstack-no-artifact/cluster-template-cluster-identity.yaml"
173174
replacements:
174175
- old: gcr.io/k8s-staging-capi-openstack/capi-openstack-controller:dev
175176
new: gcr.io/k8s-staging-capi-openstack/capi-openstack-controller:e2e

test/e2e/data/kustomize/cluster-identity-denied/kustomization.yaml

Lines changed: 0 additions & 21 deletions
This file was deleted.

test/e2e/data/kustomize/cluster-identity-denied/openstackclusteridentity.yaml

Lines changed: 0 additions & 12 deletions
This file was deleted.

test/e2e/data/kustomize/cluster-identity-denied/patch-openstackcluster-identityref.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

test/e2e/data/kustomize/cluster-identity/kustomization.yaml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,12 @@ apiVersion: kustomize.config.k8s.io/v1beta1
22
kind: Kustomization
33

44
resources:
5-
- ../../../../../kustomize/v1beta1/default
5+
- ../default
66
- openstackclusteridentity.yaml
77

8-
components:
9-
- ../common-patches/cluster
10-
- ../common-patches/cni
11-
- ../upgrade-patches
12-
- ../common-patches/ccm
13-
- ../common-patches/externalNetworkByName
14-
- ../common-patches/images
15-
168
patches:
179
- path: patch-openstackcluster-identityref.yaml
1810
target:
1911
kind: OpenStackCluster
20-
name: ${CLUSTER_NAME}
12+
name: \${CLUSTER_NAME}
2113

test/e2e/shared/defaults.go

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

3737
const (
38-
DefaultSSHKeyPairName = "cluster-api-provider-openstack-sigs-k8s-io"
39-
KubeContext = "KUBE_CONTEXT"
40-
KubernetesVersion = "KUBERNETES_VERSION"
41-
CCMPath = "CCM"
42-
CCMResources = "CCM_RESOURCES"
43-
OpenStackBastionFlavorAlt = "OPENSTACK_BASTION_MACHINE_FLAVOR_ALT"
44-
OpenStackCloudYAMLFile = "OPENSTACK_CLOUD_YAML_FILE"
45-
OpenStackCloud = "OPENSTACK_CLOUD"
46-
OpenStackCloudCACertB64 = "OPENSTACK_CLOUD_CACERT_B64"
47-
OpenStackCloudAdmin = "OPENSTACK_CLOUD_ADMIN"
48-
OpenStackFailureDomain = "OPENSTACK_FAILURE_DOMAIN" //nolint:gosec // Linter thinks this could be credentials...
49-
OpenStackFailureDomainAlt = "OPENSTACK_FAILURE_DOMAIN_ALT"
50-
OpenStackVolumeTypeAlt = "OPENSTACK_VOLUME_TYPE_ALT"
51-
OpenStackImageName = "OPENSTACK_IMAGE_NAME"
52-
OpenStackNodeMachineFlavor = "OPENSTACK_NODE_MACHINE_FLAVOR"
53-
SSHUserMachine = "SSH_USER_MACHINE"
54-
FlavorDefault = ""
55-
FlavorNoBastion = "no-bastion"
56-
FlavorWithoutLB = "without-lb"
57-
FlavorMultiNetwork = "multi-network"
58-
FlavorMultiAZ = "multi-az"
59-
FlavorMDRemediation = "md-remediation"
60-
FlavorKCPRemediation = "kcp-remediation"
61-
FlavorFlatcar = "flatcar"
62-
FlavorKubernetesUpgrade = "k8s-upgrade"
63-
FlavorFlatcarSysext = "flatcar-sysext"
64-
FlavorHealthMonitor = "health-monitor"
65-
FlavorClusterIdentity = "cluster-identity"
66-
FlavorClusterIdentityDenied = "cluster-identity-denied"
38+
DefaultSSHKeyPairName = "cluster-api-provider-openstack-sigs-k8s-io"
39+
KubeContext = "KUBE_CONTEXT"
40+
KubernetesVersion = "KUBERNETES_VERSION"
41+
CCMPath = "CCM"
42+
CCMResources = "CCM_RESOURCES"
43+
OpenStackBastionFlavorAlt = "OPENSTACK_BASTION_MACHINE_FLAVOR_ALT"
44+
OpenStackCloudYAMLFile = "OPENSTACK_CLOUD_YAML_FILE"
45+
OpenStackCloud = "OPENSTACK_CLOUD"
46+
OpenStackCloudCACertB64 = "OPENSTACK_CLOUD_CACERT_B64"
47+
OpenStackCloudAdmin = "OPENSTACK_CLOUD_ADMIN"
48+
OpenStackFailureDomain = "OPENSTACK_FAILURE_DOMAIN" //nolint:gosec // Linter thinks this could be credentials...
49+
OpenStackFailureDomainAlt = "OPENSTACK_FAILURE_DOMAIN_ALT"
50+
OpenStackVolumeTypeAlt = "OPENSTACK_VOLUME_TYPE_ALT"
51+
OpenStackImageName = "OPENSTACK_IMAGE_NAME"
52+
OpenStackNodeMachineFlavor = "OPENSTACK_NODE_MACHINE_FLAVOR"
53+
SSHUserMachine = "SSH_USER_MACHINE"
54+
FlavorDefault = ""
55+
FlavorNoBastion = "no-bastion"
56+
FlavorWithoutLB = "without-lb"
57+
FlavorMultiNetwork = "multi-network"
58+
FlavorMultiAZ = "multi-az"
59+
FlavorMDRemediation = "md-remediation"
60+
FlavorKCPRemediation = "kcp-remediation"
61+
FlavorFlatcar = "flatcar"
62+
FlavorKubernetesUpgrade = "k8s-upgrade"
63+
FlavorFlatcarSysext = "flatcar-sysext"
64+
FlavorHealthMonitor = "health-monitor"
65+
FlavorCapiV1Beta1 = "capi-v1beta1"
66+
FlavorClusterIdentity = "cluster-identity"
6767
)
6868

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

test/e2e/suites/e2e/e2e_test.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -358,38 +358,6 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
358358
})
359359
})
360360

361-
Describe("Workload cluster (cluster-identity denied)", func() {
362-
It("should fail to reconcile new workers when namespaceSelector denies access", func(ctx context.Context) {
363-
shared.Logf("Creating a cluster with ClusterIdentity (denied flavor) and 0 workers")
364-
clusterName := fmt.Sprintf("cluster-%s", namespace.Name)
365-
configCluster := defaultConfigCluster(clusterName, namespace.Name)
366-
configCluster.ControlPlaneMachineCount = ptr.To(int64(1))
367-
configCluster.WorkerMachineCount = ptr.To(int64(0))
368-
configCluster.Flavor = shared.FlavorClusterIdentityDenied
369-
createCluster(ctx, configCluster, clusterResources)
370-
371-
// Create a new MachineDeployment that should fail to reconcile due to denied identity access
372-
mdName := clusterName + "-md-denied"
373-
replicas := int32(1)
374-
framework.CreateMachineDeployment(ctx, framework.CreateMachineDeploymentInput{
375-
Creator: e2eCtx.Environment.BootstrapClusterProxy.GetClient(),
376-
MachineDeployment: makeMachineDeployment(namespace.Name, mdName, clusterName, e2eCtx.E2EConfig.MustGetVariable(shared.OpenStackFailureDomain), replicas),
377-
BootstrapConfigTemplate: makeJoinBootstrapConfigTemplate(namespace.Name, mdName),
378-
InfraMachineTemplate: makeOpenStackMachineTemplate(namespace.Name, clusterName, mdName),
379-
})
380-
381-
// Assert that no worker servers are created
382-
machineTags := fmt.Sprintf("%s,%s", clusterName, "machine")
383-
Consistently(func() (int, error) {
384-
serversList, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{Tags: machineTags})
385-
if err != nil {
386-
return -1, err
387-
}
388-
return len(serversList), nil
389-
}, e2eCtx.E2EConfig.GetIntervals(specName, "wait-worker-nodes")[0]).Should(Equal(0))
390-
})
391-
})
392-
393361
Describe("Workload cluster (no bastion)", func() {
394362
It("should be creatable and deletable", func(ctx context.Context) {
395363
shared.Logf("Creating a cluster")

0 commit comments

Comments
 (0)