diff options
author | Eric Multanen <eric.w.multanen@intel.com> | 2020-05-27 11:21:42 -0700 |
---|---|---|
committer | Eric Multanen <eric.w.multanen@intel.com> | 2020-06-03 17:15:58 -0700 |
commit | 8e7a20777f2100324526a34b4b6c943b512df0fb (patch) | |
tree | eca4847a8361da6f3f97a363f8d65d8a3c6a08b2 /src/ncm/api | |
parent | 0c22bafd470e36647157b6d01221cb17841f360a (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/ncm/api')
-rw-r--r-- | src/ncm/api/api.go | 29 | ||||
-rw-r--r-- | src/ncm/api/clusterhandler.go | 485 | ||||
-rw-r--r-- | src/ncm/api/clusterhandler_test.go | 1432 |
3 files changed, 0 insertions, 1946 deletions
diff --git a/src/ncm/api/api.go b/src/ncm/api/api.go index a304516c..6dd958a1 100644 --- a/src/ncm/api/api.go +++ b/src/ncm/api/api.go @@ -20,7 +20,6 @@ import ( "reflect" "github.com/gorilla/mux" - "github.com/onap/multicloud-k8s/src/ncm/pkg/cluster" "github.com/onap/multicloud-k8s/src/ncm/pkg/module" "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents" "github.com/onap/multicloud-k8s/src/ncm/pkg/scheduler" @@ -33,13 +32,6 @@ var moduleClient *module.Client // return the testClient, otherwise return the client. func setClient(client, testClient interface{}) interface{} { switch cl := client.(type) { - case *cluster.ClusterClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*cluster.ClusterManager)(nil)).Elem()) { - c, ok := testClient.(cluster.ClusterManager) - if ok { - return c - } - } case *networkintents.NetworkClient: if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*networkintents.NetworkManager)(nil)).Elem()) { c, ok := testClient.(networkintents.NetworkManager) @@ -75,27 +67,6 @@ func NewRouter(testClient interface{}) *mux.Router { router := mux.NewRouter().PathPrefix("/v2").Subrouter() - clusterHandler := clusterHandler{ - client: setClient(moduleClient.Cluster, testClient).(cluster.ClusterManager), - } - router.HandleFunc("/cluster-providers", clusterHandler.createClusterProviderHandler).Methods("POST") - router.HandleFunc("/cluster-providers", clusterHandler.getClusterProviderHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{name}", clusterHandler.getClusterProviderHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{name}", clusterHandler.deleteClusterProviderHandler).Methods("DELETE") - router.HandleFunc("/cluster-providers/{provider-name}/clusters", clusterHandler.createClusterHandler).Methods("POST") - router.HandleFunc("/cluster-providers/{provider-name}/clusters", clusterHandler.getClusterHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters", clusterHandler.getClusterHandler).Queries("label", "{label}") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{name}", clusterHandler.getClusterHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{name}", clusterHandler.deleteClusterHandler).Methods("DELETE") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/labels", clusterHandler.createClusterLabelHandler).Methods("POST") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/labels", clusterHandler.getClusterLabelHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/labels/{label}", clusterHandler.getClusterLabelHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/labels/{label}", clusterHandler.deleteClusterLabelHandler).Methods("DELETE") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs", clusterHandler.createClusterKvPairsHandler).Methods("POST") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs", clusterHandler.getClusterKvPairsHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/{kvpair}", clusterHandler.getClusterKvPairsHandler).Methods("GET") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/{kvpair}", clusterHandler.deleteClusterKvPairsHandler).Methods("DELETE") - networkHandler := networkHandler{ client: setClient(moduleClient.Network, testClient).(networkintents.NetworkManager), } diff --git a/src/ncm/api/clusterhandler.go b/src/ncm/api/clusterhandler.go deleted file mode 100644 index 08040408..00000000 --- a/src/ncm/api/clusterhandler.go +++ /dev/null @@ -1,485 +0,0 @@ -/* - * 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/base64" - "encoding/json" - "io" - "io/ioutil" - "mime" - "mime/multipart" - "net/http" - "net/textproto" - - clusterPkg "github.com/onap/multicloud-k8s/src/ncm/pkg/cluster" - - "github.com/gorilla/mux" -) - -// Used to store backend implementations objects -// Also simplifies mocking for unit testing purposes -type clusterHandler struct { - // Interface that implements Cluster operations - // We will set this variable with a mock interface for testing - client clusterPkg.ClusterManager -} - -// Create handles creation of the ClusterProvider entry in the database -func (h clusterHandler) createClusterProviderHandler(w http.ResponseWriter, r *http.Request) { - var p clusterPkg.ClusterProvider - - err := json.NewDecoder(r.Body).Decode(&p) - - switch { - case err == io.EOF: - http.Error(w, "Empty body", http.StatusBadRequest) - return - case err != nil: - http.Error(w, err.Error(), http.StatusUnprocessableEntity) - return - } - - // Name is required. - if p.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - ret, err := h.client.CreateClusterProvider(p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Get handles GET operations on a particular ClusterProvider Name -// Returns a ClusterProvider -func (h clusterHandler) getClusterProviderHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - var ret interface{} - var err error - - if len(name) == 0 { - ret, err = h.client.GetClusterProviders() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetClusterProvider(name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Delete handles DELETE operations on a particular ClusterProvider Name -func (h clusterHandler) deleteClusterProviderHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - - err := h.client.DeleteClusterProvider(name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} - -// Create handles creation of the Cluster entry in the database -func (h clusterHandler) createClusterHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - var p clusterPkg.Cluster - var q clusterPkg.ClusterContent - - // Implemenation using multipart form - // Review and enable/remove at a later date - // Set Max size to 16mb here - err := r.ParseMultipartForm(16777216) - if err != nil { - http.Error(w, err.Error(), http.StatusUnprocessableEntity) - return - } - - jsn := bytes.NewBuffer([]byte(r.FormValue("metadata"))) - err = json.NewDecoder(jsn).Decode(&p) - switch { - case err == io.EOF: - http.Error(w, "Empty body", http.StatusBadRequest) - return - case err != nil: - http.Error(w, err.Error(), http.StatusUnprocessableEntity) - return - } - - //Read the file section and ignore the header - file, _, err := r.FormFile("file") - if err != nil { - http.Error(w, "Unable to process file", http.StatusUnprocessableEntity) - return - } - - defer file.Close() - - //Convert the file content to base64 for storage - content, err := ioutil.ReadAll(file) - if err != nil { - http.Error(w, "Unable to read file", http.StatusUnprocessableEntity) - return - } - - q.Kubeconfig = base64.StdEncoding.EncodeToString(content) - - // Name is required. - if p.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - ret, err := h.client.CreateCluster(provider, p, q) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Get handles GET operations on a particular Cluster Name -// Returns a Cluster -func (h clusterHandler) getClusterHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - name := vars["name"] - - label := r.URL.Query().Get("label") - if len(label) != 0 { - ret, err := h.client.GetClustersWithLabel(provider, label) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - return - } - - // handle the get all clusters case - return a list of only the json parts - if len(name) == 0 { - var retList []clusterPkg.Cluster - - ret, err := h.client.GetClusters(provider) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - for _, cl := range ret { - retList = append(retList, clusterPkg.Cluster{Metadata: cl.Metadata}) - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(retList) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - return - } - - accepted, _, err := mime.ParseMediaType(r.Header.Get("Accept")) - if err != nil { - http.Error(w, err.Error(), http.StatusNotAcceptable) - return - } - - retCluster, err := h.client.GetCluster(provider, name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - retKubeconfig, err := h.client.GetClusterContent(provider, name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - switch accepted { - case "multipart/form-data": - mpw := multipart.NewWriter(w) - w.Header().Set("Content-Type", mpw.FormDataContentType()) - w.WriteHeader(http.StatusOK) - pw, err := mpw.CreatePart(textproto.MIMEHeader{"Content-Type": {"application/json"}, "Content-Disposition": {"form-data; name=metadata"}}) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if err := json.NewEncoder(pw).Encode(retCluster); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - pw, err = mpw.CreatePart(textproto.MIMEHeader{"Content-Type": {"application/octet-stream"}, "Content-Disposition": {"form-data; name=file; filename=kubeconfig"}}) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - kcBytes, err := base64.StdEncoding.DecodeString(retKubeconfig.Kubeconfig) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - _, err = pw.Write(kcBytes) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - case "application/json": - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(retCluster) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - case "application/octet-stream": - w.Header().Set("Content-Type", "application/octet-stream") - w.WriteHeader(http.StatusOK) - kcBytes, err := base64.StdEncoding.DecodeString(retKubeconfig.Kubeconfig) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - _, err = w.Write(kcBytes) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - default: - http.Error(w, "set Accept: multipart/form-data, application/json or application/octet-stream", http.StatusMultipleChoices) - return - } -} - -// Delete handles DELETE operations on a particular Cluster Name -func (h clusterHandler) deleteClusterHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - name := vars["name"] - - err := h.client.DeleteCluster(provider, name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} - -// Create handles creation of the ClusterLabel entry in the database -func (h clusterHandler) createClusterLabelHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - var p clusterPkg.ClusterLabel - - err := json.NewDecoder(r.Body).Decode(&p) - - // LabelName is required. - if p.LabelName == "" { - http.Error(w, "Missing label name in POST request", http.StatusBadRequest) - return - } - - ret, err := h.client.CreateClusterLabel(provider, cluster, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Get handles GET operations on a particular Cluster Label -// Returns a ClusterLabel -func (h clusterHandler) getClusterLabelHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - label := vars["label"] - - var ret interface{} - var err error - - if len(label) == 0 { - ret, err = h.client.GetClusterLabels(provider, cluster) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetClusterLabel(provider, cluster, label) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Delete handles DELETE operations on a particular ClusterLabel Name -func (h clusterHandler) deleteClusterLabelHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - label := vars["label"] - - err := h.client.DeleteClusterLabel(provider, cluster, label) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} - -// Create handles creation of the ClusterKvPairs entry in the database -func (h clusterHandler) createClusterKvPairsHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - var p clusterPkg.ClusterKvPairs - - err := json.NewDecoder(r.Body).Decode(&p) - - // KvPairsName is required. - if p.Metadata.Name == "" { - http.Error(w, "Missing Key Value pair name in POST request", http.StatusBadRequest) - return - } - - ret, err := h.client.CreateClusterKvPairs(provider, cluster, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Get handles GET operations on a particular Cluster Key Value Pair -// Returns a ClusterKvPairs -func (h clusterHandler) getClusterKvPairsHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - kvpair := vars["kvpair"] - - var ret interface{} - var err error - - if len(kvpair) == 0 { - ret, err = h.client.GetAllClusterKvPairs(provider, cluster) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetClusterKvPairs(provider, cluster, kvpair) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err = json.NewEncoder(w).Encode(ret) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} - -// Delete handles DELETE operations on a particular Cluster Name -func (h clusterHandler) deleteClusterKvPairsHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - cluster := vars["cluster-name"] - kvpair := vars["kvpair"] - - err := h.client.DeleteClusterKvPairs(provider, cluster, kvpair) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} diff --git a/src/ncm/api/clusterhandler_test.go b/src/ncm/api/clusterhandler_test.go deleted file mode 100644 index a9290ad9..00000000 --- a/src/ncm/api/clusterhandler_test.go +++ /dev/null @@ -1,1432 +0,0 @@ -/* - * 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/ncm/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) - } - }) - } -} |