Let unit tests run in different namespaces to avoid resource conflict
This commit is contained in:
+36
-20
@@ -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
@@ -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
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user