aboutsummaryrefslogtreecommitdiffstats
path: root/src/ncm/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/ncm/api')
-rw-r--r--src/ncm/api/api.go101
-rw-r--r--src/ncm/api/chainhandler.go290
-rw-r--r--src/ncm/api/chainhandler_test.go56
-rw-r--r--src/ncm/api/clusterhandler.go48
-rw-r--r--src/ncm/api/clusterhandler_test.go263
-rw-r--r--src/ncm/api/netcontrolintenthandler.go230
-rw-r--r--src/ncm/api/networkhandler.go15
-rw-r--r--src/ncm/api/providernethandler.go23
-rw-r--r--src/ncm/api/schedulerhandler.go63
-rw-r--r--src/ncm/api/workloadifintenthandler.go251
-rw-r--r--src/ncm/api/workloadintenthandler.go218
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)
-}