Let unit tests run in different namespaces to avoid resource conflict

This commit is contained in:
Ta-Ching Chen
2020-01-24 01:33:12 +08:00
parent 4923708836
commit 49ec161c5e
3 changed files with 59 additions and 30 deletions
+36 -20
View File
@@ -28,6 +28,7 @@ import (
"testing" "testing"
"time" "time"
uuid "github.com/satori/go.uuid"
"go.uber.org/zap" "go.uber.org/zap"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -35,13 +36,17 @@ import (
fv1 "github.com/fission/fission/pkg/apis/core/v1" fv1 "github.com/fission/fission/pkg/apis/core/v1"
"github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/controller/client"
"github.com/fission/fission/pkg/controller/client/rest" "github.com/fission/fission/pkg/controller/client/rest"
"github.com/fission/fission/pkg/crd"
ferror "github.com/fission/fission/pkg/error" ferror "github.com/fission/fission/pkg/error"
"github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd"
) )
var g struct { var (
cmd.CommandActioner g struct {
} cmd.CommandActioner
}
testNS = metav1.NamespaceDefault
)
func panicIf(err error) { func panicIf(err error) {
if err != nil { if err != nil {
@@ -81,17 +86,17 @@ func TestFunctionApi(t *testing.T) {
testFunc := &fv1.Function{ testFunc := &fv1.Function{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.FunctionSpec{ Spec: fv1.FunctionSpec{
Environment: fv1.EnvironmentReference{ Environment: fv1.EnvironmentReference{
Name: "nodejs", Name: "nodejs",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Package: fv1.FunctionPackageRef{ Package: fv1.FunctionPackageRef{
FunctionName: "xxx", FunctionName: "xxx",
PackageRef: fv1.PackageRef{ PackageRef: fv1.PackageRef{
Namespace: metav1.NamespaceDefault, Namespace: testNS,
Name: "xxx", Name: "xxx",
ResourceVersion: "12345", ResourceVersion: "12345",
}, },
@@ -100,7 +105,7 @@ func TestFunctionApi(t *testing.T) {
} }
_, err := g.Client().V1().Function().Get(&metav1.ObjectMeta{ _, err := g.Client().V1().Function().Get(&metav1.ObjectMeta{
Name: testFunc.ObjectMeta.Name, Name: testFunc.ObjectMeta.Name,
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}) })
assertNotFoundFailure(err, "function") assertNotFoundFailure(err, "function")
@@ -125,7 +130,7 @@ func TestFunctionApi(t *testing.T) {
panicIf(err) panicIf(err)
defer g.Client().V1().Function().Delete(m2) defer g.Client().V1().Function().Delete(m2)
funcs, err := g.Client().V1().Function().List(metav1.NamespaceDefault) funcs, err := g.Client().V1().Function().List(testNS)
panicIf(err) panicIf(err)
assert(len(funcs) == 2, fmt.Sprintf("created two functions, but found %v", len(funcs))) assert(len(funcs) == 2, fmt.Sprintf("created two functions, but found %v", len(funcs)))
@@ -148,7 +153,7 @@ func TestHTTPTriggerApi(t *testing.T) {
testTrigger := &fv1.HTTPTrigger{ testTrigger := &fv1.HTTPTrigger{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.HTTPTriggerSpec{ Spec: fv1.HTTPTriggerSpec{
Method: http.MethodGet, Method: http.MethodGet,
@@ -161,7 +166,7 @@ func TestHTTPTriggerApi(t *testing.T) {
} }
_, err := g.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{ _, err := g.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{
Name: testTrigger.ObjectMeta.Name, Name: testTrigger.ObjectMeta.Name,
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}) })
assertNotFoundFailure(err, "httptrigger") assertNotFoundFailure(err, "httptrigger")
@@ -194,17 +199,16 @@ func TestHTTPTriggerApi(t *testing.T) {
panicIf(err) panicIf(err)
defer g.Client().V1().HTTPTrigger().Delete(m2) defer g.Client().V1().HTTPTrigger().Delete(m2)
ts, err := g.Client().V1().HTTPTrigger().List(metav1.NamespaceDefault) ts, err := g.Client().V1().HTTPTrigger().List(testNS)
panicIf(err) panicIf(err)
assert(len(ts) == 2, fmt.Sprintf("created two triggers, but found %v", len(ts))) assert(len(ts) == 2, fmt.Sprintf("created two triggers, but found %v", len(ts)))
} }
func TestEnvironmentApi(t *testing.T) { func TestEnvironmentApi(t *testing.T) {
testEnv := &fv1.Environment{ testEnv := &fv1.Environment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.EnvironmentSpec{ Spec: fv1.EnvironmentSpec{
Version: 1, Version: 1,
@@ -216,7 +220,7 @@ func TestEnvironmentApi(t *testing.T) {
} }
_, err := g.Client().V1().Environment().Get(&metav1.ObjectMeta{ _, err := g.Client().V1().Environment().Get(&metav1.ObjectMeta{
Name: testEnv.ObjectMeta.Name, Name: testEnv.ObjectMeta.Name,
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}) })
assertNotFoundFailure(err, "environment") assertNotFoundFailure(err, "environment")
@@ -243,7 +247,7 @@ func TestEnvironmentApi(t *testing.T) {
panicIf(err) panicIf(err)
defer g.Client().V1().Environment().Delete(m2) defer g.Client().V1().Environment().Delete(m2)
ts, err := g.Client().V1().Environment().List(metav1.NamespaceDefault) ts, err := g.Client().V1().Environment().List(testNS)
panicIf(err) panicIf(err)
assert(len(ts) == 2, fmt.Sprintf("created two envs, but found %v", len(ts))) assert(len(ts) == 2, fmt.Sprintf("created two envs, but found %v", len(ts)))
} }
@@ -252,7 +256,7 @@ func TestWatchApi(t *testing.T) {
testWatch := &fv1.KubernetesWatchTrigger{ testWatch := &fv1.KubernetesWatchTrigger{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "xxx", Name: "xxx",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.KubernetesWatchTriggerSpec{ Spec: fv1.KubernetesWatchTriggerSpec{
Namespace: "default", Namespace: "default",
@@ -265,7 +269,7 @@ func TestWatchApi(t *testing.T) {
} }
_, err := g.Client().V1().KubeWatcher().Get(&metav1.ObjectMeta{ _, err := g.Client().V1().KubeWatcher().Get(&metav1.ObjectMeta{
Name: testWatch.ObjectMeta.Name, Name: testWatch.ObjectMeta.Name,
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}) })
assertNotFoundFailure(err, "watch") assertNotFoundFailure(err, "watch")
@@ -288,7 +292,7 @@ func TestWatchApi(t *testing.T) {
panicIf(err) panicIf(err)
defer g.Client().V1().KubeWatcher().Delete(m2) defer g.Client().V1().KubeWatcher().Delete(m2)
ws, err := g.Client().V1().KubeWatcher().List(metav1.NamespaceDefault) ws, err := g.Client().V1().KubeWatcher().List(testNS)
panicIf(err) panicIf(err)
assert(len(ws) == 2, fmt.Sprintf("created two watches, but found %v", len(ws))) assert(len(ws) == 2, fmt.Sprintf("created two watches, but found %v", len(ws)))
} }
@@ -297,7 +301,7 @@ func TestTimeTriggerApi(t *testing.T) {
testTrigger := &fv1.TimeTrigger{ testTrigger := &fv1.TimeTrigger{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "xxx", Name: "xxx",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.TimeTriggerSpec{ Spec: fv1.TimeTriggerSpec{
Cron: "0 30 * * * *", Cron: "0 30 * * * *",
@@ -334,7 +338,7 @@ func TestTimeTriggerApi(t *testing.T) {
_, err = g.Client().V1().TimeTrigger().Create(testTrigger) _, err = g.Client().V1().TimeTrigger().Create(testTrigger)
assertCronSpecFails(err) assertCronSpecFails(err)
ts, err := g.Client().V1().TimeTrigger().List(metav1.NamespaceDefault) ts, err := g.Client().V1().TimeTrigger().List(testNS)
panicIf(err) panicIf(err)
assert(len(ts) == 1, fmt.Sprintf("created two time triggers, but found %v", len(ts))) assert(len(ts) == 1, fmt.Sprintf("created two time triggers, but found %v", len(ts)))
} }
@@ -349,6 +353,18 @@ func TestMain(m *testing.M) {
return return
} }
_, kubeClient, _, err := crd.GetKubernetesClient()
panicIf(err)
// testNS isolation for running multiple CI builds concurrently.
testNS = uuid.NewV4().String()
kubeClient.CoreV1().Namespaces().Create(&v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: testNS,
},
})
defer kubeClient.CoreV1().Namespaces().Delete(testNS, nil)
logger, err := zap.NewDevelopment() logger, err := zap.NewDevelopment()
panicIf(err) panicIf(err)
+22 -9
View File
@@ -22,13 +22,17 @@ import (
"testing" "testing"
"time" "time"
uuid "github.com/satori/go.uuid"
"go.uber.org/zap" "go.uber.org/zap"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fv1 "github.com/fission/fission/pkg/apis/core/v1" fv1 "github.com/fission/fission/pkg/apis/core/v1"
genInformerCoreV1 "github.com/fission/fission/pkg/apis/genclient/clientset/versioned/typed/core/v1" genInformerCoreV1 "github.com/fission/fission/pkg/apis/genclient/clientset/versioned/typed/core/v1"
) )
var testNS = metav1.NamespaceDefault
func panicIf(err error) { func panicIf(err error) {
if err != nil { if err != nil {
log.Panicf("err: %v", err) log.Panicf("err: %v", err)
@@ -44,7 +48,7 @@ func functionTests(crdClient genInformerCoreV1.CoreV1Interface) {
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.FunctionSpec{ Spec: fv1.FunctionSpec{
Package: fv1.FunctionPackageRef{ Package: fv1.FunctionPackageRef{
@@ -61,7 +65,7 @@ func functionTests(crdClient genInformerCoreV1.CoreV1Interface) {
} }
// Test function CRUD // Test function CRUD
fi := crdClient.Functions(metav1.NamespaceDefault) fi := crdClient.Functions(testNS)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
fi.Delete(function.ObjectMeta.Name, nil) fi.Delete(function.ObjectMeta.Name, nil)
@@ -144,7 +148,7 @@ func environmentTests(crdClient genInformerCoreV1.CoreV1Interface) {
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.EnvironmentSpec{ Spec: fv1.EnvironmentSpec{
Version: 1, Version: 1,
@@ -159,7 +163,7 @@ func environmentTests(crdClient genInformerCoreV1.CoreV1Interface) {
} }
// Test environment CRUD // Test environment CRUD
ei := crdClient.Environments(metav1.NamespaceDefault) ei := crdClient.Environments(testNS)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(environment.ObjectMeta.Name, nil) ei.Delete(environment.ObjectMeta.Name, nil)
@@ -238,7 +242,7 @@ func httpTriggerTests(crdClient genInformerCoreV1.CoreV1Interface) {
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.HTTPTriggerSpec{ Spec: fv1.HTTPTriggerSpec{
RelativeURL: "/hi", RelativeURL: "/hi",
@@ -251,7 +255,7 @@ func httpTriggerTests(crdClient genInformerCoreV1.CoreV1Interface) {
} }
// Test httpTrigger CRUD // Test httpTrigger CRUD
ei := crdClient.HTTPTriggers(metav1.NamespaceDefault) ei := crdClient.HTTPTriggers(testNS)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(httpTrigger.ObjectMeta.Name, nil) ei.Delete(httpTrigger.ObjectMeta.Name, nil)
@@ -330,7 +334,7 @@ func kubernetesWatchTriggerTests(crdClient genInformerCoreV1.CoreV1Interface) {
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault, Namespace: testNS,
}, },
Spec: fv1.KubernetesWatchTriggerSpec{ Spec: fv1.KubernetesWatchTriggerSpec{
Namespace: "foo", Namespace: "foo",
@@ -346,7 +350,7 @@ func kubernetesWatchTriggerTests(crdClient genInformerCoreV1.CoreV1Interface) {
} }
// Test kubernetesWatchTrigger CRUD // Test kubernetesWatchTrigger CRUD
ei := crdClient.KubernetesWatchTriggers(metav1.NamespaceDefault) ei := crdClient.KubernetesWatchTriggers(testNS)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(kubernetesWatchTrigger.ObjectMeta.Name, nil) ei.Delete(kubernetesWatchTrigger.ObjectMeta.Name, nil)
@@ -427,11 +431,20 @@ func TestCrd(t *testing.T) {
logger, err := zap.NewDevelopment() logger, err := zap.NewDevelopment()
panicIf(err) panicIf(err)
fc, _, apiExtClient, err := MakeFissionClient() fc, kubeClient, apiExtClient, err := MakeFissionClient()
if err != nil { if err != nil {
panicIf(err) panicIf(err)
} }
// testNS isolation for running multiple CI builds concurrently.
testNS = uuid.NewV4().String()
kubeClient.CoreV1().Namespaces().Create(&v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: testNS,
},
})
defer kubeClient.CoreV1().Namespaces().Delete(testNS, nil)
// init our types // init our types
err = EnsureFissionCRDs(logger, apiExtClient) err = EnsureFissionCRDs(logger, apiExtClient)
panicIf(err) panicIf(err)
+1 -1
View File
@@ -75,8 +75,8 @@ setupIngressController() {
removeIngressController() { removeIngressController() {
# set up NGINX ingress controller # set up NGINX ingress controller
kubectl delete clusterrolebinding cluster-admin-binding || true kubectl delete clusterrolebinding cluster-admin-binding || true
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/mandatory.yaml || true
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/provider/cloud-generic.yaml || true kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/provider/cloud-generic.yaml || true
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/mandatory.yaml || true
} }
build_and_push_go_mod_cache_image() { build_and_push_go_mod_cache_image() {