Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add e2e test for different runtimes and allow them to be parallely runned #9223

Merged
merged 4 commits into from Aug 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion resources/serverless/templates/tests/test.yaml
Expand Up @@ -31,7 +31,7 @@ spec:
env:
- name: APP_TEST_WAIT_TIMEOUT
value: "{{ .Values.tests.envs.waitTimeout }}"
- name: APP_TEST_INGRESS_HOST
- name: APP_TEST_DOMAIN_NAME
value: "{{ .Values.global.ingress.domainName }}"
- name: APP_TEST_VERBOSE
value: "{{ .Values.tests.envs.verbose }}"
Expand Down
2 changes: 1 addition & 1 deletion resources/serverless/values.yaml
Expand Up @@ -36,7 +36,7 @@ tests:

image:
repository: "eu.gcr.io/kyma-project/function-controller-test"
tag: "PR-9298"
tag: "PR-9223"
pullPolicy: IfNotPresent
disableConcurrency: false
restartPolicy: Never
Expand Down
2 changes: 1 addition & 1 deletion tests/function-controller/Dockerfile
@@ -1,4 +1,4 @@
FROM golang:1.14-alpine3.11 as builder
FROM golang:1.15-alpine3.12 as builder

ENV BASE_APP_DIR /go/src/github.com/kyma-project/kyma/tests/function-controller
WORKDIR ${BASE_APP_DIR}
Expand Down
38 changes: 18 additions & 20 deletions tests/function-controller/go.mod
@@ -1,36 +1,34 @@
module github.com/kyma-project/kyma/tests/function-controller

go 1.14
go 1.15

require (
github.com/golang/protobuf v1.4.0 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/imdario/mergo v0.3.9 // indirect
github.com/json-iterator/go v1.1.9 // indirect
github.com/Azure/go-autorest/autorest v0.9.3 // indirect
github.com/Azure/go-autorest/autorest/adal v0.8.1 // indirect
github.com/avast/retry-go v2.6.0+incompatible
github.com/hashicorp/errwrap v1.0.0
github.com/hashicorp/go-multierror v1.1.0
github.com/kubernetes-incubator/service-catalog v0.2.2
github.com/kubernetes-sigs/service-catalog v0.2.2 // indirect
github.com/kyma-project/helm-broker v1.0.0
github.com/kyma-project/kyma/components/function-controller v0.0.0-20200507074609-9796320d6479
github.com/onsi/gomega v1.9.0
github.com/kyma-project/kyma/components/function-controller v0.0.0-20200825094731-2ab8b8780e41
github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a // indirect
github.com/onsi/gomega v1.10.1
github.com/pkg/errors v0.9.1
github.com/robfig/cron v1.2.0 // indirect
github.com/sirupsen/logrus v1.6.0
github.com/spf13/pflag v1.0.5
github.com/vrischmann/envconfig v1.2.0
go.uber.org/multierr v1.5.0 // indirect
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 // indirect
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
google.golang.org/appengine v1.6.5 // indirect
gopkg.in/yaml.v2 v2.2.8
k8s.io/api v0.17.4
k8s.io/apiextensions-apiserver v0.17.4 // indirect
k8s.io/apimachinery v0.17.4
k8s.io/client-go v0.17.4
k8s.io/utils v0.0.0-20200414100711-2df71ebbae66 // indirect
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed // indirect
honnef.co/go/tools v0.0.1-2020.1.5 // indirect
k8s.io/api v0.17.8
k8s.io/apimachinery v0.17.8
k8s.io/client-go v0.17.8
knative.dev/eventing v0.12.0
knative.dev/pkg v0.0.0-20200207155214-fef852970f43
sigs.k8s.io/controller-runtime v0.5.2
knative.dev/pkg v0.0.0-20200306230727-a56a6ea3fa56
sigs.k8s.io/controller-runtime v0.5.9
)

replace (
Expand Down
234 changes: 132 additions & 102 deletions tests/function-controller/go.sum

Large diffs are not rendered by default.

21 changes: 14 additions & 7 deletions tests/function-controller/main_test.go
Expand Up @@ -5,6 +5,11 @@ import (
"testing"
"time"

"github.com/sirupsen/logrus"

"github.com/kyma-project/kyma/tests/function-controller/pkg/step"
"github.com/kyma-project/kyma/tests/function-controller/testsuite/scenarios"

"github.com/onsi/gomega"
"github.com/vrischmann/envconfig"
_ "k8s.io/client-go/plugin/pkg/client/auth"
Expand All @@ -18,23 +23,25 @@ type config struct {
Test testsuite.Config
}

func TestFunctionController(t *testing.T) {
func TestRuntimes(t *testing.T) {
rand.Seed(time.Now().UnixNano())

g := gomega.NewGomegaWithT(t)

cfg, err := loadConfig("APP")
failOnError(g, err)

restConfig := controllerruntime.GetConfigOrDie()
failOnError(g, err)

testSuite, err := testsuite.New(restConfig, cfg.Test, t, g)
logf := logrus.New()
logf.SetFormatter(&logrus.TextFormatter{})
logf.SetReportCaller(false)

steps, err := scenarios.FunctionTestStep(restConfig, cfg.Test, logf)
failOnError(g, err)
runner := step.NewRunner(step.WithCleanupDefault(cfg.Test.Cleanup), step.WithLogger(logf))

defer testSuite.Cleanup()
defer testSuite.LogResources()
testSuite.Run()
err = runner.Execute(steps)
failOnError(g, err)
}

func loadConfig(prefix string) (config, error) {
Expand Down
19 changes: 18 additions & 1 deletion tests/function-controller/pkg/addons/addons.go
Expand Up @@ -5,8 +5,10 @@ import (
"time"

"github.com/kyma-project/helm-broker/pkg/apis/addons/v1alpha1"
"github.com/sirupsen/logrus"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/json"
"k8s.io/apimachinery/pkg/watch"
watchtools "k8s.io/client-go/tools/watch"

Expand All @@ -22,7 +24,7 @@ type AddonConfiguration struct {
name string
namespace string
waitTimeout time.Duration
log shared.Logger
log *logrus.Entry
verbose bool
}

Expand Down Expand Up @@ -88,6 +90,21 @@ func (a *AddonConfiguration) get() (*v1alpha1.AddonsConfiguration, error) {
return &ac, nil
}

func (a AddonConfiguration) LogResource() error {
ad, err := a.get()
if err != nil {
return err
}

out, err := json.Marshal(ad)
if err != nil {
return err
}

a.log.Infof("%s", string(out))
return nil
}

func (a *AddonConfiguration) WaitForStatusRunning() error {
ac, err := a.get()
if err != nil {
Expand Down
13 changes: 7 additions & 6 deletions tests/function-controller/pkg/apirule/apirule.go
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"time"

"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
Expand All @@ -22,7 +23,7 @@ type APIRule struct {
name string
namespace string
waitTimeout time.Duration
log shared.Logger
log *logrus.Entry
verbose bool
}

Expand All @@ -37,7 +38,7 @@ func New(name string, c shared.Container) *APIRule {
}
}

func (a *APIRule) Create(name, host string, port uint32) (string, error) {
func (a *APIRule) Create(serviceName, host string, port uint32) (string, error) {
gateway := "kyma-gateway.kyma-system.svc.cluster.local"

rule := &apiruleTypes.APIRule{
Expand Down Expand Up @@ -65,7 +66,7 @@ func (a *APIRule) Create(name, host string, port uint32) (string, error) {
},
},
Service: &apiruleTypes.Service{
Name: &name,
Name: &serviceName,
Port: &port,
Host: &host,
},
Expand All @@ -88,7 +89,7 @@ func (a *APIRule) Delete() error {
return nil
}

func (a *APIRule) get() (*apiruleTypes.APIRule, error) {
func (a *APIRule) Get() (*apiruleTypes.APIRule, error) {
u, err := a.resCli.Get(a.name)
if err != nil {
return &apiruleTypes.APIRule{}, errors.Wrapf(err, "while getting ApiRule %s in namespace %s", a.name, a.namespace)
Expand All @@ -103,7 +104,7 @@ func (a *APIRule) get() (*apiruleTypes.APIRule, error) {
}

func (a *APIRule) WaitForStatusRunning() error {
apirule, err := a.get()
apirule, err := a.Get()
if err != nil {
return err
}
Expand All @@ -130,7 +131,7 @@ func (a *APIRule) isApiRuleReady(name string) func(event watch.Event) (bool, err
return false, shared.ErrInvalidDataType
}
if u.GetName() != name {
a.log.Logf("names mismatch, object's name %s, supplied %s", u.GetName(), name)
a.log.Infof("names mismatch, object's name %s, supplied %s", u.GetName(), name)
return false, nil
}

Expand Down
6 changes: 4 additions & 2 deletions tests/function-controller/pkg/broker/broker.go
Expand Up @@ -10,6 +10,8 @@ import (
watchtools "k8s.io/client-go/tools/watch"
eventingv1alpha1 "knative.dev/eventing/pkg/apis/eventing/v1alpha1"

"github.com/sirupsen/logrus"

"github.com/kyma-project/kyma/tests/function-controller/pkg/resource"
"github.com/kyma-project/kyma/tests/function-controller/pkg/shared"

Expand All @@ -23,7 +25,7 @@ type Broker struct {
name string
namespace string
waitTimeout time.Duration
log shared.Logger
log *logrus.Entry
verbose bool
}

Expand Down Expand Up @@ -89,7 +91,7 @@ func (b *Broker) isBrokerReady(name string) func(event watch.Event) (bool, error
return false, shared.ErrInvalidDataType
}
if u.GetName() != name {
b.log.Logf("names mismatch, object's name %s, supplied %s", u.GetName(), name)
b.log.Infof("names mismatch, object's name %s, supplied %s", u.GetName(), name)
return false, nil
}

Expand Down
@@ -1,10 +1,12 @@
package testsuite
package function

import (
"context"
"time"

"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/json"

"github.com/kyma-project/kyma/tests/function-controller/pkg/shared"

Expand All @@ -20,17 +22,17 @@ import (
serverlessv1alpha1 "github.com/kyma-project/kyma/components/function-controller/pkg/apis/serverless/v1alpha1"
)

type function struct {
type Function struct {
resCli *resource.Resource
name string
namespace string
waitTimeout time.Duration
log shared.Logger
log *logrus.Entry
verbose bool
}

func newFunction(name string, c shared.Container) *function {
return &function{
func NewFunction(name string, c shared.Container) *Function {
return &Function{
resCli: resource.New(c.DynamicCli, serverlessv1alpha1.GroupVersion.WithResource("functions"), c.Namespace, c.Log, c.Verbose),
name: name,
namespace: c.Namespace,
Expand All @@ -40,7 +42,7 @@ func newFunction(name string, c shared.Container) *function {
}
}

func (f *function) Create(data *functionData) error {
func (f *Function) Create(data *FunctionData) error {
function := &serverlessv1alpha1.Function{
TypeMeta: metav1.TypeMeta{
Kind: "Function",
Expand All @@ -51,8 +53,9 @@ func (f *function) Create(data *functionData) error {
Namespace: f.namespace,
},
Spec: serverlessv1alpha1.FunctionSpec{
Source: data.Body,
Deps: data.Deps,
Source: data.Body,
Deps: data.Deps,
Runtime: data.Runtime,
},
}

Expand All @@ -63,8 +66,8 @@ func (f *function) Create(data *functionData) error {
return err
}

func (f *function) WaitForStatusRunning() error {
fn, err := f.get()
func (f *Function) WaitForStatusRunning() error {
fn, err := f.Get()
if err != nil {
return err
}
Expand All @@ -83,7 +86,7 @@ func (f *function) WaitForStatusRunning() error {
return nil
}

func (f *function) Delete() error {
func (f *Function) Delete() error {
err := f.resCli.Delete(f.name, f.waitTimeout)
if err != nil {
return errors.Wrapf(err, "while deleting Function %s in namespace %s", f.name, f.namespace)
Expand All @@ -92,9 +95,9 @@ func (f *function) Delete() error {
return nil
}

func (f *function) Update(data *functionData) error {
func (f *Function) Update(data *FunctionData) error {
// correct update must first perform get
fn, err := f.get()
fn, err := f.Get()
if err != nil {
return err
}
Expand All @@ -105,12 +108,13 @@ func (f *function) Update(data *functionData) error {
fnCopy.Spec.MaxReplicas = &data.MaxReplicas
fnCopy.Spec.Deps = data.Deps
fnCopy.Spec.Source = data.Body
fnCopy.Spec.Runtime = data.Runtime

_, err = f.resCli.Update(fnCopy)
return err
}

func (f *function) get() (*serverlessv1alpha1.Function, error) {
func (f *Function) Get() (*serverlessv1alpha1.Function, error) {
u, err := f.resCli.Get(f.name)
if err != nil {
return nil, errors.Wrapf(err, "while getting Function %s in namespace %s", f.name, f.namespace)
Expand All @@ -124,13 +128,28 @@ func (f *function) get() (*serverlessv1alpha1.Function, error) {
return &function, nil
}

func (f *function) isFunctionReady() func(event watch.Event) (bool, error) {
func (f Function) LogResource() error {
fn, err := f.Get()
if err != nil {
return err
}

out, err := json.Marshal(fn)
if err != nil {
return err
}

f.log.Infof("%s", string(out))
return nil
}

func (f *Function) isFunctionReady() func(event watch.Event) (bool, error) {
return func(event watch.Event) (bool, error) {
if event.Type != watch.Modified {
return false, nil
}

function, err := f.get()
function, err := f.Get()

if err != nil {
return false, err
Expand All @@ -139,7 +158,7 @@ func (f *function) isFunctionReady() func(event watch.Event) (bool, error) {
}
}

func (f function) isConditionReady(fn serverlessv1alpha1.Function) bool {
func (f Function) isConditionReady(fn serverlessv1alpha1.Function) bool {
conditions := fn.Status.Conditions
if len(conditions) == 0 {
shared.LogReadiness(false, f.verbose, f.name, f.log, fn)
Expand Down