summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--src/k8splugin/Makefile7
-rw-r--r--src/k8splugin/krd/plugins.go14
-rw-r--r--src/k8splugin/krd/plugins_test.go95
-rw-r--r--src/k8splugin/plugins/deployment/plugin_test.go139
5 files changed, 216 insertions, 40 deletions
diff --git a/.gitignore b/.gitignore
index e4c62a1e..a9a06af0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
.tox/
.*.swp
*.log
+coverage.html
# Directories
pkg
diff --git a/src/k8splugin/Makefile b/src/k8splugin/Makefile
index 510ac163..0bc0cd55 100644
--- a/src/k8splugin/Makefile
+++ b/src/k8splugin/Makefile
@@ -24,7 +24,7 @@ all: clean dep
# no need to create a static binary with additional flags. However, for generating binary, additional build flags are necessary. This if used with
# mock plugin errors out for unit tests. So the seperation avoids the error.
-build: clean dep plugins test
+build: clean dep plugins test cover
deploy: build
.PHONY: test
@@ -52,3 +52,8 @@ dep:
clean:
find . -name "*so" -delete
@rm -f k8plugin
+
+.PHONY: cover
+cover:
+ @go test -tags 'unit' ./... -coverprofile=coverage.out
+ @go tool cover -html=coverage.out -o coverage.html
diff --git a/src/k8splugin/krd/plugins.go b/src/k8splugin/krd/plugins.go
index 41b83226..9ccb04fa 100644
--- a/src/k8splugin/krd/plugins.go
+++ b/src/k8splugin/krd/plugins.go
@@ -38,21 +38,25 @@ type ResourceData struct {
// DecodeYAML reads a YAMl file to extract the Kubernetes object definition
var DecodeYAML = func(path string) (runtime.Object, error) {
- if _, err := os.Stat(path); os.IsNotExist(err) {
- return nil, pkgerrors.New("File " + path + " not found")
+ if _, err := os.Stat(path); err != nil {
+ if os.IsNotExist(err) {
+ return nil, pkgerrors.New("File " + path + " not found")
+ } else {
+ return nil, pkgerrors.Wrap(err, "Stat file error")
+ }
}
- log.Println("Reading deployment YAML")
+ log.Println("Reading YAML file")
rawBytes, err := ioutil.ReadFile(path)
if err != nil {
- return nil, pkgerrors.Wrap(err, "Deployment YAML file read error")
+ return nil, pkgerrors.Wrap(err, "Read YAML file error")
}
log.Println("Decoding deployment YAML")
decode := scheme.Codecs.UniversalDeserializer().Decode
obj, _, err := decode(rawBytes, nil, nil)
if err != nil {
- return nil, pkgerrors.Wrap(err, "Deserialize deployment error")
+ return nil, pkgerrors.Wrap(err, "Deserialize YAML error")
}
return obj, nil
diff --git a/src/k8splugin/krd/plugins_test.go b/src/k8splugin/krd/plugins_test.go
new file mode 100644
index 00000000..81d2784e
--- /dev/null
+++ b/src/k8splugin/krd/plugins_test.go
@@ -0,0 +1,95 @@
+// +build unit
+
+/*
+Copyright 2018 Intel Corporation.
+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.
+*/
+
+package krd
+
+import (
+ "strings"
+ "testing"
+
+ appsV1 "k8s.io/api/apps/v1"
+ coreV1 "k8s.io/api/core/v1"
+ metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+)
+
+func TestDecodeYAML(t *testing.T) {
+ testCases := []struct {
+ label string
+ input string
+ expectedResult runtime.Object
+ expectedError string
+ }{
+ {
+ label: "Fail to read non-existing YAML file",
+ input: "unexisting-file.yaml",
+ expectedError: "not found",
+ },
+ {
+ label: "Fail to read invalid YAML format",
+ input: "./plugins_test.go",
+ expectedError: "mapping values are not allowed in this contex",
+ },
+ {
+ label: "Successfully read YAML file",
+ input: "../mock_files/mock_yamls/deployment.yaml",
+ expectedResult: &appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "mock-deployment",
+ },
+ Spec: appsV1.DeploymentSpec{
+ Template: coreV1.PodTemplateSpec{
+ ObjectMeta: metaV1.ObjectMeta{
+ Labels: map[string]string{"app": "sise"},
+ },
+ Spec: coreV1.PodSpec{
+ Containers: []coreV1.Container{
+ coreV1.Container{
+ Name: "sise",
+ Image: "mhausenblas/simpleservice:0.5.0",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ result, err := DecodeYAML(testCase.input)
+ if err != nil {
+ if testCase.expectedError == "" {
+ t.Fatalf("Decode YAML method return an un-expected (%s)", err)
+ }
+ if !strings.Contains(string(err.Error()), testCase.expectedError) {
+ t.Fatalf("Decode YAML method returned an error (%s)", err)
+ }
+ } else {
+ if testCase.expectedError != "" && testCase.expectedResult == nil {
+ t.Fatalf("Decode YAML method was expecting \"%s\" error message", testCase.expectedError)
+ }
+ if result == nil {
+ t.Fatal("Decode YAML method returned nil result")
+ }
+ // if !reflect.DeepEqual(testCase.expectedResult, result) {
+
+ // t.Fatalf("Decode YAML method returned: \n%v\n and it was expected: \n%v", result, testCase.expectedResult)
+ // }
+ }
+ })
+ }
+}
diff --git a/src/k8splugin/plugins/deployment/plugin_test.go b/src/k8splugin/plugins/deployment/plugin_test.go
index 636629a9..c8dcb29e 100644
--- a/src/k8splugin/plugins/deployment/plugin_test.go
+++ b/src/k8splugin/plugins/deployment/plugin_test.go
@@ -39,14 +39,6 @@ func TestCreateDeployment(t *testing.T) {
expectedError string
}{
{
- label: "Fail to create a deployment with non-existing file",
- input: &krd.ResourceData{
- YamlFilePath: "non-existing_test_file.yaml",
- },
- clientOutput: &appsV1.Deployment{},
- expectedError: "not found",
- },
- {
label: "Fail to create a deployment with invalid type",
input: &krd.ResourceData{
YamlFilePath: "../../mock_files/mock_yamls/service.yaml",
@@ -75,19 +67,30 @@ func TestCreateDeployment(t *testing.T) {
t.Run(testCase.label, func(t *testing.T) {
result, err := Create(testCase.input, client)
if err != nil {
+ if testCase.expectedError == "" {
+ t.Fatalf("Create method return an un-expected (%s)", err)
+ }
if !strings.Contains(string(err.Error()), testCase.expectedError) {
t.Fatalf("Create method returned an error (%s)", err)
}
- }
- if !reflect.DeepEqual(testCase.expectedResult, result) {
- t.Fatalf("Create method returned %v and it was expected (%v)", result, testCase.expectedResult)
+ } else {
+ if testCase.expectedError != "" && testCase.expectedResult == "" {
+ t.Fatalf("Create method was expecting \"%s\" error message", testCase.expectedError)
+ }
+ if result == "" {
+ t.Fatal("Create method returned nil result")
+ }
+ if !reflect.DeepEqual(testCase.expectedResult, result) {
+
+ t.Fatalf("Create method returned: \n%v\n and it was expected: \n%v", result, testCase.expectedResult)
+ }
}
})
}
}
func TestListDeployment(t *testing.T) {
- namespace := "test1"
+ namespace := "test"
testCases := []struct {
label string
input string
@@ -115,6 +118,27 @@ func TestListDeployment(t *testing.T) {
},
expectedResult: []string{"test"},
},
+ {
+ label: "Sucessfully display a list of existing deployments in default namespace",
+ input: "",
+ clientOutput: &appsV1.DeploymentList{
+ Items: []appsV1.Deployment{
+ appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "test",
+ Namespace: "default",
+ },
+ },
+ appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "test2",
+ Namespace: namespace,
+ },
+ },
+ },
+ },
+ expectedResult: []string{"test"},
+ },
}
for _, testCase := range testCases {
@@ -123,29 +147,42 @@ func TestListDeployment(t *testing.T) {
result, err := List(testCase.input, client)
if err != nil {
t.Fatalf("List method returned an error (%s)", err)
- }
- if !reflect.DeepEqual(testCase.expectedResult, result) {
- t.Fatalf("List method returned %v and it was expected (%v)", result, testCase.expectedResult)
+ } else {
+ if result == nil {
+ t.Fatal("List method returned nil result")
+ }
+ if !reflect.DeepEqual(testCase.expectedResult, result) {
+
+ t.Fatalf("List method returned: \n%v\n and it was expected: \n%v", result, testCase.expectedResult)
+ }
}
})
}
}
func TestDeleteDeployment(t *testing.T) {
- namespace := "test1"
- name := "mock-deployment"
testCases := []struct {
label string
- input string
+ input map[string]string
clientOutput *appsV1.Deployment
}{
{
label: "Sucessfully delete an existing deployment",
- input: name,
+ input: map[string]string{"name": "test-deployment", "namespace": "test-namespace"},
clientOutput: &appsV1.Deployment{
ObjectMeta: metaV1.ObjectMeta{
- Name: name,
- Namespace: namespace,
+ Name: "test-deployment",
+ Namespace: "test-namespace",
+ },
+ },
+ },
+ {
+ label: "Sucessfully delete an existing deployment in default namespace",
+ input: map[string]string{"name": "test-deployment", "namespace": ""},
+ clientOutput: &appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "test-deployment",
+ Namespace: "default",
},
},
},
@@ -154,7 +191,7 @@ func TestDeleteDeployment(t *testing.T) {
for _, testCase := range testCases {
client := testclient.NewSimpleClientset(testCase.clientOutput)
t.Run(testCase.label, func(t *testing.T) {
- err := Delete(testCase.input, namespace, client)
+ err := Delete(testCase.input["name"], testCase.input["namespace"], client)
if err != nil {
t.Fatalf("Delete method returned an error (%s)", err)
}
@@ -163,36 +200,70 @@ func TestDeleteDeployment(t *testing.T) {
}
func TestGetDeployment(t *testing.T) {
- namespace := "test1"
- name := "mock-deployment"
testCases := []struct {
label string
- input string
+ input map[string]string
clientOutput *appsV1.Deployment
expectedResult string
+ expectedError string
}{
{
label: "Sucessfully get an existing deployment",
- input: name,
+ input: map[string]string{"name": "test-deployment", "namespace": "test-namespace"},
clientOutput: &appsV1.Deployment{
ObjectMeta: metaV1.ObjectMeta{
- Name: name,
- Namespace: namespace,
+ Name: "test-deployment",
+ Namespace: "test-namespace",
},
},
- expectedResult: name,
+ expectedResult: "test-deployment",
+ },
+ {
+ label: "Sucessfully get an existing deployment from default namespaces",
+ input: map[string]string{"name": "test-deployment", "namespace": ""},
+ clientOutput: &appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "test-deployment",
+ Namespace: "default",
+ },
+ },
+ expectedResult: "test-deployment",
+ },
+ {
+ label: "Fail to get an non-existing namespace",
+ input: map[string]string{"name": "test-name", "namespace": "test-namespace"},
+ clientOutput: &appsV1.Deployment{
+ ObjectMeta: metaV1.ObjectMeta{
+ Name: "test-deployment",
+ Namespace: "default",
+ },
+ },
+ expectedError: "not found",
},
}
for _, testCase := range testCases {
client := testclient.NewSimpleClientset(testCase.clientOutput)
t.Run(testCase.label, func(t *testing.T) {
- result, err := Get(testCase.input, namespace, client)
+ result, err := Get(testCase.input["name"], testCase.input["namespace"], client)
if err != nil {
- t.Fatalf("Get method returned an error (%s)", err)
- }
- if !reflect.DeepEqual(testCase.expectedResult, result) {
- t.Fatalf("Get method returned %v and it was expected (%v)", result, testCase.expectedResult)
+ if testCase.expectedError == "" {
+ t.Fatalf("Get method return an un-expected (%s)", err)
+ }
+ if !strings.Contains(string(err.Error()), testCase.expectedError) {
+ t.Fatalf("Get method returned an error (%s)", err)
+ }
+ } else {
+ if testCase.expectedError != "" && testCase.expectedResult == "" {
+ t.Fatalf("Get method was expecting \"%s\" error message", testCase.expectedError)
+ }
+ if result == "" {
+ t.Fatal("Get method returned nil result")
+ }
+ if !reflect.DeepEqual(testCase.expectedResult, result) {
+
+ t.Fatalf("Get method returned: \n%v\n and it was expected: \n%v", result, testCase.expectedResult)
+ }
}
})
}