Skip to content

Commit 88bcf1b

Browse files
authored
test/e2e: add framework for e2e tests (#359)
* test/e2e: add framework for e2e tests This will allow us to add more tests in the future without duplicating code and will also allow us to parse command line options more easily. * test/e2e/framework/framework.go: simplify kubeconfig default string * test/e2e/framework/framework.go: change usage message for kubeconfig arg
1 parent 1b3cec5 commit 88bcf1b

File tree

4 files changed

+80
-32
lines changed

4 files changed

+80
-32
lines changed

test/e2e/framework/framework.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package framework
2+
3+
import (
4+
"flag"
5+
"log"
6+
"os"
7+
8+
"k8s.io/client-go/kubernetes"
9+
"k8s.io/client-go/rest"
10+
"k8s.io/client-go/tools/clientcmd"
11+
)
12+
13+
var Global *Framework
14+
15+
type Framework struct {
16+
KubeConfig *rest.Config
17+
KubeClient kubernetes.Interface
18+
}
19+
20+
func setup() error {
21+
defaultKubeConfig := ""
22+
homedir, ok := os.LookupEnv("HOME")
23+
if ok {
24+
defaultKubeConfig = homedir + "/.kube/config"
25+
}
26+
config := flag.String("kubeconfig", defaultKubeConfig, "kubeconfig path, defaults to $HOME/.kube/config")
27+
flag.Parse()
28+
if *config == "" {
29+
log.Fatalf("Cannot find kubeconfig, exiting\n")
30+
}
31+
kubeconfig, err := clientcmd.BuildConfigFromFlags("", *config)
32+
if err != nil {
33+
return err
34+
}
35+
kubeclient, err := kubernetes.NewForConfig(kubeconfig)
36+
if err != nil {
37+
return err
38+
}
39+
Global = &Framework{
40+
KubeConfig: kubeconfig,
41+
KubeClient: kubeclient,
42+
}
43+
return nil
44+
}

test/e2e/framework/main_entry.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package framework
2+
3+
import (
4+
"log"
5+
"os"
6+
"testing"
7+
)
8+
9+
func MainEntry(m *testing.M) {
10+
if err := setup(); err != nil {
11+
log.Fatalf("Failed to set up framework: %v", err)
12+
}
13+
14+
os.Exit(m.Run())
15+
}

test/e2e/main_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package e2e
22

33
import (
4-
"os"
54
"testing"
5+
6+
f "github.com/operator-framework/operator-sdk/test/e2e/framework"
67
)
78

89
func TestMain(m *testing.M) {
9-
// TODO: create a setup step for the framework here
10-
os.Exit(m.Run())
10+
f.MainEntry(m)
1111
}

test/e2e/memcached_test.go

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@ import (
77
"net/http"
88
"os"
99
"os/exec"
10-
"path/filepath"
1110
"testing"
1211

1312
"github.com/operator-framework/operator-sdk/test/e2e/e2eutil"
13+
framework "github.com/operator-framework/operator-sdk/test/e2e/framework"
14+
1415
core "k8s.io/api/core/v1"
1516
extensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
1617
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718
"k8s.io/apimachinery/pkg/types"
18-
"k8s.io/client-go/kubernetes"
19-
"k8s.io/client-go/tools/clientcmd"
2019
)
2120

2221
const (
@@ -94,22 +93,12 @@ func TestMemcached(t *testing.T) {
9493
t.Fatal(err)
9594
}
9695

96+
// get global framework variables
97+
f := framework.Global
9798
namespace := "memcached"
98-
kubeconfigPath := filepath.Join(
99-
os.Getenv("HOME"), ".kube", "config",
100-
)
101-
kubeconfig, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
102-
if err != nil {
103-
t.Fatal(err)
104-
}
105-
kubeclient, err := kubernetes.NewForConfig(kubeconfig)
106-
if err != nil {
107-
t.Fatal(err)
108-
}
109-
11099
// create namespace
111100
namespaceObj := &core.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespace}}
112-
_, err = kubeclient.CoreV1().Namespaces().Create(namespaceObj)
101+
_, err = f.KubeClient.CoreV1().Namespaces().Create(namespaceObj)
113102
if err != nil {
114103
t.Fatal(err)
115104
}
@@ -119,7 +108,7 @@ func TestMemcached(t *testing.T) {
119108
rbacYAML, err := ioutil.ReadFile("deploy/rbac.yaml")
120109
rbacYAMLSplit := bytes.Split(rbacYAML, []byte("\n---\n"))
121110
for _, rbacSpec := range rbacYAMLSplit {
122-
err = e2eutil.CreateFromYAML(t, rbacSpec, kubeclient, kubeconfig, namespace)
111+
err = e2eutil.CreateFromYAML(t, rbacSpec, f.KubeClient, f.KubeConfig, namespace)
123112
if err != nil {
124113
t.Fatal(err)
125114
}
@@ -128,22 +117,22 @@ func TestMemcached(t *testing.T) {
128117

129118
// create crd
130119
crdYAML, err := ioutil.ReadFile("deploy/crd.yaml")
131-
err = e2eutil.CreateFromYAML(t, crdYAML, kubeclient, kubeconfig, namespace)
120+
err = e2eutil.CreateFromYAML(t, crdYAML, f.KubeClient, f.KubeConfig, namespace)
132121
if err != nil {
133122
t.Fatal(err)
134123
}
135124
t.Log("Created crd")
136125

137126
// create operator
138127
operatorYAML, err = ioutil.ReadFile("deploy/operator.yaml")
139-
err = e2eutil.CreateFromYAML(t, operatorYAML, kubeclient, kubeconfig, namespace)
128+
err = e2eutil.CreateFromYAML(t, operatorYAML, f.KubeClient, f.KubeConfig, namespace)
140129
if err != nil {
141130
t.Fatal(err)
142131
}
143132
t.Log("Created operator")
144133

145134
// wait for memcached-operator to be ready
146-
err = e2eutil.DeploymentReplicaCheck(t, kubeclient, namespace, "memcached-operator", 1, 6)
135+
err = e2eutil.DeploymentReplicaCheck(t, f.KubeClient, namespace, "memcached-operator", 1, 6)
147136
if err != nil {
148137
t.Fatal(err)
149138
}
@@ -158,11 +147,11 @@ func TestMemcached(t *testing.T) {
158147

159148
// create memcached custom resource
160149
crYAML, err := ioutil.ReadFile("deploy/cr.yaml")
161-
e2eutil.CreateFromYAML(t, crYAML, kubeclient, kubeconfig, namespace)
162-
memcachedClient := e2eutil.GetCRClient(t, kubeconfig, crYAML)
150+
e2eutil.CreateFromYAML(t, crYAML, f.KubeClient, f.KubeConfig, namespace)
151+
memcachedClient := e2eutil.GetCRClient(t, f.KubeConfig, crYAML)
163152

164153
// wait for example-memcached to reach 3 replicas
165-
err = e2eutil.DeploymentReplicaCheck(t, kubeclient, namespace, "example-memcached", 3, 6)
154+
err = e2eutil.DeploymentReplicaCheck(t, f.KubeClient, namespace, "example-memcached", 3, 6)
166155
if err != nil {
167156
t.Fatal(err)
168157
}
@@ -180,7 +169,7 @@ func TestMemcached(t *testing.T) {
180169
}
181170

182171
// wait for example-memcached to reach 4 replicas
183-
err = e2eutil.DeploymentReplicaCheck(t, kubeclient, namespace, "example-memcached", 4, 6)
172+
err = e2eutil.DeploymentReplicaCheck(t, f.KubeClient, namespace, "example-memcached", 4, 6)
184173
if err != nil {
185174
t.Fatal(err)
186175
}
@@ -197,23 +186,23 @@ func TestMemcached(t *testing.T) {
197186
t.Log("Failed to delete example-memcached CR")
198187
t.Fatal(err)
199188
}
200-
err = kubeclient.AppsV1().Deployments(namespace).
189+
err = f.KubeClient.AppsV1().Deployments(namespace).
201190
Delete("memcached-operator", metav1.NewDeleteOptions(0))
202191
if err != nil {
203192
t.Log("Failed to delete memcached-operator deployment")
204193
t.Fatal(err)
205194
}
206-
err = kubeclient.RbacV1beta1().Roles(namespace).Delete("memcached-operator", metav1.NewDeleteOptions(0))
195+
err = f.KubeClient.RbacV1beta1().Roles(namespace).Delete("memcached-operator", metav1.NewDeleteOptions(0))
207196
if err != nil {
208197
t.Log("Failed to delete memcached-operator Role")
209198
t.Fatal(err)
210199
}
211-
err = kubeclient.RbacV1beta1().RoleBindings(namespace).Delete("default-account-memcached-operator", metav1.NewDeleteOptions(0))
200+
err = f.KubeClient.RbacV1beta1().RoleBindings(namespace).Delete("default-account-memcached-operator", metav1.NewDeleteOptions(0))
212201
if err != nil {
213202
t.Log("Failed to delete memcached-operator RoleBinding")
214203
t.Fatal(err)
215204
}
216-
extensionclient, err := extensions.NewForConfig(kubeconfig)
205+
extensionclient, err := extensions.NewForConfig(f.KubeConfig)
217206
if err != nil {
218207
t.Fatal(err)
219208
}
@@ -222,7 +211,7 @@ func TestMemcached(t *testing.T) {
222211
t.Log("Failed to delete memcached CRD")
223212
t.Fatal(err)
224213
}
225-
err = kubeclient.CoreV1().Namespaces().Delete(namespace, metav1.NewDeleteOptions(0))
214+
err = f.KubeClient.CoreV1().Namespaces().Delete(namespace, metav1.NewDeleteOptions(0))
226215
if err != nil {
227216
t.Log("Failed to delete memcached namespace")
228217
t.Fatal(err)

0 commit comments

Comments
 (0)