Skip to content

Commit

Permalink
Add e2e test for project
Browse files Browse the repository at this point in the history
  • Loading branch information
vishesh92 committed May 21, 2024
1 parent eba72cf commit b7b787e
Show file tree
Hide file tree
Showing 7 changed files with 199 additions and 1 deletion.
1 change: 0 additions & 1 deletion docs/book/src/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
secret-key: <cloudstackSecretKey>
api-url: <cloudstackApiUrl>
verify-ssl: "false"
project-id: <project id> # Optional. If provided, the provider will use this project id for all operations
```
- Apply this secret to the management cluster:
Expand Down
1 change: 1 addition & 0 deletions test/e2e/config/cloudstack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ variables:
CLOUDSTACK_INVALID_ZONE_NAME: zoneXXXX
CLOUDSTACK_INVALID_NETWORK_NAME: networkXXXX
CLOUDSTACK_ACCOUNT_NAME: admin
CLOUDSTACK_PROJECT_NAME: capc-e2e-test
CLOUDSTACK_INVALID_ACCOUNT_NAME: accountXXXX
CLOUDSTACK_DOMAIN_NAME: ROOT
CLOUDSTACK_INVALID_DOMAIN_NAME: domainXXXX
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: infrastructure.cluster.x-k8s.io/v1beta3
kind: CloudStackCluster
metadata:
name: ${CLUSTER_NAME}
spec:
failureDomains:
- name: ${CLOUDSTACK_FD1_NAME}
acsEndpoint:
name: ${CLOUDSTACK_FD1_SECRET_NAME}
namespace: default
zone:
name : ${CLOUDSTACK_ZONE_NAME}
network:
name: ${CLOUDSTACK_NETWORK_NAME}
project: ${CLOUDSTACK_PROJECT_NAME}
controlPlaneEndpoint:
host: ""
port: 6443
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
bases:
- ../bases/cluster-with-kcp.yaml
- ../bases/md.yaml

patchesStrategicMerge:
- ./cloudstack-cluster.yaml
- ./md.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta3
kind: CloudStackMachineTemplate
metadata:
name: ${CLUSTER_NAME}-control-plane
spec:
template:
spec:
offering:
name: ${CLOUDSTACK_CONTROL_PLANE_MACHINE_OFFERING}
template:
name: ${CLOUDSTACK_TEMPLATE_NAME}
sshKey: ${CLOUDSTACK_SSH_KEY_NAME}
affinity: pro
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta3
kind: CloudStackMachineTemplate
metadata:
name: ${CLUSTER_NAME}-md-0
spec:
template:
spec:
offering:
name: ${CLOUDSTACK_WORKER_MACHINE_OFFERING}
template:
name: ${CLOUDSTACK_TEMPLATE_NAME}
sshKey: ${CLOUDSTACK_SSH_KEY_NAME}
affinity: pro
106 changes: 106 additions & 0 deletions test/e2e/project.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
Copyright 2020 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package e2e

import (
"context"
"fmt"
"os"
"path/filepath"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
"k8s.io/utils/pointer"

"sigs.k8s.io/cluster-api/test/framework/clusterctl"
"sigs.k8s.io/cluster-api/util"
)

// ProjectSpec implements a test that verifies that an app deployed to the workload cluster works.
func ProjectSpec(ctx context.Context, inputGetter func() CommonSpecInput) {
var (
specName = "project"
input CommonSpecInput
namespace *corev1.Namespace
cancelWatches context.CancelFunc
clusterResources *clusterctl.ApplyClusterTemplateAndWaitResult
affinityIds []string
)

BeforeEach(func() {
Expect(ctx).NotTo(BeNil(), "ctx is required for %s spec", specName)
input = inputGetter()
Expect(input.E2EConfig).ToNot(BeNil(), "Invalid argument. input.E2EConfig can't be nil when calling %s spec", specName)
Expect(input.ClusterctlConfigPath).To(BeAnExistingFile(), "Invalid argument. input.ClusterctlConfigPath must be an existing file when calling %s spec", specName)
Expect(input.BootstrapClusterProxy).ToNot(BeNil(), "Invalid argument. input.BootstrapClusterProxy can't be nil when calling %s spec", specName)
Expect(os.MkdirAll(input.ArtifactFolder, 0750)).To(Succeed(), "Invalid argument. input.ArtifactFolder can't be created for %s spec", specName)

Expect(input.E2EConfig.Variables).To(HaveKey(KubernetesVersion))

// Setup a Namespace where to host objects for this spec and create a watcher for the namespace events.
namespace, cancelWatches = setupSpecNamespace(ctx, specName, input.BootstrapClusterProxy, input.ArtifactFolder)
clusterResources = new(clusterctl.ApplyClusterTemplateAndWaitResult)

Expect(ctx).NotTo(BeNil(), "ctx is required for %s spec", specName)
input = inputGetter()

csClient := CreateCloudStackClient(ctx, input.BootstrapClusterProxy.GetKubeconfigPath())
projectName := os.Getenv("CLOUDSTACK_PROJECT_NAME")
project, _, err := csClient.Project.GetProjectByName(projectName)
if (err != nil) || (project == nil) {
Skip(fmt.Sprintf("Failed to fetch project %s", projectName))
}
})

It("Should create a cluster in a project", func() {
clusterctl.ApplyClusterTemplateAndWait(ctx, clusterctl.ApplyClusterTemplateAndWaitInput{
ClusterProxy: input.BootstrapClusterProxy,
CNIManifestPath: input.E2EConfig.GetVariable(CNIPath),
ConfigCluster: clusterctl.ConfigClusterInput{
LogFolder: filepath.Join(input.ArtifactFolder, "clusters", input.BootstrapClusterProxy.GetName()),
ClusterctlConfigPath: input.ClusterctlConfigPath,
KubeconfigPath: input.BootstrapClusterProxy.GetKubeconfigPath(),
InfrastructureProvider: clusterctl.DefaultInfrastructureProvider,
Flavor: specName,
Namespace: namespace.Name,
ClusterName: fmt.Sprintf("%s-%s", specName, util.RandomString(6)),
KubernetesVersion: input.E2EConfig.GetVariable(KubernetesVersion),
ControlPlaneMachineCount: pointer.Int64Ptr(1),
WorkerMachineCount: pointer.Int64Ptr(1),
},
WaitForClusterIntervals: input.E2EConfig.GetIntervals(specName, "wait-cluster"),
WaitForControlPlaneIntervals: input.E2EConfig.GetIntervals(specName, "wait-control-plane"),
WaitForMachineDeployments: input.E2EConfig.GetIntervals(specName, "wait-worker-nodes"),
}, clusterResources)

csClient := CreateCloudStackClient(ctx, input.BootstrapClusterProxy.GetKubeconfigPath())
affinityIds = CheckAffinityGroup(csClient, clusterResources.Cluster.Name, "pro")
})

AfterEach(func() {
// Dumps all the resources in the spec namespace, then cleanups the cluster object and the spec namespace itself.
dumpSpecResourcesAndCleanup(ctx, specName, input.BootstrapClusterProxy, input.ArtifactFolder, namespace, cancelWatches, clusterResources.Cluster, input.E2EConfig.GetIntervals, input.SkipCleanup)

csClient := CreateCloudStackClient(ctx, input.BootstrapClusterProxy.GetKubeconfigPath())
err := CheckAffinityGroupsDeleted(csClient, affinityIds)
if err != nil {
Fail(err.Error())
}
By("PASSED!")
})
}
39 changes: 39 additions & 0 deletions test/e2e/project_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//go:build e2e
// +build e2e

/*
Copyright 2020 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package e2e

import (
"context"

. "github.com/onsi/ginkgo/v2"
)

var _ = Describe("When testing project", func() {
ProjectSpec(context.TODO(), func() CommonSpecInput {
return CommonSpecInput{
E2EConfig: e2eConfig,
ClusterctlConfigPath: clusterctlConfigPath,
BootstrapClusterProxy: bootstrapClusterProxy,
ArtifactFolder: artifactFolder,
SkipCleanup: skipCleanup,
}
})

})

0 comments on commit b7b787e

Please sign in to comment.