summaryrefslogtreecommitdiffstats
path: root/src/ncm
diff options
context:
space:
mode:
Diffstat (limited to 'src/ncm')
-rw-r--r--src/ncm/api/api.go65
-rw-r--r--src/ncm/api/chainhandler.go290
-rw-r--r--src/ncm/api/chainhandler_test.go56
-rw-r--r--src/ncm/api/netcontrolintenthandler.go230
-rw-r--r--src/ncm/api/workloadifintenthandler.go251
-rw-r--r--src/ncm/api/workloadintenthandler.go218
-rw-r--r--src/ncm/cmd/main.go58
-rw-r--r--src/ncm/go.mod2
-rw-r--r--src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go45
-rw-r--r--src/ncm/pkg/grpc/register.go58
-rw-r--r--src/ncm/pkg/module/chaining.go209
-rw-r--r--src/ncm/pkg/module/module.go8
-rw-r--r--src/ncm/pkg/module/module_definitions.go3
-rw-r--r--src/ncm/pkg/module/netcontrolintent.go295
-rw-r--r--src/ncm/pkg/module/resources.go273
-rw-r--r--src/ncm/pkg/module/workloadifintent.go188
-rw-r--r--src/ncm/pkg/module/workloadintent.go181
17 files changed, 2 insertions, 2428 deletions
diff --git a/src/ncm/api/api.go b/src/ncm/api/api.go
index 29ed46bd..2b9c1b17 100644
--- a/src/ncm/api/api.go
+++ b/src/ncm/api/api.go
@@ -51,34 +51,6 @@ func setClient(client, testClient interface{}) interface{} {
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)
- if ok {
- return c
- }
- }
default:
fmt.Printf("unknown type %T\n", cl)
}
@@ -134,42 +106,5 @@ 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),
- }
- 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")
-
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/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/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)
-}
diff --git a/src/ncm/cmd/main.go b/src/ncm/cmd/main.go
index 49af81ee..640fa3ea 100644
--- a/src/ncm/cmd/main.go
+++ b/src/ncm/cmd/main.go
@@ -15,72 +15,21 @@ package main
import (
"context"
- "fmt"
"log"
"math/rand"
- "net"
"net/http"
"os"
"os/signal"
- "strings"
"time"
"github.com/gorilla/handlers"
"github.com/onap/multicloud-k8s/src/ncm/api"
- register "github.com/onap/multicloud-k8s/src/ncm/pkg/grpc"
- "github.com/onap/multicloud-k8s/src/ncm/pkg/grpc/contextupdateserver"
- updatepb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/grpc/contextupdate"
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/auth"
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/config"
contextDb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/contextdb"
"github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials"
- "google.golang.org/grpc/testdata"
)
-func startGrpcServer() error {
- var tls bool
-
- if strings.Contains(config.GetConfiguration().GrpcEnableTLS, "enable") {
- tls = true
- } else {
- tls = false
- }
- certFile := config.GetConfiguration().GrpcServerCert
- keyFile := config.GetConfiguration().GrpcServerKey
-
- host, port := register.GetServerHostPort()
-
- lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port))
- if err != nil {
- log.Fatalf("Could not listen to port: %v", err)
- }
- var opts []grpc.ServerOption
- if tls {
- if certFile == "" {
- certFile = testdata.Path("server.pem")
- }
- if keyFile == "" {
- keyFile = testdata.Path("server.key")
- }
- creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
- if err != nil {
- log.Fatalf("Could not generate credentials %v", err)
- }
- opts = []grpc.ServerOption{grpc.Creds(creds)}
- }
- grpcServer := grpc.NewServer(opts...)
- updatepb.RegisterContextupdateServer(grpcServer, contextupdateserver.NewContextupdateServer())
-
- log.Println("Starting Network Configuration Manager gRPC Server")
- err = grpcServer.Serve(lis)
- if err != nil {
- log.Fatalf("ncm grpc server is not serving %v", err)
- }
- return err
-}
-
func main() {
rand.Seed(time.Now().UnixNano())
@@ -106,13 +55,6 @@ func main() {
Addr: ":" + config.GetConfiguration().ServicePort,
}
- go func() {
- err := startGrpcServer()
- if err != nil {
- log.Fatalf("GRPC server failed to start")
- }
- }()
-
connectionsClose := make(chan struct{})
go func() {
c := make(chan os.Signal, 1)
diff --git a/src/ncm/go.mod b/src/ncm/go.mod
index d9fde682..41f2b5ff 100644
--- a/src/ncm/go.mod
+++ b/src/ncm/go.mod
@@ -8,6 +8,7 @@ require (
github.com/gorilla/mux v1.6.2
github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20200127152046-0ee521d56061
github.com/onap/multicloud-k8s/src/orchestrator v0.0.0-20200527175204-ef27eb4d63f1
+ github.com/onap/multicloud-k8s/src/rsync v0.0.0-20200529003854-0a7bf256bde5
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/pkg/errors v0.8.1
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect
@@ -23,6 +24,7 @@ require (
replace (
github.com/onap/multicloud-k8s/src/orchestrator => ../orchestrator
+ github.com/onap/multicloud-k8s/src/rsync => ../rsync
k8s.io/api => k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d
diff --git a/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go b/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go
deleted file mode 100644
index fc548ccc..00000000
--- a/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-Copyright 2020 Intel Corporation.
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package contextupdateserver
-
-import (
- "context"
- "encoding/json"
- "log"
-
- contextpb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/grpc/contextupdate"
- //"google.golang.org/grpc/codes"
- //"google.golang.org/grpc/status"
-)
-
-type contextupdateServer struct {
- contextpb.UnimplementedContextupdateServer
-}
-
-func (cs *contextupdateServer) UpdateAppContext(ctx context.Context, req *contextpb.ContextUpdateRequest) (*contextpb.ContextUpdateResponse, error) {
- contextUpdateReq, _ := json.Marshal(req)
- log.Println("GRPC Server received contextupdateRequest: ", string(contextUpdateReq))
-
- // Insert call to Server Functionality here
- //
- //
-
- return &contextpb.ContextUpdateResponse{AppContextUpdated: true}, nil
-}
-
-// NewContextUpdateServer exported
-func NewContextupdateServer() *contextupdateServer {
- s := &contextupdateServer{}
- return s
-}
diff --git a/src/ncm/pkg/grpc/register.go b/src/ncm/pkg/grpc/register.go
deleted file mode 100644
index 07d8f5c0..00000000
--- a/src/ncm/pkg/grpc/register.go
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-Copyright 2020 Intel Corporation.
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package grpc
-
-import (
- "os"
- "strconv"
- "strings"
-
- log "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/logutils"
-)
-
-const default_host = "localhost"
-const default_port = 9030
-const default_ncm_name = "ncm"
-const ENV_NCM_NAME = "NCM_NAME"
-
-func GetServerHostPort() (string, int) {
-
- // expect name of this ncm program to be in env variable "NCM_NAME" - e.g. NCM_NAME="ncm"
- serviceName := os.Getenv(ENV_NCM_NAME)
- if serviceName == "" {
- serviceName = default_ncm_name
- log.Info("Using default name for NCM service name", log.Fields{
- "Name": serviceName,
- })
- }
-
- // expect service name to be in env variable - e.g. NCM_SERVICE_HOST
- host := os.Getenv(strings.ToUpper(serviceName) + "_SERVICE_HOST")
- if host == "" {
- host = default_host
- log.Info("Using default host for ncm gRPC controller", log.Fields{
- "Host": host,
- })
- }
-
- // expect service port to be in env variable - e.g. NCM_SERVICE_PORT
- port, err := strconv.Atoi(os.Getenv(strings.ToUpper(serviceName) + "_SERVICE_PORT"))
- if err != nil || port < 0 {
- port = default_port
- log.Info("Using default port for ncm gRPC controller", log.Fields{
- "Port": port,
- })
- }
- return host, port
-}
diff --git a/src/ncm/pkg/module/chaining.go b/src/ncm/pkg/module/chaining.go
deleted file mode 100644
index 45f061fa..00000000
--- a/src/ncm/pkg/module/chaining.go
+++ /dev/null
@@ -1,209 +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 module
-
-import (
- "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
-
- pkgerrors "github.com/pkg/errors"
-)
-
-// Chain defines the high level structure of a network chain document
-type Chain struct {
- Metadata Metadata `json:"metadata" yaml:"metadata"`
- Spec NetworkChainingSpec `json:"spec" yaml:"spec"`
-}
-
-// NetworkChainingSpec contains the specification of a network chain
-type NetworkChainingSpec struct {
- ChainType string `json:"type"`
- RoutingSpec RouteSpec `json:"routingSpec"`
-}
-
-// RouteSpec contains the routing specificaiton of a network chain
-type RouteSpec struct {
- LeftNetwork []RoutingNetwork `json:"leftNetwork"`
- RightNetwork []RoutingNetwork `json:"rightNetwork"`
- NetworkChain string `json:"networkChain"`
- Namespace string `json:"namespace"`
-}
-
-// RoutingNetwork contains the route networkroute network details for en element of a network chain
-type RoutingNetwork struct {
- NetworkName string `json:"networkName"`
- GatewayIP string `json:"gatewayIp"`
- Subnet string `json:"subnet"`
-}
-
-// ChainKey is the key structure that is used in the database
-type ChainKey struct {
- Project string `json:"project"`
- CompositeApp string `json:"compositeapp"`
- CompositeAppVersion string `json:"compositeappversion"`
- NetControlIntent string `json:"netcontrolintent"`
- NetworkChain string `json:"networkchain"`
-}
-
-// CrChain is the structure for the Network Chain Custom Resource
-type CrChain struct {
- APIVersion string `yaml:"apiVersion"`
- Kind string `yaml:"kind"`
- Chain Chain
-}
-
-// RoutingChainType is currently only defined chaining type
-const RoutingChainType = "routing"
-
-// ChainingAPIVersion is the kubernetes version of a network chain custom resource
-const ChainingAPIVersion = "k8s.plugin.opnfv.org/v1"
-
-// ChainingKind is the Kind string for a network chain
-const ChainingKind = "NetworkChaining"
-
-// ChainManager is an interface exposing the Chain functionality
-type ChainManager interface {
- CreateChain(ch Chain, pr, ca, caver, netctrlint string, exists bool) (Chain, error)
- GetChain(name, pr, ca, caver, netctrlint string) (Chain, error)
- GetChains(pr, ca, caver, netctrlint string) ([]Chain, error)
- DeleteChain(name, pr, ca, caver, netctrlint string) error
-}
-
-// ChainClient implements the Manager
-// It will also be used to maintain some localized state
-type ChainClient struct {
- db ClientDbInfo
-}
-
-// NewChainClient returns an instance of the ChainClient
-// which implements the Manager
-func NewChainClient() *ChainClient {
- return &ChainClient{
- db: ClientDbInfo{
- storeName: "orchestrator",
- tagMeta: "chainmetadata",
- },
- }
-}
-
-// CreateChain - create a new Chain
-func (v *ChainClient) CreateChain(ch Chain, pr, ca, caver, netctrlint string, exists bool) (Chain, error) {
- //Construct key and tag to select the entry
- key := ChainKey{
- Project: pr,
- CompositeApp: ca,
- CompositeAppVersion: caver,
- NetControlIntent: netctrlint,
- NetworkChain: ch.Metadata.Name,
- }
-
- //Check if the Network Control Intent exists
- _, err := NewNetControlIntentClient().GetNetControlIntent(netctrlint, pr, ca, caver)
- if err != nil {
- return Chain{}, pkgerrors.Errorf("Network Control Intent %v does not exist", netctrlint)
- }
-
- //Check if this Chain already exists
- _, err = v.GetChain(ch.Metadata.Name, pr, ca, caver, netctrlint)
- if err == nil && !exists {
- return Chain{}, pkgerrors.New("Chain already exists")
- }
-
- err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, ch)
- if err != nil {
- return Chain{}, pkgerrors.Wrap(err, "Creating DB Entry")
- }
-
- return ch, nil
-}
-
-// GetChain returns the Chain for corresponding name
-func (v *ChainClient) GetChain(name, pr, ca, caver, netctrlint string) (Chain, error) {
- //Construct key and tag to select the entry
- key := ChainKey{
- Project: pr,
- CompositeApp: ca,
- CompositeAppVersion: caver,
- NetControlIntent: netctrlint,
- NetworkChain: name,
- }
-
- value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return Chain{}, pkgerrors.Wrap(err, "Get Chain")
- }
-
- //value is a byte array
- if value != nil {
- ch := Chain{}
- err = db.DBconn.Unmarshal(value[0], &ch)
- if err != nil {
- return Chain{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- return ch, nil
- }
-
- return Chain{}, pkgerrors.New("Error getting Chain")
-}
-
-// GetChains returns all of the Chains for for the given network control intent
-func (v *ChainClient) GetChains(pr, ca, caver, netctrlint string) ([]Chain, error) {
- //Construct key and tag to select the entry
- key := ChainKey{
- Project: pr,
- CompositeApp: ca,
- CompositeAppVersion: caver,
- NetControlIntent: netctrlint,
- NetworkChain: "",
- }
-
- var resp []Chain
- values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return []Chain{}, pkgerrors.Wrap(err, "Get Chains")
- }
-
- for _, value := range values {
- cp := Chain{}
- err = db.DBconn.Unmarshal(value, &cp)
- if err != nil {
- return []Chain{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- resp = append(resp, cp)
- }
-
- return resp, nil
-}
-
-// DeleteChain deletes the Chain from the database
-func (v *ChainClient) DeleteChain(name, pr, ca, caver, netctrlint string) error {
-
- //Construct key and tag to select the entry
- key := ChainKey{
- Project: pr,
- CompositeApp: ca,
- CompositeAppVersion: caver,
- NetControlIntent: netctrlint,
- NetworkChain: name,
- }
-
- err := db.DBconn.Remove(v.db.storeName, key)
- if err != nil {
- return pkgerrors.Wrap(err, "Delete Chain Entry;")
- }
-
- return nil
-}
diff --git a/src/ncm/pkg/module/module.go b/src/ncm/pkg/module/module.go
index 21adaf9d..e3ebcccc 100644
--- a/src/ncm/pkg/module/module.go
+++ b/src/ncm/pkg/module/module.go
@@ -21,10 +21,6 @@ type Client struct {
Cluster *ClusterClient
Network *NetworkClient
ProviderNet *ProviderNetClient
- NetControlIntent *NetControlIntentClient
- WorkloadIntent *WorkloadIntentClient
- WorkloadIfIntent *WorkloadIfIntentClient
- Chain *ChainClient
// Add Clients for API's here
}
@@ -34,10 +30,6 @@ func NewClient() *Client {
c.Cluster = NewClusterClient()
c.Network = NewNetworkClient()
c.ProviderNet = NewProviderNetClient()
- c.NetControlIntent = NewNetControlIntentClient()
- c.WorkloadIntent = NewWorkloadIntentClient()
- c.WorkloadIfIntent = NewWorkloadIfIntentClient()
- c.Chain = NewChainClient()
// Add Client API handlers here
return c
}
diff --git a/src/ncm/pkg/module/module_definitions.go b/src/ncm/pkg/module/module_definitions.go
index 8d4b3ad7..efcbca95 100644
--- a/src/ncm/pkg/module/module_definitions.go
+++ b/src/ncm/pkg/module/module_definitions.go
@@ -31,9 +31,6 @@ const CNI_TYPE_OVN4NFV string = "ovn4nfv"
var CNI_TYPES = [...]string{CNI_TYPE_OVN4NFV}
-const YAML_START = "---\n"
-const YAML_END = "...\n"
-
// It implements the interface for managing the ClusterProviders
const MAX_DESCRIPTION_LEN int = 1024
const MAX_USERDATA_LEN int = 4096
diff --git a/src/ncm/pkg/module/netcontrolintent.go b/src/ncm/pkg/module/netcontrolintent.go
deleted file mode 100644
index c005a935..00000000
--- a/src/ncm/pkg/module/netcontrolintent.go
+++ /dev/null
@@ -1,295 +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 module
-
-import (
- "encoding/json"
- "strings"
-
- jyaml "github.com/ghodss/yaml"
-
- nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
- "github.com/onap/multicloud-k8s/src/orchestrator/pkg/appcontext"
- "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
- log "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/logutils"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/client-go/kubernetes/scheme"
-
- pkgerrors "github.com/pkg/errors"
-)
-
-// NetControlIntent contains the parameters needed for dynamic networks
-type NetControlIntent struct {
- Metadata Metadata `json:"metadata"`
-}
-
-// NetControlIntentKey is the key structure that is used in the database
-type NetControlIntentKey struct {
- NetControlIntent string `json:"netcontrolintent"`
- Project string `json:"project"`
- CompositeApp string `json:"compositeapp"`
- CompositeAppVersion string `json:"compositeappversion"`
-}
-
-// Manager is an interface exposing the NetControlIntent functionality
-type NetControlIntentManager interface {
- CreateNetControlIntent(nci NetControlIntent, project, compositeapp, compositeappversion string, exists bool) (NetControlIntent, error)
- GetNetControlIntent(name, project, compositeapp, compositeappversion string) (NetControlIntent, error)
- GetNetControlIntents(project, compositeapp, compositeappversion string) ([]NetControlIntent, error)
- DeleteNetControlIntent(name, project, compositeapp, compositeappversion string) error
- ApplyNetControlIntent(name, project, compositeapp, compositeappversion, appContextId string) error
-}
-
-// NetControlIntentClient implements the Manager
-// It will also be used to maintain some localized state
-type NetControlIntentClient struct {
- db ClientDbInfo
-}
-
-// NewNetControlIntentClient returns an instance of the NetControlIntentClient
-// which implements the Manager
-func NewNetControlIntentClient() *NetControlIntentClient {
- return &NetControlIntentClient{
- db: ClientDbInfo{
- storeName: "orchestrator",
- tagMeta: "netcontrolintentmetadata",
- },
- }
-}
-
-// CreateNetControlIntent - create a new NetControlIntent
-func (v *NetControlIntentClient) CreateNetControlIntent(nci NetControlIntent, project, compositeapp, compositeappversion string, exists bool) (NetControlIntent, error) {
-
- //Construct key and tag to select the entry
- key := NetControlIntentKey{
- NetControlIntent: nci.Metadata.Name,
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- }
-
- //Check if this NetControlIntent already exists
- _, err := v.GetNetControlIntent(nci.Metadata.Name, project, compositeapp, compositeappversion)
- if err == nil && !exists {
- return NetControlIntent{}, pkgerrors.New("NetControlIntent already exists")
- }
-
- err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, nci)
- if err != nil {
- return NetControlIntent{}, pkgerrors.Wrap(err, "Creating DB Entry")
- }
-
- return nci, nil
-}
-
-// GetNetControlIntent returns the NetControlIntent for corresponding name
-func (v *NetControlIntentClient) GetNetControlIntent(name, project, compositeapp, compositeappversion string) (NetControlIntent, error) {
-
- //Construct key and tag to select the entry
- key := NetControlIntentKey{
- NetControlIntent: name,
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- }
-
- value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return NetControlIntent{}, pkgerrors.Wrap(err, "Get NetControlIntent")
- }
-
- //value is a byte array
- if value != nil {
- nci := NetControlIntent{}
- err = db.DBconn.Unmarshal(value[0], &nci)
- if err != nil {
- return NetControlIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- return nci, nil
- }
-
- return NetControlIntent{}, pkgerrors.New("Error getting NetControlIntent")
-}
-
-// GetNetControlIntentList returns all of the NetControlIntent for corresponding name
-func (v *NetControlIntentClient) GetNetControlIntents(project, compositeapp, compositeappversion string) ([]NetControlIntent, error) {
-
- //Construct key and tag to select the entry
- key := NetControlIntentKey{
- NetControlIntent: "",
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- }
-
- var resp []NetControlIntent
- values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return []NetControlIntent{}, pkgerrors.Wrap(err, "Get NetControlIntents")
- }
-
- for _, value := range values {
- nci := NetControlIntent{}
- err = db.DBconn.Unmarshal(value, &nci)
- if err != nil {
- return []NetControlIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- resp = append(resp, nci)
- }
-
- return resp, nil
-}
-
-// Delete the NetControlIntent from database
-func (v *NetControlIntentClient) DeleteNetControlIntent(name, project, compositeapp, compositeappversion string) error {
-
- //Construct key and tag to select the entry
- key := NetControlIntentKey{
- NetControlIntent: name,
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- }
-
- err := db.DBconn.Remove(v.db.storeName, key)
- if err != nil {
- return pkgerrors.Wrap(err, "Delete NetControlIntent Entry;")
- }
-
- return nil
-}
-
-// (Test Routine) - Apply network-control-intent
-func (v *NetControlIntentClient) ApplyNetControlIntent(name, project, compositeapp, compositeappversion, appContextId string) error {
- // TODO: Handle all Network Chain Intents for the Network Control Intent
-
- // Handle all Workload Intents for the Network Control Intent
- wis, err := NewWorkloadIntentClient().GetWorkloadIntents(project, compositeapp, compositeappversion, name)
- if err != nil {
- return pkgerrors.Wrapf(err, "Error getting Workload Intents for Network Control Intent %v for %v/%v%v not found", name, project, compositeapp, compositeappversion)
- }
-
- // Setup the AppContext
- var context appcontext.AppContext
- _, err = context.LoadAppContext(appContextId)
- if err != nil {
- return pkgerrors.Wrapf(err, "Error getting AppContext with Id: %v for %v/%v%v",
- appContextId, project, compositeapp, compositeappversion)
- }
-
- // Handle all intents (currently just Interface intents) for each Workload Intent
- for _, wi := range wis {
- // The app/resource identified in the workload intent needs to be updated with two annotations.
- // 1 - The "k8s.v1.cni.cncf.io/networks" annotation will have {"name": "ovn-networkobj", "namespace": "default"} added
- // to it (preserving any existing values for this annotation.
- // 2 - The "k8s.plugin.opnfv.org/nfn-network" annotation will add any network interfaces that are provided by the
- // workload/interfaces intents.
-
- // Prepare the list of interfaces from the workload intent
- wifs, err := NewWorkloadIfIntentClient().GetWorkloadIfIntents(project,
- compositeapp,
- compositeappversion,
- name,
- wi.Metadata.Name)
- if err != nil {
- return pkgerrors.Wrapf(err,
- "Error getting Workload Interface Intents for Workload Intent %v under Network Control Intent %v for %v/%v%v not found",
- wi.Metadata.Name, name, project, compositeapp, compositeappversion)
- }
- if len(wifs) == 0 {
- log.Warn("No interface intents provided for workload intent", log.Fields{
- "project": project,
- "composite app": compositeapp,
- "composite app version": compositeappversion,
- "network control intent": name,
- "workload intent": wi.Metadata.Name,
- })
- continue
- }
-
- // Get all clusters for the current App from the AppContext
- clusters, err := context.GetClusterNames(wi.Spec.AppName)
- for _, c := range clusters {
- rh, err := context.GetResourceHandle(wi.Spec.AppName, c,
- strings.Join([]string{wi.Spec.WorkloadResource, wi.Spec.Type}, "+"))
- if err != nil {
- log.Warn("App Context resource handle not found", log.Fields{
- "project": project,
- "composite app": compositeapp,
- "composite app version": compositeappversion,
- "network control intent": name,
- "workload name": wi.Metadata.Name,
- "app": wi.Spec.AppName,
- "resource": wi.Spec.WorkloadResource,
- "resource type": wi.Spec.Type,
- })
- continue
- }
- r, err := context.GetValue(rh)
- if err != nil {
- log.Error("Error retrieving resource from App Context", log.Fields{
- "error": err,
- "resource handle": rh,
- })
- }
-
- // Unmarshal resource to K8S object
- robj, err := runtime.Decode(scheme.Codecs.UniversalDeserializer(), []byte(r.(string)))
-
- // Add network annotation to object
- netAnnot := nettypes.NetworkSelectionElement{
- Name: "ovn-networkobj",
- Namespace: "default",
- }
- AddNetworkAnnotation(robj, netAnnot)
-
- // Add nfn interface annotations to object
- var newNfnIfs []WorkloadIfIntentSpec
- for _, i := range wifs {
- newNfnIfs = append(newNfnIfs, i.Spec)
- }
- AddNfnAnnotation(robj, newNfnIfs)
-
- // Marshal object back to yaml format (via json - seems to eliminate most clutter)
- j, err := json.Marshal(robj)
- if err != nil {
- log.Error("Error marshalling resource to JSON", log.Fields{
- "error": err,
- })
- continue
- }
- y, err := jyaml.JSONToYAML(j)
- if err != nil {
- log.Error("Error marshalling resource to YAML", log.Fields{
- "error": err,
- })
- continue
- }
-
- // Update resource in AppContext
- err = context.UpdateResourceValue(rh, string(y))
- if err != nil {
- log.Error("Network updating app context resource handle", log.Fields{
- "error": err,
- "resource handle": rh,
- })
- }
- }
- }
-
- return nil
-}
diff --git a/src/ncm/pkg/module/resources.go b/src/ncm/pkg/module/resources.go
deleted file mode 100644
index 24c9833e..00000000
--- a/src/ncm/pkg/module/resources.go
+++ /dev/null
@@ -1,273 +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 module
-
-import (
- "encoding/json"
- "fmt"
-
- nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
- netutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils"
- log "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/logutils"
- v1 "k8s.io/api/apps/v1"
- batch "k8s.io/api/batch/v1"
- batchv1beta1 "k8s.io/api/batch/v1beta1"
- v1core "k8s.io/api/core/v1"
- _ "k8s.io/kubernetes/pkg/apis/apps/install"
- _ "k8s.io/kubernetes/pkg/apis/batch/install"
- _ "k8s.io/kubernetes/pkg/apis/core/install"
- _ "k8s.io/kubernetes/pkg/apis/extensions/install"
-
- pkgerrors "github.com/pkg/errors"
-)
-
-type NfnAnnotation struct {
- CniType string
- Interface []WorkloadIfIntentSpec
-}
-
-const NfnAnnotationKey = "k8s.plugin.opnfv.org/nfn-network"
-
-// ParsePodTemplateNetworkAnnotation parses Pod annotation in PodTemplate
-func ParsePodTemplateNetworkAnnotation(pt *v1core.PodTemplateSpec) ([]*nettypes.NetworkSelectionElement, error) {
- netAnnot := pt.Annotations[nettypes.NetworkAttachmentAnnot]
- defaultNamespace := pt.Namespace
-
- if len(netAnnot) == 0 {
- return nil, pkgerrors.Errorf("No kubernetes network annotation found")
- }
-
- networks, err := netutils.ParseNetworkAnnotation(netAnnot, defaultNamespace)
- if err != nil {
- return nil, err
- }
- return networks, nil
-}
-
-// GetPodTemplateNetworkAnnotation gets Pod Nfn annotation in PodTemplate
-func GetPodTemplateNfnAnnotation(pt *v1core.PodTemplateSpec) NfnAnnotation {
- var nfn NfnAnnotation
-
- nfnAnnot := pt.Annotations[NfnAnnotationKey]
- if len(nfnAnnot) == 0 {
- return nfn
- }
-
- err := json.Unmarshal([]byte(nfnAnnot), &nfn)
- if err != nil {
- log.Warn("Error unmarshalling nfn annotation", log.Fields{
- "annotation": nfnAnnot,
- })
- }
- return nfn
-}
-
-// GetPodNetworkAnnotation gets Pod Nfn annotation in PodTemplate
-func GetPodNfnAnnotation(p *v1core.Pod) NfnAnnotation {
- var nfn NfnAnnotation
-
- nfnAnnot := p.Annotations[NfnAnnotationKey]
- if len(nfnAnnot) == 0 {
- return nfn
- }
-
- err := json.Unmarshal([]byte(nfnAnnot), &nfn)
- if err != nil {
- log.Warn("Error unmarshalling nfn annotation", log.Fields{
- "annotation": nfnAnnot,
- })
- }
- return nfn
-}
-
-func addNetworkAnnotation(a nettypes.NetworkSelectionElement, as []*nettypes.NetworkSelectionElement) []*nettypes.NetworkSelectionElement {
- var netElements []*nettypes.NetworkSelectionElement
-
- found := false
- for _, e := range as {
- if e.Name == a.Name {
- found = true
- }
- netElements = append(netElements, e)
- }
- if !found {
- netElements = append(netElements, &a)
- }
-
- return netElements
-}
-
-// Add the interfaces in the 'new' parameter to the nfn annotation
-func newNfnIfs(nfn NfnAnnotation, new []WorkloadIfIntentSpec) NfnAnnotation {
- // Prepare a new interface list - combining the original plus new ones
- var newNfn NfnAnnotation
-
- if nfn.CniType != CNI_TYPE_OVN4NFV {
- if len(nfn.CniType) > 0 {
- log.Warn("Error existing nfn cnitype is invalid", log.Fields{
- "existing cnitype": nfn.CniType,
- "using cnitype": CNI_TYPE_OVN4NFV,
- })
- }
- }
- newNfn.CniType = CNI_TYPE_OVN4NFV
-
- // update any interfaces already in the list with the updated interface
- for _, i := range nfn.Interface {
- for _, j := range new {
- if i.NetworkName == j.NetworkName && i.IfName == j.IfName {
- i.DefaultGateway = j.DefaultGateway
- i.IpAddr = j.IpAddr
- i.MacAddr = j.MacAddr
- break
- }
- }
- newNfn.Interface = append(newNfn.Interface, i)
- }
-
- // add new interfaces not present in original list
- for _, j := range new {
- found := false
- for _, i := range nfn.Interface {
- if i.NetworkName == j.NetworkName && i.IfName == j.IfName {
- found = true
- break
- }
- }
- if !found {
- newNfn.Interface = append(newNfn.Interface, j)
- }
- }
- return newNfn
-}
-
-func updatePodTemplateNetworkAnnotation(pt *v1core.PodTemplateSpec, a nettypes.NetworkSelectionElement) {
- netAnnotation, _ := ParsePodTemplateNetworkAnnotation(pt)
- elements := addNetworkAnnotation(a, netAnnotation)
- j, err := json.Marshal(elements)
- if err != nil {
- log.Error("Existing network annotation has invalid format", log.Fields{
- "error": err,
- })
- return
- }
- if pt.Annotations == nil {
- pt.Annotations = make(map[string]string)
- }
- pt.Annotations[nettypes.NetworkAttachmentAnnot] = string(j)
-}
-
-// Add a network annotation to the resource
-func AddNetworkAnnotation(r interface{}, a nettypes.NetworkSelectionElement) {
-
- switch o := r.(type) {
- case *batch.Job:
- updatePodTemplateNetworkAnnotation(&o.Spec.Template, a)
- case *batchv1beta1.CronJob:
- updatePodTemplateNetworkAnnotation(&o.Spec.JobTemplate.Spec.Template, a)
- case *v1.DaemonSet:
- updatePodTemplateNetworkAnnotation(&o.Spec.Template, a)
- case *v1.Deployment:
- updatePodTemplateNetworkAnnotation(&o.Spec.Template, a)
- case *v1.ReplicaSet:
- updatePodTemplateNetworkAnnotation(&o.Spec.Template, a)
- case *v1.StatefulSet:
- updatePodTemplateNetworkAnnotation(&o.Spec.Template, a)
- case *v1core.Pod:
- netAnnotation, _ := netutils.ParsePodNetworkAnnotation(o)
- elements := addNetworkAnnotation(a, netAnnotation)
- j, err := json.Marshal(elements)
- if err != nil {
- log.Error("Existing network annotation has invalid format", log.Fields{
- "error": err,
- })
- break
- }
- if o.Annotations == nil {
- o.Annotations = make(map[string]string)
- }
- o.Annotations[nettypes.NetworkAttachmentAnnot] = string(j)
- return
- case *v1core.ReplicationController:
- updatePodTemplateNetworkAnnotation(o.Spec.Template, a)
- default:
- typeStr := fmt.Sprintf("%T", o)
- log.Warn("Network annotations not supported for resource type", log.Fields{
- "resource type": typeStr,
- })
- }
-}
-
-func updatePodTemplateNfnAnnotation(pt *v1core.PodTemplateSpec, new []WorkloadIfIntentSpec) {
- nfnAnnotation := GetPodTemplateNfnAnnotation(pt)
- newNfnAnnotation := newNfnIfs(nfnAnnotation, new)
- j, err := json.Marshal(newNfnAnnotation)
- if err != nil {
- log.Error("Network nfn annotation has invalid format", log.Fields{
- "error": err,
- })
- return
- }
- if pt.Annotations == nil {
- pt.Annotations = make(map[string]string)
- }
- pt.Annotations[NfnAnnotationKey] = string(j)
-}
-
-// Add an nfn annotation to the resource
-func AddNfnAnnotation(r interface{}, new []WorkloadIfIntentSpec) {
-
- switch o := r.(type) {
- case *batch.Job:
- updatePodTemplateNfnAnnotation(&o.Spec.Template, new)
- case *batchv1beta1.CronJob:
- updatePodTemplateNfnAnnotation(&o.Spec.JobTemplate.Spec.Template, new)
- case *v1.DaemonSet:
- updatePodTemplateNfnAnnotation(&o.Spec.Template, new)
- return
- case *v1.Deployment:
- updatePodTemplateNfnAnnotation(&o.Spec.Template, new)
- return
- case *v1.ReplicaSet:
- updatePodTemplateNfnAnnotation(&o.Spec.Template, new)
- case *v1.StatefulSet:
- updatePodTemplateNfnAnnotation(&o.Spec.Template, new)
- case *v1core.Pod:
- nfnAnnotation := GetPodNfnAnnotation(o)
- newNfnAnnotation := newNfnIfs(nfnAnnotation, new)
- j, err := json.Marshal(newNfnAnnotation)
- if err != nil {
- log.Error("Network nfn annotation has invalid format", log.Fields{
- "error": err,
- })
- break
- }
- if o.Annotations == nil {
- o.Annotations = make(map[string]string)
- }
- o.Annotations[NfnAnnotationKey] = string(j)
- return
- case *v1core.ReplicationController:
- updatePodTemplateNfnAnnotation(o.Spec.Template, new)
- return
- default:
- typeStr := fmt.Sprintf("%T", o)
- log.Warn("Network nfn annotations not supported for resource type", log.Fields{
- "resource type": typeStr,
- })
- }
-}
diff --git a/src/ncm/pkg/module/workloadifintent.go b/src/ncm/pkg/module/workloadifintent.go
deleted file mode 100644
index 55062564..00000000
--- a/src/ncm/pkg/module/workloadifintent.go
+++ /dev/null
@@ -1,188 +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 module
-
-import (
- "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
-
- pkgerrors "github.com/pkg/errors"
-)
-
-// WorkloadIfIntent contains the parameters needed for dynamic networks
-type WorkloadIfIntent struct {
- Metadata Metadata `json:"metadata"`
- Spec WorkloadIfIntentSpec `json:"spec"`
-}
-
-type WorkloadIfIntentSpec struct {
- IfName string `json:"interface"`
- NetworkName string `json:"name"`
- DefaultGateway string `json:"defaultGateway"` // optional, default value is "false"
- IpAddr string `json:"ipAddress,omitempty"` // optional, if not provided then will be dynamically allocated
- MacAddr string `json:"macAddress,omitempty"` // optional, if not provided then will be dynamically allocated
-}
-
-// WorkloadIfIntentKey is the key structure that is used in the database
-type WorkloadIfIntentKey struct {
- Project string `json:"provider"`
- CompositeApp string `json:"compositeapp"`
- CompositeAppVersion string `json:"compositeappversion"`
- NetControlIntent string `json:"netcontrolintent"`
- WorkloadIntent string `json:"workloadintent"`
- WorkloadIfIntent string `json:"workloadifintent"`
-}
-
-// Manager is an interface exposing the WorkloadIfIntent functionality
-type WorkloadIfIntentManager interface {
- CreateWorkloadIfIntent(wi WorkloadIfIntent, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string, exists bool) (WorkloadIfIntent, error)
- GetWorkloadIfIntent(name, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) (WorkloadIfIntent, error)
- GetWorkloadIfIntents(project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) ([]WorkloadIfIntent, error)
- DeleteWorkloadIfIntent(name, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) error
-}
-
-// WorkloadIfIntentClient implements the Manager
-// It will also be used to maintain some localized state
-type WorkloadIfIntentClient struct {
- db ClientDbInfo
-}
-
-// NewWorkloadIfIntentClient returns an instance of the WorkloadIfIntentClient
-// which implements the Manager
-func NewWorkloadIfIntentClient() *WorkloadIfIntentClient {
- return &WorkloadIfIntentClient{
- db: ClientDbInfo{
- storeName: "orchestrator",
- tagMeta: "workloadifintentmetadata",
- },
- }
-}
-
-// CreateWorkloadIfIntent - create a new WorkloadIfIntent
-func (v *WorkloadIfIntentClient) CreateWorkloadIfIntent(wif WorkloadIfIntent, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string, exists bool) (WorkloadIfIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIfIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: workloadintent,
- WorkloadIfIntent: wif.Metadata.Name,
- }
-
- //Check if the Workload Intent exists
- _, err := NewWorkloadIntentClient().GetWorkloadIntent(workloadintent, project, compositeapp, compositeappversion, netcontrolintent)
- if err != nil {
- return WorkloadIfIntent{}, pkgerrors.Errorf("Workload Intent %v does not exist", workloadintent)
- }
-
- //Check if this WorkloadIfIntent already exists
- _, err = v.GetWorkloadIfIntent(wif.Metadata.Name, project, compositeapp, compositeappversion, netcontrolintent, workloadintent)
- if err == nil && !exists {
- return WorkloadIfIntent{}, pkgerrors.New("WorkloadIfIntent already exists")
- }
-
- err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, wif)
- if err != nil {
- return WorkloadIfIntent{}, pkgerrors.Wrap(err, "Creating DB Entry")
- }
-
- return wif, nil
-}
-
-// GetWorkloadIfIntent returns the WorkloadIfIntent for corresponding name
-func (v *WorkloadIfIntentClient) GetWorkloadIfIntent(name, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) (WorkloadIfIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIfIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: workloadintent,
- WorkloadIfIntent: name,
- }
-
- value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return WorkloadIfIntent{}, pkgerrors.Wrap(err, "Get WorkloadIfIntent")
- }
-
- //value is a byte array
- if value != nil {
- wif := WorkloadIfIntent{}
- err = db.DBconn.Unmarshal(value[0], &wif)
- if err != nil {
- return WorkloadIfIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- return wif, nil
- }
-
- return WorkloadIfIntent{}, pkgerrors.New("Error getting WorkloadIfIntent")
-}
-
-// GetWorkloadIfIntentList returns all of the WorkloadIfIntent for corresponding name
-func (v *WorkloadIfIntentClient) GetWorkloadIfIntents(project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) ([]WorkloadIfIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIfIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: workloadintent,
- WorkloadIfIntent: "",
- }
-
- var resp []WorkloadIfIntent
- values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return []WorkloadIfIntent{}, pkgerrors.Wrap(err, "Get WorkloadIfIntents")
- }
-
- for _, value := range values {
- wif := WorkloadIfIntent{}
- err = db.DBconn.Unmarshal(value, &wif)
- if err != nil {
- return []WorkloadIfIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- resp = append(resp, wif)
- }
-
- return resp, nil
-}
-
-// Delete the WorkloadIfIntent from database
-func (v *WorkloadIfIntentClient) DeleteWorkloadIfIntent(name, project, compositeapp, compositeappversion, netcontrolintent, workloadintent string) error {
-
- //Construct key and tag to select the entry
- key := WorkloadIfIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: workloadintent,
- WorkloadIfIntent: name,
- }
-
- err := db.DBconn.Remove(v.db.storeName, key)
- if err != nil {
- return pkgerrors.Wrap(err, "Delete WorkloadIfIntent Entry;")
- }
-
- return nil
-}
diff --git a/src/ncm/pkg/module/workloadintent.go b/src/ncm/pkg/module/workloadintent.go
deleted file mode 100644
index e6916954..00000000
--- a/src/ncm/pkg/module/workloadintent.go
+++ /dev/null
@@ -1,181 +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 module
-
-import (
- "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
-
- pkgerrors "github.com/pkg/errors"
-)
-
-// WorkloadIntent contains the parameters needed for dynamic networks
-type WorkloadIntent struct {
- Metadata Metadata `json:"metadata"`
- Spec WorkloadIntentSpec `json:"spec"`
-}
-
-type WorkloadIntentSpec struct {
- AppName string `json:"application-name"`
- WorkloadResource string `json:"workload-resource"`
- Type string `json:"type"`
-}
-
-// WorkloadIntentKey is the key structure that is used in the database
-type WorkloadIntentKey struct {
- Project string `json:"provider"`
- CompositeApp string `json:"compositeapp"`
- CompositeAppVersion string `json:"compositeappversion"`
- NetControlIntent string `json:"netcontrolintent"`
- WorkloadIntent string `json:"workloadintent"`
-}
-
-// Manager is an interface exposing the WorkloadIntent functionality
-type WorkloadIntentManager interface {
- CreateWorkloadIntent(wi WorkloadIntent, project, compositeapp, compositeappversion, netcontrolintent string, exists bool) (WorkloadIntent, error)
- GetWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) (WorkloadIntent, error)
- GetWorkloadIntents(project, compositeapp, compositeappversion, netcontrolintent string) ([]WorkloadIntent, error)
- DeleteWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) error
-}
-
-// WorkloadIntentClient implements the Manager
-// It will also be used to maintain some localized state
-type WorkloadIntentClient struct {
- db ClientDbInfo
-}
-
-// NewWorkloadIntentClient returns an instance of the WorkloadIntentClient
-// which implements the Manager
-func NewWorkloadIntentClient() *WorkloadIntentClient {
- return &WorkloadIntentClient{
- db: ClientDbInfo{
- storeName: "orchestrator",
- tagMeta: "workloadintentmetadata",
- },
- }
-}
-
-// CreateWorkloadIntent - create a new WorkloadIntent
-func (v *WorkloadIntentClient) CreateWorkloadIntent(wi WorkloadIntent, project, compositeapp, compositeappversion, netcontrolintent string, exists bool) (WorkloadIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: wi.Metadata.Name,
- }
-
- //Check if the Network Control Intent exists
- _, err := NewNetControlIntentClient().GetNetControlIntent(netcontrolintent, project, compositeapp, compositeappversion)
- if err != nil {
- return WorkloadIntent{}, pkgerrors.Errorf("Network Control Intent %v does not exist", netcontrolintent)
- }
-
- //Check if this WorkloadIntent already exists
- _, err = v.GetWorkloadIntent(wi.Metadata.Name, project, compositeapp, compositeappversion, netcontrolintent)
- if err == nil && !exists {
- return WorkloadIntent{}, pkgerrors.New("WorkloadIntent already exists")
- }
-
- err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, wi)
- if err != nil {
- return WorkloadIntent{}, pkgerrors.Wrap(err, "Creating DB Entry")
- }
-
- return wi, nil
-}
-
-// GetWorkloadIntent returns the WorkloadIntent for corresponding name
-func (v *WorkloadIntentClient) GetWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) (WorkloadIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: name,
- }
-
- value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return WorkloadIntent{}, pkgerrors.Wrap(err, "Get WorkloadIntent")
- }
-
- //value is a byte array
- if value != nil {
- wi := WorkloadIntent{}
- err = db.DBconn.Unmarshal(value[0], &wi)
- if err != nil {
- return WorkloadIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- return wi, nil
- }
-
- return WorkloadIntent{}, pkgerrors.New("Error getting WorkloadIntent")
-}
-
-// GetWorkloadIntentList returns all of the WorkloadIntent for corresponding name
-func (v *WorkloadIntentClient) GetWorkloadIntents(project, compositeapp, compositeappversion, netcontrolintent string) ([]WorkloadIntent, error) {
-
- //Construct key and tag to select the entry
- key := WorkloadIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: "",
- }
-
- var resp []WorkloadIntent
- values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta)
- if err != nil {
- return []WorkloadIntent{}, pkgerrors.Wrap(err, "Get WorkloadIntents")
- }
-
- for _, value := range values {
- wi := WorkloadIntent{}
- err = db.DBconn.Unmarshal(value, &wi)
- if err != nil {
- return []WorkloadIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value")
- }
- resp = append(resp, wi)
- }
-
- return resp, nil
-}
-
-// Delete the WorkloadIntent from database
-func (v *WorkloadIntentClient) DeleteWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) error {
-
- //Construct key and tag to select the entry
- key := WorkloadIntentKey{
- Project: project,
- CompositeApp: compositeapp,
- CompositeAppVersion: compositeappversion,
- NetControlIntent: netcontrolintent,
- WorkloadIntent: name,
- }
-
- err := db.DBconn.Remove(v.db.storeName, key)
- if err != nil {
- return pkgerrors.Wrap(err, "Delete WorkloadIntent Entry;")
- }
-
- return nil
-}