1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00

Implemented first test

This commit is contained in:
Ewout Prangsma 2018-02-20 10:58:28 +01:00
parent 5a7597d999
commit ad50694af9
No known key found for this signature in database
GPG key ID: 4DBAD380D93D0698
5 changed files with 169 additions and 7 deletions

View file

@ -37,6 +37,8 @@ TESTBIN := $(BINDIR)/$(TESTBINNAME)
RELEASE := $(GOBUILDDIR)/bin/release
GHRELEASE := $(GOBUILDDIR)/bin/github-release
TESTNAMESPACE := arangodb-operator-tests
SOURCES := $(shell find $(SRCDIR) -name '*.go' -not -path './test/*')
.PHONY: all clean deps docker update-vendor update-generated verify-generated
@ -128,7 +130,7 @@ docker: $(BIN)
$(TESTBIN): $(GOBUILDDIR) $(SOURCES)
@mkdir -p $(BINDIR)
@docker run \
docker run \
--rm \
-v $(SRCDIR):/usr/code \
-e GOPATH=/usr/code/.gobuild \
@ -143,7 +145,11 @@ docker-test: $(TESTBIN)
docker build --quiet -f $(DOCKERTESTFILE) -t arangodb/arangodb-operator-test .
run-tests: docker-test
kubectl run arangodb-operator-test -i --rm --quiet --restart=Never --image=arangodb/arangodb-operator-test
$(ROOTDIR)/scripts/kube_delete_namespace.sh $(TESTNAMESPACE)
kubectl create namespace $(TESTNAMESPACE)
kubectl --namespace=$(TESTNAMESPACE) create -f examples/deployment.yaml
kubectl --namespace $(TESTNAMESPACE) run arangodb-operator-test -i --rm --quiet --restart=Never --image=arangodb/arangodb-operator-test --env="TEST_NAMESPACE=$(TESTNAMESPACE)" -- -test.v
kubectl delete namespace $(TESTNAMESPACE) --ignore-not-found --now
# Release building
@ -184,7 +190,7 @@ minikube-start:
minikube start --cpus=4 --memory=6144
delete-operator:
kubectl delete -f examples/deployment.yaml || true
kubectl delete -f examples/deployment.yaml --ignore-not-found
redeploy-operator: delete-operator
kubectl create -f examples/deployment.yaml

View file

@ -0,0 +1,12 @@
#!/bin/bash
# Delete a namespace and wait until it is gone
NS=$1
kubectl delete namespace $NS --now --ignore-not-found
response=$(kubectl get namespace $NS --template="non-empty" --ignore-not-found)
while [ ! -z $response ]; do
sleep 1
response=$(kubectl get namespace $NS --template="non-empty" --ignore-not-found)
done

34
tests/predicates.go Normal file
View file

@ -0,0 +1,34 @@
//
// DISCLAIMER
//
// Copyright 2018 ArangoDB GmbH, Cologne, Germany
//
// 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.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
// Author Ewout Prangsma
//
package tests
import (
api "github.com/arangodb/k8s-operator/pkg/apis/arangodb/v1alpha"
)
// deploymentHasState creates a predicate that returns true when the deployment has the given state.
func deploymentHasState(state api.DeploymentState) func(*api.ArangoDeployment) bool {
return func(obj *api.ArangoDeployment) bool {
return obj.Status.State == state
}
}

View file

@ -2,11 +2,30 @@ package tests
import (
"testing"
"time"
"github.com/dchest/uniuri"
api "github.com/arangodb/k8s-operator/pkg/apis/arangodb/v1alpha"
"github.com/arangodb/k8s-operator/pkg/client"
)
// TestSimpleSingle tests the creating of a single server deployment
// with default settings.
func TestSimpleSingle(t *testing.T) {
time.Sleep(time.Second * 5)
t.Log("TODO")
t.Error("foo")
c := client.MustNewInCluster()
ns := getNamespace(t)
// Prepare deployment config
depl := newDeployment("test-single-" + uniuri.NewLen(4))
// Create deployment
_, err := c.DatabaseV1alpha().ArangoDeployments(ns).Create(depl)
if err != nil {
t.Fatalf("Create deployment failed: %v", err)
}
// Wait for deployment to be ready
if _, err := waitUntilDeployment(c, depl.GetName(), ns, deploymentHasState(api.DeploymentStateRunning)); err != nil {
t.Errorf("Deployment not running in time: %v", err)
}
}

91
tests/test_util.go Normal file
View file

@ -0,0 +1,91 @@
//
// DISCLAIMER
//
// Copyright 2018 ArangoDB GmbH, Cologne, Germany
//
// 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.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
// Author Ewout Prangsma
//
package tests
import (
"fmt"
"os"
"strings"
"testing"
"time"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
api "github.com/arangodb/k8s-operator/pkg/apis/arangodb/v1alpha"
"github.com/arangodb/k8s-operator/pkg/generated/clientset/versioned"
"github.com/arangodb/k8s-operator/pkg/util/retry"
)
const (
deploymentReadyTimeout = time.Minute * 2
)
var (
maskAny = errors.WithStack
)
// getNamespace returns the kubernetes namespace in which to run tests.
func getNamespace(t *testing.T) string {
ns := os.Getenv("TEST_NAMESPACE")
if ns == "" {
t.Fatal("Missing environment variable TEST_NAMESPACE")
}
return ns
}
// newDeployment creates a basic ArangoDeployment with configured
// type & name.
func newDeployment(name string) *api.ArangoDeployment {
return &api.ArangoDeployment{
TypeMeta: metav1.TypeMeta{
APIVersion: api.SchemeGroupVersion.String(),
Kind: api.ArangoDeploymentResourceKind,
},
ObjectMeta: metav1.ObjectMeta{
Name: strings.ToLower(name),
},
}
}
// waitUntilDeployment waits until a deployment with given name in given namespace
// reached a state where the given predicate returns true.
func waitUntilDeployment(cli versioned.Interface, deploymentName, ns string, predicate func(*api.ArangoDeployment) bool) (*api.ArangoDeployment, error) {
var result *api.ArangoDeployment
op := func() error {
obj, err := cli.DatabaseV1alpha().ArangoDeployments(ns).Get(deploymentName, metav1.GetOptions{})
if err != nil {
result = nil
return maskAny(err)
}
result = obj
if predicate(obj) {
return nil
}
return fmt.Errorf("Predicate returns false")
}
if err := retry.Retry(op, deploymentReadyTimeout); err != nil {
return nil, maskAny(err)
}
return result, nil
}