diff options
Diffstat (limited to 'src/ncm/api')
-rw-r--r-- | src/ncm/api/api.go | 101 | ||||
-rw-r--r-- | src/ncm/api/chainhandler.go | 290 | ||||
-rw-r--r-- | src/ncm/api/chainhandler_test.go | 56 | ||||
-rw-r--r-- | src/ncm/api/clusterhandler.go | 48 | ||||
-rw-r--r-- | src/ncm/api/clusterhandler_test.go | 263 | ||||
-rw-r--r-- | src/ncm/api/netcontrolintenthandler.go | 230 | ||||
-rw-r--r-- | src/ncm/api/networkhandler.go | 15 | ||||
-rw-r--r-- | src/ncm/api/providernethandler.go | 23 | ||||
-rw-r--r-- | src/ncm/api/schedulerhandler.go | 63 | ||||
-rw-r--r-- | src/ncm/api/workloadifintenthandler.go | 251 | ||||
-rw-r--r-- | src/ncm/api/workloadintenthandler.go | 218 |
11 files changed, 245 insertions, 1313 deletions
diff --git a/src/ncm/api/api.go b/src/ncm/api/api.go index 29ed46bd..a304516c 100644 --- a/src/ncm/api/api.go +++ b/src/ncm/api/api.go @@ -20,61 +20,43 @@ import ( "reflect" "github.com/gorilla/mux" - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" + "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" ) -var moduleClient *moduleLib.Client +var moduleClient *module.Client // For the given client and testClient, if the testClient is not null and // implements the client manager interface corresponding to client, then // return the testClient, otherwise return the client. func setClient(client, testClient interface{}) interface{} { switch cl := client.(type) { - case *moduleLib.ClusterClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.ClusterManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.ClusterManager) + 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 *moduleLib.NetworkClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.NetworkManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.NetworkManager) + case *networkintents.NetworkClient: + if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*networkintents.NetworkManager)(nil)).Elem()) { + c, ok := testClient.(networkintents.NetworkManager) if ok { return c } } - case *moduleLib.ProviderNetClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.ProviderNetManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.ProviderNetManager) + case *networkintents.ProviderNetClient: + if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*networkintents.ProviderNetManager)(nil)).Elem()) { + c, ok := testClient.(networkintents.ProviderNetManager) if ok { return c } } - case *moduleLib.NetControlIntentClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.NetControlIntentManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.NetControlIntentManager) - if ok { - return c - } - } - case *moduleLib.WorkloadIntentClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.WorkloadIntentManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.WorkloadIntentManager) - if ok { - return c - } - } - case *moduleLib.WorkloadIfIntentClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.WorkloadIfIntentManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.WorkloadIfIntentManager) - if ok { - return c - } - } - case *moduleLib.ChainClient: - if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*moduleLib.ChainManager)(nil)).Elem()) { - c, ok := testClient.(moduleLib.ChainManager) + case *scheduler.SchedulerClient: + if testClient != nil && reflect.TypeOf(testClient).Implements(reflect.TypeOf((*scheduler.SchedulerManager)(nil)).Elem()) { + c, ok := testClient.(scheduler.SchedulerManager) if ok { return c } @@ -89,12 +71,12 @@ func setClient(client, testClient interface{}) interface{} { // testClient parameter allows unit testing for a given client func NewRouter(testClient interface{}) *mux.Router { - moduleClient = moduleLib.NewClient() + moduleClient = module.NewClient() router := mux.NewRouter().PathPrefix("/v2").Subrouter() clusterHandler := clusterHandler{ - client: setClient(moduleClient.Cluster, testClient).(moduleLib.ClusterManager), + client: setClient(moduleClient.Cluster, testClient).(cluster.ClusterManager), } router.HandleFunc("/cluster-providers", clusterHandler.createClusterProviderHandler).Methods("POST") router.HandleFunc("/cluster-providers", clusterHandler.getClusterProviderHandler).Methods("GET") @@ -105,8 +87,6 @@ func NewRouter(testClient interface{}) *mux.Router { 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/{name}/apply", clusterHandler.applyClusterHandler).Methods("POST") - router.HandleFunc("/cluster-providers/{provider-name}/clusters/{name}/terminate", clusterHandler.terminateClusterHandler).Methods("POST") 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") @@ -117,7 +97,7 @@ func NewRouter(testClient interface{}) *mux.Router { router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/{kvpair}", clusterHandler.deleteClusterKvPairsHandler).Methods("DELETE") networkHandler := networkHandler{ - client: setClient(moduleClient.Network, testClient).(moduleLib.NetworkManager), + client: setClient(moduleClient.Network, testClient).(networkintents.NetworkManager), } router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/networks", networkHandler.createNetworkHandler).Methods("POST") router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/networks", networkHandler.getNetworkHandler).Methods("GET") @@ -126,7 +106,7 @@ func NewRouter(testClient interface{}) *mux.Router { router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/networks/{name}", networkHandler.deleteNetworkHandler).Methods("DELETE") providernetHandler := providernetHandler{ - client: setClient(moduleClient.ProviderNet, testClient).(moduleLib.ProviderNetManager), + client: setClient(moduleClient.ProviderNet, testClient).(networkintents.ProviderNetManager), } router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/provider-networks", providernetHandler.createProviderNetHandler).Methods("POST") router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/provider-networks", providernetHandler.getProviderNetHandler).Methods("GET") @@ -134,42 +114,11 @@ func NewRouter(testClient interface{}) *mux.Router { router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/provider-networks/{name}", providernetHandler.getProviderNetHandler).Methods("GET") router.HandleFunc("/cluster-providers/{provider-name}/clusters/{cluster-name}/provider-networks/{name}", providernetHandler.deleteProviderNetHandler).Methods("DELETE") - netcontrolintentHandler := netcontrolintentHandler{ - client: setClient(moduleClient.NetControlIntent, testClient).(moduleLib.NetControlIntentManager), - } - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent", netcontrolintentHandler.createHandler).Methods("POST") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent", netcontrolintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{name}", netcontrolintentHandler.putHandler).Methods("PUT") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{name}", netcontrolintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{name}", netcontrolintentHandler.deleteHandler).Methods("DELETE") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{name}/apply", netcontrolintentHandler.applyHandler).Methods("POST") - - workloadintentHandler := workloadintentHandler{ - client: setClient(moduleClient.WorkloadIntent, testClient).(moduleLib.WorkloadIntentManager), - } - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents", workloadintentHandler.createHandler).Methods("POST") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents", workloadintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{name}", workloadintentHandler.putHandler).Methods("PUT") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{name}", workloadintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{name}", workloadintentHandler.deleteHandler).Methods("DELETE") - - workloadifintentHandler := workloadifintentHandler{ - client: setClient(moduleClient.WorkloadIfIntent, testClient).(moduleLib.WorkloadIfIntentManager), - } - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{workload-intent}/interfaces", workloadifintentHandler.createHandler).Methods("POST") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{workload-intent}/interfaces", workloadifintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{workload-intent}/interfaces/{name}", workloadifintentHandler.putHandler).Methods("PUT") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{workload-intent}/interfaces/{name}", workloadifintentHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/workload-intents/{workload-intent}/interfaces/{name}", workloadifintentHandler.deleteHandler).Methods("DELETE") - - chainHandler := chainHandler{ - client: setClient(moduleClient.Chain, testClient).(moduleLib.ChainManager), + schedulerHandler := schedulerHandler{ + client: setClient(moduleClient.Scheduler, testClient).(scheduler.SchedulerManager), } - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/network-chains", chainHandler.createHandler).Methods("POST") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/network-chains", chainHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/network-chains/{name}", chainHandler.putHandler).Methods("PUT") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/network-chains/{name}", chainHandler.getHandler).Methods("GET") - router.HandleFunc("/projects/{project}/composite-apps/{composite-app-name}/{version}/network-controller-intent/{net-control-intent}/network-chains/{name}", chainHandler.deleteHandler).Methods("DELETE") + router.HandleFunc("/cluster-providers/{cluster-provider}/clusters/{cluster}/apply", schedulerHandler.applySchedulerHandler).Methods("POST") + router.HandleFunc("/cluster-providers/{cluster-provider}/clusters/{cluster}/terminate", schedulerHandler.terminateSchedulerHandler).Methods("POST") return router } diff --git a/src/ncm/api/chainhandler.go b/src/ncm/api/chainhandler.go deleted file mode 100644 index 7169014b..00000000 --- a/src/ncm/api/chainhandler.go +++ /dev/null @@ -1,290 +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 ( - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/validation" - pkgerrors "github.com/pkg/errors" - - "github.com/gorilla/mux" -) - -// Used to store backend implementations objects -// Also simplifies mocking for unit testing purposes -type chainHandler struct { - // Interface that implements workload intent operations - // We will set this variable with a mock interface for testing - client moduleLib.ChainManager -} - -func validateRoutingNetwork(r moduleLib.RoutingNetwork) error { - errs := validation.IsValidName(r.NetworkName) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid routing network name: %v", errs) - } - - err := validation.IsIpv4Cidr(r.Subnet) - if err != nil { - return pkgerrors.Wrap(err, "Invalid routing network subnet") - } - - err = validation.IsIpv4(r.GatewayIP) - if err != nil { - return pkgerrors.Wrap(err, "Invalid routing network gateway IP") - } - - return nil -} - -// validateNetworkChain checks that the network chain string input follows the -// generic format: "app=app1,net1,app=app2,net2, ..... ,netN-1,app=appN" -// assume "app=app1" can conform to validation.IsValidLabel() with an "=" -func validateNetworkChain(chain string) error { - elems := strings.Split(chain, ",") - - // chain needs at least two apps and a network - if len(elems) < 3 { - return pkgerrors.Errorf("Network chain is too short") - } - - // chain needs to have an odd number of elements - if len(elems)%2 == 0 { - return pkgerrors.Errorf("Invalid network chain - even number of elements") - } - - for i, s := range elems { - // allows whitespace in comma separated elements - t := strings.TrimSpace(s) - // if even element, verify a=b format - if i%2 == 0 { - if strings.Index(t, "=") < 1 { - return pkgerrors.Errorf("Invalid deployment label element of network chain") - } - errs := validation.IsValidLabel(t) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid deployment label element: %v", errs) - } - } else { - errs := validation.IsValidName(t) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid network element of network chain: %v", errs) - } - } - } - return nil -} - -// Check for valid format of input parameters -func validateChainInputs(ch moduleLib.Chain) error { - // validate metadata - err := moduleLib.IsValidMetadata(ch.Metadata) - if err != nil { - return pkgerrors.Wrap(err, "Invalid network chain metadata") - } - - if strings.ToLower(ch.Spec.ChainType) != moduleLib.RoutingChainType { - return pkgerrors.Wrap(err, "Invalid network chain type") - } - - for _, r := range ch.Spec.RoutingSpec.LeftNetwork { - err = validateRoutingNetwork(r) - if err != nil { - return err - } - } - - for _, r := range ch.Spec.RoutingSpec.RightNetwork { - err = validateRoutingNetwork(r) - if err != nil { - return err - } - } - - err = validateNetworkChain(ch.Spec.RoutingSpec.NetworkChain) - if err != nil { - return err - } - - errs := validation.IsValidName(ch.Spec.RoutingSpec.Namespace) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid network chain route spec namespace: %v", errs) - } - - return nil -} - -// Create handles creation of the Chain entry in the database -func (h chainHandler) createHandler(w http.ResponseWriter, r *http.Request) { - var ch moduleLib.Chain - vars := mux.Vars(r) - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := json.NewDecoder(r.Body).Decode(&ch) - - 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 ch.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - err = validateChainInputs(ch) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateChain(ch, project, compositeApp, compositeAppVersion, netControlIntent, false) - 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 - } -} - -// Put handles creation/update of the Chain entry in the database -func (h chainHandler) putHandler(w http.ResponseWriter, r *http.Request) { - var ch moduleLib.Chain - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := json.NewDecoder(r.Body).Decode(&ch) - - 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 ch.Metadata.Name == "" { - http.Error(w, "Missing name in PUT request", http.StatusBadRequest) - return - } - - // Name in URL should match name in body - if ch.Metadata.Name != name { - fmt.Printf("bodyname = %v, name= %v\n", ch.Metadata.Name, name) - http.Error(w, "Mismatched name in PUT request", http.StatusBadRequest) - return - } - - err = validateChainInputs(ch) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateChain(ch, project, compositeApp, compositeAppVersion, netControlIntent, true) - 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 Chain Name -// Returns a Chain -func (h chainHandler) getHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - var ret interface{} - var err error - - if len(name) == 0 { - ret, err = h.client.GetChains(project, compositeApp, compositeAppVersion, netControlIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetChain(name, project, compositeApp, compositeAppVersion, netControlIntent) - 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 Chain -func (h chainHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := h.client.DeleteChain(name, project, compositeApp, compositeAppVersion, netControlIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} diff --git a/src/ncm/api/chainhandler_test.go b/src/ncm/api/chainhandler_test.go deleted file mode 100644 index f13a90c4..00000000 --- a/src/ncm/api/chainhandler_test.go +++ /dev/null @@ -1,56 +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 ( - "testing" -) - -func TestIsValidNetworkChain(t *testing.T) { - t.Run("Valid Chains", func(t *testing.T) { - validchains := []string{ - "app=abc,net1,app=xyz", - "app=abc, net1, app=xyz", - " app=abc , net1 , app=xyz ", - "app.kubernets.io/name=abc,net1,app.kubernets.io/name=xyz", - "app.kubernets.io/name=abc,net1,app.kubernets.io/name=xyz, net2, anotherlabel=wex", - } - for _, chain := range validchains { - err := validateNetworkChain(chain) - if err != nil { - t.Errorf("Valid network chain failed to pass: %v %v", chain, err) - } - } - }) - - t.Run("Invalid Chains", func(t *testing.T) { - invalidchains := []string{ - "", - "app=abc,net1,app= xyz", - "app=abc,net1,xyz", - "app=abc,net1", - "app.kubernets.io/name=abc,net1,=xyz", - "abcdefg", - } - for _, chain := range invalidchains { - err := validateNetworkChain(chain) - if err == nil { - t.Errorf("Invalid network chain passed: %v", chain) - } - } - }) -} diff --git a/src/ncm/api/clusterhandler.go b/src/ncm/api/clusterhandler.go index 78453aa8..08040408 100644 --- a/src/ncm/api/clusterhandler.go +++ b/src/ncm/api/clusterhandler.go @@ -27,7 +27,7 @@ import ( "net/http" "net/textproto" - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" + clusterPkg "github.com/onap/multicloud-k8s/src/ncm/pkg/cluster" "github.com/gorilla/mux" ) @@ -37,12 +37,12 @@ import ( type clusterHandler struct { // Interface that implements Cluster operations // We will set this variable with a mock interface for testing - client moduleLib.ClusterManager + 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 moduleLib.ClusterProvider + var p clusterPkg.ClusterProvider err := json.NewDecoder(r.Body).Decode(&p) @@ -125,8 +125,8 @@ func (h clusterHandler) deleteClusterProviderHandler(w http.ResponseWriter, r *h func (h clusterHandler) createClusterHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) provider := vars["provider-name"] - var p moduleLib.Cluster - var q moduleLib.ClusterContent + var p clusterPkg.Cluster + var q clusterPkg.ClusterContent // Implemenation using multipart form // Review and enable/remove at a later date @@ -213,7 +213,7 @@ func (h clusterHandler) getClusterHandler(w http.ResponseWriter, r *http.Request // handle the get all clusters case - return a list of only the json parts if len(name) == 0 { - var retList []moduleLib.Cluster + var retList []clusterPkg.Cluster ret, err := h.client.GetClusters(provider) if err != nil { @@ -222,7 +222,7 @@ func (h clusterHandler) getClusterHandler(w http.ResponseWriter, r *http.Request } for _, cl := range ret { - retList = append(retList, moduleLib.Cluster{Metadata: cl.Metadata}) + retList = append(retList, clusterPkg.Cluster{Metadata: cl.Metadata}) } w.Header().Set("Content-Type", "application/json") @@ -324,42 +324,12 @@ func (h clusterHandler) deleteClusterHandler(w http.ResponseWriter, r *http.Requ w.WriteHeader(http.StatusNoContent) } -// apply network intents associated with the cluster -func (h clusterHandler) applyClusterHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - name := vars["name"] - - err := h.client.ApplyNetworkIntents(provider, name) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} - -// terminate network intents associated with the cluster -func (h clusterHandler) terminateClusterHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - provider := vars["provider-name"] - name := vars["name"] - - err := h.client.TerminateNetworkIntents(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 moduleLib.ClusterLabel + var p clusterPkg.ClusterLabel err := json.NewDecoder(r.Body).Decode(&p) @@ -439,7 +409,7 @@ func (h clusterHandler) createClusterKvPairsHandler(w http.ResponseWriter, r *ht vars := mux.Vars(r) provider := vars["provider-name"] cluster := vars["cluster-name"] - var p moduleLib.ClusterKvPairs + var p clusterPkg.ClusterKvPairs err := json.NewDecoder(r.Body).Decode(&p) diff --git a/src/ncm/api/clusterhandler_test.go b/src/ncm/api/clusterhandler_test.go index b32df527..a9290ad9 100644 --- a/src/ncm/api/clusterhandler_test.go +++ b/src/ncm/api/clusterhandler_test.go @@ -27,8 +27,9 @@ import ( "reflect" "testing" - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" + "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" ) @@ -39,35 +40,35 @@ import ( type mockClusterManager struct { // Items and err will be used to customize each test // via a localized instantiation of mockClusterManager - ClusterProviderItems []moduleLib.ClusterProvider - ClusterItems []moduleLib.Cluster - ClusterContentItems []moduleLib.ClusterContent + ClusterProviderItems []cluster.ClusterProvider + ClusterItems []cluster.Cluster + ClusterContentItems []cluster.ClusterContent ClusterContextItems []appcontext.AppContext - ClusterLabelItems []moduleLib.ClusterLabel - ClusterKvPairsItems []moduleLib.ClusterKvPairs + ClusterLabelItems []cluster.ClusterLabel + ClusterKvPairsItems []cluster.ClusterKvPairs ClusterList []string Err error } -func (m *mockClusterManager) CreateClusterProvider(inp moduleLib.ClusterProvider) (moduleLib.ClusterProvider, error) { +func (m *mockClusterManager) CreateClusterProvider(inp cluster.ClusterProvider) (cluster.ClusterProvider, error) { if m.Err != nil { - return moduleLib.ClusterProvider{}, m.Err + return cluster.ClusterProvider{}, m.Err } return m.ClusterProviderItems[0], nil } -func (m *mockClusterManager) GetClusterProvider(name string) (moduleLib.ClusterProvider, error) { +func (m *mockClusterManager) GetClusterProvider(name string) (cluster.ClusterProvider, error) { if m.Err != nil { - return moduleLib.ClusterProvider{}, m.Err + return cluster.ClusterProvider{}, m.Err } return m.ClusterProviderItems[0], nil } -func (m *mockClusterManager) GetClusterProviders() ([]moduleLib.ClusterProvider, error) { +func (m *mockClusterManager) GetClusterProviders() ([]cluster.ClusterProvider, error) { if m.Err != nil { - return []moduleLib.ClusterProvider{}, m.Err + return []cluster.ClusterProvider{}, m.Err } return m.ClusterProviderItems, nil @@ -77,25 +78,25 @@ func (m *mockClusterManager) DeleteClusterProvider(name string) error { return m.Err } -func (m *mockClusterManager) CreateCluster(provider string, inp moduleLib.Cluster, inq moduleLib.ClusterContent) (moduleLib.Cluster, error) { +func (m *mockClusterManager) CreateCluster(provider string, inp cluster.Cluster, inq cluster.ClusterContent) (cluster.Cluster, error) { if m.Err != nil { - return moduleLib.Cluster{}, m.Err + return cluster.Cluster{}, m.Err } return m.ClusterItems[0], nil } -func (m *mockClusterManager) GetCluster(provider, name string) (moduleLib.Cluster, error) { +func (m *mockClusterManager) GetCluster(provider, name string) (cluster.Cluster, error) { if m.Err != nil { - return moduleLib.Cluster{}, m.Err + return cluster.Cluster{}, m.Err } return m.ClusterItems[0], nil } -func (m *mockClusterManager) GetClusterContent(provider, name string) (moduleLib.ClusterContent, error) { +func (m *mockClusterManager) GetClusterContent(provider, name string) (cluster.ClusterContent, error) { if m.Err != nil { - return moduleLib.ClusterContent{}, m.Err + return cluster.ClusterContent{}, m.Err } return m.ClusterContentItems[0], nil @@ -109,9 +110,9 @@ func (m *mockClusterManager) GetClusterContext(provider, name string) (appcontex return m.ClusterContextItems[0], nil } -func (m *mockClusterManager) GetClusters(provider string) ([]moduleLib.Cluster, error) { +func (m *mockClusterManager) GetClusters(provider string) ([]cluster.Cluster, error) { if m.Err != nil { - return []moduleLib.Cluster{}, m.Err + return []cluster.Cluster{}, m.Err } return m.ClusterItems, nil @@ -129,67 +130,59 @@ func (m *mockClusterManager) DeleteCluster(provider, name string) error { return m.Err } -func (m *mockClusterManager) ApplyNetworkIntents(provider, name string) error { - return m.Err -} - -func (m *mockClusterManager) TerminateNetworkIntents(provider, name string) error { - return m.Err -} - -func (m *mockClusterManager) CreateClusterLabel(provider, cluster string, inp moduleLib.ClusterLabel) (moduleLib.ClusterLabel, error) { +func (m *mockClusterManager) CreateClusterLabel(provider, clusterName string, inp cluster.ClusterLabel) (cluster.ClusterLabel, error) { if m.Err != nil { - return moduleLib.ClusterLabel{}, m.Err + return cluster.ClusterLabel{}, m.Err } return m.ClusterLabelItems[0], nil } -func (m *mockClusterManager) GetClusterLabel(provider, cluster, label string) (moduleLib.ClusterLabel, error) { +func (m *mockClusterManager) GetClusterLabel(provider, clusterName, label string) (cluster.ClusterLabel, error) { if m.Err != nil { - return moduleLib.ClusterLabel{}, m.Err + return cluster.ClusterLabel{}, m.Err } return m.ClusterLabelItems[0], nil } -func (m *mockClusterManager) GetClusterLabels(provider, cluster string) ([]moduleLib.ClusterLabel, error) { +func (m *mockClusterManager) GetClusterLabels(provider, clusterName string) ([]cluster.ClusterLabel, error) { if m.Err != nil { - return []moduleLib.ClusterLabel{}, m.Err + return []cluster.ClusterLabel{}, m.Err } return m.ClusterLabelItems, nil } -func (m *mockClusterManager) DeleteClusterLabel(provider, cluster, label string) error { +func (m *mockClusterManager) DeleteClusterLabel(provider, clusterName, label string) error { return m.Err } -func (m *mockClusterManager) CreateClusterKvPairs(provider, cluster string, inp moduleLib.ClusterKvPairs) (moduleLib.ClusterKvPairs, error) { +func (m *mockClusterManager) CreateClusterKvPairs(provider, clusterName string, inp cluster.ClusterKvPairs) (cluster.ClusterKvPairs, error) { if m.Err != nil { - return moduleLib.ClusterKvPairs{}, m.Err + return cluster.ClusterKvPairs{}, m.Err } return m.ClusterKvPairsItems[0], nil } -func (m *mockClusterManager) GetClusterKvPairs(provider, cluster, kvpair string) (moduleLib.ClusterKvPairs, error) { +func (m *mockClusterManager) GetClusterKvPairs(provider, clusterName, kvpair string) (cluster.ClusterKvPairs, error) { if m.Err != nil { - return moduleLib.ClusterKvPairs{}, m.Err + return cluster.ClusterKvPairs{}, m.Err } return m.ClusterKvPairsItems[0], nil } -func (m *mockClusterManager) GetAllClusterKvPairs(provider, cluster string) ([]moduleLib.ClusterKvPairs, error) { +func (m *mockClusterManager) GetAllClusterKvPairs(provider, clusterName string) ([]cluster.ClusterKvPairs, error) { if m.Err != nil { - return []moduleLib.ClusterKvPairs{}, m.Err + return []cluster.ClusterKvPairs{}, m.Err } return m.ClusterKvPairsItems, nil } -func (m *mockClusterManager) DeleteClusterKvPairs(provider, cluster, kvpair string) error { +func (m *mockClusterManager) DeleteClusterKvPairs(provider, clusterName, kvpair string) error { return m.Err } @@ -197,7 +190,7 @@ func TestClusterProviderCreateHandler(t *testing.T) { testCases := []struct { label string reader io.Reader - expected moduleLib.ClusterProvider + expected cluster.ClusterProvider expectedCode int clusterClient *mockClusterManager }{ @@ -217,8 +210,8 @@ func TestClusterProviderCreateHandler(t *testing.T) { "userData2": "some user data 2" } }`)), - expected: moduleLib.ClusterProvider{ - Metadata: moduleLib.Metadata{ + expected: cluster.ClusterProvider{ + Metadata: types.Metadata{ Name: "clusterProviderTest", Description: "testClusterProvider", UserData1: "some user data 1", @@ -227,9 +220,9 @@ func TestClusterProviderCreateHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterProviderItems: []moduleLib.ClusterProvider{ + ClusterProviderItems: []cluster.ClusterProvider{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "clusterProviderTest", Description: "testClusterProvider", UserData1: "some user data 1", @@ -265,7 +258,7 @@ func TestClusterProviderCreateHandler(t *testing.T) { //Check returned body only if statusCreated if resp.StatusCode == http.StatusCreated { - got := moduleLib.ClusterProvider{} + got := cluster.ClusterProvider{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -281,7 +274,7 @@ func TestClusterProviderGetAllHandler(t *testing.T) { testCases := []struct { label string - expected []moduleLib.ClusterProvider + expected []cluster.ClusterProvider name, version string expectedCode int clusterClient *mockClusterManager @@ -289,9 +282,9 @@ func TestClusterProviderGetAllHandler(t *testing.T) { { label: "Get Cluster Provider", expectedCode: http.StatusOK, - expected: []moduleLib.ClusterProvider{ + expected: []cluster.ClusterProvider{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testClusterProvider1", Description: "testClusterProvider 1 description", UserData1: "some user data 1", @@ -299,7 +292,7 @@ func TestClusterProviderGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testClusterProvider2", Description: "testClusterProvider 2 description", UserData1: "some user data A", @@ -309,9 +302,9 @@ func TestClusterProviderGetAllHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterProviderItems: []moduleLib.ClusterProvider{ + ClusterProviderItems: []cluster.ClusterProvider{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testClusterProvider1", Description: "testClusterProvider 1 description", UserData1: "some user data 1", @@ -319,7 +312,7 @@ func TestClusterProviderGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testClusterProvider2", Description: "testClusterProvider 2 description", UserData1: "some user data A", @@ -343,7 +336,7 @@ func TestClusterProviderGetAllHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := []moduleLib.ClusterProvider{} + got := []cluster.ClusterProvider{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -359,7 +352,7 @@ func TestClusterProviderGetHandler(t *testing.T) { testCases := []struct { label string - expected moduleLib.ClusterProvider + expected cluster.ClusterProvider name, version string expectedCode int clusterClient *mockClusterManager @@ -367,8 +360,8 @@ func TestClusterProviderGetHandler(t *testing.T) { { label: "Get Cluster Provider", expectedCode: http.StatusOK, - expected: moduleLib.ClusterProvider{ - Metadata: moduleLib.Metadata{ + expected: cluster.ClusterProvider{ + Metadata: types.Metadata{ Name: "testClusterProvider", Description: "testClusterProvider description", UserData1: "some user data 1", @@ -378,9 +371,9 @@ func TestClusterProviderGetHandler(t *testing.T) { name: "testClusterProvider", clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterProviderItems: []moduleLib.ClusterProvider{ + ClusterProviderItems: []cluster.ClusterProvider{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testClusterProvider", Description: "testClusterProvider description", UserData1: "some user data 1", @@ -395,7 +388,7 @@ func TestClusterProviderGetHandler(t *testing.T) { expectedCode: http.StatusInternalServerError, name: "nonexistingclusterprovider", clusterClient: &mockClusterManager{ - ClusterProviderItems: []moduleLib.ClusterProvider{}, + ClusterProviderItems: []cluster.ClusterProvider{}, Err: pkgerrors.New("Internal Error"), }, }, @@ -413,7 +406,7 @@ func TestClusterProviderGetHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := moduleLib.ClusterProvider{} + got := cluster.ClusterProvider{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -468,7 +461,7 @@ func TestClusterCreateHandler(t *testing.T) { label string metadata string kubeconfig string - expected moduleLib.Cluster + expected cluster.Cluster expectedCode int clusterClient *mockClusterManager }{ @@ -494,8 +487,8 @@ of a file attached to the creation of clusterTest `, - expected: moduleLib.Cluster{ - Metadata: moduleLib.Metadata{ + expected: cluster.Cluster{ + Metadata: types.Metadata{ Name: "clusterTest", Description: "testCluster", UserData1: "some user data 1", @@ -504,9 +497,9 @@ of clusterTest }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterProviderItems: []moduleLib.ClusterProvider{ + ClusterProviderItems: []cluster.ClusterProvider{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "clusterProvider1", Description: "ClusterProvider 1 description", UserData1: "some user data 1", @@ -514,9 +507,9 @@ of clusterTest }, }, }, - ClusterItems: []moduleLib.Cluster{ + ClusterItems: []cluster.Cluster{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "clusterTest", Description: "testCluster", UserData1: "some user data 1", @@ -524,7 +517,7 @@ of clusterTest }, }, }, - ClusterContentItems: []moduleLib.ClusterContent{ + ClusterContentItems: []cluster.ClusterContent{ { Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==", }, @@ -574,7 +567,7 @@ of clusterTest //Check returned body only if statusCreated if resp.StatusCode == http.StatusCreated { - got := moduleLib.Cluster{} + got := cluster.Cluster{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -590,7 +583,7 @@ func TestClusterGetAllHandler(t *testing.T) { testCases := []struct { label string - expected []moduleLib.Cluster + expected []cluster.Cluster name, version string expectedCode int clusterClient *mockClusterManager @@ -598,9 +591,9 @@ func TestClusterGetAllHandler(t *testing.T) { { label: "Get Clusters", expectedCode: http.StatusOK, - expected: []moduleLib.Cluster{ + expected: []cluster.Cluster{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster1", Description: "testCluster 1 description", UserData1: "some user data 1", @@ -608,7 +601,7 @@ func TestClusterGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster2", Description: "testCluster 2 description", UserData1: "some user data A", @@ -618,9 +611,9 @@ func TestClusterGetAllHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterItems: []moduleLib.Cluster{ + ClusterItems: []cluster.Cluster{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster1", Description: "testCluster 1 description", UserData1: "some user data 1", @@ -628,7 +621,7 @@ func TestClusterGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster2", Description: "testCluster 2 description", UserData1: "some user data A", @@ -636,7 +629,7 @@ func TestClusterGetAllHandler(t *testing.T) { }, }, }, - ClusterContentItems: []moduleLib.ClusterContent{ + ClusterContentItems: []cluster.ClusterContent{ // content here doesn't matter - just needs to be present { Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==", @@ -661,7 +654,7 @@ func TestClusterGetAllHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := []moduleLib.Cluster{} + got := []cluster.Cluster{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -677,7 +670,7 @@ func TestClusterGetHandler(t *testing.T) { testCases := []struct { label string - expected moduleLib.Cluster + expected cluster.Cluster name, version string accept string expectedCode int @@ -687,8 +680,8 @@ func TestClusterGetHandler(t *testing.T) { label: "Get Cluster with Accept: application/json", accept: "application/json", expectedCode: http.StatusOK, - expected: moduleLib.Cluster{ - Metadata: moduleLib.Metadata{ + expected: cluster.Cluster{ + Metadata: types.Metadata{ Name: "testCluster", Description: "testCluster description", UserData1: "some user data 1", @@ -698,9 +691,9 @@ func TestClusterGetHandler(t *testing.T) { name: "testCluster", clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterItems: []moduleLib.Cluster{ + ClusterItems: []cluster.Cluster{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster", Description: "testCluster description", UserData1: "some user data 1", @@ -708,7 +701,7 @@ func TestClusterGetHandler(t *testing.T) { }, }, }, - ClusterContentItems: []moduleLib.ClusterContent{ + ClusterContentItems: []cluster.ClusterContent{ { Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==", }, @@ -721,7 +714,7 @@ func TestClusterGetHandler(t *testing.T) { expectedCode: http.StatusInternalServerError, name: "nonexistingcluster", clusterClient: &mockClusterManager{ - ClusterItems: []moduleLib.Cluster{}, + ClusterItems: []cluster.Cluster{}, Err: pkgerrors.New("Internal Error"), }, }, @@ -742,7 +735,7 @@ func TestClusterGetHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := moduleLib.Cluster{} + got := cluster.Cluster{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -776,9 +769,9 @@ of clusterTest name: "testCluster", clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterItems: []moduleLib.Cluster{ + ClusterItems: []cluster.Cluster{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "testCluster", Description: "testCluster description", UserData1: "some user data 1", @@ -786,7 +779,7 @@ of clusterTest }, }, }, - ClusterContentItems: []moduleLib.ClusterContent{ + ClusterContentItems: []cluster.ClusterContent{ { Kubeconfig: "dGVzdCBjb250ZW50cwpvZiBhIGZpbGUgYXR0YWNoZWQKdG8gdGhlIGNyZWF0aW9uCm9mIGNsdXN0ZXJUZXN0Cg==", }, @@ -799,7 +792,7 @@ of clusterTest expectedCode: http.StatusInternalServerError, name: "nonexistingcluster", clusterClient: &mockClusterManager{ - ClusterItems: []moduleLib.Cluster{}, + ClusterItems: []cluster.Cluster{}, Err: pkgerrors.New("Internal Error"), }, }, @@ -875,7 +868,7 @@ func TestClusterLabelCreateHandler(t *testing.T) { testCases := []struct { label string reader io.Reader - expected moduleLib.ClusterLabel + expected cluster.ClusterLabel expectedCode int clusterClient *mockClusterManager }{ @@ -890,12 +883,12 @@ func TestClusterLabelCreateHandler(t *testing.T) { reader: bytes.NewBuffer([]byte(`{ "label-name": "test-label" }`)), - expected: moduleLib.ClusterLabel{ + expected: cluster.ClusterLabel{ LabelName: "test-label", }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterLabelItems: []moduleLib.ClusterLabel{ + ClusterLabelItems: []cluster.ClusterLabel{ { LabelName: "test-label", }, @@ -916,7 +909,7 @@ func TestClusterLabelCreateHandler(t *testing.T) { //Check returned body only if statusCreated if resp.StatusCode == http.StatusCreated { - got := moduleLib.ClusterLabel{} + got := cluster.ClusterLabel{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -932,7 +925,7 @@ func TestClusterLabelsGetHandler(t *testing.T) { testCases := []struct { label string - expected []moduleLib.ClusterLabel + expected []cluster.ClusterLabel name, version string expectedCode int clusterClient *mockClusterManager @@ -940,7 +933,7 @@ func TestClusterLabelsGetHandler(t *testing.T) { { label: "Get Cluster Labels", expectedCode: http.StatusOK, - expected: []moduleLib.ClusterLabel{ + expected: []cluster.ClusterLabel{ { LabelName: "test-label1", }, @@ -953,7 +946,7 @@ func TestClusterLabelsGetHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterLabelItems: []moduleLib.ClusterLabel{ + ClusterLabelItems: []cluster.ClusterLabel{ { LabelName: "test-label1", }, @@ -980,7 +973,7 @@ func TestClusterLabelsGetHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := []moduleLib.ClusterLabel{} + got := []cluster.ClusterLabel{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -996,7 +989,7 @@ func TestClusterLabelGetHandler(t *testing.T) { testCases := []struct { label string - expected moduleLib.ClusterLabel + expected cluster.ClusterLabel name, version string expectedCode int clusterClient *mockClusterManager @@ -1004,13 +997,13 @@ func TestClusterLabelGetHandler(t *testing.T) { { label: "Get Cluster Label", expectedCode: http.StatusOK, - expected: moduleLib.ClusterLabel{ + expected: cluster.ClusterLabel{ LabelName: "testlabel", }, name: "testlabel", clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterLabelItems: []moduleLib.ClusterLabel{ + ClusterLabelItems: []cluster.ClusterLabel{ { LabelName: "testlabel", }, @@ -1022,7 +1015,7 @@ func TestClusterLabelGetHandler(t *testing.T) { expectedCode: http.StatusInternalServerError, name: "nonexistingclusterlabel", clusterClient: &mockClusterManager{ - ClusterLabelItems: []moduleLib.ClusterLabel{}, + ClusterLabelItems: []cluster.ClusterLabel{}, Err: pkgerrors.New("Internal Error"), }, }, @@ -1040,7 +1033,7 @@ func TestClusterLabelGetHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := moduleLib.ClusterLabel{} + got := cluster.ClusterLabel{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -1094,7 +1087,7 @@ func TestClusterKvPairsCreateHandler(t *testing.T) { testCases := []struct { label string reader io.Reader - expected moduleLib.ClusterKvPairs + expected cluster.ClusterKvPairs expectedCode int clusterClient *mockClusterManager }{ @@ -1124,14 +1117,14 @@ func TestClusterKvPairsCreateHandler(t *testing.T) { ] } }`)), - expected: moduleLib.ClusterKvPairs{ - Metadata: moduleLib.Metadata{ + expected: cluster.ClusterKvPairs{ + Metadata: types.Metadata{ Name: "ClusterKvPair1", Description: "test cluster kv pairs", UserData1: "some user data 1", UserData2: "some user data 2", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "key1": "value1", @@ -1144,15 +1137,15 @@ func TestClusterKvPairsCreateHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterKvPairsItems: []moduleLib.ClusterKvPairs{ + ClusterKvPairsItems: []cluster.ClusterKvPairs{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair1", Description: "test cluster kv pairs", UserData1: "some user data 1", UserData2: "some user data 2", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "key1": "value1", @@ -1180,7 +1173,7 @@ func TestClusterKvPairsCreateHandler(t *testing.T) { //Check returned body only if statusCreated if resp.StatusCode == http.StatusCreated { - got := moduleLib.ClusterKvPairs{} + got := cluster.ClusterKvPairs{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -1196,7 +1189,7 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { testCases := []struct { label string - expected []moduleLib.ClusterKvPairs + expected []cluster.ClusterKvPairs name, version string expectedCode int clusterClient *mockClusterManager @@ -1204,15 +1197,15 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { { label: "Get Cluster KvPairs", expectedCode: http.StatusOK, - expected: []moduleLib.ClusterKvPairs{ + expected: []cluster.ClusterKvPairs{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair1", Description: "test cluster kv pairs", UserData1: "some user data 1", UserData2: "some user data 2", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "key1": "value1", @@ -1224,13 +1217,13 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair2", Description: "test cluster kv pairs", UserData1: "some user data A", UserData2: "some user data B", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "keyA": "valueA", @@ -1244,15 +1237,15 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { }, clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterKvPairsItems: []moduleLib.ClusterKvPairs{ + ClusterKvPairsItems: []cluster.ClusterKvPairs{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair1", Description: "test cluster kv pairs", UserData1: "some user data 1", UserData2: "some user data 2", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "key1": "value1", @@ -1264,13 +1257,13 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { }, }, { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair2", Description: "test cluster kv pairs", UserData1: "some user data A", UserData2: "some user data B", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "keyA": "valueA", @@ -1298,7 +1291,7 @@ func TestClusterKvPairsGetAllHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := []moduleLib.ClusterKvPairs{} + got := []cluster.ClusterKvPairs{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { @@ -1314,7 +1307,7 @@ func TestClusterKvPairsGetHandler(t *testing.T) { testCases := []struct { label string - expected moduleLib.ClusterKvPairs + expected cluster.ClusterKvPairs name, version string expectedCode int clusterClient *mockClusterManager @@ -1322,14 +1315,14 @@ func TestClusterKvPairsGetHandler(t *testing.T) { { label: "Get Cluster KV Pairs", expectedCode: http.StatusOK, - expected: moduleLib.ClusterKvPairs{ - Metadata: moduleLib.Metadata{ + expected: cluster.ClusterKvPairs{ + Metadata: types.Metadata{ Name: "ClusterKvPair2", Description: "test cluster kv pairs", UserData1: "some user data A", UserData2: "some user data B", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "keyA": "valueA", @@ -1343,15 +1336,15 @@ func TestClusterKvPairsGetHandler(t *testing.T) { name: "ClusterKvPair2", clusterClient: &mockClusterManager{ //Items that will be returned by the mocked Client - ClusterKvPairsItems: []moduleLib.ClusterKvPairs{ + ClusterKvPairsItems: []cluster.ClusterKvPairs{ { - Metadata: moduleLib.Metadata{ + Metadata: types.Metadata{ Name: "ClusterKvPair2", Description: "test cluster kv pairs", UserData1: "some user data A", UserData2: "some user data B", }, - Spec: moduleLib.ClusterKvSpec{ + Spec: cluster.ClusterKvSpec{ Kv: []map[string]interface{}{ { "keyA": "valueA", @@ -1370,7 +1363,7 @@ func TestClusterKvPairsGetHandler(t *testing.T) { expectedCode: http.StatusInternalServerError, name: "nonexistingclusterkvpairs", clusterClient: &mockClusterManager{ - ClusterKvPairsItems: []moduleLib.ClusterKvPairs{}, + ClusterKvPairsItems: []cluster.ClusterKvPairs{}, Err: pkgerrors.New("Internal Error"), }, }, @@ -1388,7 +1381,7 @@ func TestClusterKvPairsGetHandler(t *testing.T) { //Check returned body only if statusOK if resp.StatusCode == http.StatusOK { - got := moduleLib.ClusterKvPairs{} + got := cluster.ClusterKvPairs{} json.NewDecoder(resp.Body).Decode(&got) if reflect.DeepEqual(testCase.expected, got) == false { diff --git a/src/ncm/api/netcontrolintenthandler.go b/src/ncm/api/netcontrolintenthandler.go deleted file mode 100644 index 48ef1de2..00000000 --- a/src/ncm/api/netcontrolintenthandler.go +++ /dev/null @@ -1,230 +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 ( - "encoding/json" - "fmt" - "io" - "net/http" - - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" - pkgerrors "github.com/pkg/errors" - - "github.com/gorilla/mux" -) - -// Used to store backend implementations objects -// Also simplifies mocking for unit testing purposes -type netcontrolintentHandler struct { - // Interface that implements Cluster operations - // We will set this variable with a mock interface for testing - client moduleLib.NetControlIntentManager -} - -// Check for valid format of input parameters -func validateNetControlIntentInputs(nci moduleLib.NetControlIntent) error { - // validate metadata - err := moduleLib.IsValidMetadata(nci.Metadata) - if err != nil { - return pkgerrors.Wrap(err, "Invalid network controller intent metadata") - } - return nil -} - -// Create handles creation of the NetControlIntent entry in the database -func (h netcontrolintentHandler) createHandler(w http.ResponseWriter, r *http.Request) { - var nci moduleLib.NetControlIntent - vars := mux.Vars(r) - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - - err := json.NewDecoder(r.Body).Decode(&nci) - - 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 nci.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - err = validateNetControlIntentInputs(nci) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateNetControlIntent(nci, project, compositeApp, compositeAppVersion, false) - 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 - } -} - -// Put handles creation/update of the NetControlIntent entry in the database -func (h netcontrolintentHandler) putHandler(w http.ResponseWriter, r *http.Request) { - var nci moduleLib.NetControlIntent - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - - err := json.NewDecoder(r.Body).Decode(&nci) - - 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 nci.Metadata.Name == "" { - http.Error(w, "Missing name in PUT request", http.StatusBadRequest) - return - } - - // Name in URL should match name in body - if nci.Metadata.Name != name { - fmt.Printf("bodyname = %v, name= %v\n", nci.Metadata.Name, name) - http.Error(w, "Mismatched name in PUT request", http.StatusBadRequest) - return - } - - err = validateNetControlIntentInputs(nci) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateNetControlIntent(nci, project, compositeApp, compositeAppVersion, true) - 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 NetControlIntent Name -// Returns a NetControlIntent -func (h netcontrolintentHandler) getHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - var ret interface{} - var err error - - if len(name) == 0 { - ret, err = h.client.GetNetControlIntents(project, compositeApp, compositeAppVersion) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetNetControlIntent(name, project, compositeApp, compositeAppVersion) - 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 NetControlIntent Name -func (h netcontrolintentHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - - err := h.client.DeleteNetControlIntent(name, project, compositeApp, compositeAppVersion) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} - -// Apply handles POST operations to Apply a particular NetControlIntent to the App Context -func (h netcontrolintentHandler) applyHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - - var aci struct { - AppContextId string `json:"appContextId"` - } - - err := json.NewDecoder(r.Body).Decode(&aci) - - switch { - case err == io.EOF: - http.Error(w, "Empty body", http.StatusBadRequest) - return - case err != nil: - http.Error(w, err.Error(), http.StatusUnprocessableEntity) - return - } - - err = h.client.ApplyNetControlIntent(name, project, compositeApp, compositeAppVersion, aci.AppContextId) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} diff --git a/src/ncm/api/networkhandler.go b/src/ncm/api/networkhandler.go index 01d077a7..ed266697 100644 --- a/src/ncm/api/networkhandler.go +++ b/src/ncm/api/networkhandler.go @@ -22,7 +22,8 @@ import ( "io" "net/http" - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" + netintents "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents" + nettypes "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents/types" "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/validation" pkgerrors "github.com/pkg/errors" @@ -34,11 +35,11 @@ import ( type networkHandler struct { // Interface that implements Cluster operations // We will set this variable with a mock interface for testing - client moduleLib.NetworkManager + client netintents.NetworkManager } // Check for valid format of input parameters -func validateNetworkInputs(p moduleLib.Network) error { +func validateNetworkInputs(p netintents.Network) error { // validate name errs := validation.IsValidName(p.Metadata.Name) if len(errs) > 0 { @@ -47,7 +48,7 @@ func validateNetworkInputs(p moduleLib.Network) error { // validate cni type found := false - for _, val := range moduleLib.CNI_TYPES { + for _, val := range nettypes.CNI_TYPES { if p.Spec.CniType == val { found = true break @@ -59,7 +60,7 @@ func validateNetworkInputs(p moduleLib.Network) error { subnets := p.Spec.Ipv4Subnets for _, subnet := range subnets { - err := moduleLib.ValidateSubnet(subnet) + err := nettypes.ValidateSubnet(subnet) if err != nil { return pkgerrors.Wrap(err, "invalid subnet") } @@ -69,7 +70,7 @@ func validateNetworkInputs(p moduleLib.Network) error { // Create handles creation of the Network entry in the database func (h networkHandler) createNetworkHandler(w http.ResponseWriter, r *http.Request) { - var p moduleLib.Network + var p netintents.Network vars := mux.Vars(r) clusterProvider := vars["provider-name"] cluster := vars["cluster-name"] @@ -114,7 +115,7 @@ func (h networkHandler) createNetworkHandler(w http.ResponseWriter, r *http.Requ // Put handles creation/update of the Network entry in the database func (h networkHandler) putNetworkHandler(w http.ResponseWriter, r *http.Request) { - var p moduleLib.Network + var p netintents.Network vars := mux.Vars(r) clusterProvider := vars["provider-name"] cluster := vars["cluster-name"] diff --git a/src/ncm/api/providernethandler.go b/src/ncm/api/providernethandler.go index 23310c31..66a41a4d 100644 --- a/src/ncm/api/providernethandler.go +++ b/src/ncm/api/providernethandler.go @@ -23,7 +23,8 @@ import ( "net/http" "strings" - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" + netintents "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents" + nettypes "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents/types" "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/validation" pkgerrors "github.com/pkg/errors" @@ -35,11 +36,11 @@ import ( type providernetHandler struct { // Interface that implements Cluster operations // We will set this variable with a mock interface for testing - client moduleLib.ProviderNetManager + client netintents.ProviderNetManager } // Check for valid format of input parameters -func validateProviderNetInputs(p moduleLib.ProviderNet) error { +func validateProviderNetInputs(p netintents.ProviderNet) error { // validate name errs := validation.IsValidName(p.Metadata.Name) if len(errs) > 0 { @@ -48,7 +49,7 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // validate cni type found := false - for _, val := range moduleLib.CNI_TYPES { + for _, val := range nettypes.CNI_TYPES { if p.Spec.CniType == val { found = true break @@ -60,7 +61,7 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // validate the provider network type found = false - for _, val := range moduleLib.PROVIDER_NET_TYPES { + for _, val := range nettypes.PROVIDER_NET_TYPES { if strings.ToUpper(p.Spec.ProviderNetType) == val { found = true break @@ -73,7 +74,7 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // validate the subnets subnets := p.Spec.Ipv4Subnets for _, subnet := range subnets { - err := moduleLib.ValidateSubnet(subnet) + err := nettypes.ValidateSubnet(subnet) if err != nil { return pkgerrors.Wrap(err, "invalid subnet") } @@ -88,10 +89,10 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // validate the VLAN Node Selector value expectLabels := false found = false - for _, val := range moduleLib.VLAN_NODE_SELECTORS { + for _, val := range nettypes.VLAN_NODE_SELECTORS { if strings.ToLower(p.Spec.Vlan.VlanNodeSelector) == val { found = true - if val == moduleLib.VLAN_NODE_SPECIFIC { + if val == nettypes.VLAN_NODE_SPECIFIC { expectLabels = true } break @@ -114,7 +115,7 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // Need at least one label if node selector value was "specific" // (if selector is "any" - don't care if labels were supplied or not if expectLabels && !gotLabels { - return pkgerrors.Errorf("Node Labels required for VlAN node selector \"%v\"", moduleLib.VLAN_NODE_SPECIFIC) + return pkgerrors.Errorf("Node Labels required for VlAN node selector \"%v\"", nettypes.VLAN_NODE_SPECIFIC) } return nil @@ -122,7 +123,7 @@ func validateProviderNetInputs(p moduleLib.ProviderNet) error { // Create handles creation of the ProviderNet entry in the database func (h providernetHandler) createProviderNetHandler(w http.ResponseWriter, r *http.Request) { - var p moduleLib.ProviderNet + var p netintents.ProviderNet vars := mux.Vars(r) clusterProvider := vars["provider-name"] cluster := vars["cluster-name"] @@ -167,7 +168,7 @@ func (h providernetHandler) createProviderNetHandler(w http.ResponseWriter, r *h // Put handles creation/update of the ProviderNet entry in the database func (h providernetHandler) putProviderNetHandler(w http.ResponseWriter, r *http.Request) { - var p moduleLib.ProviderNet + var p netintents.ProviderNet vars := mux.Vars(r) clusterProvider := vars["provider-name"] cluster := vars["cluster-name"] diff --git a/src/ncm/api/schedulerhandler.go b/src/ncm/api/schedulerhandler.go new file mode 100644 index 00000000..d07d132d --- /dev/null +++ b/src/ncm/api/schedulerhandler.go @@ -0,0 +1,63 @@ +/* + * 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 ( + "net/http" + + "github.com/onap/multicloud-k8s/src/ncm/pkg/scheduler" + + "github.com/gorilla/mux" +) + +// Used to store backend implementations objects +// Also simplifies mocking for unit testing purposes +type schedulerHandler struct { + // Interface that implements Cluster operations + // We will set this variable with a mock interface for testing + client scheduler.SchedulerManager +} + +// applyClusterHandler handles requests to apply network intents for a cluster +func (h schedulerHandler) applySchedulerHandler(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + provider := vars["cluster-provider"] + cluster := vars["cluster"] + + err := h.client.ApplyNetworkIntents(provider, cluster) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusNoContent) +} + +// terminateSchedulerHandler handles requests to apply network intents for a cluster +func (h schedulerHandler) terminateSchedulerHandler(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + provider := vars["cluster-provider"] + cluster := vars["cluster"] + + err := h.client.TerminateNetworkIntents(provider, cluster) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusNoContent) +} diff --git a/src/ncm/api/workloadifintenthandler.go b/src/ncm/api/workloadifintenthandler.go deleted file mode 100644 index 31472a5d..00000000 --- a/src/ncm/api/workloadifintenthandler.go +++ /dev/null @@ -1,251 +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 ( - "encoding/json" - "fmt" - "io" - "net/http" - - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/validation" - pkgerrors "github.com/pkg/errors" - - "github.com/gorilla/mux" -) - -// Used to store backend implementations objects -// Also simplifies mocking for unit testing purposes -type workloadifintentHandler struct { - // Interface that implements workload intent operations - // We will set this variable with a mock interface for testing - client moduleLib.WorkloadIfIntentManager -} - -// Check for valid format of input parameters -func validateWorkloadIfIntentInputs(wif moduleLib.WorkloadIfIntent) error { - // validate metadata - err := moduleLib.IsValidMetadata(wif.Metadata) - if err != nil { - return pkgerrors.Wrap(err, "Invalid network controller intent metadata") - } - - errs := validation.IsValidName(wif.Spec.IfName) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid interface name = [%v], errors: %v", wif.Spec.IfName, errs) - } - - errs = validation.IsValidName(wif.Spec.NetworkName) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid network name = [%v], errors: %v", wif.Spec.NetworkName, errs) - } - - // optional - only validate if supplied - if len(wif.Spec.DefaultGateway) > 0 { - errs = validation.IsValidName(wif.Spec.DefaultGateway) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid default interface = [%v], errors: %v", wif.Spec.DefaultGateway, errs) - } - } - - // optional - only validate if supplied - if len(wif.Spec.IpAddr) > 0 { - err = validation.IsIp(wif.Spec.IpAddr) - if err != nil { - return pkgerrors.Errorf("Invalid IP address = [%v], errors: %v", wif.Spec.IpAddr, err) - } - } - - // optional - only validate if supplied - if len(wif.Spec.MacAddr) > 0 { - err = validation.IsMac(wif.Spec.MacAddr) - if err != nil { - return pkgerrors.Errorf("Invalid MAC address = [%v], errors: %v", wif.Spec.MacAddr, err) - } - } - return nil -} - -// Create handles creation of the Network entry in the database -func (h workloadifintentHandler) createHandler(w http.ResponseWriter, r *http.Request) { - var wif moduleLib.WorkloadIfIntent - vars := mux.Vars(r) - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - workloadIntent := vars["workload-intent"] - - err := json.NewDecoder(r.Body).Decode(&wif) - - 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 wif.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - // set default value - if len(wif.Spec.DefaultGateway) == 0 { - wif.Spec.DefaultGateway = "false" // set default value - } - - err = validateWorkloadIfIntentInputs(wif) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateWorkloadIfIntent(wif, project, compositeApp, compositeAppVersion, netControlIntent, workloadIntent, false) - 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 - } -} - -// Put handles creation/update of the Network entry in the database -func (h workloadifintentHandler) putHandler(w http.ResponseWriter, r *http.Request) { - var wif moduleLib.WorkloadIfIntent - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - workloadIntent := vars["workload-intent"] - - err := json.NewDecoder(r.Body).Decode(&wif) - - 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 wif.Metadata.Name == "" { - http.Error(w, "Missing name in PUT request", http.StatusBadRequest) - return - } - - // Name in URL should match name in body - if wif.Metadata.Name != name { - fmt.Printf("bodyname = %v, name= %v\n", wif.Metadata.Name, name) - http.Error(w, "Mismatched name in PUT request", http.StatusBadRequest) - return - } - - // set default value - if len(wif.Spec.DefaultGateway) == 0 { - wif.Spec.DefaultGateway = "false" // set default value - } - - err = validateWorkloadIfIntentInputs(wif) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateWorkloadIfIntent(wif, project, compositeApp, compositeAppVersion, netControlIntent, workloadIntent, true) - 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 Network Name -// Returns a Network -func (h workloadifintentHandler) getHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - workloadIntent := vars["workload-intent"] - var ret interface{} - var err error - - if len(name) == 0 { - ret, err = h.client.GetWorkloadIfIntents(project, compositeApp, compositeAppVersion, netControlIntent, workloadIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetWorkloadIfIntent(name, project, compositeApp, compositeAppVersion, netControlIntent, workloadIntent) - 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 Network Name -func (h workloadifintentHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - workloadIntent := vars["workload-intent"] - - err := h.client.DeleteWorkloadIfIntent(name, project, compositeApp, compositeAppVersion, netControlIntent, workloadIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} diff --git a/src/ncm/api/workloadintenthandler.go b/src/ncm/api/workloadintenthandler.go deleted file mode 100644 index f1d0093d..00000000 --- a/src/ncm/api/workloadintenthandler.go +++ /dev/null @@ -1,218 +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 ( - "encoding/json" - "fmt" - "io" - "net/http" - - moduleLib "github.com/onap/multicloud-k8s/src/ncm/pkg/module" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/validation" - pkgerrors "github.com/pkg/errors" - - "github.com/gorilla/mux" -) - -// Used to store backend implementations objects -// Also simplifies mocking for unit testing purposes -type workloadintentHandler struct { - // Interface that implements workload intent operations - // We will set this variable with a mock interface for testing - client moduleLib.WorkloadIntentManager -} - -// Check for valid format of input parameters -func validateWorkloadIntentInputs(wi moduleLib.WorkloadIntent) error { - // validate metadata - err := moduleLib.IsValidMetadata(wi.Metadata) - if err != nil { - return pkgerrors.Wrap(err, "Invalid network controller intent metadata") - } - - errs := validation.IsValidName(wi.Spec.AppName) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid application name = [%v], errors: %v", wi.Spec.AppName, errs) - } - - errs = validation.IsValidName(wi.Spec.WorkloadResource) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid workload resource = [%v], errors: %v", wi.Spec.WorkloadResource, errs) - } - - errs = validation.IsValidName(wi.Spec.Type) - if len(errs) > 0 { - return pkgerrors.Errorf("Invalid workload type = [%v], errors: %v", wi.Spec.Type, errs) - } - return nil -} - -// Create handles creation of the Network entry in the database -func (h workloadintentHandler) createHandler(w http.ResponseWriter, r *http.Request) { - var wi moduleLib.WorkloadIntent - vars := mux.Vars(r) - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := json.NewDecoder(r.Body).Decode(&wi) - - 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 wi.Metadata.Name == "" { - http.Error(w, "Missing name in POST request", http.StatusBadRequest) - return - } - - err = validateWorkloadIntentInputs(wi) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateWorkloadIntent(wi, project, compositeApp, compositeAppVersion, netControlIntent, false) - 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 - } -} - -// Put handles creation/update of the Network entry in the database -func (h workloadintentHandler) putHandler(w http.ResponseWriter, r *http.Request) { - var wi moduleLib.WorkloadIntent - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := json.NewDecoder(r.Body).Decode(&wi) - - 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 wi.Metadata.Name == "" { - http.Error(w, "Missing name in PUT request", http.StatusBadRequest) - return - } - - // Name in URL should match name in body - if wi.Metadata.Name != name { - fmt.Printf("bodyname = %v, name= %v\n", wi.Metadata.Name, name) - http.Error(w, "Mismatched name in PUT request", http.StatusBadRequest) - return - } - - err = validateWorkloadIntentInputs(wi) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - ret, err := h.client.CreateWorkloadIntent(wi, project, compositeApp, compositeAppVersion, netControlIntent, true) - 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 Network Name -// Returns a Network -func (h workloadintentHandler) getHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - var ret interface{} - var err error - - if len(name) == 0 { - ret, err = h.client.GetWorkloadIntents(project, compositeApp, compositeAppVersion, netControlIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - } else { - ret, err = h.client.GetWorkloadIntent(name, project, compositeApp, compositeAppVersion, netControlIntent) - 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 Network Name -func (h workloadintentHandler) deleteHandler(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - name := vars["name"] - project := vars["project"] - compositeApp := vars["composite-app-name"] - compositeAppVersion := vars["version"] - netControlIntent := vars["net-control-intent"] - - err := h.client.DeleteWorkloadIntent(name, project, compositeApp, compositeAppVersion, netControlIntent) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusNoContent) -} |