summaryrefslogtreecommitdiffstats
path: root/src/clm/api/clusterhandler_test.go
diff options
context:
space:
mode:
authorEric Multanen <eric.w.multanen@intel.com>2020-05-27 11:21:42 -0700
committerEric Multanen <eric.w.multanen@intel.com>2020-06-03 17:15:58 -0700
commit8e7a20777f2100324526a34b4b6c943b512df0fb (patch)
treeeca4847a8361da6f3f97a363f8d65d8a3c6a08b2 /src/clm/api/clusterhandler_test.go
parent0c22bafd470e36647157b6d01221cb17841f360a (diff)
Move cluster management into its own microservice
Split out the cluster provider and cluster APIs and packages into a separate microservice to align with the architecture. Issue-ID: MULTICLOUD-1029 Signed-off-by: Eric Multanen <eric.w.multanen@intel.com> Change-Id: I08f357b5a488004a2389b72a178ae33e101d1540
Diffstat (limited to 'src/clm/api/clusterhandler_test.go')
-rw-r--r--src/clm/api/clusterhandler_test.go1432
1 files changed, 1432 insertions, 0 deletions
diff --git a/src/clm/api/clusterhandler_test.go b/src/clm/api/clusterhandler_test.go
new file mode 100644
index 00000000..7095e87c
--- /dev/null
+++ b/src/clm/api/clusterhandler_test.go
@@ -0,0 +1,1432 @@
+/*
+ * Copyright 2020 Intel Corporation, Inc
+ *
+ * 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 api
+
+import (
+ "bytes"
+ "encoding/json"
+ "io"
+ "mime/multipart"
+ "net/http"
+ "net/http/httptest"
+ "net/textproto"
+ "reflect"
+ "testing"
+
+ "github.com/onap/multicloud-k8s/src/clm/pkg/cluster"
+ "github.com/onap/multicloud-k8s/src/orchestrator/pkg/appcontext"
+ types "github.com/onap/multicloud-k8s/src/orchestrator/pkg/module/types"
+
+ pkgerrors "github.com/pkg/errors"
+)
+
+//Creating an embedded interface via anonymous variable
+//This allows us to make mockDB satisfy the DatabaseConnection
+//interface even if we are not implementing all the methods in it
+type mockClusterManager struct {
+ // Items and err will be used to customize each test
+ // via a localized instantiation of mockClusterManager
+ ClusterProviderItems []cluster.ClusterProvider
+ ClusterItems []cluster.Cluster
+ ClusterContentItems []cluster.ClusterContent
+ ClusterContextItems []appcontext.AppContext
+ ClusterLabelItems []cluster.ClusterLabel
+ ClusterKvPairsItems []cluster.ClusterKvPairs
+ ClusterList []string
+ Err error
+}
+
+func (m *mockClusterManager) CreateClusterProvider(inp cluster.ClusterProvider) (cluster.ClusterProvider, error) {
+ if m.Err != nil {
+ return cluster.ClusterProvider{}, m.Err
+ }
+
+ return m.ClusterProviderItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterProvider(name string) (cluster.ClusterProvider, error) {
+ if m.Err != nil {
+ return cluster.ClusterProvider{}, m.Err
+ }
+
+ return m.ClusterProviderItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterProviders() ([]cluster.ClusterProvider, error) {
+ if m.Err != nil {
+ return []cluster.ClusterProvider{}, m.Err
+ }
+
+ return m.ClusterProviderItems, nil
+}
+
+func (m *mockClusterManager) DeleteClusterProvider(name string) error {
+ return m.Err
+}
+
+func (m *mockClusterManager) CreateCluster(provider string, inp cluster.Cluster, inq cluster.ClusterContent) (cluster.Cluster, error) {
+ if m.Err != nil {
+ return cluster.Cluster{}, m.Err
+ }
+
+ return m.ClusterItems[0], nil
+}
+
+func (m *mockClusterManager) GetCluster(provider, name string) (cluster.Cluster, error) {
+ if m.Err != nil {
+ return cluster.Cluster{}, m.Err
+ }
+
+ return m.ClusterItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterContent(provider, name string) (cluster.ClusterContent, error) {
+ if m.Err != nil {
+ return cluster.ClusterContent{}, m.Err
+ }
+
+ return m.ClusterContentItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterContext(provider, name string) (appcontext.AppContext, error) {
+ if m.Err != nil {
+ return appcontext.AppContext{}, m.Err
+ }
+
+ return m.ClusterContextItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusters(provider string) ([]cluster.Cluster, error) {
+ if m.Err != nil {
+ return []cluster.Cluster{}, m.Err
+ }
+
+ return m.ClusterItems, nil
+}
+
+func (m *mockClusterManager) GetClustersWithLabel(provider, label string) ([]string, error) {
+ if m.Err != nil {
+ return []string{}, m.Err
+ }
+
+ return m.ClusterList, nil
+}
+
+func (m *mockClusterManager) DeleteCluster(provider, name string) error {
+ return m.Err
+}
+
+func (m *mockClusterManager) CreateClusterLabel(provider, clusterName string, inp cluster.ClusterLabel) (cluster.ClusterLabel, error) {
+ if m.Err != nil {
+ return cluster.ClusterLabel{}, m.Err
+ }
+
+ return m.ClusterLabelItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterLabel(provider, clusterName, label string) (cluster.ClusterLabel, error) {
+ if m.Err != nil {
+ return cluster.ClusterLabel{}, m.Err
+ }
+
+ return m.ClusterLabelItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterLabels(provider, clusterName string) ([]cluster.ClusterLabel, error) {
+ if m.Err != nil {
+ return []cluster.ClusterLabel{}, m.Err
+ }
+
+ return m.ClusterLabelItems, nil
+}
+
+func (m *mockClusterManager) DeleteClusterLabel(provider, clusterName, label string) error {
+ return m.Err
+}
+
+func (m *mockClusterManager) CreateClusterKvPairs(provider, clusterName string, inp cluster.ClusterKvPairs) (cluster.ClusterKvPairs, error) {
+ if m.Err != nil {
+ return cluster.ClusterKvPairs{}, m.Err
+ }
+
+ return m.ClusterKvPairsItems[0], nil
+}
+
+func (m *mockClusterManager) GetClusterKvPairs(provider, clusterName, kvpair string) (cluster.ClusterKvPairs, error) {
+ if m.Err != nil {
+ return cluster.ClusterKvPairs{}, m.Err
+ }
+
+ return m.ClusterKvPairsItems[0], nil
+}
+
+func (m *mockClusterManager) GetAllClusterKvPairs(provider, clusterName string) ([]cluster.ClusterKvPairs, error) {
+ if m.Err != nil {
+ return []cluster.ClusterKvPairs{}, m.Err
+ }
+
+ return m.ClusterKvPairsItems, nil
+}
+
+func (m *mockClusterManager) DeleteClusterKvPairs(provider, clusterName, kvpair string) error {
+ return m.Err
+}
+
+func TestClusterProviderCreateHandler(t *testing.T) {
+ testCases := []struct {
+ label string
+ reader io.Reader
+ expected cluster.ClusterProvider
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Missing Cluster Provider Body Failure",
+ expectedCode: http.StatusBadRequest,
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Create Cluster Provider",
+ expectedCode: http.StatusCreated,
+ reader: bytes.NewBuffer([]byte(`{
+ "metadata": {
+ "name": "clusterProviderTest",
+ "description": "testClusterProvider",
+ "userData1": "some user data 1",
+ "userData2": "some user data 2"
+ }
+ }`)),
+ expected: cluster.ClusterProvider{
+ Metadata: types.Metadata{
+ Name: "clusterProviderTest",
+ Description: "testClusterProvider",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterProviderItems: []cluster.ClusterProvider{
+ {
+ Metadata: types.Metadata{
+ Name: "clusterProviderTest",
+ Description: "testClusterProvider",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ },
+ },
+ {
+ label: "Missing ClusterProvider Name in Request Body",
+ reader: bytes.NewBuffer([]byte(`{
+ "metadata": {
+ "description": "this is a test cluster provider",
+ "userData1": "some user data 1",
+ "userData2": "some user data 2"
+ }
+ }`)),
+ expectedCode: http.StatusBadRequest,
+ clusterClient: &mockClusterManager{},
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("POST", "/v2/cluster-providers", testCase.reader)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusCreated
+ if resp.StatusCode == http.StatusCreated {
+ got := cluster.ClusterProvider{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("createHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterProviderGetAllHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected []cluster.ClusterProvider
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster Provider",
+ expectedCode: http.StatusOK,
+ expected: []cluster.ClusterProvider{
+ {
+ Metadata: types.Metadata{
+ Name: "testClusterProvider1",
+ Description: "testClusterProvider 1 description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "testClusterProvider2",
+ Description: "testClusterProvider 2 description",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterProviderItems: []cluster.ClusterProvider{
+ {
+ Metadata: types.Metadata{
+ Name: "testClusterProvider1",
+ Description: "testClusterProvider 1 description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "testClusterProvider2",
+ Description: "testClusterProvider 2 description",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers", nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := []cluster.ClusterProvider{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterProviderGetHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected cluster.ClusterProvider
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster Provider",
+ expectedCode: http.StatusOK,
+ expected: cluster.ClusterProvider{
+ Metadata: types.Metadata{
+ Name: "testClusterProvider",
+ Description: "testClusterProvider description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ name: "testClusterProvider",
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterProviderItems: []cluster.ClusterProvider{
+ {
+ Metadata: types.Metadata{
+ Name: "testClusterProvider",
+ Description: "testClusterProvider description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ },
+ },
+ {
+ label: "Get Non-Existing Cluster Provider",
+ expectedCode: http.StatusInternalServerError,
+ name: "nonexistingclusterprovider",
+ clusterClient: &mockClusterManager{
+ ClusterProviderItems: []cluster.ClusterProvider{},
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := cluster.ClusterProvider{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterProviderDeleteHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ name string
+ version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Delete Cluster Provider",
+ expectedCode: http.StatusNoContent,
+ name: "testClusterProvider",
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Delete Non-Existing Cluster Provider",
+ expectedCode: http.StatusInternalServerError,
+ name: "testClusterProvider",
+ clusterClient: &mockClusterManager{
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("DELETE", "/v2/cluster-providers/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+ })
+ }
+}
+
+func TestClusterCreateHandler(t *testing.T) {
+ testCases := []struct {
+ label string
+ metadata string
+ kubeconfig string
+ expected cluster.Cluster
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Missing Cluster Body Failure",
+ expectedCode: http.StatusBadRequest,
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Create Cluster",
+ expectedCode: http.StatusCreated,
+ metadata: `
+{
+ "metadata": {
+ "name": "clusterTest",
+ "description": "this is test cluster",
+ "userData1": "some cluster data abc",
+ "userData2": "some cluster data def"
+ }
+}`,
+ kubeconfig: `test contents
+of a file attached
+to the creation
+of clusterTest
+`,
+ expected: cluster.Cluster{
+ Metadata: types.Metadata{
+ Name: "clusterTest",
+ Description: "testCluster",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterProviderItems: []cluster.ClusterProvider{
+ {
+ Metadata: types.Metadata{
+ Name: "clusterProvider1",
+ Description: "ClusterProvider 1 description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ ClusterItems: []cluster.Cluster{
+ {
+ Metadata: types.Metadata{
+ Name: "clusterTest",
+ Description: "testCluster",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ ClusterContentItems: []cluster.ClusterContent{
+ {
+ Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==",
+ },
+ },
+ },
+ },
+ {
+ label: "Missing Cluster Name in Request Body",
+ expectedCode: http.StatusBadRequest,
+ metadata: `
+{
+ "metadata": {
+ "description": "this is test cluster",
+ "userData1": "some cluster data abc",
+ "userData2": "some cluster data def"
+ }
+}`,
+ kubeconfig: `test contents
+of a file attached
+to the creation
+of clusterTest
+`,
+ clusterClient: &mockClusterManager{},
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ // Create the multipart test Request body
+ body := new(bytes.Buffer)
+ multiwr := multipart.NewWriter(body)
+ multiwr.SetBoundary("------------------------f77f80a7092eb312")
+ pw, _ := multiwr.CreatePart(textproto.MIMEHeader{"Content-Type": {"application/json"}, "Content-Disposition": {"form-data; name=metadata"}})
+ pw.Write([]byte(testCase.metadata))
+ pw, _ = multiwr.CreateFormFile("file", "kubeconfig")
+ pw.Write([]byte(testCase.kubeconfig))
+ multiwr.Close()
+
+ request := httptest.NewRequest("POST", "/v2/cluster-providers/clusterProvider1/clusters", bytes.NewBuffer(body.Bytes()))
+ request.Header.Set("Content-Type", multiwr.FormDataContentType())
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusCreated
+ if resp.StatusCode == http.StatusCreated {
+ got := cluster.Cluster{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("createHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterGetAllHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected []cluster.Cluster
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Clusters",
+ expectedCode: http.StatusOK,
+ expected: []cluster.Cluster{
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster1",
+ Description: "testCluster 1 description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster2",
+ Description: "testCluster 2 description",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterItems: []cluster.Cluster{
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster1",
+ Description: "testCluster 1 description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster2",
+ Description: "testCluster 2 description",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ },
+ },
+ ClusterContentItems: []cluster.ClusterContent{
+ // content here doesn't matter - just needs to be present
+ {
+ Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==",
+ },
+ {
+ Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==",
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/clusterProvder1/clusters", nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := []cluster.Cluster{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterGetHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected cluster.Cluster
+ name, version string
+ accept string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster with Accept: application/json",
+ accept: "application/json",
+ expectedCode: http.StatusOK,
+ expected: cluster.Cluster{
+ Metadata: types.Metadata{
+ Name: "testCluster",
+ Description: "testCluster description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ name: "testCluster",
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterItems: []cluster.Cluster{
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster",
+ Description: "testCluster description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ ClusterContentItems: []cluster.ClusterContent{
+ {
+ Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==",
+ },
+ },
+ },
+ },
+ {
+ label: "Get Non-Existing Cluster",
+ accept: "application/json",
+ expectedCode: http.StatusInternalServerError,
+ name: "nonexistingcluster",
+ clusterClient: &mockClusterManager{
+ ClusterItems: []cluster.Cluster{},
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/clusterProvider1/clusters/"+testCase.name, nil)
+ if len(testCase.accept) > 0 {
+ request.Header.Set("Accept", testCase.accept)
+ }
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := cluster.Cluster{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterGetContentHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected string
+ name, version string
+ accept string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster Content with Accept: application/octet-stream",
+ accept: "application/octet-stream",
+ expectedCode: http.StatusOK,
+ expected: `test contents
+of a file attached
+to the creation
+of clusterTest
+`,
+ name: "testCluster",
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterItems: []cluster.Cluster{
+ {
+ Metadata: types.Metadata{
+ Name: "testCluster",
+ Description: "testCluster description",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ },
+ },
+ ClusterContentItems: []cluster.ClusterContent{
+ {
+ Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==",
+ },
+ },
+ },
+ },
+ {
+ label: "Get Non-Existing Cluster",
+ accept: "application/octet-stream",
+ expectedCode: http.StatusInternalServerError,
+ name: "nonexistingcluster",
+ clusterClient: &mockClusterManager{
+ ClusterItems: []cluster.Cluster{},
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/clusterProvider1/clusters/"+testCase.name, nil)
+ if len(testCase.accept) > 0 {
+ request.Header.Set("Accept", testCase.accept)
+ }
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ body := new(bytes.Buffer)
+ body.ReadFrom(resp.Body)
+ got := body.String()
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterDeleteHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ name string
+ version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Delete Cluster",
+ expectedCode: http.StatusNoContent,
+ name: "testCluster",
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Delete Non-Existing Cluster",
+ expectedCode: http.StatusInternalServerError,
+ name: "testCluster",
+ clusterClient: &mockClusterManager{
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("DELETE", "/v2/cluster-providers/clusterProvider1/clusters/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+ })
+ }
+}
+
+func TestClusterLabelCreateHandler(t *testing.T) {
+ testCases := []struct {
+ label string
+ reader io.Reader
+ expected cluster.ClusterLabel
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Missing Cluster Label Body Failure",
+ expectedCode: http.StatusBadRequest,
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Create Cluster Label",
+ expectedCode: http.StatusCreated,
+ reader: bytes.NewBuffer([]byte(`{
+ "label-name": "test-label"
+ }`)),
+ expected: cluster.ClusterLabel{
+ LabelName: "test-label",
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterLabelItems: []cluster.ClusterLabel{
+ {
+ LabelName: "test-label",
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("POST", "/v2/cluster-providers/cp1/clusters/cl1/labels", testCase.reader)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusCreated
+ if resp.StatusCode == http.StatusCreated {
+ got := cluster.ClusterLabel{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("createHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterLabelsGetHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected []cluster.ClusterLabel
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster Labels",
+ expectedCode: http.StatusOK,
+ expected: []cluster.ClusterLabel{
+ {
+ LabelName: "test-label1",
+ },
+ {
+ LabelName: "test-label-two",
+ },
+ {
+ LabelName: "test-label-3",
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterLabelItems: []cluster.ClusterLabel{
+ {
+ LabelName: "test-label1",
+ },
+ {
+ LabelName: "test-label-two",
+ },
+ {
+ LabelName: "test-label-3",
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/cp1/clusters/cl1/labels", nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := []cluster.ClusterLabel{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterLabelGetHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected cluster.ClusterLabel
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster Label",
+ expectedCode: http.StatusOK,
+ expected: cluster.ClusterLabel{
+ LabelName: "testlabel",
+ },
+ name: "testlabel",
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterLabelItems: []cluster.ClusterLabel{
+ {
+ LabelName: "testlabel",
+ },
+ },
+ },
+ },
+ {
+ label: "Get Non-Existing Cluster Label",
+ expectedCode: http.StatusInternalServerError,
+ name: "nonexistingclusterlabel",
+ clusterClient: &mockClusterManager{
+ ClusterLabelItems: []cluster.ClusterLabel{},
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/clusterProvider1/clusters/cl1/labels/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := cluster.ClusterLabel{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterLabelDeleteHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ name string
+ version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Delete Cluster Label",
+ expectedCode: http.StatusNoContent,
+ name: "testClusterLabel",
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Delete Non-Existing Cluster Label",
+ expectedCode: http.StatusInternalServerError,
+ name: "testClusterLabel",
+ clusterClient: &mockClusterManager{
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("DELETE", "/v2/cluster-providers/cp1/clusters/cl1/labels/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+ })
+ }
+}
+
+func TestClusterKvPairsCreateHandler(t *testing.T) {
+ testCases := []struct {
+ label string
+ reader io.Reader
+ expected cluster.ClusterKvPairs
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Missing Cluster KvPairs Body Failure",
+ expectedCode: http.StatusBadRequest,
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Create Cluster KvPairs",
+ expectedCode: http.StatusCreated,
+ reader: bytes.NewBuffer([]byte(`{
+ "metadata": {
+ "name": "ClusterKvPair1",
+ "description": "test cluster kv pairs",
+ "userData1": "some user data 1",
+ "userData2": "some user data 2"
+ },
+ "spec": {
+ "kv": [
+ {
+ "key1": "value1"
+ },
+ {
+ "key2": "value2"
+ }
+ ]
+ }
+ }`)),
+ expected: cluster.ClusterKvPairs{
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair1",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "key1": "value1",
+ },
+ {
+ "key2": "value2",
+ },
+ },
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterKvPairsItems: []cluster.ClusterKvPairs{
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair1",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "key1": "value1",
+ },
+ {
+ "key2": "value2",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("POST", "/v2/cluster-providers/cp1/clusters/cl1/kv-pairs", testCase.reader)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusCreated
+ if resp.StatusCode == http.StatusCreated {
+ got := cluster.ClusterKvPairs{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("createHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterKvPairsGetAllHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected []cluster.ClusterKvPairs
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster KvPairs",
+ expectedCode: http.StatusOK,
+ expected: []cluster.ClusterKvPairs{
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair1",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "key1": "value1",
+ },
+ {
+ "key2": "value2",
+ },
+ },
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair2",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "keyA": "valueA",
+ },
+ {
+ "keyB": "valueB",
+ },
+ },
+ },
+ },
+ },
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterKvPairsItems: []cluster.ClusterKvPairs{
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair1",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data 1",
+ UserData2: "some user data 2",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "key1": "value1",
+ },
+ {
+ "key2": "value2",
+ },
+ },
+ },
+ },
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair2",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "keyA": "valueA",
+ },
+ {
+ "keyB": "valueB",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/cp1/clusters/cl1/kv-pairs", nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := []cluster.ClusterKvPairs{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterKvPairsGetHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ expected cluster.ClusterKvPairs
+ name, version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Get Cluster KV Pairs",
+ expectedCode: http.StatusOK,
+ expected: cluster.ClusterKvPairs{
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair2",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "keyA": "valueA",
+ },
+ {
+ "keyB": "valueB",
+ },
+ },
+ },
+ },
+ name: "ClusterKvPair2",
+ clusterClient: &mockClusterManager{
+ //Items that will be returned by the mocked Client
+ ClusterKvPairsItems: []cluster.ClusterKvPairs{
+ {
+ Metadata: types.Metadata{
+ Name: "ClusterKvPair2",
+ Description: "test cluster kv pairs",
+ UserData1: "some user data A",
+ UserData2: "some user data B",
+ },
+ Spec: cluster.ClusterKvSpec{
+ Kv: []map[string]interface{}{
+ {
+ "keyA": "valueA",
+ },
+ {
+ "keyB": "valueB",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ label: "Get Non-Existing Cluster KV Pairs",
+ expectedCode: http.StatusInternalServerError,
+ name: "nonexistingclusterkvpairs",
+ clusterClient: &mockClusterManager{
+ ClusterKvPairsItems: []cluster.ClusterKvPairs{},
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("GET", "/v2/cluster-providers/clusterProvider1/clusters/cl1/kv-pairs/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+
+ //Check returned body only if statusOK
+ if resp.StatusCode == http.StatusOK {
+ got := cluster.ClusterKvPairs{}
+ json.NewDecoder(resp.Body).Decode(&got)
+
+ if reflect.DeepEqual(testCase.expected, got) == false {
+ t.Errorf("listHandler returned unexpected body: got %v;"+
+ " expected %v", got, testCase.expected)
+ }
+ }
+ })
+ }
+}
+
+func TestClusterKvPairsDeleteHandler(t *testing.T) {
+
+ testCases := []struct {
+ label string
+ name string
+ version string
+ expectedCode int
+ clusterClient *mockClusterManager
+ }{
+ {
+ label: "Delete Cluster KV Pairs",
+ expectedCode: http.StatusNoContent,
+ name: "testClusterKvPairs",
+ clusterClient: &mockClusterManager{},
+ },
+ {
+ label: "Delete Non-Existing Cluster KV Pairs",
+ expectedCode: http.StatusInternalServerError,
+ name: "testClusterKvPairs",
+ clusterClient: &mockClusterManager{
+ Err: pkgerrors.New("Internal Error"),
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.label, func(t *testing.T) {
+ request := httptest.NewRequest("DELETE", "/v2/cluster-providers/cp1/clusters/cl1/kv-pairs/"+testCase.name, nil)
+ resp := executeRequest(request, NewRouter(testCase.clusterClient))
+
+ //Check returned code
+ if resp.StatusCode != testCase.expectedCode {
+ t.Fatalf("Expected %d; Got: %d", testCase.expectedCode, resp.StatusCode)
+ }
+ })
+ }
+}