Skip to content

Commit

Permalink
Add testframework skeleton
Browse files Browse the repository at this point in the history
Create filesystem before the tests
  • Loading branch information
Cheng Pan committed Oct 20, 2019
1 parent 19b173e commit e7b53e9
Show file tree
Hide file tree
Showing 10 changed files with 502 additions and 479 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ test:

.PHONY: test-e2e
test-e2e:
AWS_REGION=us-west-2 AWS_AVAILABILITY_ZONES=us-west-2a,us-west-2b,us-west-2c ./hack/run-e2e-test
#AWS_REGION=us-west-2 AWS_AVAILABILITY_ZONES=us-west-2a,us-west-2b,us-west-2c ./hack/run-e2e-test
TESTCONFIG=./tester/e2e-test-config.yaml go run tester/cmd/main.go

.PHONY: image
image:
Expand Down
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
module github.com/kubernetes-sigs/aws-efs-csi-driver

require (
github.com/aws/aws-k8s-tester/e2e/tester v0.0.0-20191012181850-1ee05aff3c62
github.com/aws/aws-sdk-go v1.23.21
github.com/container-storage-interface/spec v1.1.0
github.com/golang/mock v1.3.1
github.com/kubernetes-csi/csi-test v2.0.2-0.20190719174114-bc42f92ebdc8+incompatible
github.com/onsi/ginkgo v1.8.0
github.com/onsi/gomega v1.5.0
google.golang.org/grpc v1.23.0
k8s.io/api v0.0.0
k8s.io/apimachinery v0.0.0
k8s.io/klog v0.4.0
k8s.io/kubernetes v1.16.1
)
Expand Down
170 changes: 170 additions & 0 deletions go.sum

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions hack/run-e2e-test
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ sed -i'' "s,newTag: latest,newTag: \"$IMAGE_TAG\"," deploy/kubernetes/overlays/d
kubectl apply -k deploy/kubernetes/overlays/dev/

echo "Creating EFS file system"
date
aws efs create-file-system --creation-token $TEST_ID --tags Key=KubernetesCluster,Value=$CLUSTER_NAME.k8s.local --region $REGION
FILE_SYSTEM_ID=$(aws efs describe-file-systems --creation-token $TEST_ID --region $REGION | jq -r '.FileSystems[0].FileSystemId')

Expand All @@ -93,6 +94,7 @@ for zone in ${ZONES//,/ }; do
SUBNET_ID=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=$SUBNET_NAME --region $REGION | jq -r '.Subnets[0].SubnetId')
aws efs create-mount-target --file-system-id $FILE_SYSTEM_ID --subnet-id $SUBNET_ID --security-groups $GROUP_ID --region $REGION
done
date

# Run the test
export KUBECONFIG=$HOME/.kube/config
Expand Down
221 changes: 221 additions & 0 deletions test/e2e/cloud.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
/*
Copyright 2019 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 (
"errors"
"fmt"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/efs"
)

type cloud struct {
efsclient *efs.EFS
ec2client *ec2.EC2
}

func NewCloud(region string) *cloud {
config := &aws.Config{
Region: aws.String(region),
}
sess := session.Must(session.NewSession(config))

return &cloud{
efsclient: efs.New(sess),
ec2client: ec2.New(sess),
}
}

type FileSystemOptions struct {
clusterName string
}

func (c *cloud) CreateFileSystem(clusterName string) (string, error) {
tags := []*efs.Tag{
{
Key: aws.String("KubernetesCluster"),
Value: aws.String(clusterName),
},
}

// Use cluster name as the token
request := &efs.CreateFileSystemInput{
CreationToken: aws.String(clusterName),
Tags: tags,
}

response, err := c.efsclient.CreateFileSystem(request)
if err != nil {
return "", err
}

fileSystemId := response.FileSystemId
err = c.ensureFileSystemStatus(*fileSystemId, "available")
if err != nil {
return "", err
}

securityGroupId, err := c.getSecurityGroup(clusterName)
if err != nil {
return "", err
}

subnetIds, err := c.getSubnetIds(clusterName)
if err != nil {
return "", err
}

for _, subnetId := range subnetIds {
request := &efs.CreateMountTargetInput{
FileSystemId: fileSystemId,
SubnetId: aws.String(subnetId),
SecurityGroups: []*string{
aws.String(securityGroupId),
},
}

_, err := c.efsclient.CreateMountTarget(request)
if err != nil {
return "", err
}
}

err = c.ensureMountTargetStatus(*fileSystemId, "available")
if err != nil {
return "", err
}

return aws.StringValue(fileSystemId), nil
}

func (c *cloud) DeleteFileSystem(fileSystemId string) error {
request := &efs.DeleteFileSystemInput{
FileSystemId: aws.String(fileSystemId),
}
_, err := c.efsclient.DeleteFileSystem(request)
if err != nil {
return err
}

return nil
}

// getSecurityGroup returns the node security group ID given cluster name
// assuming it's kops cluster and find security group using tag
func (c *cloud) getSecurityGroup(clusterName string) (string, error) {
request := &ec2.DescribeSecurityGroupsInput{
Filters: []*ec2.Filter{
{
Name: aws.String("tag:Name"),
Values: []*string{
aws.String(fmt.Sprintf("nodes.%s", clusterName)),
},
},
},
}

response, err := c.ec2client.DescribeSecurityGroups(request)
if err != nil {
return "", err
}

if len(response.SecurityGroups) == 0 {
return "", fmt.Errorf("No security group found for cluster %s", clusterName)
}

return aws.StringValue(response.SecurityGroups[0].GroupId), nil
}

func (c *cloud) getSubnetIds(clusterName string) ([]string, error) {
request := &ec2.DescribeSubnetsInput{
Filters: []*ec2.Filter{
{
Name: aws.String("tag:KubernetesCluster"),
Values: []*string{
aws.String(clusterName),
},
},
},
}

subnetIds := []string{}
response, err := c.ec2client.DescribeSubnets(request)
if err != nil {
return subnetIds, err
}

for _, subnet := range response.Subnets {
subnetIds = append(subnetIds, aws.StringValue(subnet.SubnetId))
}

return subnetIds, nil
}

func (c *cloud) ensureFileSystemStatus(fileSystemId, status string) error {
request := &efs.DescribeFileSystemsInput{
FileSystemId: aws.String(fileSystemId),
}

for {
response, err := c.efsclient.DescribeFileSystems(request)
if err != nil {
return err
}

if len(response.FileSystems) == 0 {
return errors.New("no filesystem found")
}

if *response.FileSystems[0].LifeCycleState == status {
return nil
}
time.Sleep(time.Second)
}

return nil
}

func (c *cloud) ensureMountTargetStatus(fileSystemId, status string) error {
request := &efs.DescribeMountTargetsInput{
FileSystemId: aws.String(fileSystemId),
}

for {
response, err := c.efsclient.DescribeMountTargets(request)
if err != nil {
return err
}

done := true
for _, target := range response.MountTargets {
if *target.LifeCycleState != status {
done = false
break
}
}
if done {
break
}
time.Sleep(time.Second)
}

return nil
}
51 changes: 43 additions & 8 deletions test/e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,49 @@ import (
"log"
"os"
"path"
"path/filepath"
"testing"

"github.com/onsi/ginkgo"
"github.com/onsi/ginkgo/config"
"github.com/onsi/ginkgo/reporters"
"github.com/onsi/gomega"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/test/e2e/framework"
frameworkconfig "k8s.io/kubernetes/test/e2e/framework/config"
"k8s.io/kubernetes/test/e2e/framework/testfiles"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/testsuites"
)

const kubeconfigEnvVar = "KUBECONFIG"

var (
clusterName = flag.String("cluster-name", "", "the cluster name")
region = flag.String("region", "us-west-2", "the region")
fileSystemID string
)

func init() {
framework.HandleFlags()
// k8s.io/kubernetes/test/e2e/framework requires env KUBECONFIG to be set
// it does not fall back to defaults
if os.Getenv(kubeconfigEnvVar) == "" {
kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
os.Setenv(kubeconfigEnvVar, kubeconfig)
}

framework.AfterReadingAllFlags(&framework.TestContext)
// PWD is test/e2e inside the git repo
testfiles.AddFileSource(testfiles.RootFileSource{Root: "../.."})
}

var fileSystemID = flag.String("file-system-id", "", "required. file system ID of the EFS file system to use for the test")
frameworkconfig.CopyFlags(frameworkconfig.Flags, flag.CommandLine)
framework.RegisterCommonFlags(flag.CommandLine)
framework.RegisterClusterFlags(flag.CommandLine)
flag.Parse()
}

func TestEFSCSI(t *testing.T) {
if *fileSystemID == "" {
log.Fatalf("file-system-id required. file system ID of the EFS file system to use for the test.")
}
gomega.RegisterFailHandler(ginkgo.Fail)

// Run tests through the Ginkgo runner with output to console + JUnit for Jenkins
Expand Down Expand Up @@ -119,7 +135,7 @@ func (e *efsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volu
pvSource := v1.PersistentVolumeSource{
CSI: &v1.CSIPersistentVolumeSource{
Driver: e.driverInfo.Name,
VolumeHandle: *fileSystemID,
VolumeHandle: fileSystemID,
},
}
return &pvSource, nil
Expand All @@ -136,6 +152,25 @@ var csiTestSuites = []func() testsuites.TestSuite{
testsuites.InitMultiVolumeTestSuite,
}

var _ = ginkgo.BeforeSuite(func() {
ginkgo.By(fmt.Sprintf("Creating EFS filesystem at %s on %s", *region, *clusterName))
c := NewCloud(*region)
id, err := c.CreateFileSystem(*clusterName)
if err != nil {
ginkgo.Fail(fmt.Sprintf("failed to create EFS filesystem: %s", err))
}
fileSystemID = id
})

var _ = ginkgo.AfterSuite(func() {
ginkgo.By(fmt.Sprintf("Deleting EFS filesystem %s", fileSystemId))
c := NewCloud(*region)
err := c.DeleteFileSystem(fileSystemID)
if err != nil {
ginkgo.Fail(fmt.Sprintf("failed to delete EFS filesystem: %s", err))
}
})

var _ = ginkgo.Describe("[efs-csi] EFS CSI", func() {
driver := InitEFSCSIDriver()
ginkgo.Context(testsuites.GetDriverNameWithFeatureTags(driver), func() {
Expand Down
Loading

0 comments on commit e7b53e9

Please sign in to comment.