Fix the format and comments 26/4326/1
authorLe Yao <le.yao@intel.com>
Thu, 10 Jun 2021 08:26:55 +0000 (08:26 +0000)
committerLe Yao <le.yao@intel.com>
Thu, 10 Jun 2021 08:26:55 +0000 (08:26 +0000)
Signed-off-by: Le Yao <le.yao@intel.com>
Change-Id: Ie6b8ec6b9a3ce6b9c992aad1ff73c1ae134edeb2

52 files changed:
central-controller/src/scc/api/api.go
central-controller/src/scc/api/controller_handler.go
central-controller/src/scc/cmd/main.go
central-controller/src/scc/pkg/client/kubernetesclient.go
central-controller/src/scc/pkg/client/rsyncclient.go
central-controller/src/scc/pkg/infra/config/config.go
central-controller/src/scc/pkg/infra/validation/validation.go
central-controller/src/scc/pkg/manager/certificate_objectmanager.go
central-controller/src/scc/pkg/manager/certutil.go
central-controller/src/scc/pkg/manager/cnf_objectmanager.go
central-controller/src/scc/pkg/manager/connection_manager.go
central-controller/src/scc/pkg/manager/constants.go
central-controller/src/scc/pkg/manager/controller_objectmanager.go
central-controller/src/scc/pkg/manager/dbutils.go
central-controller/src/scc/pkg/manager/device_objectmanager.go
central-controller/src/scc/pkg/manager/deviceconnection_objectmanager.go
central-controller/src/scc/pkg/manager/hub_objectmanager.go
central-controller/src/scc/pkg/manager/hubconnection_objectmanager.go
central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go
central-controller/src/scc/pkg/manager/iprange_objectmanager.go
central-controller/src/scc/pkg/manager/kubeconfigutil.go
central-controller/src/scc/pkg/manager/managerset.go
central-controller/src/scc/pkg/manager/overlay_objectmanager.go
central-controller/src/scc/pkg/manager/proposal_objectmanager.go
central-controller/src/scc/pkg/manager/resutils.go
central-controller/src/scc/pkg/manager/utils.go
central-controller/src/scc/pkg/module/certificateobject.go
central-controller/src/scc/pkg/module/cnfobject.go
central-controller/src/scc/pkg/module/connectionobject.go
central-controller/src/scc/pkg/module/controllerobject.go
central-controller/src/scc/pkg/module/deviceobject.go
central-controller/src/scc/pkg/module/emptyobject.go
central-controller/src/scc/pkg/module/hubdeviceobject.go
central-controller/src/scc/pkg/module/hubobject.go
central-controller/src/scc/pkg/module/iprangeobject.go
central-controller/src/scc/pkg/module/objectbuilder.go
central-controller/src/scc/pkg/module/overlayobject.go
central-controller/src/scc/pkg/module/proposalobject.go
central-controller/src/scc/pkg/resource/empty_resource.go
central-controller/src/scc/pkg/resource/file_resource.go
central-controller/src/scc/pkg/resource/firewall_dnat_resource.go
central-controller/src/scc/pkg/resource/firewall_zone_resource.go
central-controller/src/scc/pkg/resource/ipsec_resource.go
central-controller/src/scc/pkg/resource/proposal_resource.go
central-controller/src/scc/pkg/resource/resourcebuilder.go
central-controller/src/scc/pkg/resource/sdewan_resource.go
central-controller/src/scc/test/certificateobject_test.go
central-controller/src/scc/test/cnfobject_test.go
central-controller/src/scc/test/iprangeobject_test.go
central-controller/src/scc/test/overlayobject_test.go
central-controller/src/scc/test/proposalobject_test.go
central-controller/src/scc/test/utilis.go

index 1f28dc1..08604f2 100644 (file)
@@ -14,179 +14,179 @@ limitations under the License.
 package api
 
 import (
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
-    "github.com/gorilla/mux"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/gorilla/mux"
 )
 
 // NewRouter creates a router that registers the various urls that are
 // supported
 
 func createHandlerMapping(
-    objectClient manager.ControllerObjectManager,
-    router *mux.Router,
-    collections string,
-    resource string ) {
-    objectHandler := ControllerHandler{client: objectClient}
-    if objectClient.IsOperationSupported("POST") == true {
-        router.HandleFunc(
-            "/" + collections,
-            objectHandler.createHandler).Methods("POST")
-    }
-
-    if objectClient.IsOperationSupported("GETS") == true {
-        router.HandleFunc(
-            "/" + collections,
-            objectHandler.getsHandler).Methods("GET")
-    }
-
-    if objectClient.IsOperationSupported("GET") == true {
-        router.HandleFunc(
-            "/" + collections + "/{" + resource + "}",
-            objectHandler.getHandler).Methods("GET")
-    }
-
-    if objectClient.IsOperationSupported("DELETE") == true {
-        router.HandleFunc(
-            "/" + collections + "/{" + resource + "}",
-            objectHandler.deleteHandler).Methods("DELETE")
-    }
-
-    if objectClient.IsOperationSupported("PUT") == true {
-        router.HandleFunc(
-            "/" + collections + "/{" + resource + "}",
-            objectHandler.updateHandler).Methods("PUT")
-    }
+       objectClient manager.ControllerObjectManager,
+       router *mux.Router,
+       collections string,
+       resource string) {
+       objectHandler := ControllerHandler{client: objectClient}
+       if objectClient.IsOperationSupported("POST") == true {
+               router.HandleFunc(
+                       "/"+collections,
+                       objectHandler.createHandler).Methods("POST")
+       }
+
+       if objectClient.IsOperationSupported("GETS") == true {
+               router.HandleFunc(
+                       "/"+collections,
+                       objectHandler.getsHandler).Methods("GET")
+       }
+
+       if objectClient.IsOperationSupported("GET") == true {
+               router.HandleFunc(
+                       "/"+collections+"/{"+resource+"}",
+                       objectHandler.getHandler).Methods("GET")
+       }
+
+       if objectClient.IsOperationSupported("DELETE") == true {
+               router.HandleFunc(
+                       "/"+collections+"/{"+resource+"}",
+                       objectHandler.deleteHandler).Methods("DELETE")
+       }
+
+       if objectClient.IsOperationSupported("PUT") == true {
+               router.HandleFunc(
+                       "/"+collections+"/{"+resource+"}",
+                       objectHandler.updateHandler).Methods("PUT")
+       }
 }
 
 func NewRouter(
-    overlayObjectClient manager.ControllerObjectManager,
-    proposalObjectClient manager.ControllerObjectManager,
-    hubObjectClient manager.ControllerObjectManager,
-    hubConnObjectClient manager.ControllerObjectManager,
-    hubDeviceObjectClient manager.ControllerObjectManager,
-    hubCNFObjectClient manager.ControllerObjectManager,
-    deviceObjectClient manager.ControllerObjectManager,
-    deviceConnObjectClient manager.ControllerObjectManager,
-    deviceCNFObjectClient manager.ControllerObjectManager,
-    ipRangeObjectClient manager.ControllerObjectManager,
-    providerIpRangeObjectClient manager.ControllerObjectManager,
-    certificateObjectClient manager.ControllerObjectManager) *mux.Router {
-
-    router := mux.NewRouter()
-    ver := "v1"
-    mgrset := manager.GetManagerset()
-
-    // router
-    verRouter := router.PathPrefix("/scc/" + ver).Subrouter()
-    providerRouter := router.PathPrefix("/scc/" + ver + "/provider").Subrouter()
-    olRouter := verRouter.PathPrefix("/" + manager.OverlayCollection + "/{" + manager.OverlayResource + "}").Subrouter()
-    hubRouter := olRouter.PathPrefix("/" + manager.HubCollection + "/{" + manager.HubResource + "}").Subrouter()
-    devRouter := olRouter.PathPrefix("/" + manager.DeviceCollection + "/{" + manager.DeviceResource + "}").Subrouter()
-
-    // overlay API
-    if overlayObjectClient == nil {
-         overlayObjectClient = manager.NewOverlayObjectManager()
-    }
-    mgrset.Overlay = overlayObjectClient.(*manager.OverlayObjectManager)
-    createHandlerMapping(overlayObjectClient, verRouter, manager.OverlayCollection, manager.OverlayResource)
-
-    // proposal API
-    if proposalObjectClient == nil {
-         proposalObjectClient = manager.NewProposalObjectManager()
-    }
-    mgrset.Proposal = proposalObjectClient.(*manager.ProposalObjectManager)
-    createHandlerMapping(proposalObjectClient, olRouter, manager.ProposalCollection, manager.ProposalResource)
-
-    // hub API
-    if hubObjectClient == nil {
-         hubObjectClient = manager.NewHubObjectManager()
-    }
-    mgrset.Hub = hubObjectClient.(*manager.HubObjectManager)
-    createHandlerMapping(hubObjectClient, olRouter, manager.HubCollection, manager.HubResource)
-
-    // hub-connection API
-    if hubConnObjectClient == nil {
-         hubConnObjectClient = manager.NewHubConnObjectManager()
-    }
-    mgrset.HubConn = hubConnObjectClient.(*manager.HubConnObjectManager)
-    createHandlerMapping(hubConnObjectClient, hubRouter, manager.ConnectionCollection, manager.ConnectionResource)
-
-    // hub-cnf API
-    if hubCNFObjectClient == nil {
-         hubCNFObjectClient = manager.NewCNFObjectManager(true)
-    }
-    mgrset.HubCNF = hubCNFObjectClient.(*manager.CNFObjectManager)
-    createHandlerMapping(hubCNFObjectClient, hubRouter, manager.CNFCollection, manager.CNFResource)
-
-    // hub-device API
-    if hubDeviceObjectClient == nil {
-         hubDeviceObjectClient = manager.NewHubDeviceObjectManager()
-    }
-    mgrset.HubDevice = hubDeviceObjectClient.(*manager.HubDeviceObjectManager)
-    createHandlerMapping(hubDeviceObjectClient, hubRouter, manager.DeviceCollection, manager.DeviceResource)
-
-    // device API
-    if deviceObjectClient == nil {
-         deviceObjectClient = manager.NewDeviceObjectManager()
-    }
-    mgrset.Device = deviceObjectClient.(*manager.DeviceObjectManager)
-    createHandlerMapping(deviceObjectClient, olRouter, manager.DeviceCollection, manager.DeviceResource)
-
-    // device-connection API
-    if deviceConnObjectClient == nil {
-         deviceConnObjectClient = manager.NewDeviceConnObjectManager()
-    }
-    mgrset.DeviceConn = deviceConnObjectClient.(*manager.DeviceConnObjectManager)
-    createHandlerMapping(deviceConnObjectClient, devRouter, manager.ConnectionCollection, manager.ConnectionResource)
-
-    // device-cnf API
-    if deviceCNFObjectClient == nil {
-         deviceCNFObjectClient = manager.NewCNFObjectManager(false)
-    }
-    mgrset.DeviceCNF = deviceCNFObjectClient.(*manager.CNFObjectManager)
-    createHandlerMapping(deviceCNFObjectClient, devRouter, manager.CNFCollection, manager.CNFResource)
-
-    // provider iprange API
-    if providerIpRangeObjectClient == nil {
-         providerIpRangeObjectClient = manager.NewIPRangeObjectManager(true)
-    }
-    mgrset.ProviderIPRange = providerIpRangeObjectClient.(*manager.IPRangeObjectManager)
-    createHandlerMapping(providerIpRangeObjectClient, providerRouter, manager.IPRangeCollection, manager.IPRangeResource)
-
-    // iprange API
-    if ipRangeObjectClient == nil {
-         ipRangeObjectClient = manager.NewIPRangeObjectManager(false)
-    }
-    mgrset.IPRange = ipRangeObjectClient.(*manager.IPRangeObjectManager)
-    createHandlerMapping(ipRangeObjectClient, olRouter, manager.IPRangeCollection, manager.IPRangeResource)
-
-    // certificate API
-    if certificateObjectClient == nil {
-         certificateObjectClient = manager.NewCertificateObjectManager()
-    }
-    mgrset.Cert = certificateObjectClient.(*manager.CertificateObjectManager)
-    createHandlerMapping(certificateObjectClient, olRouter, manager.CertCollection, manager.CertResource)
-
-    // Add depedency
-    overlayObjectClient.AddOwnResManager(proposalObjectClient)
-    overlayObjectClient.AddOwnResManager(hubObjectClient)
-    overlayObjectClient.AddOwnResManager(deviceObjectClient)
-    overlayObjectClient.AddOwnResManager(ipRangeObjectClient)
-    overlayObjectClient.AddOwnResManager(certificateObjectClient)
-    hubObjectClient.AddOwnResManager(hubDeviceObjectClient)
-    deviceObjectClient.AddOwnResManager(hubDeviceObjectClient)
-
-    proposalObjectClient.AddDepResManager(overlayObjectClient)
-    hubObjectClient.AddDepResManager(overlayObjectClient)
-    deviceObjectClient.AddDepResManager(overlayObjectClient)
-    ipRangeObjectClient.AddDepResManager(overlayObjectClient)
-    certificateObjectClient.AddDepResManager(overlayObjectClient)
-    hubDeviceObjectClient.AddDepResManager(hubObjectClient)
-    hubDeviceObjectClient.AddDepResManager(deviceObjectClient)
-    hubConnObjectClient.AddDepResManager(hubObjectClient)
-    deviceConnObjectClient.AddDepResManager(deviceObjectClient)
-    hubCNFObjectClient.AddDepResManager(hubObjectClient)
-//    deviceCNFObjectClient.AddDepResManager(deviceObjectClient)
-
-    return router
+       overlayObjectClient manager.ControllerObjectManager,
+       proposalObjectClient manager.ControllerObjectManager,
+       hubObjectClient manager.ControllerObjectManager,
+       hubConnObjectClient manager.ControllerObjectManager,
+       hubDeviceObjectClient manager.ControllerObjectManager,
+       hubCNFObjectClient manager.ControllerObjectManager,
+       deviceObjectClient manager.ControllerObjectManager,
+       deviceConnObjectClient manager.ControllerObjectManager,
+       deviceCNFObjectClient manager.ControllerObjectManager,
+       ipRangeObjectClient manager.ControllerObjectManager,
+       providerIpRangeObjectClient manager.ControllerObjectManager,
+       certificateObjectClient manager.ControllerObjectManager) *mux.Router {
+
+       router := mux.NewRouter()
+       ver := "v1"
+       mgrset := manager.GetManagerset()
+
+       // router
+       verRouter := router.PathPrefix("/scc/" + ver).Subrouter()
+       providerRouter := router.PathPrefix("/scc/" + ver + "/provider").Subrouter()
+       olRouter := verRouter.PathPrefix("/" + manager.OverlayCollection + "/{" + manager.OverlayResource + "}").Subrouter()
+       hubRouter := olRouter.PathPrefix("/" + manager.HubCollection + "/{" + manager.HubResource + "}").Subrouter()
+       devRouter := olRouter.PathPrefix("/" + manager.DeviceCollection + "/{" + manager.DeviceResource + "}").Subrouter()
+
+       // overlay API
+       if overlayObjectClient == nil {
+               overlayObjectClient = manager.NewOverlayObjectManager()
+       }
+       mgrset.Overlay = overlayObjectClient.(*manager.OverlayObjectManager)
+       createHandlerMapping(overlayObjectClient, verRouter, manager.OverlayCollection, manager.OverlayResource)
+
+       // proposal API
+       if proposalObjectClient == nil {
+               proposalObjectClient = manager.NewProposalObjectManager()
+       }
+       mgrset.Proposal = proposalObjectClient.(*manager.ProposalObjectManager)
+       createHandlerMapping(proposalObjectClient, olRouter, manager.ProposalCollection, manager.ProposalResource)
+
+       // hub API
+       if hubObjectClient == nil {
+               hubObjectClient = manager.NewHubObjectManager()
+       }
+       mgrset.Hub = hubObjectClient.(*manager.HubObjectManager)
+       createHandlerMapping(hubObjectClient, olRouter, manager.HubCollection, manager.HubResource)
+
+       // hub-connection API
+       if hubConnObjectClient == nil {
+               hubConnObjectClient = manager.NewHubConnObjectManager()
+       }
+       mgrset.HubConn = hubConnObjectClient.(*manager.HubConnObjectManager)
+       createHandlerMapping(hubConnObjectClient, hubRouter, manager.ConnectionCollection, manager.ConnectionResource)
+
+       // hub-cnf API
+       if hubCNFObjectClient == nil {
+               hubCNFObjectClient = manager.NewCNFObjectManager(true)
+       }
+       mgrset.HubCNF = hubCNFObjectClient.(*manager.CNFObjectManager)
+       createHandlerMapping(hubCNFObjectClient, hubRouter, manager.CNFCollection, manager.CNFResource)
+
+       // hub-device API
+       if hubDeviceObjectClient == nil {
+               hubDeviceObjectClient = manager.NewHubDeviceObjectManager()
+       }
+       mgrset.HubDevice = hubDeviceObjectClient.(*manager.HubDeviceObjectManager)
+       createHandlerMapping(hubDeviceObjectClient, hubRouter, manager.DeviceCollection, manager.DeviceResource)
+
+       // device API
+       if deviceObjectClient == nil {
+               deviceObjectClient = manager.NewDeviceObjectManager()
+       }
+       mgrset.Device = deviceObjectClient.(*manager.DeviceObjectManager)
+       createHandlerMapping(deviceObjectClient, olRouter, manager.DeviceCollection, manager.DeviceResource)
+
+       // device-connection API
+       if deviceConnObjectClient == nil {
+               deviceConnObjectClient = manager.NewDeviceConnObjectManager()
+       }
+       mgrset.DeviceConn = deviceConnObjectClient.(*manager.DeviceConnObjectManager)
+       createHandlerMapping(deviceConnObjectClient, devRouter, manager.ConnectionCollection, manager.ConnectionResource)
+
+       // device-cnf API
+       if deviceCNFObjectClient == nil {
+               deviceCNFObjectClient = manager.NewCNFObjectManager(false)
+       }
+       mgrset.DeviceCNF = deviceCNFObjectClient.(*manager.CNFObjectManager)
+       createHandlerMapping(deviceCNFObjectClient, devRouter, manager.CNFCollection, manager.CNFResource)
+
+       // provider iprange API
+       if providerIpRangeObjectClient == nil {
+               providerIpRangeObjectClient = manager.NewIPRangeObjectManager(true)
+       }
+       mgrset.ProviderIPRange = providerIpRangeObjectClient.(*manager.IPRangeObjectManager)
+       createHandlerMapping(providerIpRangeObjectClient, providerRouter, manager.IPRangeCollection, manager.IPRangeResource)
+
+       // iprange API
+       if ipRangeObjectClient == nil {
+               ipRangeObjectClient = manager.NewIPRangeObjectManager(false)
+       }
+       mgrset.IPRange = ipRangeObjectClient.(*manager.IPRangeObjectManager)
+       createHandlerMapping(ipRangeObjectClient, olRouter, manager.IPRangeCollection, manager.IPRangeResource)
+
+       // certificate API
+       if certificateObjectClient == nil {
+               certificateObjectClient = manager.NewCertificateObjectManager()
+       }
+       mgrset.Cert = certificateObjectClient.(*manager.CertificateObjectManager)
+       createHandlerMapping(certificateObjectClient, olRouter, manager.CertCollection, manager.CertResource)
+
+       // Add depedency
+       overlayObjectClient.AddOwnResManager(proposalObjectClient)
+       overlayObjectClient.AddOwnResManager(hubObjectClient)
+       overlayObjectClient.AddOwnResManager(deviceObjectClient)
+       overlayObjectClient.AddOwnResManager(ipRangeObjectClient)
+       overlayObjectClient.AddOwnResManager(certificateObjectClient)
+       hubObjectClient.AddOwnResManager(hubDeviceObjectClient)
+       deviceObjectClient.AddOwnResManager(hubDeviceObjectClient)
+
+       proposalObjectClient.AddDepResManager(overlayObjectClient)
+       hubObjectClient.AddDepResManager(overlayObjectClient)
+       deviceObjectClient.AddDepResManager(overlayObjectClient)
+       ipRangeObjectClient.AddDepResManager(overlayObjectClient)
+       certificateObjectClient.AddDepResManager(overlayObjectClient)
+       hubDeviceObjectClient.AddDepResManager(hubObjectClient)
+       hubDeviceObjectClient.AddDepResManager(deviceObjectClient)
+       hubConnObjectClient.AddDepResManager(hubObjectClient)
+       deviceConnObjectClient.AddDepResManager(deviceObjectClient)
+       hubCNFObjectClient.AddDepResManager(hubObjectClient)
+       deviceCNFObjectClient.AddDepResManager(deviceObjectClient)
+
+       return router
 }
index c979e88..655acff 100644 (file)
-/*\r
-* Copyright 2020 Intel Corporation, Inc\r
-*\r
-* Licensed under the Apache License, Version 2.0 (the "License");\r
-* you may not use this file except in compliance with the License.\r
-* You may obtain a copy of the License at\r
-*\r
-*     http://www.apache.org/licenses/LICENSE-2.0\r
-*\r
-* Unless required by applicable law or agreed to in writing, software\r
-* distributed under the License is distributed on an "AS IS" BASIS,\r
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r
-* implied.\r
-* See the License for the specific language governing permissions\r
-* and\r
-* limitations under the License.\r
-*/\r
-\r
-package api\r
-\r
-import (\r
-    "encoding/json"\r
-    "net/http"\r
-    "io"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/validation"\r
-    "github.com/gorilla/mux"\r
-)\r
-\r
-\r
-// ControllerHandler is used to store backend implementations objects\r
-type ControllerHandler struct {\r
-    client manager.ControllerObjectManager\r
-}\r
-\r
-// CreateHandler handles creation of the Controller Object entry in the database\r
-func (h ControllerHandler) createHandler(w http.ResponseWriter, r *http.Request) {\r
-    var ret interface{}\r
-    var err error\r
-    var v module.ControllerObject\r
-\r
-    vars := mux.Vars(r)\r
-\r
-    v, err = h.client.ParseObject(r.Body)\r
-    switch {\r
-    case err == io.EOF:\r
-        http.Error(w, "Empty body", http.StatusBadRequest)\r
-        return\r
-    case err != nil:\r
-        http.Error(w, err.Error(), http.StatusUnprocessableEntity)\r
-        return\r
-    }\r
-\r
-    validate := validation.GetValidator(h.client.GetStoreMeta())\r
-    isValid, msg := validate.Validate(v)\r
-    if isValid == false {\r
-        http.Error(w, msg, http.StatusUnprocessableEntity)\r
-        return\r
-    }\r
-\r
-    // Check resource depedency\r
-    err = manager.GetDBUtils().CheckDep(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    // Check whether the resource is available\r
-    if h.client.IsOperationSupported("GET") {\r
-        vars[h.client.GetResourceName()] = v.GetMetadata().Name\r
-        ret, err = h.client.GetObject(vars)\r
-        if err == nil {\r
-            http.Error(w, "Resource " + v.GetMetadata().Name + " is available already", http.StatusConflict)\r
-            return\r
-        }\r
-    }\r
-\r
-    ret, err = h.client.CreateObject(vars, v)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-   }\r
-\r
-    w.Header().Set("Content-Type", "application/json")\r
-    w.WriteHeader(http.StatusCreated)\r
-    err = json.NewEncoder(w).Encode(ret)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-}\r
-\r
-// getsHandler handle GET All operations\r
-func (h ControllerHandler) getsHandler(w http.ResponseWriter, r *http.Request) {\r
-    var err error\r
-    vars := mux.Vars(r)\r
-\r
-    // Check resource depedency\r
-    err = manager.GetDBUtils().CheckDep(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    ret, err := h.client.GetObjects(vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    w.Header().Set("Content-Type", "application/json")\r
-    w.WriteHeader(http.StatusOK)\r
-    err = json.NewEncoder(w).Encode(ret)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-}\r
-\r
-// getHandler handle GET operations on a particular name\r
-func (h ControllerHandler) getHandler(w http.ResponseWriter, r *http.Request) {\r
-    var err error\r
-    vars := mux.Vars(r)\r
-\r
-    // Check resource depedency\r
-    err = manager.GetDBUtils().CheckDep(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    ret, err := h.client.GetObject(vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    w.Header().Set("Content-Type", "application/json")\r
-    w.WriteHeader(http.StatusOK)\r
-    err = json.NewEncoder(w).Encode(ret)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-}\r
-\r
-// UpdateHandler handles Update operations\r
-func (h ControllerHandler) updateHandler(w http.ResponseWriter, r *http.Request) {\r
-    var ret interface{}\r
-    var err error\r
-    var v module.ControllerObject\r
-\r
-    vars := mux.Vars(r)\r
-\r
-    v, err = h.client.ParseObject(r.Body)\r
-    switch {\r
-        case err == io.EOF:\r
-            http.Error(w, "Empty body", http.StatusBadRequest)\r
-            return\r
-        case err != nil:\r
-            http.Error(w, err.Error(), http.StatusUnprocessableEntity)\r
-            return\r
-    }\r
-\r
-    validate := validation.GetValidator(h.client.GetStoreName())\r
-    isValid, msg := validate.Validate(v)\r
-    if isValid == false {\r
-        http.Error(w, msg, http.StatusUnprocessableEntity)\r
-        return\r
-    }\r
-\r
-    // Check resource depedency\r
-    err = manager.GetDBUtils().CheckDep(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    ret, err = h.client.UpdateObject(vars, v)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    w.Header().Set("Content-Type", "application/json")\r
-    w.WriteHeader(http.StatusOK)\r
-    err = json.NewEncoder(w).Encode(ret)\r
-    if err != nil {\r
-        http.Error(w, err.Error(),\r
-        http.StatusInternalServerError)\r
-        return\r
-    }\r
-}\r
-\r
-//deleteHandler handles DELETE operations on a particular record\r
-func (h ControllerHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {\r
-    var err error\r
-    vars := mux.Vars(r)\r
-\r
-    // Check resource depedency\r
-    err = manager.GetDBUtils().CheckDep(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    // Check whether sub-resource available\r
-    err = manager.GetDBUtils().CheckOwn(h.client, vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-\r
-    err = h.client.DeleteObject(vars)\r
-    if err != nil {\r
-        http.Error(w, err.Error(), http.StatusInternalServerError)\r
-        return\r
-    }\r
-\r
-    w.WriteHeader(http.StatusNoContent)\r
-}\r
+/*
+* 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"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/validation"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/gorilla/mux"
+       "io"
+       "net/http"
+)
+
+// ControllerHandler is used to store backend implementations objects
+type ControllerHandler struct {
+       client manager.ControllerObjectManager
+}
+
+// CreateHandler handles creation of the Controller Object entry in the database
+func (h ControllerHandler) createHandler(w http.ResponseWriter, r *http.Request) {
+       var ret interface{}
+       var err error
+       var v module.ControllerObject
+
+       vars := mux.Vars(r)
+
+       v, err = h.client.ParseObject(r.Body)
+       switch {
+       case err == io.EOF:
+               http.Error(w, "Empty body", http.StatusBadRequest)
+               return
+       case err != nil:
+               http.Error(w, err.Error(), http.StatusUnprocessableEntity)
+               return
+       }
+
+       validate := validation.GetValidator(h.client.GetStoreMeta())
+       isValid, msg := validate.Validate(v)
+       if isValid == false {
+               http.Error(w, msg, http.StatusUnprocessableEntity)
+               return
+       }
+
+       // Check resource depedency
+       err = manager.GetDBUtils().CheckDep(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       // Check whether the resource is available
+       if h.client.IsOperationSupported("GET") {
+               vars[h.client.GetResourceName()] = v.GetMetadata().Name
+               ret, err = h.client.GetObject(vars)
+               if err == nil {
+                       http.Error(w, "Resource "+v.GetMetadata().Name+" is available already", http.StatusConflict)
+                       return
+               }
+       }
+
+       ret, err = h.client.CreateObject(vars, v)
+       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
+       }
+}
+
+// getsHandler handle GET All operations
+func (h ControllerHandler) getsHandler(w http.ResponseWriter, r *http.Request) {
+       var err error
+       vars := mux.Vars(r)
+
+       // Check resource depedency
+       err = manager.GetDBUtils().CheckDep(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       ret, err := h.client.GetObjects(vars)
+       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
+       }
+}
+
+// getHandler handle GET operations on a particular name
+func (h ControllerHandler) getHandler(w http.ResponseWriter, r *http.Request) {
+       var err error
+       vars := mux.Vars(r)
+
+       // Check resource depedency
+       err = manager.GetDBUtils().CheckDep(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       ret, err := h.client.GetObject(vars)
+       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
+       }
+}
+
+// UpdateHandler handles Update operations
+func (h ControllerHandler) updateHandler(w http.ResponseWriter, r *http.Request) {
+       var ret interface{}
+       var err error
+       var v module.ControllerObject
+
+       vars := mux.Vars(r)
+
+       v, err = h.client.ParseObject(r.Body)
+       switch {
+       case err == io.EOF:
+               http.Error(w, "Empty body", http.StatusBadRequest)
+               return
+       case err != nil:
+               http.Error(w, err.Error(), http.StatusUnprocessableEntity)
+               return
+       }
+
+       validate := validation.GetValidator(h.client.GetStoreName())
+       isValid, msg := validate.Validate(v)
+       if isValid == false {
+               http.Error(w, msg, http.StatusUnprocessableEntity)
+               return
+       }
+
+       // Check resource depedency
+       err = manager.GetDBUtils().CheckDep(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       ret, err = h.client.UpdateObject(vars, v)
+       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
+       }
+}
+
+//deleteHandler handles DELETE operations on a particular record
+func (h ControllerHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
+       var err error
+       vars := mux.Vars(r)
+
+       // Check resource depedency
+       err = manager.GetDBUtils().CheckDep(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       // Check whether sub-resource available
+       err = manager.GetDBUtils().CheckOwn(h.client, vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       err = h.client.DeleteObject(vars)
+       if err != nil {
+               http.Error(w, err.Error(), http.StatusInternalServerError)
+               return
+       }
+
+       w.WriteHeader(http.StatusNoContent)
+}
index 861e5aa..0f4ca22 100644 (file)
@@ -14,27 +14,27 @@ limitations under the License.
 package main
 
 import (
-    "context"
-    "log"
-    "math/rand"
-    "net/http"
-    "os"
-    "os/signal"
-    "time"
-    "strconv"
-
-    logs "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/logutils"
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/api"
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/auth"
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/config"
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
-    contextDb "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/contextdb"
-    controller "github.com/open-ness/EMCO/src/orchestrator/pkg/module/controller"
-    "github.com/gorilla/handlers"
-    mtypes "github.com/open-ness/EMCO/src/orchestrator/pkg/module/types"
-
-    rconfig "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/config"
+       "context"
+       "log"
+       "math/rand"
+       "net/http"
+       "os"
+       "os/signal"
+       "strconv"
+       "time"
+
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/api"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/gorilla/handlers"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/auth"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/config"
+       contextDb "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/contextdb"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       logs "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/logutils"
+       controller "github.com/open-ness/EMCO/src/orchestrator/pkg/module/controller"
+       mtypes "github.com/open-ness/EMCO/src/orchestrator/pkg/module/types"
+
+       rconfig "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/config"
 )
 
 const default_rsync_name = "rsync"
@@ -42,111 +42,111 @@ const ENV_RSYNC_NAME = "RSYNC_NAME"
 
 func main() {
 
-    rand.Seed(time.Now().UnixNano())
-
-    // create database and context database
-    err := db.InitializeDatabaseConnection("scc")
-    if err != nil {
-            log.Println("Unable to initialize database connection...")
-            log.Println(err)
-            log.Fatalln("Exiting...")
-    }
-
-    err = contextDb.InitializeContextDatabase()
-    if err != nil {
-            log.Println("Unable to initialize database connection...")
-            log.Println(err)
-            log.Fatalln("Exiting...")
-    }
-
-    // create sdewan namespace and root certificate
-    cu, err := manager.GetCertUtil()
-    if err == nil {
-        _, err = cu.CreateNamespace(manager.NameSpaceName)
-        if err == nil {
-            log.Println("Namespace is available : " + manager.NameSpaceName)
-            _, err = cu.CreateSelfSignedIssuer(manager.RootIssuerName, manager.NameSpaceName)
-            if err == nil {
-                log.Println("SDEWAN root issuer is available : " + manager.RootIssuerName)
-                _, err = cu.CreateCertificate(manager.RootCertName, manager.NameSpaceName, manager.RootIssuerName, true)
-                if err == nil {
-                    log.Println("SDEWAN root certificate is available : " + manager.RootCertName)
-                    _, err = cu.CreateCAIssuer(manager.RootCAIssuerName, manager.NameSpaceName, manager.RootCertName)
-                    if err == nil {
-                        log.Println("SDEWAN root ca issuer is available : " + manager.RootCAIssuerName)
-                    }
-                    _, err = cu.CreateCertificate(manager.SCCCertName, manager.NameSpaceName, manager.RootCAIssuerName, false)
-                    if err == nil {
-                        log.Println("SDEWAN central controller base certificates is available : " + manager.SCCCertName)
-                    }
-                }
-            }
-        }
-    }
-
-    if err != nil {
-        log.Println(err)
-    }
-
-    //Register rsync client
-    serviceName := os.Getenv(ENV_RSYNC_NAME)
-    if serviceName == "" {
-            serviceName = default_rsync_name
-            logs.Info("Using default name for rsync service name", logs.Fields{
-                        "Name": serviceName,
-            })
-    }
-
-    client := controller.NewControllerClient()
-
-    // Create or update the controller entry
-    rsync_port, _ := strconv.Atoi(rconfig.GetConfiguration().RsyncPort)
-    controller := controller.Controller{
-            Metadata: mtypes.Metadata{
-                    Name: serviceName,
-            },
-            Spec: controller.ControllerSpec{
-                    Host:     rconfig.GetConfiguration().RsyncIP,
-                    Port:     rsync_port,
-                    Type:     controller.CONTROLLER_TYPE_ACTION,
-                    Priority: controller.MinControllerPriority,
-            },
-    }
-    _, err = client.CreateController(controller, true)
-    if err != nil {
-            logs.Error("Failed to create/update a gRPC controller", logs.Fields{
-                    "Error":      err,
-                    "Controller": serviceName,
-            })
-    }
-
-    // create http server
-    httpRouter := api.NewRouter(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
-    loggedRouter := handlers.LoggingHandler(os.Stdout, httpRouter)
-    log.Println("Starting SDEWAN Central Controller API")
-
-    httpServer := &http.Server{
-            Handler:    loggedRouter,
-            Addr:       ":" + config.GetConfiguration().ServicePort,
-    }
-
-    connectionsClose := make(chan struct{})
-    go func() {
-            c := make(chan os.Signal, 1)
-            signal.Notify(c, os.Interrupt)
-            <-c
-            httpServer.Shutdown(context.Background())
-            close(connectionsClose)
-    }()
-
-    tlsConfig, err := auth.GetTLSConfig("ca.cert", "server.cert", "server.key")
-    if err != nil {
-        log.Println("Error Getting TLS Configuration. Starting without TLS...")
-        log.Fatal(httpServer.ListenAndServe())
-    } else {
-            httpServer.TLSConfig = tlsConfig
-
-            err = httpServer.ListenAndServeTLS("", "")
-    }
+       rand.Seed(time.Now().UnixNano())
+
+       // create database and context database
+       err := db.InitializeDatabaseConnection("scc")
+       if err != nil {
+               log.Println("Unable to initialize database connection...")
+               log.Println(err)
+               log.Fatalln("Exiting...")
+       }
+
+       err = contextDb.InitializeContextDatabase()
+       if err != nil {
+               log.Println("Unable to initialize database connection...")
+               log.Println(err)
+               log.Fatalln("Exiting...")
+       }
+
+       // create sdewan namespace and root certificate
+       cu, err := manager.GetCertUtil()
+       if err == nil {
+               _, err = cu.CreateNamespace(manager.NameSpaceName)
+               if err == nil {
+                       log.Println("Namespace is available : " + manager.NameSpaceName)
+                       _, err = cu.CreateSelfSignedIssuer(manager.RootIssuerName, manager.NameSpaceName)
+                       if err == nil {
+                               log.Println("SDEWAN root issuer is available : " + manager.RootIssuerName)
+                               _, err = cu.CreateCertificate(manager.RootCertName, manager.NameSpaceName, manager.RootIssuerName, true)
+                               if err == nil {
+                                       log.Println("SDEWAN root certificate is available : " + manager.RootCertName)
+                                       _, err = cu.CreateCAIssuer(manager.RootCAIssuerName, manager.NameSpaceName, manager.RootCertName)
+                                       if err == nil {
+                                               log.Println("SDEWAN root ca issuer is available : " + manager.RootCAIssuerName)
+                                       }
+                                       _, err = cu.CreateCertificate(manager.SCCCertName, manager.NameSpaceName, manager.RootCAIssuerName, false)
+                                       if err == nil {
+                                               log.Println("SDEWAN central controller base certificates is available : " + manager.SCCCertName)
+                                       }
+                               }
+                       }
+               }
+       }
+
+       if err != nil {
+               log.Println(err)
+       }
+
+       //Register rsync client
+       serviceName := os.Getenv(ENV_RSYNC_NAME)
+       if serviceName == "" {
+               serviceName = default_rsync_name
+               logs.Info("Using default name for rsync service name", logs.Fields{
+                       "Name": serviceName,
+               })
+       }
+
+       client := controller.NewControllerClient()
+
+       // Create or update the controller entry
+       rsync_port, _ := strconv.Atoi(rconfig.GetConfiguration().RsyncPort)
+       controller := controller.Controller{
+               Metadata: mtypes.Metadata{
+                       Name: serviceName,
+               },
+               Spec: controller.ControllerSpec{
+                       Host:     rconfig.GetConfiguration().RsyncIP,
+                       Port:     rsync_port,
+                       Type:     controller.CONTROLLER_TYPE_ACTION,
+                       Priority: controller.MinControllerPriority,
+               },
+       }
+       _, err = client.CreateController(controller, true)
+       if err != nil {
+               logs.Error("Failed to create/update a gRPC controller", logs.Fields{
+                       "Error":      err,
+                       "Controller": serviceName,
+               })
+       }
+
+       // create http server
+       httpRouter := api.NewRouter(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
+       loggedRouter := handlers.LoggingHandler(os.Stdout, httpRouter)
+       log.Println("Starting SDEWAN Central Controller API")
+
+       httpServer := &http.Server{
+               Handler: loggedRouter,
+               Addr:    ":" + config.GetConfiguration().ServicePort,
+       }
+
+       connectionsClose := make(chan struct{})
+       go func() {
+               c := make(chan os.Signal, 1)
+               signal.Notify(c, os.Interrupt)
+               <-c
+               httpServer.Shutdown(context.Background())
+               close(connectionsClose)
+       }()
+
+       tlsConfig, err := auth.GetTLSConfig("ca.cert", "server.cert", "server.key")
+       if err != nil {
+               log.Println("Error Getting TLS Configuration. Starting without TLS...")
+               log.Fatal(httpServer.ListenAndServe())
+       } else {
+               httpServer.TLSConfig = tlsConfig
+
+               err = httpServer.ListenAndServeTLS("", "")
+       }
 
 }
index 5bbffaa..6054bcb 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-// Based on Code: https://github.com/johandry/klient\r
-\r
-package client\r
-\r
-import (\r
-    "log"\r
-    "k8s.io/client-go/rest"\r
-    "k8s.io/client-go/tools/clientcmd"\r
-    "k8s.io/apimachinery/pkg/runtime/schema"\r
-    "k8s.io/client-go/kubernetes/scheme"\r
-    "k8s.io/client-go/kubernetes"\r
-    corev1 "k8s.io/client-go/kubernetes/typed/core/v1"\r
-    certmanagerversioned "github.com/jetstack/cert-manager/pkg/client/clientset/versioned"\r
-    certmanagerv1beta1 "github.com/jetstack/cert-manager/pkg/client/clientset/versioned/typed/certmanager/v1beta1"\r
-)\r
-\r
-type KubernetesClient struct {\r
-    Context string\r
-    ConfigPath string\r
-    KubeConfig  []byte\r
-}\r
-\r
-func NewClient(context string, configPath string, kubeConfig []byte) *KubernetesClient {\r
-    return &KubernetesClient{\r
-        Context: context,\r
-        ConfigPath: configPath,\r
-        KubeConfig: kubeConfig,\r
-    }\r
-}\r
-\r
-func (c *KubernetesClient) ToRESTConfig() (*rest.Config, error) {\r
-    var config *rest.Config\r
-    var err error\r
-    if len(c.KubeConfig) == 0 {\r
-        // From: k8s.io/kubectl/pkg/cmd/util/kubectl_match_version.go > func setKubernetesDefaults()\r
-        config, err = c.toRawKubeConfigLoader().ClientConfig()\r
-    } else {\r
-        config, err = clientcmd.RESTConfigFromKubeConfig(c.KubeConfig)\r
-    }\r
-\r
-    if err != nil {\r
-        return nil, err\r
-    }\r
-\r
-    if config.GroupVersion == nil {\r
-        config.GroupVersion = &schema.GroupVersion{Group: "", Version: "v1"}\r
-    }\r
-    if config.APIPath == "" {\r
-        config.APIPath = "/api"\r
-    }\r
-    if config.NegotiatedSerializer == nil {\r
-        // This codec config ensures the resources are not converted. Therefore, resources\r
-        // will not be round-tripped through internal versions. Defaulting does not happen\r
-        // on the client.\r
-        config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()\r
-    }\r
-\r
-    rest.SetKubernetesDefaults(config)\r
-    return config, nil\r
-}\r
-\r
-// toRawKubeConfigLoader creates a client using the following rules:\r
-// 1. builds from the given kubeconfig path, if not empty\r
-// 2. use the in cluster factory if running in-cluster\r
-// 3. gets the factory from KUBECONFIG env var\r
-// 4. Uses $HOME/.kube/factory\r
-// It's required to implement the interface genericclioptions.RESTClientGetter\r
-func (c *KubernetesClient) toRawKubeConfigLoader() clientcmd.ClientConfig {\r
-    loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()\r
-    loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig\r
-    if len(c.ConfigPath) != 0 {\r
-        loadingRules.ExplicitPath = c.ConfigPath\r
-    }\r
-    configOverrides := &clientcmd.ConfigOverrides{\r
-        ClusterDefaults: clientcmd.ClusterDefaults,\r
-    }\r
-    if len(c.Context) != 0 {\r
-        configOverrides.CurrentContext = c.Context\r
-    }\r
-\r
-    return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)\r
-}\r
-\r
-func (c *KubernetesClient) GetCMClients() (certmanagerv1beta1.CertmanagerV1beta1Interface, corev1.CoreV1Interface, error) {\r
-    config, err := c.ToRESTConfig()\r
-    if err != nil {\r
-        return nil, nil, err\r
-    }\r
-\r
-    cmclientset, err := certmanagerversioned.NewForConfig(config)\r
-    if err != nil {\r
-        return nil, nil, err\r
-    }\r
-\r
-    k8sclientset, err := kubernetes.NewForConfig(config)\r
-    if err != nil {\r
-        return nil, nil, err\r
-    }\r
-\r
-    return cmclientset.CertmanagerV1beta1(), k8sclientset.CoreV1(), nil\r
-}\r
-\r
-func (c *KubernetesClient) KubernetesClientSet() (*kubernetes.Clientset, error) {\r
-    config, err := c.ToRESTConfig()\r
-    if err != nil {\r
-        return nil, err\r
-    }\r
-\r
-    return kubernetes.NewForConfig(config)\r
-}\r
-\r
-func (c *KubernetesClient) IsReachable() bool {\r
-    clientset, err := c.KubernetesClientSet()\r
-    if err != nil {\r
-        log.Println(err)\r
-        return false\r
-    }\r
-\r
-    _, err = clientset.ServerVersion()\r
-    if err != nil {\r
-        log.Println(err)\r
-        return false\r
-    }\r
-\r
-    return true\r
-}\r
-\r
+/*
+ * 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.
+ */
+// Based on Code: https://github.com/johandry/klient
+
+package client
+
+import (
+       certmanagerversioned "github.com/jetstack/cert-manager/pkg/client/clientset/versioned"
+       certmanagerv1beta1 "github.com/jetstack/cert-manager/pkg/client/clientset/versioned/typed/certmanager/v1beta1"
+       "k8s.io/apimachinery/pkg/runtime/schema"
+       "k8s.io/client-go/kubernetes"
+       "k8s.io/client-go/kubernetes/scheme"
+       corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
+       "k8s.io/client-go/rest"
+       "k8s.io/client-go/tools/clientcmd"
+       "log"
+)
+
+type KubernetesClient struct {
+       Context    string
+       ConfigPath string
+       KubeConfig []byte
+}
+
+func NewClient(context string, configPath string, kubeConfig []byte) *KubernetesClient {
+       return &KubernetesClient{
+               Context:    context,
+               ConfigPath: configPath,
+               KubeConfig: kubeConfig,
+       }
+}
+
+func (c *KubernetesClient) ToRESTConfig() (*rest.Config, error) {
+       var config *rest.Config
+       var err error
+       if len(c.KubeConfig) == 0 {
+               // From: k8s.io/kubectl/pkg/cmd/util/kubectl_match_version.go > func setKubernetesDefaults()
+               config, err = c.toRawKubeConfigLoader().ClientConfig()
+       } else {
+               config, err = clientcmd.RESTConfigFromKubeConfig(c.KubeConfig)
+       }
+
+       if err != nil {
+               return nil, err
+       }
+
+       if config.GroupVersion == nil {
+               config.GroupVersion = &schema.GroupVersion{Group: "", Version: "v1"}
+       }
+       if config.APIPath == "" {
+               config.APIPath = "/api"
+       }
+       if config.NegotiatedSerializer == nil {
+               // This codec config ensures the resources are not converted. Therefore, resources
+               // will not be round-tripped through internal versions. Defaulting does not happen
+               // on the client.
+               config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
+       }
+
+       rest.SetKubernetesDefaults(config)
+       return config, nil
+}
+
+// toRawKubeConfigLoader creates a client using the following rules:
+// 1. builds from the given kubeconfig path, if not empty
+// 2. use the in cluster factory if running in-cluster
+// 3. gets the factory from KUBECONFIG env var
+// 4. Uses $HOME/.kube/factory
+// It's required to implement the interface genericclioptions.RESTClientGetter
+func (c *KubernetesClient) toRawKubeConfigLoader() clientcmd.ClientConfig {
+       loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
+       loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig
+       if len(c.ConfigPath) != 0 {
+               loadingRules.ExplicitPath = c.ConfigPath
+       }
+       configOverrides := &clientcmd.ConfigOverrides{
+               ClusterDefaults: clientcmd.ClusterDefaults,
+       }
+       if len(c.Context) != 0 {
+               configOverrides.CurrentContext = c.Context
+       }
+
+       return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
+}
+
+func (c *KubernetesClient) GetCMClients() (certmanagerv1beta1.CertmanagerV1beta1Interface, corev1.CoreV1Interface, error) {
+       config, err := c.ToRESTConfig()
+       if err != nil {
+               return nil, nil, err
+       }
+
+       cmclientset, err := certmanagerversioned.NewForConfig(config)
+       if err != nil {
+               return nil, nil, err
+       }
+
+       k8sclientset, err := kubernetes.NewForConfig(config)
+       if err != nil {
+               return nil, nil, err
+       }
+
+       return cmclientset.CertmanagerV1beta1(), k8sclientset.CoreV1(), nil
+}
+
+func (c *KubernetesClient) KubernetesClientSet() (*kubernetes.Clientset, error) {
+       config, err := c.ToRESTConfig()
+       if err != nil {
+               return nil, err
+       }
+
+       return kubernetes.NewForConfig(config)
+}
+
+func (c *KubernetesClient) IsReachable() bool {
+       clientset, err := c.KubernetesClientSet()
+       if err != nil {
+               log.Println(err)
+               return false
+       }
+
+       _, err = clientset.ServerVersion()
+       if err != nil {
+               log.Println(err)
+               return false
+       }
+
+       return true
+}
index 76e1dfd..d26bf15 100644 (file)
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-\r
-package client\r
-\r
-import (\r
-       "context"\r
-       "sync"\r
-       "time"\r
-\r
-       log "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/logutils"\r
-       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/rpc"\r
-       installpb "github.com/open-ness/EMCO/src/rsync/pkg/grpc/installapp"\r
-       pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-const rsyncName = "rsync"\r
-\r
-/*\r
-RsyncInfo consists of rsyncName, hostName and portNumber.\r
-*/\r
-type RsyncInfo struct {\r
-       RsyncName  string\r
-       hostName   string\r
-       portNumber int\r
-}\r
-\r
-var rsyncInfo RsyncInfo\r
-var mutex = &sync.Mutex{}\r
-\r
-type _testvars struct {\r
-       UseGrpcMock   bool\r
-       InstallClient installpb.InstallappClient\r
-}\r
-\r
-var Testvars _testvars\r
-\r
-// InitRsyncClient initializes connctions to the Resource Synchronizer service\r
-func initRsyncClient() bool {\r
-       if (RsyncInfo{}) == rsyncInfo {\r
-               mutex.Lock()\r
-               defer mutex.Unlock()\r
-               log.Error("RsyncInfo not set. InitRsyncClient failed", log.Fields{\r
-                       "Rsyncname":  rsyncInfo.RsyncName,\r
-                       "Hostname":   rsyncInfo.hostName,\r
-                       "PortNumber": rsyncInfo.portNumber,\r
-               })\r
-               return false\r
-       }\r
-       rpc.UpdateRpcConn(rsyncInfo.RsyncName, rsyncInfo.hostName, rsyncInfo.portNumber)\r
-       return true\r
-}\r
-\r
-// NewRsyncInfo shall return a newly created RsyncInfo object\r
-func NewRsyncInfo(rName, h string, pN int) RsyncInfo {\r
-       mutex.Lock()\r
-       defer mutex.Unlock()\r
-       rsyncInfo = RsyncInfo{RsyncName: rName, hostName: h, portNumber: pN}\r
-       return rsyncInfo\r
-\r
-}\r
-\r
-// InvokeInstallApp will make the grpc call to the resource synchronizer\r
-// or rsync controller.\r
-// rsync will deploy the resources in the app context to the clusters as\r
-// prepared in the app context.\r
-func InvokeInstallApp(appContextId string) error {\r
-       var err error\r
-       var rpcClient installpb.InstallappClient\r
-       var installRes *installpb.InstallAppResponse\r
-       ctx, cancel := context.WithTimeout(context.Background(), 600*time.Second)\r
-       defer cancel()\r
-\r
-       // Unit test helper code\r
-       if Testvars.UseGrpcMock {\r
-               rpcClient = Testvars.InstallClient\r
-               installReq := new(installpb.InstallAppRequest)\r
-               installReq.AppContext = appContextId\r
-               installRes, err = rpcClient.InstallApp(ctx, installReq)\r
-               if err == nil {\r
-                       log.Info("Response from InstappApp GRPC call", log.Fields{\r
-                               "Succeeded": installRes.AppContextInstalled,\r
-                               "Message":   installRes.AppContextInstallMessage,\r
-                       })\r
-               }\r
-               return nil\r
-       }\r
-\r
-       conn := rpc.GetRpcConn(rsyncName)\r
-       if conn == nil {\r
-               initRsyncClient()\r
-               conn = rpc.GetRpcConn(rsyncName)\r
-       }\r
-\r
-       if conn != nil {\r
-               rpcClient = installpb.NewInstallappClient(conn)\r
-               installReq := new(installpb.InstallAppRequest)\r
-               installReq.AppContext = appContextId\r
-               installRes, err = rpcClient.InstallApp(ctx, installReq)\r
-               if err == nil {\r
-                       log.Info("Response from InstappApp GRPC call", log.Fields{\r
-                               "Succeeded": installRes.AppContextInstalled,\r
-                               "Message":   installRes.AppContextInstallMessage,\r
-                       })\r
-               }\r
-       } else {\r
-               return pkgerrors.Errorf("InstallApp Failed - Could not get InstallAppClient: %v", "rsync")\r
-       }\r
-\r
-       if err == nil {\r
-               if installRes.AppContextInstalled {\r
-                       log.Info("InstallApp Success", log.Fields{\r
-                               "AppContext": appContextId,\r
-                               "Message":    installRes.AppContextInstallMessage,\r
-                       })\r
-                       return nil\r
-               } else {\r
-                       return pkgerrors.Errorf("InstallApp Failed: %v", installRes.AppContextInstallMessage)\r
-               }\r
-       }\r
-       return err\r
-}\r
-\r
-func InvokeUninstallApp(appContextId string) error {\r
-       var err error\r
-       var rpcClient installpb.InstallappClient\r
-       var uninstallRes *installpb.UninstallAppResponse\r
-       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\r
-       defer cancel()\r
-\r
-       conn := rpc.GetRpcConn(rsyncName)\r
-       if conn == nil {\r
-               initRsyncClient()\r
-               conn = rpc.GetRpcConn(rsyncName)\r
-       }\r
-\r
-       if conn != nil {\r
-               rpcClient = installpb.NewInstallappClient(conn)\r
-               uninstallReq := new(installpb.UninstallAppRequest)\r
-               uninstallReq.AppContext = appContextId\r
-               uninstallRes, err = rpcClient.UninstallApp(ctx, uninstallReq)\r
-               if err == nil {\r
-                       log.Info("Response from UninstappApp GRPC call", log.Fields{\r
-                               "Succeeded": uninstallRes.AppContextUninstalled,\r
-                               "Message":   uninstallRes.AppContextUninstallMessage,\r
-                       })\r
-               }\r
-       } else {\r
-               return pkgerrors.Errorf("UninstallApp Failed - Could not get InstallAppClient: %v", "rsync")\r
-       }\r
-\r
-       if err == nil {\r
-               if uninstallRes.AppContextUninstalled {\r
-                       log.Info("UninstallApp Success", log.Fields{\r
-                               "AppContext": appContextId,\r
-                               "Message":    uninstallRes.AppContextUninstallMessage,\r
-                       })\r
-                       return nil\r
-               } else {\r
-                       return pkgerrors.Errorf("UninstallApp Failed: %v", uninstallRes.AppContextUninstallMessage)\r
-               }\r
-       }\r
-       return err\r
-}\r
-\r
-func InvokeGetResource(appContextId string) error {\r
-       var err error\r
-       var rpcClient installpb.InstallappClient\r
-       var readAppContextRes *installpb.ReadAppContextResponse\r
-       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\r
-       defer cancel()\r
-\r
-       conn := rpc.GetRpcConn(rsyncName)\r
-       if conn == nil {\r
-               initRsyncClient()\r
-               conn = rpc.GetRpcConn(rsyncName)\r
-               if conn == nil {\r
-                       log.Error("[InvokeReadRq gRPC] connection error", log.Fields{"grpc-server": rsyncName})\r
-                       return pkgerrors.Errorf("[InvokeReadRq gRPC] connection error. grpc-server[%v]", rsyncName)\r
-               }\r
-       }\r
-\r
-       if conn != nil {\r
-               rpcClient = installpb.NewInstallappClient(conn)\r
-               readReq := new(installpb.ReadAppContextRequest)\r
-               readReq.AppContext = appContextId\r
-               readAppContextRes, err = rpcClient.ReadAppContext(ctx, readReq)\r
-               if err == nil {\r
-                       log.Info("Response from ReadAppContext GRPC call", log.Fields{\r
-                               "Succeeded": readAppContextRes.AppContextReadSuccessful,\r
-                               "Message":   readAppContextRes.AppContextReadMessage,\r
-                       })\r
-               }\r
-       } else {\r
-               return pkgerrors.Errorf("ReadAppContext Failed - Could not get ReadAppContext: %v", "rsync")\r
-       }\r
-\r
-       return nil\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+
+package client
+
+import (
+       "context"
+       "sync"
+       "time"
+
+       log "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/logutils"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/rpc"
+       installpb "github.com/open-ness/EMCO/src/rsync/pkg/grpc/installapp"
+       pkgerrors "github.com/pkg/errors"
+)
+
+const rsyncName = "rsync"
+
+/*
+RsyncInfo consists of rsyncName, hostName and portNumber.
+*/
+type RsyncInfo struct {
+       RsyncName  string
+       hostName   string
+       portNumber int
+}
+
+var rsyncInfo RsyncInfo
+var mutex = &sync.Mutex{}
+
+type _testvars struct {
+       UseGrpcMock   bool
+       InstallClient installpb.InstallappClient
+}
+
+var Testvars _testvars
+
+// InitRsyncClient initializes connctions to the Resource Synchronizer service
+func initRsyncClient() bool {
+       if (RsyncInfo{}) == rsyncInfo {
+               mutex.Lock()
+               defer mutex.Unlock()
+               log.Error("RsyncInfo not set. InitRsyncClient failed", log.Fields{
+                       "Rsyncname":  rsyncInfo.RsyncName,
+                       "Hostname":   rsyncInfo.hostName,
+                       "PortNumber": rsyncInfo.portNumber,
+               })
+               return false
+       }
+       rpc.UpdateRpcConn(rsyncInfo.RsyncName, rsyncInfo.hostName, rsyncInfo.portNumber)
+       return true
+}
+
+// NewRsyncInfo shall return a newly created RsyncInfo object
+func NewRsyncInfo(rName, h string, pN int) RsyncInfo {
+       mutex.Lock()
+       defer mutex.Unlock()
+       rsyncInfo = RsyncInfo{RsyncName: rName, hostName: h, portNumber: pN}
+       return rsyncInfo
+
+}
+
+// InvokeInstallApp will make the grpc call to the resource synchronizer
+// or rsync controller.
+// rsync will deploy the resources in the app context to the clusters as
+// prepared in the app context.
+func InvokeInstallApp(appContextId string) error {
+       var err error
+       var rpcClient installpb.InstallappClient
+       var installRes *installpb.InstallAppResponse
+       ctx, cancel := context.WithTimeout(context.Background(), 600*time.Second)
+       defer cancel()
+
+       // Unit test helper code
+       if Testvars.UseGrpcMock {
+               rpcClient = Testvars.InstallClient
+               installReq := new(installpb.InstallAppRequest)
+               installReq.AppContext = appContextId
+               installRes, err = rpcClient.InstallApp(ctx, installReq)
+               if err == nil {
+                       log.Info("Response from InstappApp GRPC call", log.Fields{
+                               "Succeeded": installRes.AppContextInstalled,
+                               "Message":   installRes.AppContextInstallMessage,
+                       })
+               }
+               return nil
+       }
+
+       conn := rpc.GetRpcConn(rsyncName)
+       if conn == nil {
+               initRsyncClient()
+               conn = rpc.GetRpcConn(rsyncName)
+       }
+
+       if conn != nil {
+               rpcClient = installpb.NewInstallappClient(conn)
+               installReq := new(installpb.InstallAppRequest)
+               installReq.AppContext = appContextId
+               installRes, err = rpcClient.InstallApp(ctx, installReq)
+               if err == nil {
+                       log.Info("Response from InstappApp GRPC call", log.Fields{
+                               "Succeeded": installRes.AppContextInstalled,
+                               "Message":   installRes.AppContextInstallMessage,
+                       })
+               }
+       } else {
+               return pkgerrors.Errorf("InstallApp Failed - Could not get InstallAppClient: %v", "rsync")
+       }
+
+       if err == nil {
+               if installRes.AppContextInstalled {
+                       log.Info("InstallApp Success", log.Fields{
+                               "AppContext": appContextId,
+                               "Message":    installRes.AppContextInstallMessage,
+                       })
+                       return nil
+               } else {
+                       return pkgerrors.Errorf("InstallApp Failed: %v", installRes.AppContextInstallMessage)
+               }
+       }
+       return err
+}
+
+func InvokeUninstallApp(appContextId string) error {
+       var err error
+       var rpcClient installpb.InstallappClient
+       var uninstallRes *installpb.UninstallAppResponse
+       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+       defer cancel()
+
+       conn := rpc.GetRpcConn(rsyncName)
+       if conn == nil {
+               initRsyncClient()
+               conn = rpc.GetRpcConn(rsyncName)
+       }
+
+       if conn != nil {
+               rpcClient = installpb.NewInstallappClient(conn)
+               uninstallReq := new(installpb.UninstallAppRequest)
+               uninstallReq.AppContext = appContextId
+               uninstallRes, err = rpcClient.UninstallApp(ctx, uninstallReq)
+               if err == nil {
+                       log.Info("Response from UninstappApp GRPC call", log.Fields{
+                               "Succeeded": uninstallRes.AppContextUninstalled,
+                               "Message":   uninstallRes.AppContextUninstallMessage,
+                       })
+               }
+       } else {
+               return pkgerrors.Errorf("UninstallApp Failed - Could not get InstallAppClient: %v", "rsync")
+       }
+
+       if err == nil {
+               if uninstallRes.AppContextUninstalled {
+                       log.Info("UninstallApp Success", log.Fields{
+                               "AppContext": appContextId,
+                               "Message":    uninstallRes.AppContextUninstallMessage,
+                       })
+                       return nil
+               } else {
+                       return pkgerrors.Errorf("UninstallApp Failed: %v", uninstallRes.AppContextUninstallMessage)
+               }
+       }
+       return err
+}
+
+func InvokeGetResource(appContextId string) error {
+       var err error
+       var rpcClient installpb.InstallappClient
+       var readAppContextRes *installpb.ReadAppContextResponse
+       ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+       defer cancel()
+
+       conn := rpc.GetRpcConn(rsyncName)
+       if conn == nil {
+               initRsyncClient()
+               conn = rpc.GetRpcConn(rsyncName)
+               if conn == nil {
+                       log.Error("[InvokeReadRq gRPC] connection error", log.Fields{"grpc-server": rsyncName})
+                       return pkgerrors.Errorf("[InvokeReadRq gRPC] connection error. grpc-server[%v]", rsyncName)
+               }
+       }
+
+       if conn != nil {
+               rpcClient = installpb.NewInstallappClient(conn)
+               readReq := new(installpb.ReadAppContextRequest)
+               readReq.AppContext = appContextId
+               readAppContextRes, err = rpcClient.ReadAppContext(ctx, readReq)
+               if err == nil {
+                       log.Info("Response from ReadAppContext GRPC call", log.Fields{
+                               "Succeeded": readAppContextRes.AppContextReadSuccessful,
+                               "Message":   readAppContextRes.AppContextReadMessage,
+                       })
+               }
+       } else {
+               return pkgerrors.Errorf("ReadAppContext Failed - Could not get ReadAppContext: %v", "rsync")
+       }
+
+       return nil
+}
index acaf6f5..f13a2e5 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package config\r
-\r
-import (\r
-       "encoding/json"\r
-       "log"\r
-       "os"\r
-       "reflect"\r
-)\r
-\r
-// Configuration loads up all the values that are used to configure\r
-// backend implementations\r
-type Configuration struct {\r
-       RsyncIP                string `json:"rsync-ip"`\r
-       RsyncPort              string `json:"rsync-port"`\r
-}\r
-\r
-// Config is the structure that stores the configuration\r
-var gConfig *Configuration\r
-\r
-// readConfigFile reads the specified smsConfig file to setup some env variables\r
-func readConfigFile(file string) (*Configuration, error) {\r
-       f, err := os.Open(file)\r
-       if err != nil {\r
-               return defaultConfiguration(), err\r
-       }\r
-       defer f.Close()\r
-\r
-       // Setup some defaults here\r
-       // If the json file has values in it, the defaults will be overwritten\r
-       conf := defaultConfiguration()\r
-\r
-       // Read the configuration from json file\r
-       decoder := json.NewDecoder(f)\r
-       decoder.DisallowUnknownFields()\r
-       err = decoder.Decode(conf)\r
-       if err != nil {\r
-               return conf, err\r
-       }\r
-\r
-       return conf, nil\r
-}\r
-\r
-func defaultConfiguration() *Configuration {\r
-       return &Configuration{\r
-               RsyncIP:                "localhost",\r
-               RsyncPort:              "9031",\r
-       }\r
-}\r
-\r
-// GetConfiguration returns the configuration for the app.\r
-// It will try to load it if it is not already loaded.\r
-func GetConfiguration() *Configuration {\r
-       if gConfig == nil {\r
-               conf, err := readConfigFile("rsync_config.json")\r
-               if err != nil {\r
-                       log.Println("Error loading config file: ", err)\r
-                       log.Println("Using defaults...")\r
-               }\r
-               gConfig = conf\r
-       }\r
-\r
-       return gConfig\r
-}\r
-\r
-// SetConfigValue sets a value in the configuration\r
-// This is mostly used to customize the application and\r
-// should be used carefully.\r
-func SetConfigValue(key string, value string) *Configuration {\r
-       c := GetConfiguration()\r
-       if value == "" || key == "" {\r
-               return c\r
-       }\r
-\r
-       v := reflect.ValueOf(c).Elem()\r
-       if v.Kind() == reflect.Struct {\r
-               f := v.FieldByName(key)\r
-               if f.IsValid() {\r
-                       if f.CanSet() {\r
-                               if f.Kind() == reflect.String {\r
-                                       f.SetString(value)\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       return c\r
-}\r
+/*
+ * 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 config
+
+import (
+       "encoding/json"
+       "log"
+       "os"
+       "reflect"
+)
+
+// Configuration loads up all the values that are used to configure
+// backend implementations
+type Configuration struct {
+       RsyncIP   string `json:"rsync-ip"`
+       RsyncPort string `json:"rsync-port"`
+}
+
+// Config is the structure that stores the configuration
+var gConfig *Configuration
+
+// readConfigFile reads the specified smsConfig file to setup some env variables
+func readConfigFile(file string) (*Configuration, error) {
+       f, err := os.Open(file)
+       if err != nil {
+               return defaultConfiguration(), err
+       }
+       defer f.Close()
+
+       // Setup some defaults here
+       // If the json file has values in it, the defaults will be overwritten
+       conf := defaultConfiguration()
+
+       // Read the configuration from json file
+       decoder := json.NewDecoder(f)
+       decoder.DisallowUnknownFields()
+       err = decoder.Decode(conf)
+       if err != nil {
+               return conf, err
+       }
+
+       return conf, nil
+}
+
+func defaultConfiguration() *Configuration {
+       return &Configuration{
+               RsyncIP:   "localhost",
+               RsyncPort: "9031",
+       }
+}
+
+// GetConfiguration returns the configuration for the app.
+// It will try to load it if it is not already loaded.
+func GetConfiguration() *Configuration {
+       if gConfig == nil {
+               conf, err := readConfigFile("rsync_config.json")
+               if err != nil {
+                       log.Println("Error loading config file: ", err)
+                       log.Println("Using defaults...")
+               }
+               gConfig = conf
+       }
+
+       return gConfig
+}
+
+// SetConfigValue sets a value in the configuration
+// This is mostly used to customize the application and
+// should be used carefully.
+func SetConfigValue(key string, value string) *Configuration {
+       c := GetConfiguration()
+       if value == "" || key == "" {
+               return c
+       }
+
+       v := reflect.ValueOf(c).Elem()
+       if v.Kind() == reflect.Struct {
+               f := v.FieldByName(key)
+               if f.IsValid() {
+                       if f.CanSet() {
+                               if f.Kind() == reflect.String {
+                                       f.SetString(value)
+                               }
+                       }
+               }
+       }
+       return c
+}
index b466d07..cf55e45 100644 (file)
@@ -1,91 +1,91 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package validation\r
-\r
-import (\r
-       "reflect"\r
-       "fmt"\r
-       "sync"\r
-       "github.com/go-playground/validator/v10"\r
-)\r
-\r
-type SdewanValidator struct {\r
-       validate *validator.Validate\r
-}\r
-\r
-type safeSdewanValidators struct {\r
-       validates map[string]*SdewanValidator\r
-       mux     sync.Mutex\r
-}\r
-\r
-var gvalidates = safeSdewanValidators{validates: make(map[string]*SdewanValidator)}\r
-\r
-func GetValidator(name string) *SdewanValidator {\r
-       return gvalidates.getValidate(name)\r
-}\r
-\r
-// safeSdewanValidators\r
-func (s *safeSdewanValidators) getValidate(name string) *SdewanValidator {\r
-       s.mux.Lock()\r
-       defer s.mux.Unlock()\r
-\r
-       if s.validates[name] == nil {\r
-               s.validates[name] = &SdewanValidator{\r
-                       validate: validator.New(),\r
-               }\r
-       }\r
-\r
-       return s.validates[name]\r
-}\r
-\r
-// SdewanValidator\r
-func(v *SdewanValidator) Validate(data interface{}) (bool, string) {\r
-       err := v.validate.Struct(data)\r
-       if err != nil {\r
-               if _, ok := err.(*validator.InvalidValidationError); ok {\r
-                       return false, reflect.TypeOf(err).String()\r
-               }\r
-\r
-               msg := "Input fields check error: ["\r
-               index := 1\r
-               for _, err := range err.(validator.ValidationErrors) {\r
-                       fieldMsg := fmt.Sprintf("%s(%s:%s)", err.Field(), err.Tag(), err.Param())\r
-                       if index == 1 {\r
-                               msg = msg + fieldMsg\r
-                       } else {\r
-                               msg = msg + ", " + fieldMsg\r
-                       }\r
-\r
-                       index = index + 1\r
-               }\r
-\r
-               msg = msg +"]"\r
-\r
-               // from here you can create your own error messages in whatever language you wish\r
-               return false, msg\r
-       }\r
-\r
-    return true, ""\r
-}\r
-\r
-func(v *SdewanValidator) RegisterValidation(tag string, fn validator.Func) error {\r
-       return v.validate.RegisterValidation(tag, fn)\r
-}\r
-\r
-func(v *SdewanValidator) RegisterStructValidation(fn validator.StructLevelFunc, types interface{}) {\r
-       v.validate.RegisterStructValidation(fn, types)\r
-}
\ No newline at end of file
+/*
+ * 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 validation
+
+import (
+       "fmt"
+       "github.com/go-playground/validator/v10"
+       "reflect"
+       "sync"
+)
+
+type SdewanValidator struct {
+       validate *validator.Validate
+}
+
+type safeSdewanValidators struct {
+       validates map[string]*SdewanValidator
+       mux       sync.Mutex
+}
+
+var gvalidates = safeSdewanValidators{validates: make(map[string]*SdewanValidator)}
+
+func GetValidator(name string) *SdewanValidator {
+       return gvalidates.getValidate(name)
+}
+
+// safeSdewanValidators
+func (s *safeSdewanValidators) getValidate(name string) *SdewanValidator {
+       s.mux.Lock()
+       defer s.mux.Unlock()
+
+       if s.validates[name] == nil {
+               s.validates[name] = &SdewanValidator{
+                       validate: validator.New(),
+               }
+       }
+
+       return s.validates[name]
+}
+
+// SdewanValidator
+func (v *SdewanValidator) Validate(data interface{}) (bool, string) {
+       err := v.validate.Struct(data)
+       if err != nil {
+               if _, ok := err.(*validator.InvalidValidationError); ok {
+                       return false, reflect.TypeOf(err).String()
+               }
+
+               msg := "Input fields check error: ["
+               index := 1
+               for _, err := range err.(validator.ValidationErrors) {
+                       fieldMsg := fmt.Sprintf("%s(%s:%s)", err.Field(), err.Tag(), err.Param())
+                       if index == 1 {
+                               msg = msg + fieldMsg
+                       } else {
+                               msg = msg + ", " + fieldMsg
+                       }
+
+                       index = index + 1
+               }
+
+               msg = msg + "]"
+
+               // from here you can create your own error messages in whatever language you wish
+               return false, msg
+       }
+
+       return true, ""
+}
+
+func (v *SdewanValidator) RegisterValidation(tag string, fn validator.Func) error {
+       return v.validate.RegisterValidation(tag, fn)
+}
+
+func (v *SdewanValidator) RegisterStructValidation(fn validator.StructLevelFunc, types interface{}) {
+       v.validate.RegisterStructValidation(fn, types)
+}
index 70cf22c..509f742 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "log"\r
-    "encoding/base64"\r
-    "encoding/json"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type CertificateObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    CertificateName string `json:"certificate-name"`\r
-}\r
-\r
-// IPRangeObjectManager implements the ControllerObjectManager\r
-type CertificateObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewCertificateObjectManager() *CertificateObjectManager {\r
-    return &CertificateObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "certificate",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *CertificateObjectManager) GetResourceName() string {\r
-    return CertResource\r
-}\r
-\r
-func (c *CertificateObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "PUT" {\r
-        // Not allowed for gets\r
-        return false\r
-    }\r
-    return true\r
-}\r
-\r
-func (c *CertificateObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.CertificateObject{}\r
-}\r
-\r
-func (c *CertificateObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    key := CertificateObjectKey{\r
-        OverlayName: overlay_name,\r
-        CertificateName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.CertificateObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[CertResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        }\r
-\r
-        key.CertificateName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")\r
-        }\r
-\r
-        key.CertificateName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *CertificateObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.CertificateObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    v.Data = module.CertificateObjectData{\r
-        RootCA: "",\r
-        Ca: "",\r
-        Key: "",\r
-    }\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *CertificateObjectManager) GetDeviceCertName(name string) string {\r
-    device := module.DeviceObject{\r
-            Metadata: module.ObjectMetaData{name, "", "", ""}}\r
-    return device.GetCertName()\r
-}\r
-\r
-func GetRootCA(overlay_name string) string {\r
-    overlay := GetManagerset().Overlay\r
-    cu, _ := GetCertUtil()\r
-\r
-    root_ca := cu.GetSelfSignedCA()\r
-    interim_ca, _, _ := overlay.GetCertificate(overlay_name)\r
-\r
-    root_ca += interim_ca\r
-\r
-    return root_ca\r
-}\r
-\r
-func GetRootBaseCA() string {\r
-    cu, _ := GetCertUtil()\r
-\r
-    root_ca := cu.GetSelfSignedCA()\r
-\r
-    return root_ca\r
-}\r
-\r
-\r
-func (c *CertificateObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // Create Certificate\r
-    overlay := GetManagerset().Overlay\r
-    overlay_name := m[OverlayResource]\r
-    cert_name := c.GetDeviceCertName(t.GetMetadata().Name)\r
-\r
-    ca, key, err := overlay.CreateCertificate(overlay_name, cert_name)\r
-    if err != nil {\r
-        log.Println(err)\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-\r
-    // DB Operation\r
-    t, err = GetDBUtils().CreateObject(c, m, t)\r
-\r
-    // Fill Certificate data\r
-    if err == nil {\r
-        to := t.(*module.CertificateObject)\r
-        to.Data.RootCA = base64.StdEncoding.EncodeToString([]byte(GetRootCA(overlay_name)))\r
-        to.Data.Ca = base64.StdEncoding.EncodeToString([]byte(ca))\r
-        to.Data.Key = base64.StdEncoding.EncodeToString([]byte(key))\r
-\r
-        return t, nil\r
-    } else {\r
-        log.Println(err)\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-}\r
-\r
-func (c *CertificateObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    if err == nil {\r
-        overlay := GetManagerset().Overlay\r
-        overlay_name := m[OverlayResource]\r
-        cert_name := c.GetDeviceCertName(t.GetMetadata().Name)\r
-\r
-        ca, key, err := overlay.CreateCertificate(overlay_name, cert_name)\r
-        if err != nil {\r
-            log.Println(err)\r
-            return c.CreateEmptyObject(), err\r
-        }\r
-\r
-        to := t.(*module.CertificateObject)\r
-        to.Data.RootCA = base64.StdEncoding.EncodeToString([]byte(GetRootCA(overlay_name)))\r
-        to.Data.Ca = base64.StdEncoding.EncodeToString([]byte(ca))\r
-        to.Data.Key = base64.StdEncoding.EncodeToString([]byte(key))\r
-\r
-        return t, nil\r
-    } else {\r
-        log.Println(err)\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-}\r
-\r
-func (c *CertificateObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *CertificateObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *CertificateObjectManager) DeleteObject(m map[string]string) error {\r
-    t, err := c.GetObject(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Certificate is not available")\r
-    }\r
-\r
-    // Delete certificate\r
-    overlay := GetManagerset().Overlay\r
-    cert_name := c.GetDeviceCertName(t.GetMetadata().Name)\r
-\r
-    log.Println("Delete Certificate: " + cert_name)\r
-    overlay.DeleteCertificate(cert_name)\r
-\r
-    // DB Operation\r
-    err = GetDBUtils().DeleteObject(c, m)\r
-\r
-    return err\r
-}\r
-\r
-// Create or Get certificate for a device\r
-func (c *CertificateObjectManager) GetOrCreateDC(overlay_name string, dev_name string) (string, string, string, error) {\r
-    m := make(map[string]string)\r
-    m[OverlayResource] = overlay_name\r
-    t := &module.CertificateObject{Metadata: module.ObjectMetaData{dev_name, "", "", ""}}\r
-\r
-    _, err := c.CreateObject(m, t)\r
-    if err != nil {\r
-        return "", "", "", err\r
-    }\r
-\r
-    return t.Data.RootCA, t.Data.Ca, t.Data.Key, nil\r
-}\r
-\r
-// Delete certificate for a device\r
-func (c *CertificateObjectManager) DeleteDC(overlay_name string, dev_name string) error {\r
-    m := make(map[string]string)\r
-    m[OverlayResource] = overlay_name\r
-    m[CertResource] = dev_name\r
-\r
-    return c.DeleteObject(m)\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/base64"
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+       "log"
+)
+
+type CertificateObjectKey struct {
+       OverlayName     string `json:"overlay-name"`
+       CertificateName string `json:"certificate-name"`
+}
+
+// IPRangeObjectManager implements the ControllerObjectManager
+type CertificateObjectManager struct {
+       BaseObjectManager
+}
+
+func NewCertificateObjectManager() *CertificateObjectManager {
+       return &CertificateObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "certificate",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *CertificateObjectManager) GetResourceName() string {
+       return CertResource
+}
+
+func (c *CertificateObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "PUT" {
+               // Not allowed for gets
+               return false
+       }
+       return true
+}
+
+func (c *CertificateObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.CertificateObject{}
+}
+
+func (c *CertificateObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       key := CertificateObjectKey{
+               OverlayName:     overlay_name,
+               CertificateName: "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.CertificateObject)
+       meta_name := to.Metadata.Name
+       res_name := m[CertResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.CertificateName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.CertificateName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *CertificateObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.CertificateObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       v.Data = module.CertificateObjectData{
+               RootCA: "",
+               Ca:     "",
+               Key:    "",
+       }
+
+       return &v, err
+}
+
+func (c *CertificateObjectManager) GetDeviceCertName(name string) string {
+       device := module.DeviceObject{
+               Metadata: module.ObjectMetaData{name, "", "", ""}}
+       return device.GetCertName()
+}
+
+func GetRootCA(overlay_name string) string {
+       overlay := GetManagerset().Overlay
+       cu, _ := GetCertUtil()
+
+       root_ca := cu.GetSelfSignedCA()
+       interim_ca, _, _ := overlay.GetCertificate(overlay_name)
+
+       root_ca += interim_ca
+
+       return root_ca
+}
+
+func GetRootBaseCA() string {
+       cu, _ := GetCertUtil()
+
+       root_ca := cu.GetSelfSignedCA()
+
+       return root_ca
+}
+
+func (c *CertificateObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // Create Certificate
+       overlay := GetManagerset().Overlay
+       overlay_name := m[OverlayResource]
+       cert_name := c.GetDeviceCertName(t.GetMetadata().Name)
+
+       ca, key, err := overlay.CreateCertificate(overlay_name, cert_name)
+       if err != nil {
+               log.Println(err)
+               return c.CreateEmptyObject(), err
+       }
+
+       // DB Operation
+       t, err = GetDBUtils().CreateObject(c, m, t)
+
+       // Fill Certificate data
+       if err == nil {
+               to := t.(*module.CertificateObject)
+               to.Data.RootCA = base64.StdEncoding.EncodeToString([]byte(GetRootCA(overlay_name)))
+               to.Data.Ca = base64.StdEncoding.EncodeToString([]byte(ca))
+               to.Data.Key = base64.StdEncoding.EncodeToString([]byte(key))
+
+               return t, nil
+       } else {
+               log.Println(err)
+               return c.CreateEmptyObject(), err
+       }
+}
+
+func (c *CertificateObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       if err == nil {
+               overlay := GetManagerset().Overlay
+               overlay_name := m[OverlayResource]
+               cert_name := c.GetDeviceCertName(t.GetMetadata().Name)
+
+               ca, key, err := overlay.CreateCertificate(overlay_name, cert_name)
+               if err != nil {
+                       log.Println(err)
+                       return c.CreateEmptyObject(), err
+               }
+
+               to := t.(*module.CertificateObject)
+               to.Data.RootCA = base64.StdEncoding.EncodeToString([]byte(GetRootCA(overlay_name)))
+               to.Data.Ca = base64.StdEncoding.EncodeToString([]byte(ca))
+               to.Data.Key = base64.StdEncoding.EncodeToString([]byte(key))
+
+               return t, nil
+       } else {
+               log.Println(err)
+               return c.CreateEmptyObject(), err
+       }
+}
+
+func (c *CertificateObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *CertificateObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *CertificateObjectManager) DeleteObject(m map[string]string) error {
+       t, err := c.GetObject(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Certificate is not available")
+       }
+
+       // Delete certificate
+       overlay := GetManagerset().Overlay
+       cert_name := c.GetDeviceCertName(t.GetMetadata().Name)
+
+       log.Println("Delete Certificate: " + cert_name)
+       overlay.DeleteCertificate(cert_name)
+
+       // DB Operation
+       err = GetDBUtils().DeleteObject(c, m)
+
+       return err
+}
+
+// Create or Get certificate for a device
+func (c *CertificateObjectManager) GetOrCreateDC(overlay_name string, dev_name string) (string, string, string, error) {
+       m := make(map[string]string)
+       m[OverlayResource] = overlay_name
+       t := &module.CertificateObject{Metadata: module.ObjectMetaData{dev_name, "", "", ""}}
+
+       _, err := c.CreateObject(m, t)
+       if err != nil {
+               return "", "", "", err
+       }
+
+       return t.Data.RootCA, t.Data.Ca, t.Data.Key, nil
+}
+
+// Delete certificate for a device
+func (c *CertificateObjectManager) DeleteDC(overlay_name string, dev_name string) error {
+       m := make(map[string]string)
+       m[OverlayResource] = overlay_name
+       m[CertResource] = dev_name
+
+       return c.DeleteObject(m)
+}
index c0be5b7..18757d1 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "log"\r
-    "context"\r
-    "time"\r
-    pkgerrors "github.com/pkg/errors"\r
-    kclient "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"\r
-    cmmeta "github.com/jetstack/cert-manager/pkg/apis/meta/v1"\r
-    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"\r
-    "k8s.io/apimachinery/pkg/util/wait"\r
-    v1 "k8s.io/api/core/v1"\r
-    corev1 "k8s.io/client-go/kubernetes/typed/core/v1"\r
-    certmanagerv1beta1 "github.com/jetstack/cert-manager/pkg/client/clientset/versioned/typed/certmanager/v1beta1"\r
-    v1beta1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1beta1"\r
-)\r
-\r
-const SELFSIGNEDCA = "sdewan-controller"\r
-\r
-type CertUtil struct {\r
-    client certmanagerv1beta1.CertmanagerV1beta1Interface\r
-    k8sclient corev1.CoreV1Interface\r
-}\r
-\r
-var certutil = CertUtil{}\r
-\r
-func GetCertUtil() (*CertUtil, error) {\r
-    var err error\r
-    if certutil.client == nil || certutil.k8sclient == nil {\r
-        certutil.client, certutil.k8sclient, err = kclient.NewClient("", "", []byte{}).GetCMClients()\r
-    }\r
-\r
-    return &certutil, err\r
-}\r
-\r
-func (c *CertUtil) CreateNamespace(name string) (*v1.Namespace, error) {\r
-    ns, err := c.k8sclient.Namespaces().Get(context.TODO(), name, metav1.GetOptions{})\r
-    if err == nil {\r
-        return ns, nil\r
-    }\r
-\r
-    log.Println("Create Namespace: " + name)\r
-    return c.k8sclient.Namespaces().Create(context.TODO(), &v1.Namespace{\r
-        ObjectMeta: metav1.ObjectMeta{\r
-            Name: name,\r
-        },\r
-    }, metav1.CreateOptions{})\r
-}\r
-\r
-func (c *CertUtil) DeleteNamespace(name string) error {\r
-    return c.k8sclient.Namespaces().Delete(context.TODO(), name, metav1.DeleteOptions{})\r
-}\r
-\r
-func (c *CertUtil) GetIssuer(name string, namespace string) (*v1beta1.Issuer, error) {\r
-    return c.client.Issuers(namespace).Get(context.TODO(), name, metav1.GetOptions{})\r
-}\r
-\r
-func (c *CertUtil) DeleteIssuer(name string, namespace string) error {\r
-    return c.client.Issuers(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})\r
-}\r
-\r
-func (c *CertUtil) CreateSelfSignedIssuer(name string, namespace string) (*v1beta1.Issuer, error) {\r
-    issuer, err := c.GetIssuer(name, namespace)\r
-    if err == nil {\r
-        return issuer, nil\r
-    }\r
-\r
-    // Not existing issuer, create a new one\r
-    return c.client.Issuers(namespace).Create(context.TODO(), &v1beta1.Issuer{\r
-        ObjectMeta: metav1.ObjectMeta{\r
-            Name: name,\r
-        },\r
-        Spec: v1beta1.IssuerSpec{\r
-            IssuerConfig: v1beta1.IssuerConfig{\r
-                SelfSigned: &v1beta1.SelfSignedIssuer{\r
-                },\r
-            },\r
-        },\r
-    }, metav1.CreateOptions{})\r
-}\r
-\r
-func (c *CertUtil) CreateCAIssuer(name string, namespace string, caname string) (*v1beta1.Issuer, error) {\r
-    issuer, err := c.GetIssuer(name, namespace)\r
-    if err == nil {\r
-        return issuer, nil\r
-    }\r
-\r
-    // Not existing issuer, create a new one\r
-    return c.client.Issuers(namespace).Create(context.TODO(), &v1beta1.Issuer{\r
-        ObjectMeta: metav1.ObjectMeta{\r
-            Name: name,\r
-        },\r
-        Spec: v1beta1.IssuerSpec{\r
-            IssuerConfig: v1beta1.IssuerConfig{\r
-                CA: &v1beta1.CAIssuer{\r
-                    SecretName: c.GetCertSecretName(caname),\r
-                },\r
-            },\r
-        },\r
-    }, metav1.CreateOptions{})\r
-}\r
-\r
-func (c *CertUtil) GetCertSecretName(name string) string {\r
-    return name + "-cert-secret"\r
-}\r
-\r
-func (c *CertUtil) GetCertificate(name string, namespace string) (*v1beta1.Certificate, error) {\r
-    return c.client.Certificates(namespace).Get(context.TODO(), name, metav1.GetOptions{})\r
-}\r
-\r
-func (c *CertUtil) DeleteCertificate(name string, namespace string) error {\r
-    return c.client.Certificates(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})\r
-}\r
-\r
-func (c *CertUtil) CreateCertificate(name string, namespace string, issuer string, isCA bool) (*v1beta1.Certificate, error) {\r
-    cert, err := c.GetCertificate(name, namespace)\r
-    if err == nil {\r
-        return cert, nil\r
-    }\r
-\r
-    // Not existing cert, create a new one\r
-    // Todo: add Duration, RenewBefore, DNSNames\r
-    cert, err = c.client.Certificates(namespace).Create(context.TODO(), &v1beta1.Certificate{\r
-        ObjectMeta: metav1.ObjectMeta{\r
-            Name: name,\r
-        },\r
-        Spec: v1beta1.CertificateSpec{\r
-            CommonName: name,\r
-            // Duration: duration,\r
-            // RenewBefore: renewBefore,\r
-            // DNSNames: dnsNames,\r
-            SecretName: c.GetCertSecretName(name),\r
-            IssuerRef: cmmeta.ObjectReference {\r
-                Name: issuer,\r
-                Kind: "Issuer",\r
-            },\r
-            IsCA: isCA,\r
-        },\r
-    }, metav1.CreateOptions{})\r
-\r
-    if err == nil {\r
-        if c.IsCertReady(name, namespace) {\r
-            return cert, nil\r
-        } else {\r
-            return cert, pkgerrors.New("Failed to get certificate " + name)\r
-        }\r
-    }\r
-\r
-    return cert, err\r
-}\r
-\r
-func (c *CertUtil) IsCertReady(name string, namespace string) bool {\r
-    err := wait.PollImmediate(time.Second, time.Second*20,\r
-        func() (bool, error) {\r
-            var err error\r
-            var crt *v1beta1.Certificate\r
-            crt, err = c.GetCertificate(name, namespace)\r
-            if err != nil {\r
-                log.Println("Failed to find certificate " + name + ": " + err.Error())\r
-                return false, err\r
-            }\r
-            curConditions := crt.Status.Conditions\r
-            for _, cond := range curConditions {\r
-                if v1beta1.CertificateConditionReady == cond.Type && cmmeta.ConditionTrue == cond.Status {\r
-                    return true, nil\r
-                }\r
-            }\r
-            log.Println("Waiting for Certificate " + name + " to be ready.")\r
-            return false, nil\r
-        },\r
-    )\r
-\r
-    if err != nil {\r
-        log.Println(err)\r
-        return false\r
-    }\r
-\r
-    return true\r
-}\r
-\r
-func (c *CertUtil) GetKeypair(certname string, namespace string) (string, string, error) {\r
-    secret, err := c.k8sclient.Secrets(namespace).Get(\r
-        context.TODO(),\r
-        c.GetCertSecretName(certname),\r
-        metav1.GetOptions{})\r
-    if err != nil {\r
-        log.Println("Failed to get certificate's key pair: " + err.Error())\r
-        return "", "", err\r
-    }\r
-\r
-    return string(secret.Data["tls.crt"]), string(secret.Data["tls.key"]), nil\r
-}\r
-\r
-func (c *CertUtil) GetSelfSignedCA() (string) {\r
-       ca, _, _ := c.GetKeypair(RootCertName, NameSpaceName)\r
-    return ca\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "context"
+       kclient "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"
+       v1beta1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1beta1"
+       cmmeta "github.com/jetstack/cert-manager/pkg/apis/meta/v1"
+       certmanagerv1beta1 "github.com/jetstack/cert-manager/pkg/client/clientset/versioned/typed/certmanager/v1beta1"
+       pkgerrors "github.com/pkg/errors"
+       v1 "k8s.io/api/core/v1"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/apimachinery/pkg/util/wait"
+       corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
+       "log"
+       "time"
+)
+
+const SELFSIGNEDCA = "sdewan-controller"
+
+type CertUtil struct {
+       client    certmanagerv1beta1.CertmanagerV1beta1Interface
+       k8sclient corev1.CoreV1Interface
+}
+
+var certutil = CertUtil{}
+
+func GetCertUtil() (*CertUtil, error) {
+       var err error
+       if certutil.client == nil || certutil.k8sclient == nil {
+               certutil.client, certutil.k8sclient, err = kclient.NewClient("", "", []byte{}).GetCMClients()
+       }
+
+       return &certutil, err
+}
+
+func (c *CertUtil) CreateNamespace(name string) (*v1.Namespace, error) {
+       ns, err := c.k8sclient.Namespaces().Get(context.TODO(), name, metav1.GetOptions{})
+       if err == nil {
+               return ns, nil
+       }
+
+       log.Println("Create Namespace: " + name)
+       return c.k8sclient.Namespaces().Create(context.TODO(), &v1.Namespace{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name: name,
+               },
+       }, metav1.CreateOptions{})
+}
+
+func (c *CertUtil) DeleteNamespace(name string) error {
+       return c.k8sclient.Namespaces().Delete(context.TODO(), name, metav1.DeleteOptions{})
+}
+
+func (c *CertUtil) GetIssuer(name string, namespace string) (*v1beta1.Issuer, error) {
+       return c.client.Issuers(namespace).Get(context.TODO(), name, metav1.GetOptions{})
+}
+
+func (c *CertUtil) DeleteIssuer(name string, namespace string) error {
+       return c.client.Issuers(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
+}
+
+func (c *CertUtil) CreateSelfSignedIssuer(name string, namespace string) (*v1beta1.Issuer, error) {
+       issuer, err := c.GetIssuer(name, namespace)
+       if err == nil {
+               return issuer, nil
+       }
+
+       // Not existing issuer, create a new one
+       return c.client.Issuers(namespace).Create(context.TODO(), &v1beta1.Issuer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name: name,
+               },
+               Spec: v1beta1.IssuerSpec{
+                       IssuerConfig: v1beta1.IssuerConfig{
+                               SelfSigned: &v1beta1.SelfSignedIssuer{},
+                       },
+               },
+       }, metav1.CreateOptions{})
+}
+
+func (c *CertUtil) CreateCAIssuer(name string, namespace string, caname string) (*v1beta1.Issuer, error) {
+       issuer, err := c.GetIssuer(name, namespace)
+       if err == nil {
+               return issuer, nil
+       }
+
+       // Not existing issuer, create a new one
+       return c.client.Issuers(namespace).Create(context.TODO(), &v1beta1.Issuer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name: name,
+               },
+               Spec: v1beta1.IssuerSpec{
+                       IssuerConfig: v1beta1.IssuerConfig{
+                               CA: &v1beta1.CAIssuer{
+                                       SecretName: c.GetCertSecretName(caname),
+                               },
+                       },
+               },
+       }, metav1.CreateOptions{})
+}
+
+func (c *CertUtil) GetCertSecretName(name string) string {
+       return name + "-cert-secret"
+}
+
+func (c *CertUtil) GetCertificate(name string, namespace string) (*v1beta1.Certificate, error) {
+       return c.client.Certificates(namespace).Get(context.TODO(), name, metav1.GetOptions{})
+}
+
+func (c *CertUtil) DeleteCertificate(name string, namespace string) error {
+       return c.client.Certificates(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
+}
+
+func (c *CertUtil) CreateCertificate(name string, namespace string, issuer string, isCA bool) (*v1beta1.Certificate, error) {
+       cert, err := c.GetCertificate(name, namespace)
+       if err == nil {
+               return cert, nil
+       }
+
+       // Not existing cert, create a new one
+       // Todo: add Duration, RenewBefore, DNSNames
+       cert, err = c.client.Certificates(namespace).Create(context.TODO(), &v1beta1.Certificate{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name: name,
+               },
+               Spec: v1beta1.CertificateSpec{
+                       CommonName: name,
+                       // Duration: duration,
+                       // RenewBefore: renewBefore,
+                       // DNSNames: dnsNames,
+                       SecretName: c.GetCertSecretName(name),
+                       IssuerRef: cmmeta.ObjectReference{
+                               Name: issuer,
+                               Kind: "Issuer",
+                       },
+                       IsCA: isCA,
+               },
+       }, metav1.CreateOptions{})
+
+       if err == nil {
+               if c.IsCertReady(name, namespace) {
+                       return cert, nil
+               } else {
+                       return cert, pkgerrors.New("Failed to get certificate " + name)
+               }
+       }
+
+       return cert, err
+}
+
+func (c *CertUtil) IsCertReady(name string, namespace string) bool {
+       err := wait.PollImmediate(time.Second, time.Second*20,
+               func() (bool, error) {
+                       var err error
+                       var crt *v1beta1.Certificate
+                       crt, err = c.GetCertificate(name, namespace)
+                       if err != nil {
+                               log.Println("Failed to find certificate " + name + ": " + err.Error())
+                               return false, err
+                       }
+                       curConditions := crt.Status.Conditions
+                       for _, cond := range curConditions {
+                               if v1beta1.CertificateConditionReady == cond.Type && cmmeta.ConditionTrue == cond.Status {
+                                       return true, nil
+                               }
+                       }
+                       log.Println("Waiting for Certificate " + name + " to be ready.")
+                       return false, nil
+               },
+       )
+
+       if err != nil {
+               log.Println(err)
+               return false
+       }
+
+       return true
+}
+
+func (c *CertUtil) GetKeypair(certname string, namespace string) (string, string, error) {
+       secret, err := c.k8sclient.Secrets(namespace).Get(
+               context.TODO(),
+               c.GetCertSecretName(certname),
+               metav1.GetOptions{})
+       if err != nil {
+               log.Println("Failed to get certificate's key pair: " + err.Error())
+               return "", "", err
+       }
+
+       return string(secret.Data["tls.crt"]), string(secret.Data["tls.key"]), nil
+}
+
+func (c *CertUtil) GetSelfSignedCA() string {
+       ca, _, _ := c.GetKeypair(RootCertName, NameSpaceName)
+       return ca
+}
index 3e44b27..408862d 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "encoding/json"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-\r
-    "k8s.io/apimachinery/pkg/runtime/schema"\r
-    "log"\r
-)\r
-\r
-type CNFObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    ClusterName string `json:"cluster-name"`\r
-    CNFName string `json:"cnf-name"`\r
-}\r
-\r
-// CNFObjectManager implements the ControllerObjectManager\r
-type CNFObjectManager struct {\r
-    BaseObjectManager\r
-    isHub bool\r
-}\r
-\r
-func NewCNFObjectManager(isHub bool) *CNFObjectManager {\r
-    object_meta := "cnf"\r
-    if isHub {\r
-        object_meta = "hub-" + object_meta\r
-    } else {\r
-        object_meta = "device-" + object_meta\r
-    }\r
-\r
-    return &CNFObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    object_meta,\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-        isHub,\r
-    }\r
-}\r
-\r
-func (c *CNFObjectManager) GetResourceName() string {\r
-    return CNFResource\r
-}\r
-\r
-func (c *CNFObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "GETS" {\r
-        return true\r
-    }\r
-    return false\r
-}\r
-\r
-func (c *CNFObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.CNFObject{}\r
-}\r
-\r
-func (c *CNFObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    cluster_name := ""\r
-    if c.isHub {\r
-        cluster_name = m[HubResource]\r
-    } else {\r
-        cluster_name = m[DeviceResource]\r
-    }\r
-\r
-    key := CNFObjectKey{\r
-        OverlayName: overlay_name,\r
-        ClusterName: cluster_name,\r
-        CNFName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.CNFObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[CNFResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        } \r
-\r
-        key.CNFName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")  \r
-        }\r
-\r
-        key.CNFName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *CNFObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.CNFObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *CNFObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *CNFObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *CNFObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    overlay_name := m[OverlayResource]\r
-    var cobj module.ControllerObject\r
-    var cluster_name string\r
-    var err error\r
-\r
-    if c.isHub {\r
-        cluster_name = m[HubResource]\r
-       hub_name := m[HubResource]\r
-        hub_manager := GetManagerset().Hub\r
-        cobj, err = hub_manager.GetObject(m)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Hub " + hub_name + " is not defined")\r
-        }\r
-    } else {\r
-        cluster_name = m[DeviceResource]\r
-       device_name := m[DeviceResource]\r
-        dev_manager := GetManagerset().Device\r
-        cobj, err = dev_manager.GetObject(m)\r
-        if err != nil {\r
-            //return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device " + device_name + " is not defined")\r
-           return []module.ControllerObject{}, pkgerrors.Wrap(err, "Device " + device_name + " is not defined")\r
-        }\r
-    }\r
-\r
-    // Query CNFStatus\r
-    resutil := NewResUtil()\r
-\r
-//    cobj = &module.DeviceObject{\r
-  //              Metadata: module.ObjectMetaData{"local", "", "", ""}, \r
-    //            Specification: module.DeviceObjectSpec{}}\r
-\r
-    res := QueryResource{\r
-                Resource: ReadResource {\r
-                    Gvk: schema.GroupVersionKind{Group: "batch.sdewan.akraino.org", Version: "v1alpha1", Kind:"CNFStatus"},\r
-                    Name: "cnf-status",\r
-                    Namespace: "sdewan-system",\r
-                }}\r
-//    res := QueryResource{\r
-//                Resource: ReadResource {\r
-//                    Gvk: schema.GroupVersionKind{Group: "", Version: "v1", Kind:"ConfigMap"},\r
-//                    Name: "mycm",\r
-//                    Namespace: "default",\r
-//                }}\r
-    resutil.AddQueryResource(cobj, res)\r
-    ctx_id, err := resutil.Query("ewo-query-app")\r
-\r
-    if err != nil {\r
-        log.Println(err)\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to Query CNFs")\r
-    }\r
-\r
-    // Todo: save ctx_id in DB\r
-    log.Println(ctx_id)\r
-    // val, err := resutil.GetResourceData(&deviceObject, "default", "mycm")\r
-    val, err := resutil.GetResourceData(cobj, "sdewan-system", "cnf-status")\r
-    if err != nil {\r
-        log.Println(err)\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "CNF information is not available")\r
-    }\r
-\r
-    log.Println(val)\r
-    status, err := c.ParseStatus(val)\r
-    if err != nil {\r
-        log.Println(err)\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "CNF information is not available")\r
-    }\r
-\r
-    return []module.ControllerObject{&module.CNFObject{\r
-        Metadata: module.ObjectMetaData{overlay_name+"."+cluster_name, "cnf informaiton", "", ""},\r
-        Status: status,\r
-    }}, nil\r
-}\r
-\r
-func (c *CNFObjectManager) ParseStatus(val string) (string, error) {\r
-/*    val = `{"apiVersion":"batch.sdewan.akraino.org/v1alpha1",\r
-"kind":"CNFStatus",\r
-"metadata":{"creationTimestamp":"2021-04-06T04:51:18Z","generation":1,"managedFields":[{"apiVersion":"batch.sdewan.akraino.org/v1alpha1","fieldsType":"FieldsV1","fieldsV1":{"f:spec":{},"f:status":{".":{},"f:appliedGeneration":{},"f:appliedTime":{},"f:information":{}}},"manager":"manager","operation":"Update","time":"2021-05-07T09:42:18Z"}],"name":"cnf-status","namespace":"sdewan-system","resourceVersion":"29161589","uid":"940de684-ca24-4686-9f3f-2bad0c099bc2"},\r
-"spec":{},\r
-"status":{"appliedGeneration":1,"appliedTime":"2021-05-28T06:43:48Z","information":[{"ip":"10.233.97.182","name":"sdewan-test-7bb68cd886-b7ntl","namespace":"default","node":"master","purpose":"sdewan-test","status":"Not Available"},{"ip":"10.233.97.155","name":"sdewan-raw-cnf-9fdcd875c-qkvhk","namespace":"default","node":"master","purpose":"sdewan-raw-cnf","status":"Not Available"},{"ip":"10.233.97.158","name":"sdewan-safe-6555988556-fhmvw","namespace":"default","node":"master","purpose":"sdewan-safe","status":"Not Available"},{"ip":"10.233.97.144","name":"sdewan-edge-a-7fb6b8bbf6-lvs5d","namespace":"default","node":"master","purpose":"sdewan-edge-a","status":"Not Available"}]}}`\r
-*/\r
-    var vi interface{}\r
-    err := json.Unmarshal([]byte(val), &vi)\r
-    if err != nil {\r
-        return "", err\r
-    }\r
-\r
-    status := vi.(map[string]interface{})["status"]\r
-    status_val, err := json.Marshal(status)\r
-\r
-    //status_val, err := status\r
-    if err != nil {\r
-        return "", err\r
-    }\r
-\r
-    log.Println("_____________-----")\r
-    log.Println(string(status_val))\r
-    return string(status_val), nil\r
-/*\r
-    status := vi.(map[string]interface{})["metadata"].(map[string]interface{})["annotations"].(map[string]interface{})["kubectl.kubernetes.io/last-applied-configuration"]\r
-    return status.(string), nil\r
-    */\r
-}\r
-\r
-func (c *CNFObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *CNFObjectManager) DeleteObject(m map[string]string) error {\r
-    return pkgerrors.New("Not implemented")\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+
+       "k8s.io/apimachinery/pkg/runtime/schema"
+       "log"
+)
+
+type CNFObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       ClusterName string `json:"cluster-name"`
+       CNFName     string `json:"cnf-name"`
+}
+
+// CNFObjectManager implements the ControllerObjectManager
+type CNFObjectManager struct {
+       BaseObjectManager
+       isHub bool
+}
+
+func NewCNFObjectManager(isHub bool) *CNFObjectManager {
+       object_meta := "cnf"
+       if isHub {
+               object_meta = "hub-" + object_meta
+       } else {
+               object_meta = "device-" + object_meta
+       }
+
+       return &CNFObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        object_meta,
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+               isHub,
+       }
+}
+
+func (c *CNFObjectManager) GetResourceName() string {
+       return CNFResource
+}
+
+func (c *CNFObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "GETS" {
+               return true
+       }
+       return false
+}
+
+func (c *CNFObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.CNFObject{}
+}
+
+func (c *CNFObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       cluster_name := ""
+       if c.isHub {
+               cluster_name = m[HubResource]
+       } else {
+               cluster_name = m[DeviceResource]
+       }
+
+       key := CNFObjectKey{
+               OverlayName: overlay_name,
+               ClusterName: cluster_name,
+               CNFName:     "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.CNFObject)
+       meta_name := to.Metadata.Name
+       res_name := m[CNFResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.CNFName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.CNFName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *CNFObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.CNFObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *CNFObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *CNFObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *CNFObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       overlay_name := m[OverlayResource]
+       var cobj module.ControllerObject
+       var cluster_name string
+       var err error
+
+       if c.isHub {
+               cluster_name = m[HubResource]
+               hub_name := m[HubResource]
+               hub_manager := GetManagerset().Hub
+               cobj, err = hub_manager.GetObject(m)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Hub "+hub_name+" is not defined")
+               }
+       } else {
+               cluster_name = m[DeviceResource]
+               device_name := m[DeviceResource]
+               dev_manager := GetManagerset().Device
+               cobj, err = dev_manager.GetObject(m)
+               if err != nil {
+                       //return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device " + device_name + " is not defined")
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Device "+device_name+" is not defined")
+               }
+       }
+
+       // Query CNFStatus
+       resutil := NewResUtil()
+
+       res := QueryResource{
+               Resource: ReadResource{
+                       Gvk:       schema.GroupVersionKind{Group: "batch.sdewan.akraino.org", Version: "v1alpha1", Kind: "CNFStatus"},
+                       Name:      "cnf-status",
+                       Namespace: "sdewan-system",
+               },
+       }
+
+       resutil.AddQueryResource(cobj, res)
+       ctx_id, err := resutil.Query("ewo-query-app")
+
+       if err != nil {
+               log.Println(err)
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to Query CNFs")
+       }
+
+       // Todo: save ctx_id in DB
+       log.Println(ctx_id)
+       val, err := resutil.GetResourceData(cobj, "sdewan-system", "cnf-status")
+       if err != nil {
+               log.Println(err)
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "CNF information is not available")
+       }
+
+       status, err := c.ParseStatus(val)
+       if err != nil {
+               log.Println(err)
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "CNF information is not available")
+       }
+
+       return []module.ControllerObject{&module.CNFObject{
+               Metadata: module.ObjectMetaData{overlay_name + "." + cluster_name, "cnf informaiton", "", ""},
+               Status:   status,
+       }}, nil
+}
+
+func (c *CNFObjectManager) ParseStatus(val string) (string, error) {
+       var vi interface{}
+       err := json.Unmarshal([]byte(val), &vi)
+       if err != nil {
+               return "", err
+       }
+
+       status := vi.(map[string]interface{})["status"]
+       status_val, err := json.Marshal(status)
+
+       if err != nil {
+               return "", err
+       }
+
+       return string(status_val), nil
+}
+
+func (c *CNFObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *CNFObjectManager) DeleteObject(m map[string]string) error {
+       return pkgerrors.New("Not implemented")
+}
index 82b788c..cfccc4b 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "log"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"    \r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type ConnectionManager struct {\r
-    storeName           string\r
-    tagMeta             string\r
-}\r
-\r
-type ConnectionKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    End1 string `json:"end1-name"`\r
-    End2 string `json:"end2-name"`\r
-}\r
-\r
-var connutil = ConnectionManager{\r
-            storeName:  StoreName,\r
-            tagMeta:    "connection",\r
-        }\r
-\r
-func GetConnectionManager() *ConnectionManager {\r
-    return &connutil\r
-}\r
-\r
-func (c *ConnectionManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.ConnectionObject{}\r
-}\r
-\r
-func (c *ConnectionManager) GetStoreName() string {\r
-    return c.storeName\r
-}\r
-\r
-func (c *ConnectionManager) GetStoreMeta() string {\r
-    return c.tagMeta\r
-}\r
-\r
-\r
-func (c *ConnectionManager) Deploy(overlay string, cm module.ConnectionObject) error {\r
-    resutil := NewResUtil()\r
-\r
-    // add resource for End1\r
-    co1, _ := module.GetObjectBuilder().ToObject(cm.Info.End1.ConnObject)\r
-    for _, r_str := range cm.Info.End1.Resources {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co1, "create", r)\r
-    }\r
-    for _, r_str := range cm.Info.End1.ReservedRes {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co1, "create", r)\r
-    }\r
-\r
-    // add resource for End2\r
-    co2, _ := module.GetObjectBuilder().ToObject(cm.Info.End2.ConnObject)\r
-    for _, r_str := range cm.Info.End2.Resources {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co2, "create", r)\r
-    }\r
-    for _, r_str := range cm.Info.End2.ReservedRes {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co2, "create", r)\r
-    }\r
-\r
-    // Deploy resources\r
-    cid, err := resutil.Deploy(cm.Metadata.Name, "YAML")\r
-    if cm.Info.ContextId == "" {\r
-        cm.Info.ContextId = cid\r
-    } else {\r
-        cm.Info.ContextId = cm.Info.ContextId + "," + cid\r
-    }\r
-\r
-    if err != nil {\r
-       log.Println(err)\r
-        cm.Info.State = module.StateEnum.Error\r
-        cm.Info.ErrorMessage = err.Error()\r
-    } else {\r
-        cm.Info.State = module.StateEnum.Deployed\r
-    }\r
-\r
-    // Save to DB\r
-    _, err = c.UpdateObject(overlay, cm)\r
-\r
-    return err\r
-}\r
-\r
-func (c *ConnectionManager) Undeploy(overlay string, cm module.ConnectionObject) error {\r
-    resutil := NewResUtil()\r
-\r
-    // add resource for End1 (reservedRes will be kept)\r
-    co1, _ := module.GetObjectBuilder().ToObject(cm.Info.End1.ConnObject)\r
-    for _, r_str := range cm.Info.End1.Resources {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co1, "create", r)\r
-    }\r
-\r
-    // add resource for End2 (reservedRes will be kept)\r
-    co2, _ := module.GetObjectBuilder().ToObject(cm.Info.End2.ConnObject)\r
-    for _, r_str := range cm.Info.End2.Resources {\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutil.AddResource(co2, "create", r)\r
-    }\r
-\r
-    // Undeploy resources\r
-    cid, err := resutil.Undeploy(cm.Metadata.Name, "YAML")\r
-    if cm.Info.ContextId == "" {\r
-        cm.Info.ContextId = cid\r
-    } else {\r
-        cm.Info.ContextId = cm.Info.ContextId + "," + cid\r
-    }\r
-\r
-    if err != nil {\r
-        log.Println(err)\r
-        cm.Info.State = module.StateEnum.Error\r
-        cm.Info.ErrorMessage = err.Error()\r
-    } else {\r
-        cm.Info.State = module.StateEnum.Undeployed\r
-    }\r
-\r
-    // Delete connection object\r
-    err = c.DeleteObject(overlay, cm.Info.End1.Name, cm.Info.End2.Name)\r
-\r
-    return err\r
-}\r
-\r
-func (c *ConnectionManager) UpdateObject(overlay string, cm module.ConnectionObject) (module.ControllerObject, error) {\r
-    key := ConnectionKey{\r
-        OverlayName: overlay,\r
-        End1: cm.Info.End1.Name,\r
-        End2: cm.Info.End2.Name,\r
-    }\r
-\r
-    err := db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), cm)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unable to create the object")\r
-    }\r
-    return &cm, err\r
-}\r
-\r
-func (c *ConnectionManager) GetObject(overlay string, key1 string, key2 string) (module.ControllerObject, error) {\r
-    key := ConnectionKey{\r
-        OverlayName: overlay,\r
-        End1: key1,\r
-        End2: key2,\r
-    }\r
-    value, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-\r
-    if value == nil {\r
-        key = ConnectionKey{\r
-            OverlayName: overlay,\r
-            End1: key2,\r
-            End2: key1,\r
-        }\r
-        value, err = db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())\r
-        if err != nil {\r
-            return c.CreateEmptyObject(), err\r
-        }\r
-    }\r
-\r
-    if value != nil {\r
-        r := c.CreateEmptyObject()\r
-        err = db.DBconn.Unmarshal(value[0], r)\r
-        if err != nil {\r
-            return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unmarshaling value")\r
-        }\r
-        return r, nil\r
-    }\r
-\r
-    return c.CreateEmptyObject(), pkgerrors.New("No Object")\r
-}\r
-\r
-func (c *ConnectionManager) GetObjects(overlay string, key string) ([]module.ControllerObject, error) {\r
-    key1 := ConnectionKey{\r
-        OverlayName: overlay,\r
-        End1: key,\r
-        End2: "",\r
-    }\r
-    key2 := ConnectionKey{\r
-        OverlayName: overlay,\r
-        End1: "",\r
-        End2: key,\r
-    }\r
-    \r
-    var resp []module.ControllerObject\r
-\r
-    // find objects with end1=key\r
-    values, err := db.DBconn.Find(c.GetStoreName(), key1, c.GetStoreMeta())\r
-    if err != nil {\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")\r
-    }\r
-\r
-    for _, value := range values {\r
-        t := c.CreateEmptyObject()\r
-        err = db.DBconn.Unmarshal(value, t)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")\r
-        }\r
-        resp = append(resp, t)\r
-    }\r
-\r
-    // find objects with end2=key\r
-    values, err = db.DBconn.Find(c.GetStoreName(), key2, c.GetStoreMeta())\r
-    if err != nil {\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")\r
-    }\r
-\r
-    for _, value := range values {\r
-        t := c.CreateEmptyObject()\r
-        err = db.DBconn.Unmarshal(value, t)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")\r
-        }\r
-        resp = append(resp, t)\r
-    }\r
-\r
-    return resp, nil\r
-}\r
-\r
-func (c *ConnectionManager) DeleteObject(overlay string, key1 string, key2 string) error {\r
-    key := ConnectionKey{\r
-        OverlayName: overlay,\r
-        End1: key1,\r
-        End2: key2,\r
-    }\r
-\r
-    err := db.DBconn.Remove(c.GetStoreName(), key)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Delete Object")\r
-    }\r
-\r
-    return err\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "log"
+)
+
+type ConnectionManager struct {
+       storeName string
+       tagMeta   string
+}
+
+type ConnectionKey struct {
+       OverlayName string `json:"overlay-name"`
+       End1        string `json:"end1-name"`
+       End2        string `json:"end2-name"`
+}
+
+var connutil = ConnectionManager{
+       storeName: StoreName,
+       tagMeta:   "connection",
+}
+
+func GetConnectionManager() *ConnectionManager {
+       return &connutil
+}
+
+func (c *ConnectionManager) CreateEmptyObject() module.ControllerObject {
+       return &module.ConnectionObject{}
+}
+
+func (c *ConnectionManager) GetStoreName() string {
+       return c.storeName
+}
+
+func (c *ConnectionManager) GetStoreMeta() string {
+       return c.tagMeta
+}
+
+func (c *ConnectionManager) Deploy(overlay string, cm module.ConnectionObject) error {
+       resutil := NewResUtil()
+
+       // add resource for End1
+       co1, _ := module.GetObjectBuilder().ToObject(cm.Info.End1.ConnObject)
+       for _, r_str := range cm.Info.End1.Resources {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co1, "create", r)
+       }
+       for _, r_str := range cm.Info.End1.ReservedRes {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co1, "create", r)
+       }
+
+       // add resource for End2
+       co2, _ := module.GetObjectBuilder().ToObject(cm.Info.End2.ConnObject)
+       for _, r_str := range cm.Info.End2.Resources {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co2, "create", r)
+       }
+       for _, r_str := range cm.Info.End2.ReservedRes {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co2, "create", r)
+       }
+
+       // Deploy resources
+       cid, err := resutil.Deploy(cm.Metadata.Name, "YAML")
+       if cm.Info.ContextId == "" {
+               cm.Info.ContextId = cid
+       } else {
+               cm.Info.ContextId = cm.Info.ContextId + "," + cid
+       }
+
+       if err != nil {
+               log.Println(err)
+               cm.Info.State = module.StateEnum.Error
+               cm.Info.ErrorMessage = err.Error()
+       } else {
+               cm.Info.State = module.StateEnum.Deployed
+       }
+
+       // Save to DB
+       _, err = c.UpdateObject(overlay, cm)
+
+       return err
+}
+
+func (c *ConnectionManager) Undeploy(overlay string, cm module.ConnectionObject) error {
+       resutil := NewResUtil()
+
+       // add resource for End1 (reservedRes will be kept)
+       co1, _ := module.GetObjectBuilder().ToObject(cm.Info.End1.ConnObject)
+       for _, r_str := range cm.Info.End1.Resources {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co1, "create", r)
+       }
+
+       // add resource for End2 (reservedRes will be kept)
+       co2, _ := module.GetObjectBuilder().ToObject(cm.Info.End2.ConnObject)
+       for _, r_str := range cm.Info.End2.Resources {
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutil.AddResource(co2, "create", r)
+       }
+
+       // Undeploy resources
+       cid, err := resutil.Undeploy(cm.Metadata.Name, "YAML")
+       if cm.Info.ContextId == "" {
+               cm.Info.ContextId = cid
+       } else {
+               cm.Info.ContextId = cm.Info.ContextId + "," + cid
+       }
+
+       if err != nil {
+               log.Println(err)
+               cm.Info.State = module.StateEnum.Error
+               cm.Info.ErrorMessage = err.Error()
+       } else {
+               cm.Info.State = module.StateEnum.Undeployed
+       }
+
+       // Delete connection object
+       err = c.DeleteObject(overlay, cm.Info.End1.Name, cm.Info.End2.Name)
+
+       return err
+}
+
+func (c *ConnectionManager) UpdateObject(overlay string, cm module.ConnectionObject) (module.ControllerObject, error) {
+       key := ConnectionKey{
+               OverlayName: overlay,
+               End1:        cm.Info.End1.Name,
+               End2:        cm.Info.End2.Name,
+       }
+
+       err := db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), cm)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unable to create the object")
+       }
+       return &cm, err
+}
+
+func (c *ConnectionManager) GetObject(overlay string, key1 string, key2 string) (module.ControllerObject, error) {
+       key := ConnectionKey{
+               OverlayName: overlay,
+               End1:        key1,
+               End2:        key2,
+       }
+       value, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())
+       if err != nil {
+               return c.CreateEmptyObject(), err
+       }
+
+       if value == nil {
+               key = ConnectionKey{
+                       OverlayName: overlay,
+                       End1:        key2,
+                       End2:        key1,
+               }
+               value, err = db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())
+               if err != nil {
+                       return c.CreateEmptyObject(), err
+               }
+       }
+
+       if value != nil {
+               r := c.CreateEmptyObject()
+               err = db.DBconn.Unmarshal(value[0], r)
+               if err != nil {
+                       return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unmarshaling value")
+               }
+               return r, nil
+       }
+
+       return c.CreateEmptyObject(), pkgerrors.New("No Object")
+}
+
+func (c *ConnectionManager) GetObjects(overlay string, key string) ([]module.ControllerObject, error) {
+       key1 := ConnectionKey{
+               OverlayName: overlay,
+               End1:        key,
+               End2:        "",
+       }
+       key2 := ConnectionKey{
+               OverlayName: overlay,
+               End1:        "",
+               End2:        key,
+       }
+
+       var resp []module.ControllerObject
+
+       // find objects with end1=key
+       values, err := db.DBconn.Find(c.GetStoreName(), key1, c.GetStoreMeta())
+       if err != nil {
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")
+       }
+
+       for _, value := range values {
+               t := c.CreateEmptyObject()
+               err = db.DBconn.Unmarshal(value, t)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")
+               }
+               resp = append(resp, t)
+       }
+
+       // find objects with end2=key
+       values, err = db.DBconn.Find(c.GetStoreName(), key2, c.GetStoreMeta())
+       if err != nil {
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")
+       }
+
+       for _, value := range values {
+               t := c.CreateEmptyObject()
+               err = db.DBconn.Unmarshal(value, t)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")
+               }
+               resp = append(resp, t)
+       }
+
+       return resp, nil
+}
+
+func (c *ConnectionManager) DeleteObject(overlay string, key1 string, key2 string) error {
+       key := ConnectionKey{
+               OverlayName: overlay,
+               End1:        key1,
+               End2:        key2,
+       }
+
+       err := db.DBconn.Remove(c.GetStoreName(), key)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Delete Object")
+       }
+
+       return err
+}
index 9c65b4b..230fc72 100644 (file)
@@ -1,42 +1,42 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-const (\r
-    NameSpaceName = "sdewan-system"\r
-    RootIssuerName = "sdewan-controller"\r
-    RootCAIssuerName = "sdewan-controller-ca"\r
-    RootCertName = "sdewan-controller"\r
-    SCCCertName = "sdewan-controller-base"\r
-    StoreName = "centralcontroller"\r
-    OverlayCollection = "overlays"\r
-    OverlayResource = "overlay-name"\r
-    ProposalCollection = "proposals"\r
-    ProposalResource = "proposal-name"\r
-    HubCollection = "hubs"\r
-    HubResource = "hub-name"\r
-    ConnectionCollection = "connections"\r
-    ConnectionResource = "connection-name"\r
-    CNFCollection = "cnfs"\r
-    CNFResource = "cnf-name"\r
-    DeviceCollection = "devices"\r
-    DeviceResource = "device-name"\r
-    IPRangeCollection = "ipranges"\r
-    IPRangeResource = "iprange-name"\r
-    CertCollection = "certificates"\r
-    CertResource = "certificate-name"\r
-)
\ No newline at end of file
+/*
+ * 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 manager
+
+const (
+       NameSpaceName        = "sdewan-system"
+       RootIssuerName       = "sdewan-controller"
+       RootCAIssuerName     = "sdewan-controller-ca"
+       RootCertName         = "sdewan-controller"
+       SCCCertName          = "sdewan-controller-base"
+       StoreName            = "centralcontroller"
+       OverlayCollection    = "overlays"
+       OverlayResource      = "overlay-name"
+       ProposalCollection   = "proposals"
+       ProposalResource     = "proposal-name"
+       HubCollection        = "hubs"
+       HubResource          = "hub-name"
+       ConnectionCollection = "connections"
+       ConnectionResource   = "connection-name"
+       CNFCollection        = "cnfs"
+       CNFResource          = "cnf-name"
+       DeviceCollection     = "devices"
+       DeviceResource       = "device-name"
+       IPRangeCollection    = "ipranges"
+       IPRangeResource      = "iprange-name"
+       CertCollection       = "certificates"
+       CertResource         = "certificate-name"
+)
index 47ef43b..5802ab2 100644 (file)
@@ -1,75 +1,75 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-)\r
-\r
-// ControllerManager is an interface exposes the ControllerObject functionality\r
-type ControllerObjectManager interface {\r
-    GetStoreName() string\r
-    GetStoreMeta() string\r
-    GetDepResManagers() []ControllerObjectManager\r
-    AddDepResManager(mgr ControllerObjectManager)\r
-    GetOwnResManagers() []ControllerObjectManager\r
-    AddOwnResManager(mgr ControllerObjectManager) \r
-    \r
-    GetResourceName() string\r
-    IsOperationSupported(oper string) bool\r
-    GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error)\r
-    CreateEmptyObject() module.ControllerObject\r
-    ParseObject(r io.Reader) (module.ControllerObject, error)\r
-    CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error)\r
-    GetObject(m map[string]string) (module.ControllerObject, error)\r
-    GetObjects(m map[string]string) ([]module.ControllerObject, error)\r
-    UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error)\r
-    DeleteObject(m map[string]string) error\r
-}\r
-\r
-type BaseObjectManager struct {\r
-    storeName           string\r
-    tagMeta             string\r
-    depResManagers      []ControllerObjectManager\r
-    ownResManagers      []ControllerObjectManager\r
-}\r
-\r
-func (c *BaseObjectManager) GetStoreName() string {\r
-    return c.storeName\r
-}\r
-\r
-func (c *BaseObjectManager) GetStoreMeta() string {\r
-    return c.tagMeta\r
-}\r
-\r
-func (c *BaseObjectManager) GetDepResManagers() []ControllerObjectManager {\r
-    return c.depResManagers\r
-}\r
-\r
-func (c *BaseObjectManager) AddDepResManager(mgr ControllerObjectManager) {\r
-    c.depResManagers = append(c.depResManagers, mgr)\r
-}\r
-\r
-func (c *BaseObjectManager) GetOwnResManagers() []ControllerObjectManager {\r
-    return c.ownResManagers\r
-}\r
-\r
-func (c *BaseObjectManager) AddOwnResManager(mgr ControllerObjectManager) {\r
-    c.ownResManagers = append(c.ownResManagers, mgr)\r
-}
\ No newline at end of file
+/*
+ * 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 manager
+
+import (
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       "io"
+)
+
+// ControllerManager is an interface exposes the ControllerObject functionality
+type ControllerObjectManager interface {
+       GetStoreName() string
+       GetStoreMeta() string
+       GetDepResManagers() []ControllerObjectManager
+       AddDepResManager(mgr ControllerObjectManager)
+       GetOwnResManagers() []ControllerObjectManager
+       AddOwnResManager(mgr ControllerObjectManager)
+
+       GetResourceName() string
+       IsOperationSupported(oper string) bool
+       GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error)
+       CreateEmptyObject() module.ControllerObject
+       ParseObject(r io.Reader) (module.ControllerObject, error)
+       CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error)
+       GetObject(m map[string]string) (module.ControllerObject, error)
+       GetObjects(m map[string]string) ([]module.ControllerObject, error)
+       UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error)
+       DeleteObject(m map[string]string) error
+}
+
+type BaseObjectManager struct {
+       storeName      string
+       tagMeta        string
+       depResManagers []ControllerObjectManager
+       ownResManagers []ControllerObjectManager
+}
+
+func (c *BaseObjectManager) GetStoreName() string {
+       return c.storeName
+}
+
+func (c *BaseObjectManager) GetStoreMeta() string {
+       return c.tagMeta
+}
+
+func (c *BaseObjectManager) GetDepResManagers() []ControllerObjectManager {
+       return c.depResManagers
+}
+
+func (c *BaseObjectManager) AddDepResManager(mgr ControllerObjectManager) {
+       c.depResManagers = append(c.depResManagers, mgr)
+}
+
+func (c *BaseObjectManager) GetOwnResManagers() []ControllerObjectManager {
+       return c.ownResManagers
+}
+
+func (c *BaseObjectManager) AddOwnResManager(mgr ControllerObjectManager) {
+       c.ownResManagers = append(c.ownResManagers, mgr)
+}
index 005c130..6e1c008 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    rsync "github.com/open-ness/EMCO/src/rsync/pkg/db"\r
-    pkgerrors "github.com/pkg/errors"\r
-    mtypes "github.com/open-ness/EMCO/src/orchestrator/pkg/module/types"\r
-)\r
-\r
-const PROVIDERNAME = "akraino_scc"\r
-\r
-type Cluster struct {\r
-    Metadata mtypes.Metadata `json:"metadata"`\r
-}\r
-\r
-type ClusterContent struct {\r
-    Kubeconfig string `json:"kubeconfig"`\r
-}\r
-\r
-type ClusterKey struct {\r
-    ClusterProviderName string `json:"provider"`\r
-    ClusterName         string `json:"cluster"`\r
-}\r
-\r
-type DBUtils struct {\r
-}\r
-\r
-var dbutils = DBUtils{}\r
-\r
-func GetDBUtils() *DBUtils {\r
-    return &dbutils\r
-}\r
-\r
-func (d *DBUtils) CheckDep(c ControllerObjectManager, m map[string]string) error {\r
-    depsResManagers := c.GetDepResManagers()\r
-    for _, mgr := range depsResManagers {\r
-        _, err := d.GetObject(mgr, m)\r
-        if err != nil {\r
-            return pkgerrors.New("Fail to find " + mgr.GetStoreMeta())\r
-        }\r
-    }\r
-\r
-    return nil\r
-}\r
-\r
-func (d *DBUtils) CheckOwn(c ControllerObjectManager, m map[string]string) error {\r
-    depsOwnManagers := c.GetOwnResManagers()\r
-    for _, mgr := range depsOwnManagers {\r
-        objs, err := d.GetObjects(mgr, m)\r
-        if err == nil && len(objs) > 0 {\r
-            return pkgerrors.New("Sub-resource found : " + mgr.GetStoreMeta())\r
-        }\r
-    }\r
-    return nil\r
-}\r
-\r
-\r
-func (d *DBUtils) CreateObject(c ControllerObjectManager, m map[string]string,\r
-    t module.ControllerObject) (module.ControllerObject, error) {\r
-\r
-    key, _ := c.GetStoreKey(m, t, false)\r
-    err := db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), t)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.New("Unable to create the object")\r
-    }\r
-\r
-    return t, nil\r
-}\r
-\r
-func (d *DBUtils) GetObject(c ControllerObjectManager,\r
-    m map[string]string) (module.ControllerObject, error) {\r
-\r
-    key, err := c.GetStoreKey(m, c.CreateEmptyObject(), false)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-\r
-\r
-    value, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Get Resource")\r
-    }\r
-\r
-\r
-    if value != nil {\r
-        r := c.CreateEmptyObject()\r
-        err = db.DBconn.Unmarshal(value[0], r)\r
-        if err != nil {\r
-            return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unmarshaling value")\r
-        }\r
-        return r, nil\r
-    }\r
-\r
-    return c.CreateEmptyObject(), pkgerrors.New("No Object")\r
-}\r
-\r
-func (d *DBUtils) GetObjects(c ControllerObjectManager,\r
-    m map[string]string) ([]module.ControllerObject, error) {\r
-\r
-\r
-    key, err := c.GetStoreKey(m, c.CreateEmptyObject(), true)\r
-    if err != nil {\r
-        return []module.ControllerObject{}, err\r
-    }\r
-\r
-\r
-    values, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())\r
-    if err != nil {\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")\r
-    }\r
-\r
-\r
-    var resp []module.ControllerObject\r
-    for _, value := range values {\r
-        t := c.CreateEmptyObject()\r
-        err = db.DBconn.Unmarshal(value, t)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")\r
-        }\r
-        resp = append(resp, t)\r
-    }\r
-\r
-    return resp, nil\r
-}\r
-\r
-func (d *DBUtils) UpdateObject(c ControllerObjectManager,\r
-    m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-\r
-    key, err := c.GetStoreKey(m, t, false)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-\r
-    err = db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), t)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Updating DB Entry")\r
-    }\r
-    return t, nil\r
-}\r
-\r
-func (d *DBUtils) DeleteObject(c ControllerObjectManager, m map[string]string) error {\r
-    key, err := c.GetStoreKey(m, c.CreateEmptyObject(), false)\r
-    if err != nil {\r
-        return err\r
-    }\r
-\r
-    err = db.DBconn.Remove(c.GetStoreName(), key)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Delete Object")\r
-    }\r
-\r
-    return nil\r
-}\r
-\r
-func (d *DBUtils) RegisterDevice(cluster_name string, kubeconfig string) error {\r
-    ccc := rsync.NewCloudConfigClient()\r
-\r
-    config, _ := ccc.GetCloudConfig(PROVIDERNAME, cluster_name, "0", "default")\r
-    if config.Config != "" {\r
-        ccc.DeleteCloudConfig(PROVIDERNAME, cluster_name, "0", "default")\r
-    }\r
-\r
-    _, err := ccc.CreateCloudConfig(PROVIDERNAME, cluster_name, "0", "default", kubeconfig)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Error creating cloud config")\r
-    }\r
-\r
-    return nil\r
-}\r
-\r
-func (d *DBUtils) UnregisterDevice(cluster_name string) error {\r
-    ccc := rsync.NewCloudConfigClient()\r
-\r
-    err := ccc.DeleteCloudConfig(PROVIDERNAME, cluster_name, "0", "default")\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Error deleting cloud config")\r
-    }\r
-\r
-    return nil\r
-}\r
-\r
+/*
+ * 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 manager
+
+import (
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       mtypes "github.com/open-ness/EMCO/src/orchestrator/pkg/module/types"
+       rsync "github.com/open-ness/EMCO/src/rsync/pkg/db"
+       pkgerrors "github.com/pkg/errors"
+)
+
+const PROVIDERNAME = "akraino_scc"
+
+type Cluster struct {
+       Metadata mtypes.Metadata `json:"metadata"`
+}
+
+type ClusterContent struct {
+       Kubeconfig string `json:"kubeconfig"`
+}
+
+type ClusterKey struct {
+       ClusterProviderName string `json:"provider"`
+       ClusterName         string `json:"cluster"`
+}
+
+type DBUtils struct {
+}
+
+var dbutils = DBUtils{}
+
+func GetDBUtils() *DBUtils {
+       return &dbutils
+}
+
+func (d *DBUtils) CheckDep(c ControllerObjectManager, m map[string]string) error {
+       depsResManagers := c.GetDepResManagers()
+       for _, mgr := range depsResManagers {
+               _, err := d.GetObject(mgr, m)
+               if err != nil {
+                       return pkgerrors.New("Fail to find " + mgr.GetStoreMeta())
+               }
+       }
+
+       return nil
+}
+
+func (d *DBUtils) CheckOwn(c ControllerObjectManager, m map[string]string) error {
+       depsOwnManagers := c.GetOwnResManagers()
+       for _, mgr := range depsOwnManagers {
+               objs, err := d.GetObjects(mgr, m)
+               if err == nil && len(objs) > 0 {
+                       return pkgerrors.New("Sub-resource found : " + mgr.GetStoreMeta())
+               }
+       }
+       return nil
+}
+
+func (d *DBUtils) CreateObject(c ControllerObjectManager, m map[string]string,
+       t module.ControllerObject) (module.ControllerObject, error) {
+
+       key, _ := c.GetStoreKey(m, t, false)
+       err := db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), t)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.New("Unable to create the object")
+       }
+
+       return t, nil
+}
+
+func (d *DBUtils) GetObject(c ControllerObjectManager,
+       m map[string]string) (module.ControllerObject, error) {
+
+       key, err := c.GetStoreKey(m, c.CreateEmptyObject(), false)
+       if err != nil {
+               return c.CreateEmptyObject(), err
+       }
+
+       value, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Get Resource")
+       }
+
+       if value != nil {
+               r := c.CreateEmptyObject()
+               err = db.DBconn.Unmarshal(value[0], r)
+               if err != nil {
+                       return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Unmarshaling value")
+               }
+               return r, nil
+       }
+
+       return c.CreateEmptyObject(), pkgerrors.New("No Object")
+}
+
+func (d *DBUtils) GetObjects(c ControllerObjectManager,
+       m map[string]string) ([]module.ControllerObject, error) {
+
+       key, err := c.GetStoreKey(m, c.CreateEmptyObject(), true)
+       if err != nil {
+               return []module.ControllerObject{}, err
+       }
+
+       values, err := db.DBconn.Find(c.GetStoreName(), key, c.GetStoreMeta())
+       if err != nil {
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Get Overlay Objects")
+       }
+
+       var resp []module.ControllerObject
+       for _, value := range values {
+               t := c.CreateEmptyObject()
+               err = db.DBconn.Unmarshal(value, t)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Unmarshaling values")
+               }
+               resp = append(resp, t)
+       }
+
+       return resp, nil
+}
+
+func (d *DBUtils) UpdateObject(c ControllerObjectManager,
+       m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+
+       key, err := c.GetStoreKey(m, t, false)
+       if err != nil {
+               return c.CreateEmptyObject(), err
+       }
+
+       err = db.DBconn.Insert(c.GetStoreName(), key, nil, c.GetStoreMeta(), t)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Updating DB Entry")
+       }
+       return t, nil
+}
+
+func (d *DBUtils) DeleteObject(c ControllerObjectManager, m map[string]string) error {
+       key, err := c.GetStoreKey(m, c.CreateEmptyObject(), false)
+       if err != nil {
+               return err
+       }
+
+       err = db.DBconn.Remove(c.GetStoreName(), key)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Delete Object")
+       }
+
+       return nil
+}
+
+func (d *DBUtils) RegisterDevice(cluster_name string, kubeconfig string) error {
+       ccc := rsync.NewCloudConfigClient()
+
+       config, _ := ccc.GetCloudConfig(PROVIDERNAME, cluster_name, "0", "default")
+       if config.Config != "" {
+               ccc.DeleteCloudConfig(PROVIDERNAME, cluster_name, "0", "default")
+       }
+
+       _, err := ccc.CreateCloudConfig(PROVIDERNAME, cluster_name, "0", "default", kubeconfig)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Error creating cloud config")
+       }
+
+       return nil
+}
+
+func (d *DBUtils) UnregisterDevice(cluster_name string) error {
+       ccc := rsync.NewCloudConfigClient()
+
+       err := ccc.DeleteCloudConfig(PROVIDERNAME, cluster_name, "0", "default")
+       if err != nil {
+               return pkgerrors.Wrap(err, "Error deleting cloud config")
+       }
+
+       return nil
+}
index 3a043e5..8587a7e 100644 (file)
-/*\r
-* Copyright 2020 Intel Corporation, Inc\r
-*\r
-* Licensed under the Apache License, Version 2.0 (the "License");\r
-* you may not use this file except in compliance with the License.\r
-* You may obtain a copy of the License at\r
-*\r
-*     http://www.apache.org/licenses/LICENSE-2.0\r
-*\r
-* Unless required by applicable law or agreed to in writing, software\r
-* distributed under the License is distributed on an "AS IS" BASIS,\r
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-* See the License for the specific language governing permissions and\r
-* limitations under the License.\r
-*/\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "log"\r
-    //"strconv"\r
-    "encoding/json"\r
-    "encoding/base64"\r
-    "strings"\r
-    "time"\r
-    "github.com/matryer/runner"\r
-\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    //"github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-const SCC_RESOURCE = "scc_ipsec_resource"\r
-const RegStatus = "RegStatus"\r
-\r
-var ips []string\r
-var task *runner.Task\r
-\r
-type DeviceObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    DeviceName string `json:"device-name"`\r
-}\r
-\r
-// DeviceObjectManager implements the ControllerObjectManager\r
-type DeviceObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewDeviceObjectManager() *DeviceObjectManager {\r
-    return &DeviceObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "device",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *DeviceObjectManager) GetResourceName() string {\r
-    return DeviceResource\r
-}\r
-\r
-func (c *DeviceObjectManager) IsOperationSupported(oper string) bool {\r
-    return true\r
-}\r
-\r
-func (c *DeviceObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.DeviceObject{}\r
-}\r
-\r
-func (c *DeviceObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    key := DeviceObjectKey{\r
-        OverlayName: overlay_name,\r
-        DeviceName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.DeviceObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[DeviceResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        }\r
-\r
-        key.DeviceName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")\r
-        }\r
-\r
-        key.DeviceName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *DeviceObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.DeviceObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    // initial Status\r
-    v.Status.Data = make(map[string]string)\r
-    return &v, err\r
-}\r
-\r
-func (c *DeviceObjectManager) PreProcessing(m map[string]string, t module.ControllerObject) error {\r
-    to := t.(*module.DeviceObject)\r
-\r
-    ipr_manager := GetManagerset().IPRange\r
-    kubeutil := GetKubeConfigUtil()\r
-\r
-    local_public_ips := to.Specification.PublicIps\r
-    kube_config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Fail to decode kubeconfig")\r
-    }\r
-\r
-    // Set the Register status to pending\r
-    to.Status.Data[RegStatus] = "pending"\r
-\r
-    if len(local_public_ips) > 0{\r
-        // Use public IP as external connection\r
-        to.Status.Mode = 1\r
-\r
-        kube_config, local_public_ip, err := kubeutil.checkKubeConfigAvail(kube_config, local_public_ips, "6443")\r
-        if err != nil {\r
-            return pkgerrors.Wrap(err, "Fail to verify public ip")\r
-        }\r
-\r
-        // Set IP in device\r
-        log.Println("Use public ip " + local_public_ip)\r
-        to.Status.Ip = local_public_ip\r
-\r
-        // Set new kubeconfig in device\r
-        to.Specification.KubeConfig = base64.StdEncoding.EncodeToString([]byte(kube_config))\r
-    } else {\r
-        // Use scc as external connection\r
-        to.Status.Mode = 2\r
-\r
-        // allocate OIP for device\r
-        overlay_name := m[OverlayResource]\r
-        oip, err := ipr_manager.Allocate(overlay_name, to.Metadata.Name)\r
-        if err != nil {\r
-            return pkgerrors.Wrap(err, "Fail to allocate overlay ip for " + to.Metadata.Name)\r
-        }\r
-\r
-        // Set OIP in Device\r
-        log.Println("Using overlay ip " + oip)\r
-        to.Status.Ip = oip\r
-\r
-        // Get all proposal resources\r
-        proposal := GetManagerset().Proposal\r
-        proposals, err := proposal.GetObjects(m)\r
-        if len(proposals) == 0 || err != nil {\r
-            log.Println("Missing Proposal in the overlay\n")\r
-            return pkgerrors.New("Error in getting proposals")\r
-        }\r
-\r
-        var all_proposal []string\r
-        var proposalresource []*resource.ProposalResource\r
-        for i:= 0 ; i < len(proposals); i++ {\r
-            proposal_obj := proposals[i].(*module.ProposalObject)\r
-            all_proposal = append(all_proposal, proposal_obj.Metadata.Name)\r
-            pr := proposal_obj.ToResource()\r
-            proposalresource = append(proposalresource, pr)\r
-        }\r
-\r
-        //Extract SCC cert/key\r
-       cu, err := GetCertUtil()\r
-       if err != nil {\r
-           log.Println("Getting certutil error")\r
-       }\r
-        crts, key, err := cu.GetKeypair(SCCCertName, NameSpaceName)\r
-        crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]\r
-\r
-       root_ca := GetRootCA(overlay_name)\r
-\r
-       // Build up ipsec resource\r
-        scc_conn := resource.Connection{\r
-            Name: DEFAULT_CONN,\r
-            ConnectionType: CONN_TYPE,\r
-            Mode: MODE,\r
-            Mark: DEFAULT_MARK,\r
-            RemoteSourceIp: oip,\r
-            LocalUpDown: DEFAULT_UPDOWN,\r
-            CryptoProposal: all_proposal,\r
-        }\r
-\r
-           scc_ipsec_resource := resource.IpsecResource{\r
-            Name: "localto" + format_resource_name(to.Metadata.Name, ""),\r
-            Type: VTI_MODE,\r
-            Remote: ANY,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+ SCCCertName,\r
-            RemoteIdentifier: "CN=" + to.GetCertName(),\r
-            CryptoProposal: all_proposal,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: scc_conn,\r
-        }\r
-\r
-        scc := module.EmptyObject{\r
-            Metadata: module.ObjectMetaData{"local", "", "", ""}}\r
-\r
-       // Add and deploy resource\r
-       resutil := NewResUtil()\r
-        resutil.AddResource(&scc, "create", &scc_ipsec_resource)\r
-           for i :=0; i < len(proposalresource); i++ {\r
-                 resutil.AddResource(&scc, "create", proposalresource[i])\r
-        }\r
-\r
-       resutil.Deploy("localto" + to.Metadata.Name, "YAML")\r
-\r
-        //Reserve ipsec resource to device object\r
-        res_str, err := resource.GetResourceBuilder().ToString(&scc_ipsec_resource)\r
-        to.Status.Data[SCC_RESOURCE] = res_str\r
-\r
-       ips = append(ips, oip)\r
-\r
-    }\r
-    return nil\r
-\r
-}\r
-\r
-func (c *DeviceObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    err := c.PreProcessing(m, t)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), err\r
-    }\r
-\r
-    to := t.(*module.DeviceObject)\r
-    task = runner.Go(func(ShouldStop runner.S) error {\r
-       for to.Status.Data[RegStatus] != "success" {\r
-               err = c.PostRegister(m, t)\r
-               if err != nil {\r
-                       log.Println(err)\r
-               }\r
-               time.Sleep(5 * time.Second)\r
-               if ShouldStop() {\r
-                       break\r
-               }\r
-       }\r
-       return nil\r
-    })\r
-\r
-    // DB Operation\r
-    t, err = GetDBUtils().CreateObject(c, m, t)\r
-    return t, err\r
-}\r
-\r
-func (c *DeviceObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *DeviceObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *DeviceObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().UpdateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *DeviceObjectManager) DeleteObject(m map[string]string) error {\r
-    t, err := c.GetObject(m)\r
-    if err != nil {\r
-        return nil\r
-    }\r
-\r
-    if ( task != nil && task.Running() ) {\r
-       task.Stop()\r
-       select {\r
-       case <-task.StopChan():\r
-       case <-time.After(2 * time.Second):\r
-               log.Println("Goroutine register device stopped")\r
-       }\r
-    }\r
-\r
-    //overlay_manager := GetManagerset().Overlay\r
-    ipr_manager := GetManagerset().IPRange\r
-\r
-    overlay_name := m[OverlayResource]\r
-    device_name := m[DeviceResource]\r
-\r
-    to := t.(*module.DeviceObject)\r
-\r
-    //If the device is in mode 2:\r
-    // * Free OIP assigned\r
-    // * Remove ipsec configuration on SCC\r
-    if to.Status.Mode == 2 {\r
-        // Free OIP\r
-        ipr_manager.Free(overlay_name, to.Status.Ip)\r
-\r
-        scc := module.EmptyObject{\r
-            Metadata: module.ObjectMetaData{"local", "", "", ""}}\r
-\r
-       resutils := NewResUtil()\r
-        r_str := to.Status.Data["scc_ipsec_resource"]\r
-        r, _ := resource.GetResourceBuilder().ToObject(r_str)\r
-        resutils.AddResource(&scc, "create", r)\r
-           resutils.Undeploy("localto" + device_name, "YAML")\r
-    }\r
-\r
-\r
-    // DB Operation\r
-    err = GetDBUtils().DeleteObject(c, m)\r
-\r
-    return err\r
-}\r
-\r
-func GetDeviceCertificate(overlay_name string, device_name string)(string, string, error){\r
-    cert := GetManagerset().Cert\r
-    _, crts, key, err := cert.GetOrCreateDC(overlay_name, device_name)\r
-    if err != nil {\r
-        log.Println("Error in getting cert for device ...")\r
-            return "", "", err\r
-    }\r
-\r
-    crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]\r
-    return crt, key, nil\r
-}\r
-\r
-func (c *DeviceObjectManager) PostRegister(m map[string]string, t module.ControllerObject) error {\r
-\r
-    overlay_manager := GetManagerset().Overlay\r
-\r
-    to := t.(*module.DeviceObject)\r
-    log.Println("Registering device " + to.Metadata.Name + " ... ")\r
-\r
-\r
-    if to.Status.Mode == 2 {\r
-        kube_config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)\r
-        if err != nil {\r
-           to.Status.Data[RegStatus] = "failed"\r
-        }\r
-\r
-       kube_config, _, err = kubeutil.checkKubeConfigAvail(kube_config, ips, DEFAULT_K8S_API_SERVER_PORT)\r
-       if err != nil {\r
-                //TODO: check the error type, and if is unauthorized then switch the status to failed.\r
-               return err\r
-       }\r
-\r
-       to.Status.Data[RegStatus] = "success"\r
-       to.Specification.KubeConfig = base64.StdEncoding.EncodeToString(kube_config)\r
-        err = GetDBUtils().RegisterDevice(to.Metadata.Name, to.Specification.KubeConfig)\r
-        if err != nil {\r
-            log.Println(err)\r
-           return err\r
-        }\r
-        log.Println("scc connection is verified.")\r
-\r
-    } else {\r
-       to.Status.Data[RegStatus] = "success"\r
-    }\r
-\r
-    if to.Status.Data[RegStatus] == "success" {\r
-       devices, err := c.GetObjects(m)\r
-       if err != nil {\r
-               log.Println(err)\r
-               return err\r
-       }\r
-\r
-        //TODO: Need to add funcs to re-create connections if some of the connections are not ready\r
-        //Maybe because of cert not ready or other reasons.\r
-       for i := 0; i < len(devices); i++ {\r
-            dev :=  devices[i].(*module.DeviceObject)\r
-            if to.Status.Mode == 1 || dev.Status.Mode == 1 {\r
-               err = overlay_manager.SetupConnection(m, to, dev, DEVICETODEVICE, NameSpaceName)\r
-               if err != nil {\r
-                       return err\r
-                }\r
-            }\r
-       }\r
-    }\r
-\r
-    c.UpdateObject(m, t)\r
-    return nil\r
-}\r
+/*
+* 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 manager
+
+import (
+       "io"
+       "log"
+       //"strconv"
+       "encoding/base64"
+       "encoding/json"
+       "github.com/matryer/runner"
+       "strings"
+       "time"
+
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       //"github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+       pkgerrors "github.com/pkg/errors"
+)
+
+const SCC_RESOURCE = "scc_ipsec_resource"
+const RegStatus = "RegStatus"
+
+var ips []string
+var task *runner.Task
+
+type DeviceObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       DeviceName  string `json:"device-name"`
+}
+
+// DeviceObjectManager implements the ControllerObjectManager
+type DeviceObjectManager struct {
+       BaseObjectManager
+}
+
+func NewDeviceObjectManager() *DeviceObjectManager {
+       return &DeviceObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "device",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *DeviceObjectManager) GetResourceName() string {
+       return DeviceResource
+}
+
+func (c *DeviceObjectManager) IsOperationSupported(oper string) bool {
+       return true
+}
+
+func (c *DeviceObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.DeviceObject{}
+}
+
+func (c *DeviceObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       key := DeviceObjectKey{
+               OverlayName: overlay_name,
+               DeviceName:  "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.DeviceObject)
+       meta_name := to.Metadata.Name
+       res_name := m[DeviceResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.DeviceName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.DeviceName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *DeviceObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.DeviceObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       // initial Status
+       v.Status.Data = make(map[string]string)
+       return &v, err
+}
+
+func (c *DeviceObjectManager) PreProcessing(m map[string]string, t module.ControllerObject) error {
+       to := t.(*module.DeviceObject)
+
+       ipr_manager := GetManagerset().IPRange
+       kubeutil := GetKubeConfigUtil()
+
+       local_public_ips := to.Specification.PublicIps
+       kube_config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Fail to decode kubeconfig")
+       }
+
+       // Set the Register status to pending
+       to.Status.Data[RegStatus] = "pending"
+
+       if len(local_public_ips) > 0 {
+               // Use public IP as external connection
+               to.Status.Mode = 1
+
+               kube_config, local_public_ip, err := kubeutil.checkKubeConfigAvail(kube_config, local_public_ips, "6443")
+               if err != nil {
+                       return pkgerrors.Wrap(err, "Fail to verify public ip")
+               }
+
+               // Set IP in device
+               log.Println("Use public ip " + local_public_ip)
+               to.Status.Ip = local_public_ip
+
+               // Set new kubeconfig in device
+               to.Specification.KubeConfig = base64.StdEncoding.EncodeToString([]byte(kube_config))
+       } else {
+               // Use scc as external connection
+               to.Status.Mode = 2
+
+               // allocate OIP for device
+               overlay_name := m[OverlayResource]
+               oip, err := ipr_manager.Allocate(overlay_name, to.Metadata.Name)
+               if err != nil {
+                       return pkgerrors.Wrap(err, "Fail to allocate overlay ip for "+to.Metadata.Name)
+               }
+
+               // Set OIP in Device
+               log.Println("Using overlay ip " + oip)
+               to.Status.Ip = oip
+
+               // Get all proposal resources
+               proposal := GetManagerset().Proposal
+               proposals, err := proposal.GetObjects(m)
+               if len(proposals) == 0 || err != nil {
+                       log.Println("Missing Proposal in the overlay\n")
+                       return pkgerrors.New("Error in getting proposals")
+               }
+
+               var all_proposal []string
+               var proposalresource []*resource.ProposalResource
+               for i := 0; i < len(proposals); i++ {
+                       proposal_obj := proposals[i].(*module.ProposalObject)
+                       all_proposal = append(all_proposal, proposal_obj.Metadata.Name)
+                       pr := proposal_obj.ToResource()
+                       proposalresource = append(proposalresource, pr)
+               }
+
+               //Extract SCC cert/key
+               cu, err := GetCertUtil()
+               if err != nil {
+                       log.Println("Getting certutil error")
+               }
+               crts, key, err := cu.GetKeypair(SCCCertName, NameSpaceName)
+               crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]
+
+               root_ca := GetRootCA(overlay_name)
+
+               // Build up ipsec resource
+               scc_conn := resource.Connection{
+                       Name:           DEFAULT_CONN,
+                       ConnectionType: CONN_TYPE,
+                       Mode:           MODE,
+                       Mark:           DEFAULT_MARK,
+                       RemoteSourceIp: oip,
+                       LocalUpDown:    DEFAULT_UPDOWN,
+                       CryptoProposal: all_proposal,
+               }
+
+               scc_ipsec_resource := resource.IpsecResource{
+                       Name:                 "localto" + format_resource_name(to.Metadata.Name, ""),
+                       Type:                 VTI_MODE,
+                       Remote:               ANY,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + SCCCertName,
+                       RemoteIdentifier:     "CN=" + to.GetCertName(),
+                       CryptoProposal:       all_proposal,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          scc_conn,
+               }
+
+               scc := module.EmptyObject{
+                       Metadata: module.ObjectMetaData{"local", "", "", ""}}
+
+               // Add and deploy resource
+               resutil := NewResUtil()
+               resutil.AddResource(&scc, "create", &scc_ipsec_resource)
+               for i := 0; i < len(proposalresource); i++ {
+                       resutil.AddResource(&scc, "create", proposalresource[i])
+               }
+
+               resutil.Deploy("localto"+to.Metadata.Name, "YAML")
+
+               //Reserve ipsec resource to device object
+               res_str, err := resource.GetResourceBuilder().ToString(&scc_ipsec_resource)
+               to.Status.Data[SCC_RESOURCE] = res_str
+
+               ips = append(ips, oip)
+
+       }
+       return nil
+
+}
+
+func (c *DeviceObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       err := c.PreProcessing(m, t)
+       if err != nil {
+               return c.CreateEmptyObject(), err
+       }
+
+       to := t.(*module.DeviceObject)
+       task = runner.Go(func(ShouldStop runner.S) error {
+               for to.Status.Data[RegStatus] != "success" {
+                       err = c.PostRegister(m, t)
+                       if err != nil {
+                               log.Println(err)
+                       }
+                       time.Sleep(5 * time.Second)
+                       if ShouldStop() {
+                               break
+                       }
+               }
+               return nil
+       })
+
+       // DB Operation
+       t, err = GetDBUtils().CreateObject(c, m, t)
+       return t, err
+}
+
+func (c *DeviceObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       return t, err
+}
+
+func (c *DeviceObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *DeviceObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().UpdateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *DeviceObjectManager) DeleteObject(m map[string]string) error {
+       t, err := c.GetObject(m)
+       if err != nil {
+               return nil
+       }
+
+       if task != nil && task.Running() {
+               task.Stop()
+               select {
+               case <-task.StopChan():
+               case <-time.After(2 * time.Second):
+                       log.Println("Goroutine register device stopped")
+               }
+       }
+
+       //overlay_manager := GetManagerset().Overlay
+       ipr_manager := GetManagerset().IPRange
+
+       overlay_name := m[OverlayResource]
+       device_name := m[DeviceResource]
+
+       to := t.(*module.DeviceObject)
+
+       //If the device is in mode 2:
+       // * Free OIP assigned
+       // * Remove ipsec configuration on SCC
+       if to.Status.Mode == 2 {
+               // Free OIP
+               ipr_manager.Free(overlay_name, to.Status.Ip)
+
+               scc := module.EmptyObject{
+                       Metadata: module.ObjectMetaData{"local", "", "", ""}}
+
+               resutils := NewResUtil()
+               r_str := to.Status.Data["scc_ipsec_resource"]
+               r, _ := resource.GetResourceBuilder().ToObject(r_str)
+               resutils.AddResource(&scc, "create", r)
+               resutils.Undeploy("localto"+device_name, "YAML")
+       }
+
+       // DB Operation
+       err = GetDBUtils().DeleteObject(c, m)
+
+       return err
+}
+
+func GetDeviceCertificate(overlay_name string, device_name string) (string, string, error) {
+       cert := GetManagerset().Cert
+       _, crts, key, err := cert.GetOrCreateDC(overlay_name, device_name)
+       if err != nil {
+               log.Println("Error in getting cert for device ...")
+               return "", "", err
+       }
+
+       crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]
+       return crt, key, nil
+}
+
+func (c *DeviceObjectManager) PostRegister(m map[string]string, t module.ControllerObject) error {
+
+       overlay_manager := GetManagerset().Overlay
+
+       to := t.(*module.DeviceObject)
+       log.Println("Registering device " + to.Metadata.Name + " ... ")
+
+       if to.Status.Mode == 2 {
+               kube_config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)
+               if err != nil {
+                       to.Status.Data[RegStatus] = "failed"
+               }
+
+               kube_config, _, err = kubeutil.checkKubeConfigAvail(kube_config, ips, DEFAULT_K8S_API_SERVER_PORT)
+               if err != nil {
+                       //TODO: check the error type, and if is unauthorized then switch the status to failed.
+                       return err
+               }
+
+               to.Status.Data[RegStatus] = "success"
+               to.Specification.KubeConfig = base64.StdEncoding.EncodeToString(kube_config)
+               err = GetDBUtils().RegisterDevice(to.Metadata.Name, to.Specification.KubeConfig)
+               if err != nil {
+                       log.Println(err)
+                       return err
+               }
+               log.Println("scc connection is verified.")
+
+       } else {
+               to.Status.Data[RegStatus] = "success"
+       }
+
+       if to.Status.Data[RegStatus] == "success" {
+               devices, err := c.GetObjects(m)
+               if err != nil {
+                       log.Println(err)
+                       return err
+               }
+
+               //TODO: Need to add funcs to re-create connections if some of the connections are not ready
+               //Maybe because of cert not ready or other reasons.
+               for i := 0; i < len(devices); i++ {
+                       dev := devices[i].(*module.DeviceObject)
+                       if to.Status.Mode == 1 || dev.Status.Mode == 1 {
+                               err = overlay_manager.SetupConnection(m, to, dev, DEVICETODEVICE, NameSpaceName)
+                               if err != nil {
+                                       return err
+                               }
+                       }
+               }
+       }
+
+       c.UpdateObject(m, t)
+       return nil
+}
index a591b4c..8b7387d 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "encoding/json"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type DeviceConnObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    DeviceName string `json:"device-name"`\r
-    ConnName string `json:"connection-name"`\r
-}\r
-\r
-// DeviceConnObjectManager implements the ControllerObjectManager\r
-type DeviceConnObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewDeviceConnObjectManager() *DeviceConnObjectManager {\r
-    return &DeviceConnObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "deviceconn",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *DeviceConnObjectManager) GetResourceName() string {\r
-    return ConnectionResource\r
-}\r
-\r
-func (c *DeviceConnObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "GETS" {\r
-        return true\r
-    }\r
-    return false\r
-}\r
-\r
-func (c *DeviceConnObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.ConnectionObject{}\r
-}\r
-\r
-func (c *DeviceConnObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    device_name := m[DeviceResource]\r
-    key := DeviceConnObjectKey{\r
-        OverlayName: overlay_name,\r
-        DeviceName: device_name,\r
-        ConnName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.ConnectionObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[ConnectionResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        } \r
-\r
-        key.ConnName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")  \r
-        }\r
-\r
-        key.ConnName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *DeviceConnObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.ConnectionObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *DeviceConnObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *DeviceConnObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *DeviceConnObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    overlay_name := m[OverlayResource]\r
-    device_name := m[DeviceResource]\r
-\r
-    return GetConnectionManager().GetObjects(overlay_name,  module.CreateEndName("Device", device_name))\r
-}\r
-\r
-func (c *DeviceConnObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *DeviceConnObjectManager) DeleteObject(m map[string]string) error {\r
-    return pkgerrors.New("Not implemented")\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+)
+
+type DeviceConnObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       DeviceName  string `json:"device-name"`
+       ConnName    string `json:"connection-name"`
+}
+
+// DeviceConnObjectManager implements the ControllerObjectManager
+type DeviceConnObjectManager struct {
+       BaseObjectManager
+}
+
+func NewDeviceConnObjectManager() *DeviceConnObjectManager {
+       return &DeviceConnObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "deviceconn",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *DeviceConnObjectManager) GetResourceName() string {
+       return ConnectionResource
+}
+
+func (c *DeviceConnObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "GETS" {
+               return true
+       }
+       return false
+}
+
+func (c *DeviceConnObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.ConnectionObject{}
+}
+
+func (c *DeviceConnObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       device_name := m[DeviceResource]
+       key := DeviceConnObjectKey{
+               OverlayName: overlay_name,
+               DeviceName:  device_name,
+               ConnName:    "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.ConnectionObject)
+       meta_name := to.Metadata.Name
+       res_name := m[ConnectionResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.ConnName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.ConnName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *DeviceConnObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.ConnectionObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *DeviceConnObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *DeviceConnObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *DeviceConnObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       overlay_name := m[OverlayResource]
+       device_name := m[DeviceResource]
+
+       return GetConnectionManager().GetObjects(overlay_name, module.CreateEndName("Device", device_name))
+}
+
+func (c *DeviceConnObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *DeviceConnObjectManager) DeleteObject(m map[string]string) error {
+       return pkgerrors.New("Not implemented")
+}
index 556edf8..466041b 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "log"\r
-    "strings"\r
-    "encoding/json"\r
-    "encoding/base64"\r
-\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-const DEFAULTPORT = "6443"\r
-\r
-type HubObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    HubName string `json:"hub-name"`\r
-}\r
-\r
-// HubObjectManager implements the ControllerObjectManager\r
-type HubObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewHubObjectManager() *HubObjectManager {\r
-    return &HubObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "hub",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *HubObjectManager) GetResourceName() string {\r
-    return HubResource\r
-}\r
-\r
-func (c *HubObjectManager) IsOperationSupported(oper string) bool {\r
-    return true\r
-}\r
-\r
-func (c *HubObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.HubObject{}\r
-}\r
-\r
-func (c *HubObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    key := HubObjectKey{\r
-        OverlayName: overlay_name,\r
-        HubName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.HubObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[HubResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        }\r
-\r
-        key.HubName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")\r
-        }\r
-\r
-        key.HubName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *HubObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.HubObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    // initial Status\r
-    v.Status.Data = make(map[string]string)\r
-    v.Status.ProxyPort = make(map[string]string)\r
-    return &v, err\r
-}\r
-\r
-func (c *HubObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    overlay := GetManagerset().Overlay\r
-    overlay_name := m[OverlayResource]\r
-    to := t.(*module.HubObject)\r
-    hub_name := to.Metadata.Name\r
-\r
-    //Todo: Check if public ip can be used.\r
-    var local_public_ip string\r
-    var config []byte\r
-    config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)\r
-    if err != nil {\r
-        log.Println(err)\r
-        return t, err\r
-    }\r
-\r
-    local_public_ips := to.Specification.PublicIps\r
-\r
-    kubeutil := GetKubeConfigUtil()\r
-    config, local_public_ip, err = kubeutil.checkKubeConfigAvail(config, local_public_ips, DEFAULTPORT)\r
-    if err == nil {\r
-        log.Println("Public IP address verified: " + local_public_ip)\r
-        to.Status.Ip = local_public_ip\r
-        to.Specification.KubeConfig = base64.StdEncoding.EncodeToString(config)\r
-        err := GetDBUtils().RegisterDevice(hub_name, to.Specification.KubeConfig)\r
-        if err != nil {\r
-            log.Println(err)\r
-        }\r
-    } else {\r
-        return t, err\r
-    }\r
-\r
-    //Create cert for ipsec connection\r
-    log.Println("Create Certificate: " + to.GetCertName())\r
-    _, _, err = overlay.CreateCertificate(overlay_name, to.GetCertName())\r
-    if err != nil {\r
-        return t, err\r
-    }\r
-\r
-    //Get all available hub objects\r
-    hubs, err := c.GetObjects(m)\r
-    if err != nil {\r
-        log.Println(err)\r
-    }\r
-\r
-    //TODO: Need to add funcs to re-create connections if some of the connections are not ready\r
-    //Maybe because of cert not ready or other reasons.\r
-    if len(hubs) > 0 && err == nil {\r
-        for i := 0; i < len(hubs); i++ {\r
-            err := overlay.SetupConnection(m, t, hubs[i], HUBTOHUB, NameSpaceName)\r
-            if err != nil {\r
-                log.Println("Setup connection with " + hubs[i].(*module.HubObject).Metadata.Name + " failed.")\r
-            }\r
-        }\r
-        t, err = GetDBUtils().CreateObject(c, m, t)\r
-    } else {\r
-\r
-        t, err = GetDBUtils().CreateObject(c, m, t)\r
-    }\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *HubObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *HubObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *HubObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().UpdateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *HubObjectManager) DeleteObject(m map[string]string) error {\r
-    //Check resource exists\r
-\r
-    t, err := c.GetObject(m)\r
-    if err != nil {\r
-        return nil\r
-    }\r
-\r
-    overlay_manager := GetManagerset().Overlay\r
-    conn_manager := GetConnectionManager()\r
-\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-\r
-// Reset all IpSec connection setup by this device\r
-    conns, err := conn_manager.GetObjects(overlay_name, module.CreateEndName(t.GetType(), hub_name))\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-        for i := 0; i < len(conns); i++ {\r
-            conn :=  conns[i].(*module.ConnectionObject)\r
-            err = conn_manager.Undeploy(overlay_name, *conn)\r
-            if err != nil {\r
-                log.Println(err)\r
-            }\r
-        }\r
-    }\r
-\r
-    to := t.(*module.HubObject)\r
-    log.Println("Delete Certificate: " + to.GetCertName())\r
-    overlay_manager.DeleteCertificate(to.GetCertName())\r
-\r
-\r
-    // DB Operation\r
-    err = GetDBUtils().DeleteObject(c, m)\r
-\r
-    return err\r
-}\r
-\r
-func GetHubCertificate(cert_name string, namespace string)(string, string, error){\r
-    cu, err := GetCertUtil()\r
-    if err != nil {\r
-        log.Println(err)\r
-        return "", "", err\r
-    } else {\r
-        ready := cu.IsCertReady(cert_name, namespace)\r
-        if ready != true {\r
-            return "", "", pkgerrors.New("Cert for hub is not ready")\r
-        } else {\r
-            crts, key, err := cu.GetKeypair(cert_name, namespace)\r
-            crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]\r
-            if err != nil {\r
-                log.Println(err)\r
-                return "", "", err\r
-            }\r
-            return crt, key, nil\r
-        }\r
-    }\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/base64"
+       "encoding/json"
+       "io"
+       "log"
+       "strings"
+
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+)
+
+const DEFAULTPORT = "6443"
+
+type HubObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       HubName     string `json:"hub-name"`
+}
+
+// HubObjectManager implements the ControllerObjectManager
+type HubObjectManager struct {
+       BaseObjectManager
+}
+
+func NewHubObjectManager() *HubObjectManager {
+       return &HubObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "hub",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *HubObjectManager) GetResourceName() string {
+       return HubResource
+}
+
+func (c *HubObjectManager) IsOperationSupported(oper string) bool {
+       return true
+}
+
+func (c *HubObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.HubObject{}
+}
+
+func (c *HubObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       key := HubObjectKey{
+               OverlayName: overlay_name,
+               HubName:     "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.HubObject)
+       meta_name := to.Metadata.Name
+       res_name := m[HubResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.HubName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.HubName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *HubObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.HubObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       // initial Status
+       v.Status.Data = make(map[string]string)
+       v.Status.ProxyPort = make(map[string]string)
+       return &v, err
+}
+
+func (c *HubObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       overlay := GetManagerset().Overlay
+       overlay_name := m[OverlayResource]
+       to := t.(*module.HubObject)
+       hub_name := to.Metadata.Name
+
+       //Todo: Check if public ip can be used.
+       var local_public_ip string
+       var config []byte
+       config, err := base64.StdEncoding.DecodeString(to.Specification.KubeConfig)
+       if err != nil {
+               log.Println(err)
+               return t, err
+       }
+
+       local_public_ips := to.Specification.PublicIps
+
+       kubeutil := GetKubeConfigUtil()
+       config, local_public_ip, err = kubeutil.checkKubeConfigAvail(config, local_public_ips, DEFAULTPORT)
+       if err == nil {
+               log.Println("Public IP address verified: " + local_public_ip)
+               to.Status.Ip = local_public_ip
+               to.Specification.KubeConfig = base64.StdEncoding.EncodeToString(config)
+               err := GetDBUtils().RegisterDevice(hub_name, to.Specification.KubeConfig)
+               if err != nil {
+                       log.Println(err)
+               }
+       } else {
+               return t, err
+       }
+
+       //Create cert for ipsec connection
+       log.Println("Create Certificate: " + to.GetCertName())
+       _, _, err = overlay.CreateCertificate(overlay_name, to.GetCertName())
+       if err != nil {
+               return t, err
+       }
+
+       //Get all available hub objects
+       hubs, err := c.GetObjects(m)
+       if err != nil {
+               log.Println(err)
+       }
+
+       //TODO: Need to add funcs to re-create connections if some of the connections are not ready
+       //Maybe because of cert not ready or other reasons.
+       if len(hubs) > 0 && err == nil {
+               for i := 0; i < len(hubs); i++ {
+                       err := overlay.SetupConnection(m, t, hubs[i], HUBTOHUB, NameSpaceName)
+                       if err != nil {
+                               log.Println("Setup connection with " + hubs[i].(*module.HubObject).Metadata.Name + " failed.")
+                       }
+               }
+               t, err = GetDBUtils().CreateObject(c, m, t)
+       } else {
+
+               t, err = GetDBUtils().CreateObject(c, m, t)
+       }
+
+       return t, err
+}
+
+func (c *HubObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       return t, err
+}
+
+func (c *HubObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *HubObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().UpdateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *HubObjectManager) DeleteObject(m map[string]string) error {
+       //Check resource exists
+
+       t, err := c.GetObject(m)
+       if err != nil {
+               return nil
+       }
+
+       overlay_manager := GetManagerset().Overlay
+       conn_manager := GetConnectionManager()
+
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+
+       // Reset all IpSec connection setup by this device
+       conns, err := conn_manager.GetObjects(overlay_name, module.CreateEndName(t.GetType(), hub_name))
+       if err != nil {
+               log.Println(err)
+       } else {
+               for i := 0; i < len(conns); i++ {
+                       conn := conns[i].(*module.ConnectionObject)
+                       err = conn_manager.Undeploy(overlay_name, *conn)
+                       if err != nil {
+                               log.Println(err)
+                       }
+               }
+       }
+
+       to := t.(*module.HubObject)
+       log.Println("Delete Certificate: " + to.GetCertName())
+       overlay_manager.DeleteCertificate(to.GetCertName())
+
+       // DB Operation
+       err = GetDBUtils().DeleteObject(c, m)
+
+       return err
+}
+
+func GetHubCertificate(cert_name string, namespace string) (string, string, error) {
+       cu, err := GetCertUtil()
+       if err != nil {
+               log.Println(err)
+               return "", "", err
+       } else {
+               ready := cu.IsCertReady(cert_name, namespace)
+               if ready != true {
+                       return "", "", pkgerrors.New("Cert for hub is not ready")
+               } else {
+                       crts, key, err := cu.GetKeypair(cert_name, namespace)
+                       crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]
+                       if err != nil {
+                               log.Println(err)
+                               return "", "", err
+                       }
+                       return crt, key, nil
+               }
+       }
+}
index 797c968..e858d7b 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "encoding/json"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type HubConnObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    HubName string `json:"hub-name"`\r
-    ConnName string `json:"connection-name"`\r
-}\r
-\r
-// HubConnObjectManager implements the ControllerObjectManager\r
-type HubConnObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewHubConnObjectManager() *HubConnObjectManager {\r
-    return &HubConnObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "hubconn",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *HubConnObjectManager) GetResourceName() string {\r
-    return ConnectionResource\r
-}\r
-\r
-func (c *HubConnObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "GETS" {\r
-        return true\r
-    }\r
-    return false\r
-}\r
-\r
-func (c *HubConnObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.ConnectionObject{}\r
-}\r
-\r
-func (c *HubConnObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-    key := HubConnObjectKey{\r
-        OverlayName: overlay_name,\r
-        HubName: hub_name,\r
-        ConnName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.ConnectionObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[ConnectionResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        } \r
-\r
-        key.ConnName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")  \r
-        }\r
-\r
-        key.ConnName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *HubConnObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.ConnectionObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *HubConnObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubConnObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubConnObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-\r
-    return GetConnectionManager().GetObjects(overlay_name, module.CreateEndName("Hub", hub_name))\r
-}\r
-\r
-func (c *HubConnObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubConnObjectManager) DeleteObject(m map[string]string) error {\r
-    return pkgerrors.New("Not implemented")\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+)
+
+type HubConnObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       HubName     string `json:"hub-name"`
+       ConnName    string `json:"connection-name"`
+}
+
+// HubConnObjectManager implements the ControllerObjectManager
+type HubConnObjectManager struct {
+       BaseObjectManager
+}
+
+func NewHubConnObjectManager() *HubConnObjectManager {
+       return &HubConnObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "hubconn",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *HubConnObjectManager) GetResourceName() string {
+       return ConnectionResource
+}
+
+func (c *HubConnObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "GETS" {
+               return true
+       }
+       return false
+}
+
+func (c *HubConnObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.ConnectionObject{}
+}
+
+func (c *HubConnObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+       key := HubConnObjectKey{
+               OverlayName: overlay_name,
+               HubName:     hub_name,
+               ConnName:    "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.ConnectionObject)
+       meta_name := to.Metadata.Name
+       res_name := m[ConnectionResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.ConnName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.ConnName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *HubConnObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.ConnectionObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *HubConnObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *HubConnObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *HubConnObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+
+       return GetConnectionManager().GetObjects(overlay_name, module.CreateEndName("Hub", hub_name))
+}
+
+func (c *HubConnObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *HubConnObjectManager) DeleteObject(m map[string]string) error {
+       return pkgerrors.New("Not implemented")
+}
index 5c44810..a9776bf 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "log"\r
-    "encoding/json"\r
-\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type HubDeviceObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    HubName string `json:"hub-name"`\r
-    DeviceName string `json:"device-name"`\r
-}\r
-\r
-// HubDeviceObjectManager implements the ControllerObjectManager\r
-type HubDeviceObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewHubDeviceObjectManager() *HubDeviceObjectManager {\r
-    return &HubDeviceObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "hubdevice",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *HubDeviceObjectManager) GetResourceName() string {\r
-    return DeviceResource\r
-}\r
-\r
-func (c *HubDeviceObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "POST" || oper == "DELETE" {\r
-        return true\r
-    }\r
-    return false\r
-}\r
-\r
-func (c *HubDeviceObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.HubDeviceObject{}\r
-}\r
-\r
-func (c *HubDeviceObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-    device_name := m[DeviceResource]\r
-    key := HubDeviceObjectKey{\r
-        OverlayName: overlay_name,\r
-        HubName: hub_name,\r
-        DeviceName: device_name,\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *HubDeviceObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.HubDeviceObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *HubDeviceObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-       // Setup hub-device connection\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-    //device_name :=m[DeviceResource]\r
-    to := t.(*module.HubDeviceObject)\r
-    device_name := to.Specification.Device\r
-    m[DeviceResource] = device_name\r
-\r
-    hub_manager := GetManagerset().Hub\r
-    dev_manager := GetManagerset().Device\r
-    overlay_namager := GetManagerset().Overlay\r
-    conn_manager := GetConnectionManager()\r
-\r
-    hub, err := hub_manager.GetObject(m)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Hub " + hub_name + " is not defined")\r
-    }\r
-\r
-    dev, err := dev_manager.GetObject(m)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device " + device_name + " is not defined")\r
-    }\r
-\r
-    device := dev.(*module.DeviceObject)\r
-    if device.Status.Data[RegStatus] != "success" {\r
-       log.Println("Device registration not ready")\r
-       return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device " + device_name + " registration is not ready")\r
-    }\r
-\r
-    _, err = conn_manager.GetObject(overlay_name,\r
-        module.CreateEndName(hub.GetType(), hub.GetMetadata().Name),\r
-        module.CreateEndName(dev.GetType(), dev.GetMetadata().Name))\r
-    if err == nil {\r
-        return c.CreateEmptyObject(), pkgerrors.New("The connection between Hub " + hub_name + " and Device " + device_name + " is already created")\r
-    }\r
-\r
-    err = overlay_namager.SetupConnection(m, hub, dev, HUBTODEVICE, NameSpaceName)\r
-    if err != nil {\r
-        return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Fail to setup connection between " + hub_name + " and " + device_name)\r
-    }\r
-\r
-    return c.CreateEmptyObject(), nil\r
-}\r
-\r
-func (c *HubDeviceObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubDeviceObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    return []module.ControllerObject{}, pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubDeviceObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")\r
-}\r
-\r
-func (c *HubDeviceObjectManager) DeleteObject(m map[string]string) error {\r
-    // Delete hub-device connection\r
-    overlay_name := m[OverlayResource]\r
-    hub_name := m[HubResource]\r
-    device_name := m[DeviceResource]\r
-\r
-    hub_manager := GetManagerset().Hub\r
-    dev_manager := GetManagerset().Device\r
-    conn_manager := GetConnectionManager()\r
-\r
-    hub, err := hub_manager.GetObject(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Hub " + hub_name + " is not defined")\r
-    }\r
-\r
-    dev, err := dev_manager.GetObject(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Device " + device_name + " is not defined")\r
-    }\r
-\r
-    conn, err := conn_manager.GetObject(overlay_name,\r
-        module.CreateEndName(hub.GetType(), hub.GetMetadata().Name),\r
-        module.CreateEndName(dev.GetType(), dev.GetMetadata().Name))\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-        conn_obj := conn.(*module.ConnectionObject)\r
-        err = conn_manager.Undeploy(overlay_name, *conn_obj)\r
-        if err != nil {\r
-            log.Println(err)\r
-        }\r
-    }\r
-\r
-    return nil\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "io"
+       "log"
+
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+)
+
+type HubDeviceObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       HubName     string `json:"hub-name"`
+       DeviceName  string `json:"device-name"`
+}
+
+// HubDeviceObjectManager implements the ControllerObjectManager
+type HubDeviceObjectManager struct {
+       BaseObjectManager
+}
+
+func NewHubDeviceObjectManager() *HubDeviceObjectManager {
+       return &HubDeviceObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "hubdevice",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *HubDeviceObjectManager) GetResourceName() string {
+       return DeviceResource
+}
+
+func (c *HubDeviceObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "POST" || oper == "DELETE" {
+               return true
+       }
+       return false
+}
+
+func (c *HubDeviceObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.HubDeviceObject{}
+}
+
+func (c *HubDeviceObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+       device_name := m[DeviceResource]
+       key := HubDeviceObjectKey{
+               OverlayName: overlay_name,
+               HubName:     hub_name,
+               DeviceName:  device_name,
+       }
+
+       return key, nil
+}
+
+func (c *HubDeviceObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.HubDeviceObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *HubDeviceObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // Setup hub-device connection
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+       //device_name :=m[DeviceResource]
+       to := t.(*module.HubDeviceObject)
+       device_name := to.Specification.Device
+       m[DeviceResource] = device_name
+
+       hub_manager := GetManagerset().Hub
+       dev_manager := GetManagerset().Device
+       overlay_namager := GetManagerset().Overlay
+       conn_manager := GetConnectionManager()
+
+       hub, err := hub_manager.GetObject(m)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Hub "+hub_name+" is not defined")
+       }
+
+       dev, err := dev_manager.GetObject(m)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device "+device_name+" is not defined")
+       }
+
+       device := dev.(*module.DeviceObject)
+       if device.Status.Data[RegStatus] != "success" {
+               log.Println("Device registration not ready")
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Device "+device_name+" registration is not ready")
+       }
+
+       _, err = conn_manager.GetObject(overlay_name,
+               module.CreateEndName(hub.GetType(), hub.GetMetadata().Name),
+               module.CreateEndName(dev.GetType(), dev.GetMetadata().Name))
+       if err == nil {
+               return c.CreateEmptyObject(), pkgerrors.New("The connection between Hub " + hub_name + " and Device " + device_name + " is already created")
+       }
+
+       err = overlay_namager.SetupConnection(m, hub, dev, HUBTODEVICE, NameSpaceName)
+       if err != nil {
+               return c.CreateEmptyObject(), pkgerrors.Wrap(err, "Fail to setup connection between "+hub_name+" and "+device_name)
+       }
+
+       return c.CreateEmptyObject(), nil
+}
+
+func (c *HubDeviceObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *HubDeviceObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       return []module.ControllerObject{}, pkgerrors.New("Not implemented")
+}
+
+func (c *HubDeviceObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       return c.CreateEmptyObject(), pkgerrors.New("Not implemented")
+}
+
+func (c *HubDeviceObjectManager) DeleteObject(m map[string]string) error {
+       // Delete hub-device connection
+       overlay_name := m[OverlayResource]
+       hub_name := m[HubResource]
+       device_name := m[DeviceResource]
+
+       hub_manager := GetManagerset().Hub
+       dev_manager := GetManagerset().Device
+       conn_manager := GetConnectionManager()
+
+       hub, err := hub_manager.GetObject(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Hub "+hub_name+" is not defined")
+       }
+
+       dev, err := dev_manager.GetObject(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Device "+device_name+" is not defined")
+       }
+
+       conn, err := conn_manager.GetObject(overlay_name,
+               module.CreateEndName(hub.GetType(), hub.GetMetadata().Name),
+               module.CreateEndName(dev.GetType(), dev.GetMetadata().Name))
+       if err != nil {
+               log.Println(err)
+       } else {
+               conn_obj := conn.(*module.ConnectionObject)
+               err = conn_manager.Undeploy(overlay_name, *conn_obj)
+               if err != nil {
+                       log.Println(err)
+               }
+       }
+
+       return nil
+}
index 3a703b8..398cbc2 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "encoding/json"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/validation"\r
-    "github.com/go-playground/validator/v10"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type IPRangeObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-    IPRangeName string `json:"iprange-name"`\r
-}\r
-\r
-type ProviderIPRangeObjectKey struct {\r
-    IPRangeName string `json:"iprange-name"`\r
-}\r
-\r
-// IPRangeObjectManager implements the ControllerObjectManager\r
-type IPRangeObjectManager struct {\r
-    BaseObjectManager\r
-    provider  bool\r
-}\r
-\r
-func NewIPRangeObjectManager(provider bool) *IPRangeObjectManager {\r
-    object_meta := "iprange"\r
-    if provider {\r
-        object_meta = "provider-" + object_meta\r
-    }\r
-\r
-    validate := validation.GetValidator(object_meta)\r
-    validate.RegisterStructValidation(ValidateIPRangeObject, module.IPRangeObject{})\r
-\r
-    return &IPRangeObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    object_meta,\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-        provider,\r
-    }\r
-}\r
-\r
-func ValidateIPRangeObject(sl validator.StructLevel) {\r
-    obj := sl.Current().Interface().(module.IPRangeObject)\r
-\r
-    if obj.Specification.MinIp != 0 && obj.Specification.MaxIp != 0 {\r
-        if obj.Specification.MinIp > obj.Specification.MaxIp {\r
-            sl.ReportError(obj.Specification.MinIp, "Range", "Range", "InValidateIPRange", "")\r
-        }\r
-    }\r
-}\r
-\r
-func (c *IPRangeObjectManager) GetResourceName() string {\r
-    return IPRangeResource\r
-}\r
-\r
-func (c *IPRangeObjectManager) IsOperationSupported(oper string) bool {\r
-    if oper == "PUT" {\r
-        // Not allowed for update\r
-        return false\r
-    }\r
-    return true\r
-}\r
-\r
-func (c *IPRangeObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.IPRangeObject{}\r
-}\r
-\r
-func (c *IPRangeObjectManager) SetIPRangeName(k db.Key, name string) {\r
-    if c.provider {\r
-        ko := k.(*ProviderIPRangeObjectKey)\r
-        ko.IPRangeName = name\r
-    } else {\r
-        ko := k.(*IPRangeObjectKey)\r
-        ko.IPRangeName = name\r
-    }\r
-}\r
-\r
-func (c *IPRangeObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    var key db.Key\r
-\r
-    if c.provider {\r
-        key = ProviderIPRangeObjectKey{\r
-            IPRangeName: "",\r
-        }\r
-    } else {\r
-        overlay_name := m[OverlayResource]\r
-        key = IPRangeObjectKey{\r
-            OverlayName: overlay_name,\r
-            IPRangeName: "",\r
-        }\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.IPRangeObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[IPRangeResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        }\r
-\r
-        c.SetIPRangeName(key, res_name)\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")\r
-        }\r
-\r
-        c.SetIPRangeName(key, meta_name)\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *IPRangeObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.IPRangeObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    // initial Status\r
-    for i:=0; i<32; i++ {\r
-        v.Status.Masks[i] = 0\r
-    }\r
-    v.Status.Data = make(map[string]string)\r
-    return &v, err\r
-}\r
-\r
-func (c *IPRangeObjectManager) GetDefinedObjects(m map[string]string)  ([]module.ControllerObject, error) {\r
-    objs, err := c.GetObjects(m)\r
-    if err != nil {\r
-        return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get available IPRange objects")\r
-    }\r
-\r
-    if c.provider {\r
-        ipr_manager := GetManagerset().IPRange\r
-        overlay_manager := GetManagerset().Overlay\r
-\r
-        // concact ip ranges defined in all overlays\r
-        ol_objs, err := overlay_manager.GetObjects(m)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get overlays")\r
-        }\r
-\r
-        for _, ol_obj := range ol_objs {\r
-            o_m := make(map[string]string)\r
-            o_m[OverlayResource] = ol_obj.GetMetadata().Name\r
-            // get ip range for the overlay\r
-            ip_objs, err := ipr_manager.GetObjects(o_m)\r
-            if err != nil {\r
-                return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get ip ranges for overlay")\r
-            }\r
-            objs = append(objs, ip_objs...)\r
-        }\r
-    } else {\r
-        // concact ip ranges defined in provider\r
-        providerIP_manager := GetManagerset().ProviderIPRange\r
-        p_objs, err := providerIP_manager.GetObjects(m)\r
-        if err != nil {\r
-            return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get provider IPRange objects")\r
-        }\r
-\r
-        objs = append(objs, p_objs...)\r
-    }\r
-\r
-    return objs, nil\r
-}\r
-\r
-func (c *IPRangeObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // Check whether conflict with other IPRange object\r
-    objs, err := c.GetDefinedObjects(m)\r
-    if err != nil {\r
-        return t, pkgerrors.Wrap(err, "Failed to get available IPRange objects")\r
-    }\r
-\r
-    ot := t.(*module.IPRangeObject)\r
-    for _, obj := range objs {\r
-        if ot.IsConflict(obj.(*module.IPRangeObject)) {\r
-            return c.CreateEmptyObject(), pkgerrors.New("Conflicted with IPRange object: " + obj.(*module.IPRangeObject).Metadata.Name)\r
-        }\r
-    }\r
-\r
-    // DB Operation\r
-    t, err = GetDBUtils().CreateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *IPRangeObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *IPRangeObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *IPRangeObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().UpdateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *IPRangeObjectManager) DeleteObject(m map[string]string) error {\r
-    // Check whether in used\r
-    obj, err := c.GetObject(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Failed to get IPRange object")\r
-    }\r
-\r
-    if obj.(*module.IPRangeObject).InUsed() {\r
-        return pkgerrors.New("The IPRange object is in used")\r
-    }\r
-\r
-    // DB Operation\r
-    err = GetDBUtils().DeleteObject(c, m)\r
-\r
-    return err\r
-}\r
-\r
-func (c *IPRangeObjectManager) Allocate(oname string, name string) (string, error) {\r
-    m := make(map[string]string)\r
-\r
-    if !c.provider {\r
-        m[OverlayResource] = oname\r
-    }\r
-\r
-    objs, err := c.GetObjects(m)\r
-    if err != nil {\r
-        return "", pkgerrors.Wrap(err, "Failed to get available IPRange objects")\r
-    }\r
-\r
-    for _, obj := range objs {\r
-        tobj := obj.(*module.IPRangeObject)\r
-        aip, err := tobj.Allocate(name)\r
-        if err == nil {\r
-            // save update object in DB\r
-            c.UpdateObject(m, tobj)\r
-            return aip, nil\r
-        }\r
-    }\r
-\r
-    return "", pkgerrors.New("No available ip")\r
-}\r
-\r
-func (c *IPRangeObjectManager) Free(oname string, ip string) error {\r
-    m := make(map[string]string)\r
-\r
-    if !c.provider {\r
-        m[OverlayResource] = oname\r
-    }\r
-\r
-    objs, err := c.GetObjects(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Failed to get available IPRange objects")\r
-    }\r
-\r
-    for _, obj := range objs {\r
-        tobj := obj.(*module.IPRangeObject)\r
-        err := tobj.Free(ip)\r
-        if err == nil {\r
-            // save update object in DB\r
-            c.UpdateObject(m, tobj)\r
-            return nil\r
-        }\r
-    }\r
-\r
-    return pkgerrors.New("ip " + ip + " is not allocated")\r
-}\r
-\r
-func (c *IPRangeObjectManager) FreeAll(oname string) error {\r
-    m := make(map[string]string)\r
-\r
-    if !c.provider {\r
-        m[OverlayResource] = oname\r
-    }\r
-\r
-    objs, err := c.GetObjects(m)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Failed to get available IPRange objects")\r
-    }\r
-\r
-    for _, obj := range objs {\r
-        tobj := obj.(*module.IPRangeObject)\r
-        err := tobj.FreeAll()\r
-        if err == nil {\r
-            // save update object in DB\r
-            c.UpdateObject(m, tobj)\r
-        }\r
-    }\r
-\r
-    return nil\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/infra/validation"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/go-playground/validator/v10"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+)
+
+type IPRangeObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+       IPRangeName string `json:"iprange-name"`
+}
+
+type ProviderIPRangeObjectKey struct {
+       IPRangeName string `json:"iprange-name"`
+}
+
+// IPRangeObjectManager implements the ControllerObjectManager
+type IPRangeObjectManager struct {
+       BaseObjectManager
+       provider bool
+}
+
+func NewIPRangeObjectManager(provider bool) *IPRangeObjectManager {
+       object_meta := "iprange"
+       if provider {
+               object_meta = "provider-" + object_meta
+       }
+
+       validate := validation.GetValidator(object_meta)
+       validate.RegisterStructValidation(ValidateIPRangeObject, module.IPRangeObject{})
+
+       return &IPRangeObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        object_meta,
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+               provider,
+       }
+}
+
+func ValidateIPRangeObject(sl validator.StructLevel) {
+       obj := sl.Current().Interface().(module.IPRangeObject)
+
+       if obj.Specification.MinIp != 0 && obj.Specification.MaxIp != 0 {
+               if obj.Specification.MinIp > obj.Specification.MaxIp {
+                       sl.ReportError(obj.Specification.MinIp, "Range", "Range", "InValidateIPRange", "")
+               }
+       }
+}
+
+func (c *IPRangeObjectManager) GetResourceName() string {
+       return IPRangeResource
+}
+
+func (c *IPRangeObjectManager) IsOperationSupported(oper string) bool {
+       if oper == "PUT" {
+               // Not allowed for update
+               return false
+       }
+       return true
+}
+
+func (c *IPRangeObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.IPRangeObject{}
+}
+
+func (c *IPRangeObjectManager) SetIPRangeName(k db.Key, name string) {
+       if c.provider {
+               ko := k.(*ProviderIPRangeObjectKey)
+               ko.IPRangeName = name
+       } else {
+               ko := k.(*IPRangeObjectKey)
+               ko.IPRangeName = name
+       }
+}
+
+func (c *IPRangeObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       var key db.Key
+
+       if c.provider {
+               key = ProviderIPRangeObjectKey{
+                       IPRangeName: "",
+               }
+       } else {
+               overlay_name := m[OverlayResource]
+               key = IPRangeObjectKey{
+                       OverlayName: overlay_name,
+                       IPRangeName: "",
+               }
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.IPRangeObject)
+       meta_name := to.Metadata.Name
+       res_name := m[IPRangeResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               c.SetIPRangeName(key, res_name)
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               c.SetIPRangeName(key, meta_name)
+       }
+
+       return key, nil
+}
+
+func (c *IPRangeObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.IPRangeObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       // initial Status
+       for i := 0; i < 32; i++ {
+               v.Status.Masks[i] = 0
+       }
+       v.Status.Data = make(map[string]string)
+       return &v, err
+}
+
+func (c *IPRangeObjectManager) GetDefinedObjects(m map[string]string) ([]module.ControllerObject, error) {
+       objs, err := c.GetObjects(m)
+       if err != nil {
+               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get available IPRange objects")
+       }
+
+       if c.provider {
+               ipr_manager := GetManagerset().IPRange
+               overlay_manager := GetManagerset().Overlay
+
+               // concact ip ranges defined in all overlays
+               ol_objs, err := overlay_manager.GetObjects(m)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get overlays")
+               }
+
+               for _, ol_obj := range ol_objs {
+                       o_m := make(map[string]string)
+                       o_m[OverlayResource] = ol_obj.GetMetadata().Name
+                       // get ip range for the overlay
+                       ip_objs, err := ipr_manager.GetObjects(o_m)
+                       if err != nil {
+                               return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get ip ranges for overlay")
+                       }
+                       objs = append(objs, ip_objs...)
+               }
+       } else {
+               // concact ip ranges defined in provider
+               providerIP_manager := GetManagerset().ProviderIPRange
+               p_objs, err := providerIP_manager.GetObjects(m)
+               if err != nil {
+                       return []module.ControllerObject{}, pkgerrors.Wrap(err, "Failed to get provider IPRange objects")
+               }
+
+               objs = append(objs, p_objs...)
+       }
+
+       return objs, nil
+}
+
+func (c *IPRangeObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // Check whether conflict with other IPRange object
+       objs, err := c.GetDefinedObjects(m)
+       if err != nil {
+               return t, pkgerrors.Wrap(err, "Failed to get available IPRange objects")
+       }
+
+       ot := t.(*module.IPRangeObject)
+       for _, obj := range objs {
+               if ot.IsConflict(obj.(*module.IPRangeObject)) {
+                       return c.CreateEmptyObject(), pkgerrors.New("Conflicted with IPRange object: " + obj.(*module.IPRangeObject).Metadata.Name)
+               }
+       }
+
+       // DB Operation
+       t, err = GetDBUtils().CreateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *IPRangeObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       return t, err
+}
+
+func (c *IPRangeObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *IPRangeObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().UpdateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *IPRangeObjectManager) DeleteObject(m map[string]string) error {
+       // Check whether in used
+       obj, err := c.GetObject(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Failed to get IPRange object")
+       }
+
+       if obj.(*module.IPRangeObject).InUsed() {
+               return pkgerrors.New("The IPRange object is in used")
+       }
+
+       // DB Operation
+       err = GetDBUtils().DeleteObject(c, m)
+
+       return err
+}
+
+func (c *IPRangeObjectManager) Allocate(oname string, name string) (string, error) {
+       m := make(map[string]string)
+
+       if !c.provider {
+               m[OverlayResource] = oname
+       }
+
+       objs, err := c.GetObjects(m)
+       if err != nil {
+               return "", pkgerrors.Wrap(err, "Failed to get available IPRange objects")
+       }
+
+       for _, obj := range objs {
+               tobj := obj.(*module.IPRangeObject)
+               aip, err := tobj.Allocate(name)
+               if err == nil {
+                       // save update object in DB
+                       c.UpdateObject(m, tobj)
+                       return aip, nil
+               }
+       }
+
+       return "", pkgerrors.New("No available ip")
+}
+
+func (c *IPRangeObjectManager) Free(oname string, ip string) error {
+       m := make(map[string]string)
+
+       if !c.provider {
+               m[OverlayResource] = oname
+       }
+
+       objs, err := c.GetObjects(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Failed to get available IPRange objects")
+       }
+
+       for _, obj := range objs {
+               tobj := obj.(*module.IPRangeObject)
+               err := tobj.Free(ip)
+               if err == nil {
+                       // save update object in DB
+                       c.UpdateObject(m, tobj)
+                       return nil
+               }
+       }
+
+       return pkgerrors.New("ip " + ip + " is not allocated")
+}
+
+func (c *IPRangeObjectManager) FreeAll(oname string) error {
+       m := make(map[string]string)
+
+       if !c.provider {
+               m[OverlayResource] = oname
+       }
+
+       objs, err := c.GetObjects(m)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Failed to get available IPRange objects")
+       }
+
+       for _, obj := range objs {
+               tobj := obj.(*module.IPRangeObject)
+               err := tobj.FreeAll()
+               if err == nil {
+                       // save update object in DB
+                       c.UpdateObject(m, tobj)
+               }
+       }
+
+       return nil
+}
index b4487c9..54ebc8b 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "os"\r
-    "log"\r
-    "io/ioutil"\r
-    "sigs.k8s.io/yaml"\r
-    "k8s.io/apimachinery/pkg/runtime"\r
-    "k8s.io/client-go/kubernetes/scheme"\r
-    "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-func DecodeYAMLFromFile(path string, into runtime.Object) (runtime.Object, error) {\r
-    if _, err := os.Stat(path); err != nil {\r
-        if os.IsNotExist(err) {\r
-            return nil, pkgerrors.New("File " + path + " not found")\r
-        } else {\r
-            return nil, pkgerrors.Wrap(err, "Stat file error")\r
-        }\r
-    }\r
-\r
-    rawBytes, err := ioutil.ReadFile(path)\r
-    if err != nil {\r
-        return nil, pkgerrors.Wrap(err, "Read YAML file error")\r
-    }\r
-\r
-    decode := scheme.Codecs.UniversalDeserializer().Decode\r
-    obj, _, err := decode(rawBytes, nil, into)\r
-    if err != nil {\r
-        return nil, pkgerrors.Wrap(err, "Deserialize YAML error")\r
-    }\r
-\r
-    return obj, nil\r
-}\r
-\r
-func DecodeYAMLFromData(data []byte, into runtime.Object) (runtime.Object, error) {\r
-    decode := scheme.Codecs.UniversalDeserializer().Decode\r
-    obj, _, err := decode(data, nil, into)\r
-    if err != nil {\r
-        return nil, pkgerrors.Wrap(err, "Deserialize YAML error")\r
-    }\r
-\r
-    return obj, nil\r
-}\r
-\r
-type KubeConfigUtil struct {\r
-}\r
-\r
-var kubeutil = KubeConfigUtil{}\r
-\r
-func GetKubeConfigUtil() *KubeConfigUtil {\r
-    return &kubeutil\r
-}\r
-\r
-func (c *KubeConfigUtil) toYaml(data *unstructured.Unstructured) ([]byte, error) {\r
-    byte_json, err := data.MarshalJSON()\r
-    if err != nil {\r
-        return []byte(""), pkgerrors.Wrap(err, "Fail to generate yaml")\r
-    }\r
-\r
-    byte_yaml, err := yaml.JSONToYAML(byte_json)\r
-    if err != nil {\r
-        return []byte(""), pkgerrors.Wrap(err, "Fail to generate yaml")\r
-    }\r
-\r
-    return byte_yaml, nil\r
-}\r
-\r
-func (c *KubeConfigUtil) UpdateK8sConfig(conf []byte, server string, insecure bool) ([]byte, error) {\r
-    conf_us_obj := &unstructured.Unstructured{}\r
-    _, err := DecodeYAMLFromData(conf, conf_us_obj)\r
-    if err == nil {\r
-        conf_obj := conf_us_obj.UnstructuredContent()\r
-        cluster_objs, _, err := unstructured.NestedSlice(conf_obj, "clusters")\r
-        if err == nil {\r
-            if len(cluster_objs) > 0 {\r
-                cluster_obj := cluster_objs[0].(map[string]interface{})\r
-                if insecure {\r
-                    // remove certificate-authority-data\r
-                    unstructured.RemoveNestedField(cluster_obj, "cluster", "certificate-authority-data")\r
-                    // add insecure-skip-tls-verify\r
-                    err = unstructured.SetNestedField(cluster_obj, true, "cluster", "insecure-skip-tls-verify")\r
-                }\r
-\r
-                if err == nil {\r
-                    // set server\r
-                    err = unstructured.SetNestedField(cluster_obj, server, "cluster", "server")\r
-                    if err == nil {\r
-                        err = unstructured.SetNestedSlice(conf_obj, cluster_objs, "clusters")\r
-                        if err == nil {\r
-                            return c.toYaml(conf_us_obj)\r
-                        }\r
-                    }\r
-                }\r
-            } else {\r
-                return []byte(""), pkgerrors.New("UpdateK8sConfig: No cluster")\r
-            }\r
-        }\r
-    }\r
-\r
-    return []byte(""), pkgerrors.Wrap(err, "UpdateK8sConfig")\r
-}\r
-\r
-func (c *KubeConfigUtil)checkKubeConfigAvail(conf []byte, ips []string, port string) ([]byte, string, error){\r
-    kubeclient := client.NewClient("", "", conf)\r
-    for i := 0 ; i < len(ips); i++ {\r
-        ip := ips[i]\r
-       //UpdateConfig\r
-        new_url := "https://" + ips[i] + ":" + port\r
-        conf, err := kubeutil.UpdateK8sConfig(conf, new_url, true)\r
-        if err != nil {\r
-                log.Println(err)\r
-                return []byte(""), "", pkgerrors.New("Error in updating kubeconfig")\r
-        }\r
-        kubeclient = client.NewClient("", "", []byte(conf))\r
-        is_reachable := kubeclient.IsReachable()\r
-        if is_reachable == true {\r
-                return conf, ip, nil\r
-        }\r
-    }\r
-    return []byte(""), "", pkgerrors.New("No public ip found workable for the cluster")\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"
+       pkgerrors "github.com/pkg/errors"
+       "io/ioutil"
+       "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+       "k8s.io/apimachinery/pkg/runtime"
+       "k8s.io/client-go/kubernetes/scheme"
+       "log"
+       "os"
+       "sigs.k8s.io/yaml"
+)
+
+func DecodeYAMLFromFile(path string, into runtime.Object) (runtime.Object, error) {
+       if _, err := os.Stat(path); err != nil {
+               if os.IsNotExist(err) {
+                       return nil, pkgerrors.New("File " + path + " not found")
+               } else {
+                       return nil, pkgerrors.Wrap(err, "Stat file error")
+               }
+       }
+
+       rawBytes, err := ioutil.ReadFile(path)
+       if err != nil {
+               return nil, pkgerrors.Wrap(err, "Read YAML file error")
+       }
+
+       decode := scheme.Codecs.UniversalDeserializer().Decode
+       obj, _, err := decode(rawBytes, nil, into)
+       if err != nil {
+               return nil, pkgerrors.Wrap(err, "Deserialize YAML error")
+       }
+
+       return obj, nil
+}
+
+func DecodeYAMLFromData(data []byte, into runtime.Object) (runtime.Object, error) {
+       decode := scheme.Codecs.UniversalDeserializer().Decode
+       obj, _, err := decode(data, nil, into)
+       if err != nil {
+               return nil, pkgerrors.Wrap(err, "Deserialize YAML error")
+       }
+
+       return obj, nil
+}
+
+type KubeConfigUtil struct {
+}
+
+var kubeutil = KubeConfigUtil{}
+
+func GetKubeConfigUtil() *KubeConfigUtil {
+       return &kubeutil
+}
+
+func (c *KubeConfigUtil) toYaml(data *unstructured.Unstructured) ([]byte, error) {
+       byte_json, err := data.MarshalJSON()
+       if err != nil {
+               return []byte(""), pkgerrors.Wrap(err, "Fail to generate yaml")
+       }
+
+       byte_yaml, err := yaml.JSONToYAML(byte_json)
+       if err != nil {
+               return []byte(""), pkgerrors.Wrap(err, "Fail to generate yaml")
+       }
+
+       return byte_yaml, nil
+}
+
+func (c *KubeConfigUtil) UpdateK8sConfig(conf []byte, server string, insecure bool) ([]byte, error) {
+       conf_us_obj := &unstructured.Unstructured{}
+       _, err := DecodeYAMLFromData(conf, conf_us_obj)
+       if err == nil {
+               conf_obj := conf_us_obj.UnstructuredContent()
+               cluster_objs, _, err := unstructured.NestedSlice(conf_obj, "clusters")
+               if err == nil {
+                       if len(cluster_objs) > 0 {
+                               cluster_obj := cluster_objs[0].(map[string]interface{})
+                               if insecure {
+                                       // remove certificate-authority-data
+                                       unstructured.RemoveNestedField(cluster_obj, "cluster", "certificate-authority-data")
+                                       // add insecure-skip-tls-verify
+                                       err = unstructured.SetNestedField(cluster_obj, true, "cluster", "insecure-skip-tls-verify")
+                               }
+
+                               if err == nil {
+                                       // set server
+                                       err = unstructured.SetNestedField(cluster_obj, server, "cluster", "server")
+                                       if err == nil {
+                                               err = unstructured.SetNestedSlice(conf_obj, cluster_objs, "clusters")
+                                               if err == nil {
+                                                       return c.toYaml(conf_us_obj)
+                                               }
+                                       }
+                               }
+                       } else {
+                               return []byte(""), pkgerrors.New("UpdateK8sConfig: No cluster")
+                       }
+               }
+       }
+
+       return []byte(""), pkgerrors.Wrap(err, "UpdateK8sConfig")
+}
+
+func (c *KubeConfigUtil) checkKubeConfigAvail(conf []byte, ips []string, port string) ([]byte, string, error) {
+       kubeclient := client.NewClient("", "", conf)
+       for i := 0; i < len(ips); i++ {
+               ip := ips[i]
+               //UpdateConfig
+               new_url := "https://" + ips[i] + ":" + port
+               conf, err := kubeutil.UpdateK8sConfig(conf, new_url, true)
+               if err != nil {
+                       log.Println(err)
+                       return []byte(""), "", pkgerrors.New("Error in updating kubeconfig")
+               }
+               kubeclient = client.NewClient("", "", []byte(conf))
+               is_reachable := kubeclient.IsReachable()
+               if is_reachable == true {
+                       return conf, ip, nil
+               }
+       }
+       return []byte(""), "", pkgerrors.New("No public ip found workable for the cluster")
+}
index 4ed0ac4..afbbb6e 100644 (file)
@@ -1,38 +1,38 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-type Managerset struct {\r
-    Overlay *OverlayObjectManager\r
-    Proposal *ProposalObjectManager\r
-    Hub *HubObjectManager\r
-    HubConn *HubConnObjectManager\r
-    HubDevice *HubDeviceObjectManager\r
-    HubCNF *CNFObjectManager\r
-    Device *DeviceObjectManager\r
-    DeviceConn *DeviceConnObjectManager\r
-    DeviceCNF *CNFObjectManager\r
-    ProviderIPRange *IPRangeObjectManager\r
-    IPRange *IPRangeObjectManager\r
-    Cert *CertificateObjectManager\r
-}\r
-\r
-var mgrset = Managerset{}\r
-\r
-func GetManagerset() *Managerset {\r
-    return &mgrset\r
-}\r
+/*
+ * 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 manager
+
+type Managerset struct {
+       Overlay         *OverlayObjectManager
+       Proposal        *ProposalObjectManager
+       Hub             *HubObjectManager
+       HubConn         *HubConnObjectManager
+       HubDevice       *HubDeviceObjectManager
+       HubCNF          *CNFObjectManager
+       Device          *DeviceObjectManager
+       DeviceConn      *DeviceConnObjectManager
+       DeviceCNF       *CNFObjectManager
+       ProviderIPRange *IPRangeObjectManager
+       IPRange         *IPRangeObjectManager
+       Cert            *CertificateObjectManager
+}
+
+var mgrset = Managerset{}
+
+func GetManagerset() *Managerset {
+       return &mgrset
+}
index 0c94cbf..f0aada0 100644 (file)
-/*\r
-* Copyright 2020 Intel Corporation, Inc\r
-*\r
-* Licensed under the Apache License, Version 2.0 (the "License");\r
-* you may not use this file except in compliance with the License.\r
-* You may obtain a copy of the License at\r
-*\r
-*     http://www.apache.org/licenses/LICENSE-2.0\r
-*\r
-* Unless required by applicable law or agreed to in writing, software\r
-* distributed under the License is distributed on an "AS IS" BASIS,\r
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-* See the License for the specific language governing permissions and\r
-* limitations under the License.\r
-*/\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "log"\r
-    "strings"\r
-//    "time"\r
-    //"strconv"\r
-    "encoding/json"\r
-    "encoding/base64"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-const DEFAULT_MARK = "30"\r
-const VTI_MODE = "VTI-based"\r
-const POLICY_MODE = "policy-based"\r
-const PUBKEY_AUTH = "pubkey"\r
-const FORCECRYPTOPROPOSAL = "0"\r
-const DEFAULT_CONN = "Conn"\r
-const DEFAULT_UPDOWN = "/etc/updown"\r
-const IPTABLES_UPDOWN = "/usr/lib/ipsec/_updown iptables"\r
-const OIP_UPDOWN = "/etc/updown_oip"\r
-const CONN_TYPE = "tunnel"\r
-const MODE = "start"\r
-const OVERLAYIP = "overlayip"\r
-const HUBTOHUB = "hub-to-hub"\r
-const HUBTODEVICE = "hub-to-device"\r
-const DEVICETODEVICE = "device-to-device"\r
-const BYCONFIG = "%config"\r
-const ANY = "%any"\r
-const BASE_PROTOCOL = "TCP"\r
-const DEFAULT_K8S_API_SERVER_PORT = "6443"\r
-const ACCEPT="ACCEPT"\r
-\r
-type OverlayObjectKey struct {\r
-    OverlayName string `json:"overlay-name"`\r
-}\r
-\r
-// OverlayObjectManager implements the ControllerObjectManager\r
-type OverlayObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewOverlayObjectManager() *OverlayObjectManager {\r
-    return &OverlayObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "overlay",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *OverlayObjectManager) GetResourceName() string {\r
-    return OverlayResource\r
-}\r
-\r
-func (c *OverlayObjectManager) IsOperationSupported(oper string) bool {\r
-    return true\r
-}\r
-\r
-func (c *OverlayObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.OverlayObject{}\r
-}\r
-\r
-func (c *OverlayObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    key := OverlayObjectKey{""}\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.OverlayObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[OverlayResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        }\r
-\r
-        key.OverlayName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")\r
-        }\r
-\r
-        key.OverlayName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *OverlayObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.OverlayObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *OverlayObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // Create a issuer each overlay\r
-    to := t.(*module.OverlayObject)\r
-    overlay_name := to.Metadata.Name\r
-    cu, err := GetCertUtil()\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-    // create overlay ca\r
-        _, err := cu.CreateCertificate(c.CertName(overlay_name), NameSpaceName, RootCAIssuerName, true)\r
-        if err == nil {\r
-        // create overlay issuer\r
-            _, err := cu.CreateCAIssuer(c.IssuerName(overlay_name), NameSpaceName, c.CertName(overlay_name))\r
-            if err != nil {\r
-                log.Println("Failed to create overlay[" + overlay_name +"] issuer: " + err.Error())\r
-            }\r
-        } else {\r
-            log.Println("Failed to create overlay[" + overlay_name +"] certificate: " + err.Error())\r
-        }\r
-    }\r
-\r
-    // DB Operation\r
-    t, err = GetDBUtils().CreateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *OverlayObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *OverlayObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *OverlayObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().UpdateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *OverlayObjectManager) DeleteObject(m map[string]string) error {\r
-    overlay_name := m[OverlayResource]\r
-\r
-    // DB Operation\r
-    err := GetDBUtils().DeleteObject(c, m)\r
-    if err == nil {\r
-           cu, err := GetCertUtil()\r
-       if err != nil {\r
-               log.Println(err)\r
-       } else {\r
-               err = cu.DeleteIssuer(c.IssuerName(overlay_name), NameSpaceName)\r
-               if err != nil {\r
-               log.Println("Failed to delete overlay[" + overlay_name +"] issuer: " + err.Error())\r
-       }\r
-               err = cu.DeleteCertificate(c.CertName(overlay_name), NameSpaceName)\r
-               if err != nil {\r
-               log.Println("Failed to delete overlay[" + overlay_name +"] certificate: " + err.Error())\r
-               }\r
-       }\r
-    }\r
-\r
-    return err\r
-}\r
-\r
-func (c *OverlayObjectManager) IssuerName(name string) string {\r
-    return name + "-issuer"\r
-}\r
-\r
-func (c *OverlayObjectManager) CertName(name string) string {\r
-    return name + "-cert"\r
-}\r
-\r
-func (c *OverlayObjectManager) CreateCertificate(oname string, cname string) (string, string, error) {\r
-    cu, err := GetCertUtil()\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-        _, err := cu.CreateCertificate(cname, NameSpaceName, c.IssuerName(oname), false)\r
-        if err != nil {\r
-            log.Println("Failed to create overlay[" + oname +"] certificate: " + err.Error())\r
-        } else {\r
-            crts, key, err := cu.GetKeypair(cname, NameSpaceName)\r
-            if err != nil {\r
-                log.Println(err)\r
-                return "", "", err\r
-            } else {\r
-                crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]\r
-                return crt, key, nil\r
-            }\r
-        }\r
-    }\r
-\r
-    return "", "", nil\r
-}\r
-\r
-func (c *OverlayObjectManager) DeleteCertificate(cname string) (string, string, error) {\r
-    cu, err := GetCertUtil()\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-        err = cu.DeleteCertificate(cname, NameSpaceName)\r
-        if err != nil {\r
-            log.Println("Failed to delete " + cname +" certificate: " + err.Error())\r
-        }\r
-    }\r
-\r
-    return "", "", nil\r
-}\r
-\r
-func (c *OverlayObjectManager) GetCertificate(oname string) (string, string, error) {\r
-    cu, err := GetCertUtil()\r
-    if err != nil {\r
-        log.Println(err)\r
-    } else {\r
-        cname := c.CertName(oname)\r
-        return cu.GetKeypair(cname, NameSpaceName)\r
-    }\r
-    return "", "", nil\r
-}\r
-\r
-//Set up Connection between objects\r
-//Passing the original map resource, the two objects, connection type("hub-to-hub", "hub-to-device", "device-to-device") and namespace name.\r
-func (c *OverlayObjectManager) SetupConnection(m map[string]string, m1 module.ControllerObject, m2 module.ControllerObject, conntype string, namespace string) error {\r
-    //Get all proposals available in the overlay\r
-    proposal := GetManagerset().Proposal\r
-    proposals, err := proposal.GetObjects(m)\r
-    if len(proposals) == 0 || err != nil {\r
-        log.Println("Missing Proposal in the overlay\n")\r
-        return pkgerrors.New("Error in getting proposals")\r
-    }\r
-    var all_proposals []string\r
-    var proposalresources []*resource.ProposalResource\r
-    for i:= 0 ; i < len(proposals); i++ {\r
-        proposal_obj := proposals[i].(*module.ProposalObject)\r
-        all_proposals = append(all_proposals, proposal_obj.Metadata.Name)\r
-        pr := proposal_obj.ToResource()\r
-        proposalresources = append(proposalresources, pr)\r
-    }\r
-\r
-    //Get the overlay cert\r
-    var root_ca string\r
-    root_ca = GetRootCA(m[OverlayResource])\r
-\r
-    var obj1_ipsec_resource resource.IpsecResource\r
-    var obj2_ipsec_resource resource.IpsecResource\r
-    var obj1_ip string\r
-    var obj2_ip string\r
-\r
-    switch conntype {\r
-    case HUBTOHUB:\r
-        obj1 := m1.(*module.HubObject)\r
-        obj2 := m2.(*module.HubObject)\r
-\r
-        obj1_ip = obj1.Status.Ip\r
-        obj2_ip = obj2.Status.Ip\r
-\r
-        //Keypair\r
-        obj1_crt, obj1_key, err := GetHubCertificate(obj1.GetCertName(),namespace)\r
-        if err != nil {\r
-           return err\r
-        }\r
-        obj2_crt, obj2_key, err := GetHubCertificate(obj2.GetCertName(),namespace)\r
-        if err != nil {\r
-           return err\r
-        }\r
-\r
-        //IpsecResources\r
-        conn := resource.Connection{\r
-            Name: DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),\r
-            ConnectionType: CONN_TYPE,\r
-            Mode: MODE,\r
-            Mark: DEFAULT_MARK,\r
-            LocalUpDown: DEFAULT_UPDOWN,\r
-            CryptoProposal: all_proposals,\r
-        }\r
-        obj1_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),\r
-            Type: VTI_MODE,\r
-            Remote: obj2_ip,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(obj1_crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(obj1_key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj1.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj2.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: conn,\r
-        }\r
-        obj2_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),\r
-            Type: VTI_MODE,\r
-            Remote: obj1_ip,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(obj2_crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(obj2_key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj2.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj1.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: conn,\r
-        }\r
-        // Todo: Hub-to-device connection\r
-    case HUBTODEVICE:\r
-        obj1 := m1.(*module.HubObject)\r
-        obj2 := m2.(*module.DeviceObject)\r
-\r
-        obj1_ip := obj1.Status.Ip\r
-        obj2_ip := obj2.Status.Ip\r
-\r
-        //Keypair\r
-        obj1_crt, obj1_key, err := GetHubCertificate(obj1.GetCertName(),namespace)\r
-        if err != nil {\r
-           return err\r
-        }\r
-\r
-        obj1_conn := resource.Connection{\r
-            Name: DEFAULT_CONN + format_resource_name(obj2.Metadata.Name, ""),\r
-            ConnectionType: CONN_TYPE,\r
-            Mode: MODE,\r
-            Mark: DEFAULT_MARK,\r
-            RemoteSourceIp: obj2_ip,\r
-            LocalUpDown: DEFAULT_UPDOWN,\r
-            CryptoProposal: all_proposals,\r
-        }\r
-\r
-        obj1_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),\r
-            Type: VTI_MODE,\r
-            Remote: ANY,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(obj1_crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(obj1_key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj1.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj2.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: obj1_conn,\r
-        }\r
-\r
-        obj2_crt, obj2_key, err := GetDeviceCertificate(m[OverlayResource], obj2.Metadata.Name)\r
-        if err != nil {\r
-           return err\r
-        }\r
-\r
-        //IpsecResources\r
-        obj2_conn := resource.Connection{\r
-            Name: DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, ""),\r
-            Mode: MODE,\r
-            LocalUpDown: IPTABLES_UPDOWN,\r
-            ConnectionType: CONN_TYPE,\r
-            LocalSourceIp: BYCONFIG,\r
-            CryptoProposal: all_proposals,\r
-        }\r
-        obj2_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),\r
-            Type: POLICY_MODE,\r
-            Remote: obj1_ip,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: obj2_crt,\r
-            PrivateCert: obj2_key,\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj2.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj1.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: obj2_conn,\r
-        }\r
-\r
-        //Todo: Device-to-device connection\r
-    case DEVICETODEVICE:\r
-        obj1 := m1.(*module.DeviceObject)\r
-        obj2 := m2.(*module.DeviceObject)\r
-\r
-        obj1_ip := obj1.Status.Ip\r
-        obj2_ip := obj2.Status.Ip\r
-\r
-        //Keypair\r
-        obj1_crt, obj1_key, err := GetDeviceCertificate(m[OverlayResource], obj1.Metadata.Name)\r
-        if err != nil {\r
-           return err\r
-        }\r
-        obj2_crt, obj2_key, err := GetDeviceCertificate(m[OverlayResource], obj2.Metadata.Name)\r
-        if err != nil {\r
-           return err\r
-        }\r
-\r
-        conn := resource.Connection{\r
-            Name: DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),\r
-            ConnectionType: CONN_TYPE,\r
-            Mode: MODE,\r
-            Mark: DEFAULT_MARK,\r
-            LocalUpDown: DEFAULT_UPDOWN,\r
-            CryptoProposal: all_proposals,\r
-        }\r
-        obj1_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),\r
-            Type: POLICY_MODE,\r
-            Remote: obj2_ip,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(obj1_crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(obj1_key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj1.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj2.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: conn,\r
-        }\r
-        obj2_ipsec_resource = resource.IpsecResource{\r
-            Name: format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),\r
-            Type: POLICY_MODE,\r
-            Remote: obj1_ip,\r
-            AuthenticationMethod: PUBKEY_AUTH,\r
-            PublicCert: base64.StdEncoding.EncodeToString([]byte(obj2_crt)),\r
-            PrivateCert: base64.StdEncoding.EncodeToString([]byte(obj2_key)),\r
-            SharedCA: base64.StdEncoding.EncodeToString([]byte(root_ca)),\r
-            LocalIdentifier: "CN="+obj2.GetCertName(),\r
-            RemoteIdentifier: "CN="+obj1.GetCertName(),\r
-            CryptoProposal: all_proposals,\r
-            ForceCryptoProposal: FORCECRYPTOPROPOSAL,\r
-            Connections: conn,\r
-        }\r
-    default:\r
-        return pkgerrors.New("Unknown connection type")\r
-    }\r
-\r
-    cend1 := module.NewConnectionEnd(m1, obj1_ip)\r
-    cend2 := module.NewConnectionEnd(m2, obj2_ip)\r
-\r
-    cend1.AddResource(&obj1_ipsec_resource, false)\r
-    cend2.AddResource(&obj2_ipsec_resource, false)\r
-\r
-    for i :=0; i < len(proposalresources); i++ {\r
-        cend1.AddResource(proposalresources[i], true)\r
-        cend2.AddResource(proposalresources[i], true)\r
-    }\r
-\r
-    co := module.NewConnectionObject(cend1, cend2)\r
-\r
-    cm := GetConnectionManager()\r
-    err = cm.Deploy(m[OverlayResource], co)\r
-    if err != nil {\r
-        return pkgerrors.Wrap(err, "Unable to create the object: fail to deploy resource")\r
-    }\r
-\r
-    return nil\r
-}\r
+/*
+* 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 manager
+
+import (
+       "encoding/base64"
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+       "log"
+       "strings"
+)
+
+const DEFAULT_MARK = "30"
+const VTI_MODE = "VTI-based"
+const POLICY_MODE = "policy-based"
+const PUBKEY_AUTH = "pubkey"
+const FORCECRYPTOPROPOSAL = "0"
+const DEFAULT_CONN = "Conn"
+const DEFAULT_UPDOWN = "/etc/updown"
+const IPTABLES_UPDOWN = "/usr/lib/ipsec/_updown iptables"
+const OIP_UPDOWN = "/etc/updown_oip"
+const CONN_TYPE = "tunnel"
+const MODE = "start"
+const OVERLAYIP = "overlayip"
+const HUBTOHUB = "hub-to-hub"
+const HUBTODEVICE = "hub-to-device"
+const DEVICETODEVICE = "device-to-device"
+const BYCONFIG = "%config"
+const ANY = "%any"
+const BASE_PROTOCOL = "TCP"
+const DEFAULT_K8S_API_SERVER_PORT = "6443"
+const ACCEPT = "ACCEPT"
+
+type OverlayObjectKey struct {
+       OverlayName string `json:"overlay-name"`
+}
+
+// OverlayObjectManager implements the ControllerObjectManager
+type OverlayObjectManager struct {
+       BaseObjectManager
+}
+
+func NewOverlayObjectManager() *OverlayObjectManager {
+       return &OverlayObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "overlay",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *OverlayObjectManager) GetResourceName() string {
+       return OverlayResource
+}
+
+func (c *OverlayObjectManager) IsOperationSupported(oper string) bool {
+       return true
+}
+
+func (c *OverlayObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.OverlayObject{}
+}
+
+func (c *OverlayObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       key := OverlayObjectKey{""}
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.OverlayObject)
+       meta_name := to.Metadata.Name
+       res_name := m[OverlayResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.OverlayName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.OverlayName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *OverlayObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.OverlayObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *OverlayObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // Create a issuer each overlay
+       to := t.(*module.OverlayObject)
+       overlay_name := to.Metadata.Name
+       cu, err := GetCertUtil()
+       if err != nil {
+               log.Println(err)
+       } else {
+               // create overlay ca
+               _, err := cu.CreateCertificate(c.CertName(overlay_name), NameSpaceName, RootCAIssuerName, true)
+               if err == nil {
+                       // create overlay issuer
+                       _, err := cu.CreateCAIssuer(c.IssuerName(overlay_name), NameSpaceName, c.CertName(overlay_name))
+                       if err != nil {
+                               log.Println("Failed to create overlay[" + overlay_name + "] issuer: " + err.Error())
+                       }
+               } else {
+                       log.Println("Failed to create overlay[" + overlay_name + "] certificate: " + err.Error())
+               }
+       }
+
+       // DB Operation
+       t, err = GetDBUtils().CreateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *OverlayObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       return t, err
+}
+
+func (c *OverlayObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *OverlayObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().UpdateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *OverlayObjectManager) DeleteObject(m map[string]string) error {
+       overlay_name := m[OverlayResource]
+
+       // DB Operation
+       err := GetDBUtils().DeleteObject(c, m)
+       if err == nil {
+               cu, err := GetCertUtil()
+               if err != nil {
+                       log.Println(err)
+               } else {
+                       err = cu.DeleteIssuer(c.IssuerName(overlay_name), NameSpaceName)
+                       if err != nil {
+                               log.Println("Failed to delete overlay[" + overlay_name + "] issuer: " + err.Error())
+                       }
+                       err = cu.DeleteCertificate(c.CertName(overlay_name), NameSpaceName)
+                       if err != nil {
+                               log.Println("Failed to delete overlay[" + overlay_name + "] certificate: " + err.Error())
+                       }
+               }
+       }
+
+       return err
+}
+
+func (c *OverlayObjectManager) IssuerName(name string) string {
+       return name + "-issuer"
+}
+
+func (c *OverlayObjectManager) CertName(name string) string {
+       return name + "-cert"
+}
+
+func (c *OverlayObjectManager) CreateCertificate(oname string, cname string) (string, string, error) {
+       cu, err := GetCertUtil()
+       if err != nil {
+               log.Println(err)
+       } else {
+               _, err := cu.CreateCertificate(cname, NameSpaceName, c.IssuerName(oname), false)
+               if err != nil {
+                       log.Println("Failed to create overlay[" + oname + "] certificate: " + err.Error())
+               } else {
+                       crts, key, err := cu.GetKeypair(cname, NameSpaceName)
+                       if err != nil {
+                               log.Println(err)
+                               return "", "", err
+                       } else {
+                               crt := strings.SplitAfter(crts, "-----END CERTIFICATE-----")[0]
+                               return crt, key, nil
+                       }
+               }
+       }
+
+       return "", "", nil
+}
+
+func (c *OverlayObjectManager) DeleteCertificate(cname string) (string, string, error) {
+       cu, err := GetCertUtil()
+       if err != nil {
+               log.Println(err)
+       } else {
+               err = cu.DeleteCertificate(cname, NameSpaceName)
+               if err != nil {
+                       log.Println("Failed to delete " + cname + " certificate: " + err.Error())
+               }
+       }
+
+       return "", "", nil
+}
+
+func (c *OverlayObjectManager) GetCertificate(oname string) (string, string, error) {
+       cu, err := GetCertUtil()
+       if err != nil {
+               log.Println(err)
+       } else {
+               cname := c.CertName(oname)
+               return cu.GetKeypair(cname, NameSpaceName)
+       }
+       return "", "", nil
+}
+
+//Set up Connection between objects
+//Passing the original map resource, the two objects, connection type("hub-to-hub", "hub-to-device", "device-to-device") and namespace name.
+func (c *OverlayObjectManager) SetupConnection(m map[string]string, m1 module.ControllerObject, m2 module.ControllerObject, conntype string, namespace string) error {
+       //Get all proposals available in the overlay
+       proposal := GetManagerset().Proposal
+       proposals, err := proposal.GetObjects(m)
+       if len(proposals) == 0 || err != nil {
+               log.Println("Missing Proposal in the overlay\n")
+               return pkgerrors.New("Error in getting proposals")
+       }
+       var all_proposals []string
+       var proposalresources []*resource.ProposalResource
+       for i := 0; i < len(proposals); i++ {
+               proposal_obj := proposals[i].(*module.ProposalObject)
+               all_proposals = append(all_proposals, proposal_obj.Metadata.Name)
+               pr := proposal_obj.ToResource()
+               proposalresources = append(proposalresources, pr)
+       }
+
+       //Get the overlay cert
+       var root_ca string
+       root_ca = GetRootCA(m[OverlayResource])
+
+       var obj1_ipsec_resource resource.IpsecResource
+       var obj2_ipsec_resource resource.IpsecResource
+       var obj1_ip string
+       var obj2_ip string
+
+       switch conntype {
+       case HUBTOHUB:
+               obj1 := m1.(*module.HubObject)
+               obj2 := m2.(*module.HubObject)
+
+               obj1_ip = obj1.Status.Ip
+               obj2_ip = obj2.Status.Ip
+
+               //Keypair
+               obj1_crt, obj1_key, err := GetHubCertificate(obj1.GetCertName(), namespace)
+               if err != nil {
+                       return err
+               }
+               obj2_crt, obj2_key, err := GetHubCertificate(obj2.GetCertName(), namespace)
+               if err != nil {
+                       return err
+               }
+
+               //IpsecResources
+               conn := resource.Connection{
+                       Name:           DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),
+                       ConnectionType: CONN_TYPE,
+                       Mode:           MODE,
+                       Mark:           DEFAULT_MARK,
+                       LocalUpDown:    DEFAULT_UPDOWN,
+                       CryptoProposal: all_proposals,
+               }
+               obj1_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),
+                       Type:                 VTI_MODE,
+                       Remote:               obj2_ip,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(obj1_crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(obj1_key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj1.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj2.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          conn,
+               }
+               obj2_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),
+                       Type:                 VTI_MODE,
+                       Remote:               obj1_ip,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(obj2_crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(obj2_key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj2.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj1.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          conn,
+               }
+               // Todo: Hub-to-device connection
+       case HUBTODEVICE:
+               obj1 := m1.(*module.HubObject)
+               obj2 := m2.(*module.DeviceObject)
+
+               obj1_ip := obj1.Status.Ip
+               obj2_ip := obj2.Status.Ip
+
+               //Keypair
+               obj1_crt, obj1_key, err := GetHubCertificate(obj1.GetCertName(), namespace)
+               if err != nil {
+                       return err
+               }
+
+               obj1_conn := resource.Connection{
+                       Name:           DEFAULT_CONN + format_resource_name(obj2.Metadata.Name, ""),
+                       ConnectionType: CONN_TYPE,
+                       Mode:           MODE,
+                       Mark:           DEFAULT_MARK,
+                       RemoteSourceIp: obj2_ip,
+                       LocalUpDown:    DEFAULT_UPDOWN,
+                       CryptoProposal: all_proposals,
+               }
+
+               obj1_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),
+                       Type:                 VTI_MODE,
+                       Remote:               ANY,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(obj1_crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(obj1_key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj1.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj2.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          obj1_conn,
+               }
+
+               obj2_crt, obj2_key, err := GetDeviceCertificate(m[OverlayResource], obj2.Metadata.Name)
+               if err != nil {
+                       return err
+               }
+
+               //IpsecResources
+               obj2_conn := resource.Connection{
+                       Name:           DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, ""),
+                       Mode:           MODE,
+                       LocalUpDown:    IPTABLES_UPDOWN,
+                       ConnectionType: CONN_TYPE,
+                       LocalSourceIp:  BYCONFIG,
+                       CryptoProposal: all_proposals,
+               }
+               obj2_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),
+                       Type:                 POLICY_MODE,
+                       Remote:               obj1_ip,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           obj2_crt,
+                       PrivateCert:          obj2_key,
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj2.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj1.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          obj2_conn,
+               }
+
+               //Todo: Device-to-device connection
+       case DEVICETODEVICE:
+               obj1 := m1.(*module.DeviceObject)
+               obj2 := m2.(*module.DeviceObject)
+
+               obj1_ip := obj1.Status.Ip
+               obj2_ip := obj2.Status.Ip
+
+               //Keypair
+               obj1_crt, obj1_key, err := GetDeviceCertificate(m[OverlayResource], obj1.Metadata.Name)
+               if err != nil {
+                       return err
+               }
+               obj2_crt, obj2_key, err := GetDeviceCertificate(m[OverlayResource], obj2.Metadata.Name)
+               if err != nil {
+                       return err
+               }
+
+               conn := resource.Connection{
+                       Name:           DEFAULT_CONN + format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),
+                       ConnectionType: CONN_TYPE,
+                       Mode:           MODE,
+                       Mark:           DEFAULT_MARK,
+                       LocalUpDown:    DEFAULT_UPDOWN,
+                       CryptoProposal: all_proposals,
+               }
+               obj1_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj1.Metadata.Name, obj2.Metadata.Name),
+                       Type:                 POLICY_MODE,
+                       Remote:               obj2_ip,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(obj1_crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(obj1_key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj1.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj2.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          conn,
+               }
+               obj2_ipsec_resource = resource.IpsecResource{
+                       Name:                 format_resource_name(obj2.Metadata.Name, obj1.Metadata.Name),
+                       Type:                 POLICY_MODE,
+                       Remote:               obj1_ip,
+                       AuthenticationMethod: PUBKEY_AUTH,
+                       PublicCert:           base64.StdEncoding.EncodeToString([]byte(obj2_crt)),
+                       PrivateCert:          base64.StdEncoding.EncodeToString([]byte(obj2_key)),
+                       SharedCA:             base64.StdEncoding.EncodeToString([]byte(root_ca)),
+                       LocalIdentifier:      "CN=" + obj2.GetCertName(),
+                       RemoteIdentifier:     "CN=" + obj1.GetCertName(),
+                       CryptoProposal:       all_proposals,
+                       ForceCryptoProposal:  FORCECRYPTOPROPOSAL,
+                       Connections:          conn,
+               }
+       default:
+               return pkgerrors.New("Unknown connection type")
+       }
+
+       cend1 := module.NewConnectionEnd(m1, obj1_ip)
+       cend2 := module.NewConnectionEnd(m2, obj2_ip)
+
+       cend1.AddResource(&obj1_ipsec_resource, false)
+       cend2.AddResource(&obj2_ipsec_resource, false)
+
+       for i := 0; i < len(proposalresources); i++ {
+               cend1.AddResource(proposalresources[i], true)
+               cend2.AddResource(proposalresources[i], true)
+       }
+
+       co := module.NewConnectionObject(cend1, cend2)
+
+       cm := GetConnectionManager()
+       err = cm.Deploy(m[OverlayResource], co)
+       if err != nil {
+               return pkgerrors.Wrap(err, "Unable to create the object: fail to deploy resource")
+       }
+
+       return nil
+}
index c1f93d5..8104ea7 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "io"\r
-    "encoding/json"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type ProposalObjectKey struct {\r
-    OverlayName  string `json:"overlay-name"`\r
-    ProposalName string `json:"proposal-name"`\r
-}\r
-\r
-// ProposalObjectManager implements the ControllerObjectManager\r
-type ProposalObjectManager struct {\r
-    BaseObjectManager\r
-}\r
-\r
-func NewProposalObjectManager() *ProposalObjectManager {\r
-    return &ProposalObjectManager{\r
-        BaseObjectManager {\r
-            storeName:  StoreName,\r
-            tagMeta:    "proposal",\r
-            depResManagers: []ControllerObjectManager {},\r
-            ownResManagers: []ControllerObjectManager {},\r
-        },\r
-    }\r
-}\r
-\r
-func (c *ProposalObjectManager) GetResourceName() string {\r
-    return ProposalResource\r
-}\r
-\r
-func (c *ProposalObjectManager) IsOperationSupported(oper string) bool {\r
-    return true\r
-}\r
-\r
-func (c *ProposalObjectManager) CreateEmptyObject() module.ControllerObject {\r
-    return &module.ProposalObject{}\r
-}\r
-\r
-func (c *ProposalObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {\r
-    overlay_name := m[OverlayResource]\r
-    key := ProposalObjectKey{\r
-        OverlayName: overlay_name,\r
-        ProposalName: "",\r
-    }\r
-\r
-    if isCollection == true {\r
-        return key, nil\r
-    }\r
-\r
-    to := t.(*module.ProposalObject)\r
-    meta_name := to.Metadata.Name\r
-    res_name := m[ProposalResource]\r
-\r
-    if res_name != "" {\r
-        if meta_name != "" && res_name != meta_name {\r
-            return key, pkgerrors.New("Resource name unmatched metadata name")\r
-        } \r
-\r
-        key.ProposalName = res_name\r
-    } else {\r
-        if meta_name == "" {\r
-            return key, pkgerrors.New("Unable to find resource name")  \r
-        }\r
-\r
-        key.ProposalName = meta_name\r
-    }\r
-\r
-    return key, nil;\r
-}\r
-\r
-func (c *ProposalObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {\r
-    var v module.ProposalObject\r
-    err := json.NewDecoder(r).Decode(&v)\r
-\r
-    return &v, err\r
-}\r
-\r
-func (c *ProposalObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().CreateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *ProposalObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObject(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *ProposalObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().GetObjects(c, m)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *ProposalObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {\r
-    // DB Operation\r
-    t, err := GetDBUtils().UpdateObject(c, m, t)\r
-\r
-    return t, err\r
-}\r
-\r
-func (c *ProposalObjectManager) DeleteObject(m map[string]string) error {\r
-    // DB Operation\r
-    err := GetDBUtils().DeleteObject(c, m)\r
-\r
-    return err\r
-}\r
+/*
+ * 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 manager
+
+import (
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/db"
+       pkgerrors "github.com/pkg/errors"
+       "io"
+)
+
+type ProposalObjectKey struct {
+       OverlayName  string `json:"overlay-name"`
+       ProposalName string `json:"proposal-name"`
+}
+
+// ProposalObjectManager implements the ControllerObjectManager
+type ProposalObjectManager struct {
+       BaseObjectManager
+}
+
+func NewProposalObjectManager() *ProposalObjectManager {
+       return &ProposalObjectManager{
+               BaseObjectManager{
+                       storeName:      StoreName,
+                       tagMeta:        "proposal",
+                       depResManagers: []ControllerObjectManager{},
+                       ownResManagers: []ControllerObjectManager{},
+               },
+       }
+}
+
+func (c *ProposalObjectManager) GetResourceName() string {
+       return ProposalResource
+}
+
+func (c *ProposalObjectManager) IsOperationSupported(oper string) bool {
+       return true
+}
+
+func (c *ProposalObjectManager) CreateEmptyObject() module.ControllerObject {
+       return &module.ProposalObject{}
+}
+
+func (c *ProposalObjectManager) GetStoreKey(m map[string]string, t module.ControllerObject, isCollection bool) (db.Key, error) {
+       overlay_name := m[OverlayResource]
+       key := ProposalObjectKey{
+               OverlayName:  overlay_name,
+               ProposalName: "",
+       }
+
+       if isCollection == true {
+               return key, nil
+       }
+
+       to := t.(*module.ProposalObject)
+       meta_name := to.Metadata.Name
+       res_name := m[ProposalResource]
+
+       if res_name != "" {
+               if meta_name != "" && res_name != meta_name {
+                       return key, pkgerrors.New("Resource name unmatched metadata name")
+               }
+
+               key.ProposalName = res_name
+       } else {
+               if meta_name == "" {
+                       return key, pkgerrors.New("Unable to find resource name")
+               }
+
+               key.ProposalName = meta_name
+       }
+
+       return key, nil
+}
+
+func (c *ProposalObjectManager) ParseObject(r io.Reader) (module.ControllerObject, error) {
+       var v module.ProposalObject
+       err := json.NewDecoder(r).Decode(&v)
+
+       return &v, err
+}
+
+func (c *ProposalObjectManager) CreateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().CreateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *ProposalObjectManager) GetObject(m map[string]string) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObject(c, m)
+
+       return t, err
+}
+
+func (c *ProposalObjectManager) GetObjects(m map[string]string) ([]module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().GetObjects(c, m)
+
+       return t, err
+}
+
+func (c *ProposalObjectManager) UpdateObject(m map[string]string, t module.ControllerObject) (module.ControllerObject, error) {
+       // DB Operation
+       t, err := GetDBUtils().UpdateObject(c, m, t)
+
+       return t, err
+}
+
+func (c *ProposalObjectManager) DeleteObject(m map[string]string) error {
+       // DB Operation
+       err := GetDBUtils().DeleteObject(c, m)
+
+       return err
+}
index c8916c1..2103130 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"\r
-    rsyncclient "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/resourcestatus"\r
-\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/appcontext"\r
-//    rsyncclient "github.com/open-ness/EMCO/src/orchestrator/pkg/grpc/installappclient"\r
-    controller "github.com/open-ness/EMCO/src/orchestrator/pkg/module/controller"\r
-    "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/rpc"\r
-\r
-    "k8s.io/apimachinery/pkg/runtime/schema"\r
-    "k8s.io/apimachinery/pkg/util/wait"\r
-\r
-    "log"\r
-    "fmt"\r
-    "time"\r
-    "encoding/json"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-var rsync_initialized = false\r
-var provider_name = "akraino_scc"\r
-var project_name = "akraino_scc"\r
-\r
-// sdewan definition\r
-type DeployResource struct {\r
-    Action string\r
-    Resource resource.ISdewanResource\r
-}\r
-\r
-type DeployResources struct {\r
-    Resources []DeployResource\r
-}\r
-\r
-type ReadResource struct {\r
-    Gvk       schema.GroupVersionKind `json:"GVK,omitempty"`\r
-    Name      string                  `json:"name,omitempty"`\r
-    Namespace string                  `json:"namespace,omitempty"`\r
-}\r
-\r
-type QueryResource struct {\r
-    Handle interface{}\r
-    Resource ReadResource\r
-}\r
-\r
-type QueryResources struct {\r
-    Resources []*QueryResource\r
-}\r
-\r
-type ResUtil struct {\r
-    resmap map[module.ControllerObject]*DeployResources\r
-    qryResmap map[module.ControllerObject]*QueryResources\r
-    qryCtxId string\r
-}\r
-\r
-func NewResUtil() *ResUtil {\r
-    if rsync_initialized == false {\r
-        rsync_initialized = InitRsyncClient()\r
-    }\r
-\r
-    return &ResUtil{\r
-        resmap: make(map[module.ControllerObject]*DeployResources),\r
-        qryResmap: make(map[module.ControllerObject]*QueryResources),\r
-        qryCtxId: "",\r
-    }\r
-}\r
-\r
-type contextForCompositeApp struct {\r
-    context            appcontext.AppContext\r
-    ctxval             interface{}\r
-    compositeAppHandle interface{}\r
-}\r
-\r
-func makeAppContextForCompositeApp(p, ca, v, rName, dig string, namespace string, level string) (contextForCompositeApp, error) {\r
-    // ctxval: context.rtcObj.id\r
-    context := appcontext.AppContext{}\r
-    ctxval, err := context.InitAppContext()\r
-    if err != nil {\r
-        return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error creating AppContext CompositeApp")\r
-    }\r
-    compositeHandle, err := context.CreateCompositeApp()\r
-    if err != nil {\r
-        return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error creating CompositeApp handle")\r
-    }\r
-    err = context.AddCompositeAppMeta(appcontext.CompositeAppMeta{Project: p, CompositeApp: ca, Version: v, Release: rName, DeploymentIntentGroup: dig, Namespace: namespace, Level: level})\r
-    if err != nil {\r
-        return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error Adding CompositeAppMeta")\r
-    }\r
-\r
-    //_, err = context.GetCompositeAppMeta()\r
-\r
-    log.Println(":: The meta data stored in the runtime context :: ")\r
-\r
-    cca := contextForCompositeApp{context: context, ctxval: ctxval, compositeAppHandle: compositeHandle}\r
-\r
-    return cca, nil\r
-}\r
-\r
-func addResourcesToCluster(ct appcontext.AppContext, ch interface{}, target string, resources []DeployResource, isDeploy bool) error {\r
-\r
-    var resOrderInstr struct {\r
-        Resorder []string `json:"resorder"`\r
-    }\r
-\r
-    var resDepInstr struct {\r
-        Resdep map[string]string `json:"resdependency"`\r
-    }\r
-    resdep := make(map[string]string)\r
-\r
-    for _, resource := range resources {\r
-        resource_name :=  resource.Resource.GetName() + "+" +  resource.Resource.GetType()\r
-        resource_data := resource.Resource.ToYaml(target)\r
-        resOrderInstr.Resorder = append(resOrderInstr.Resorder, resource_name)\r
-        resdep[resource_name] = "go"\r
-        // rtc.RtcAddResource("<cid>/app/app_name/cluster/clusername/", res.name, res.content)\r
-        // -> save ("<cid>/app/app_name/cluster/clusername/resource/res.name/", res.content) in etcd\r
-        // return ("<cid>/app/app_name/cluster/clusername/resource/res.name/"\r
-        rh, err := ct.AddResource(ch, resource_name, resource_data)\r
-       if isDeploy == false {\r
-               //Delete resource\r
-               ct.AddLevelValue(rh, "status", resourcestatus.ResourceStatus{Status:resourcestatus.RsyncStatusEnum.Applied})\r
-       }\r
-        if err != nil {\r
-            cleanuperr := ct.DeleteCompositeApp()\r
-            if cleanuperr != nil {\r
-                log.Printf(":: Error Cleaning up AppContext after add resource failure ::")\r
-            }\r
-            return pkgerrors.Wrapf(err, "Error adding resource ::%s to AppContext", resource_name)\r
-        }\r
-        jresOrderInstr, _ := json.Marshal(resOrderInstr)\r
-        resDepInstr.Resdep = resdep\r
-        jresDepInstr, _ := json.Marshal(resDepInstr)\r
-        // rtc.RtcAddInstruction("<cid>app/app_name/cluster/clusername/", "resource", "order", "{[res.name]}")\r
-        // ->save ("<cid>/app/app_name/cluster/clusername/resource/instruction/order/", "{[res.name]}") in etcd\r
-        // return "<cid>/app/app_name/cluster/clusername/resource/instruction/order/"\r
-        _, err = ct.AddInstruction(ch, "resource", "order", string(jresOrderInstr))\r
-        _, err = ct.AddInstruction(ch, "resource", "dependency", string(jresDepInstr))\r
-        if err != nil {\r
-            cleanuperr := ct.DeleteCompositeApp()\r
-            if cleanuperr != nil {\r
-                log.Printf(":: Error Cleaning up AppContext after add instruction failure ::")\r
-            }\r
-            return pkgerrors.Wrapf(err, "Error adding instruction for resource ::%s to AppContext", resource_name)\r
-        }\r
-    }\r
-    return nil\r
-}\r
-\r
-func InitRsyncClient() bool {\r
-    client := controller.NewControllerClient()\r
-\r
-    vals, _ := client.GetControllers()\r
-    found := false\r
-    for _, v := range vals {\r
-        if v.Metadata.Name == "rsync" {\r
-            log.Println("Initializing RPC connection to resource synchronizer")\r
-            rpc.UpdateRpcConn(v.Metadata.Name, v.Spec.Host, v.Spec.Port)\r
-            found = true\r
-            break\r
-        }\r
-    }\r
-    return found\r
-}\r
-\r
-func initializeAppContextStatus(ac appcontext.AppContext, acStatus appcontext.AppContextStatus) error {\r
-        h, err := ac.GetCompositeAppHandle()\r
-        if err != nil {\r
-                return err\r
-        }\r
-        sh, err := ac.GetLevelHandle(h, "status")\r
-        if sh == nil {\r
-                _, err = ac.AddLevelValue(h, "status", acStatus)\r
-        } else {\r
-                err = ac.UpdateValue(sh, acStatus)\r
-        }\r
-        if err != nil {\r
-                return err\r
-        }\r
-        return nil\r
-}\r
-\r
-func (d *ResUtil) contains(reses []DeployResource, res DeployResource) bool {\r
-    for _, r := range reses {\r
-        if r.Action == res.Action &&\r
-           r.Resource.GetName() == res.Resource.GetName() &&\r
-           r.Resource.GetType() == res.Resource.GetType() {\r
-            return true\r
-        }\r
-    }\r
-\r
-    return false\r
-}\r
-\r
-func (d *ResUtil) AddResource(device module.ControllerObject, action string, resource resource.ISdewanResource) error {\r
-    if d.resmap[device] == nil {\r
-        d.resmap[device] = &DeployResources{Resources: []DeployResource{}}\r
-    }\r
-\r
-    ds := DeployResource{Action: action, Resource: resource,}\r
-    if !d.contains(d.resmap[device].Resources, ds) {\r
-        d.resmap[device].Resources = append(d.resmap[device].Resources, ds)\r
-    }\r
-    return nil\r
-}\r
-\r
-func (d *ResUtil) TargetName (o module.ControllerObject) string {\r
-    return o.GetType() + "." + o.GetMetadata().Name\r
-}\r
-\r
-func (d *ResUtil) Deploy(app_name string, format string) (string, error) {\r
-    // Generate Application context\r
-    cca, err := makeAppContextForCompositeApp(project_name, app_name + "-d", "1.0", "1.0", "di", "default", "0")\r
-    context := cca.context  // appcontext.AppContext\r
-    ctxval := cca.ctxval    // id\r
-    compositeHandle := cca.compositeAppHandle // cid\r
-\r
-    var appOrderInstr struct {\r
-        Apporder []string `json:"apporder"`\r
-    }\r
-    var appDepInstr struct {\r
-            Appdep map[string]string `json:"appdependency"`\r
-        }\r
-    appdep := make(map[string]string)\r
-    // create a com_app for each device\r
-    for device, res := range d.resmap {\r
-        // Add application\r
-        app_name := device.GetMetadata().Name + "-app"\r
-        appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)\r
-        appdep[app_name] = "go"\r
-\r
-        // rtc.RtcAddLevel(cid, "app", app_name) -> save ("<cid>app/app_name/", app_name) in etcd\r
-        // apphandle = "<cid>app/app_name/"\r
-        apphandle, _ := context.AddApp(compositeHandle, app_name)\r
-\r
-        // Add cluster\r
-        // err = addClustersToAppContext(listOfClusters, context, apphandle, resources)\r
-        // rtc.RtcAddLevel("<cid>app/app_name/", "cluster", clustername) \r
-        // -> save ("<cid>app/app_name/cluster/clusername/", clustername) in etcd\r
-        // return "<cid>app/app_name/cluster/clusername/"\r
-        clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)\r
-        err = addResourcesToCluster(context, clusterhandle, d.TargetName(device), res.Resources, true)\r
-    }\r
-\r
-    jappOrderInstr, _ := json.Marshal(appOrderInstr)\r
-    appDepInstr.Appdep = appdep\r
-    jappDepInstr, _ := json.Marshal(appDepInstr)\r
-    context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))\r
-    context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))\r
-\r
-    // invoke deployment process\r
-    appContextID := fmt.Sprintf("%v", ctxval)\r
-    err = rsyncclient.InvokeInstallApp(appContextID)\r
-    if err != nil {\r
-        log.Println(err)\r
-        return appContextID, err\r
-    }\r
-\r
-    return appContextID, nil\r
-}\r
-\r
-func (d *ResUtil) Undeploy(app_name string, format string) (string, error) {\r
-    // Generate Application context\r
-    cca, err := makeAppContextForCompositeApp(project_name, app_name + "-u", "1.0", "1.0", "di", "default", "0")\r
-    context := cca.context  // appcontext.AppContext\r
-    ctxval := cca.ctxval    // id\r
-    compositeHandle := cca.compositeAppHandle // cid\r
-\r
-    var appOrderInstr struct {\r
-        Apporder []string `json:"apporder"`\r
-    }\r
-    var appDepInstr struct {\r
-            Appdep map[string]string `json:"appdependency"`\r
-        }\r
-    appdep := make(map[string]string)\r
-    // create a com_app for each device\r
-    for device, res := range d.resmap {\r
-        // Add application\r
-        app_name := device.GetMetadata().Name + "-app"\r
-        appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)\r
-        appdep[app_name] = "go"\r
-        apphandle, _ := context.AddApp(compositeHandle, app_name)\r
-\r
-        // Add cluster\r
-        clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)\r
-        err = addResourcesToCluster(context, clusterhandle, d.TargetName(device), res.Resources, false)\r
-    }\r
-\r
-    jappOrderInstr, _ := json.Marshal(appOrderInstr)\r
-    appDepInstr.Appdep = appdep\r
-    jappDepInstr, _ := json.Marshal(appDepInstr)\r
-    context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))\r
-    context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))\r
-\r
-    initializeAppContextStatus(context, appcontext.AppContextStatus{Status: appcontext.AppContextStatusEnum.Instantiated})\r
-    // invoke deployment process\r
-    appContextID := fmt.Sprintf("%v", ctxval)\r
-    err = rsyncclient.InvokeUninstallApp(appContextID)\r
-    if err != nil {\r
-        log.Println(err)\r
-        return appContextID, err\r
-    }\r
-\r
-    return appContextID, nil\r
-}\r
-\r
-func (d *ResUtil) AddQueryResource(device module.ControllerObject, resource QueryResource) error {\r
-    if d.qryResmap[device] == nil {\r
-        d.qryResmap[device] = &QueryResources{Resources: []*QueryResource{}}\r
-    }\r
-\r
-    d.qryResmap[device].Resources = append(d.qryResmap[device].Resources, &resource)\r
-    d.qryCtxId = ""\r
-\r
-    return nil\r
-}\r
-\r
-func addQueryResourcesToCluster(ct appcontext.AppContext, ch interface{}, resources *[]*QueryResource) error {\r
-\r
-    var resOrderInstr struct {\r
-        Resorder []string `json:"resorder"`\r
-    }\r
-\r
-    var resDepInstr struct {\r
-        Resdep map[string]string `json:"resdependency"`\r
-    }\r
-    resdep := make(map[string]string)\r
-\r
-    for _, resource := range *resources {\r
-        resource_name :=  resource.Resource.Namespace + "+" +  resource.Resource.Name\r
-        v, _ := json.Marshal(resource.Resource)\r
-        resOrderInstr.Resorder = append(resOrderInstr.Resorder, resource_name)\r
-        resdep[resource_name] = "go"\r
-\r
-        rh, err := ct.AddResource(ch, resource_name, string(v))\r
-\r
-        if err != nil {\r
-            return pkgerrors.Wrapf(err, "Error adding resource ::%s to AppContext", resource_name)\r
-        }\r
-\r
-        // save the resource handler for query result\r
-        resource.Handle = rh\r
-\r
-        jresOrderInstr, _ := json.Marshal(resOrderInstr)\r
-        resDepInstr.Resdep = resdep\r
-        jresDepInstr, _ := json.Marshal(resDepInstr)\r
-\r
-        _, err = ct.AddInstruction(ch, "resource", "order", string(jresOrderInstr))\r
-        _, err = ct.AddInstruction(ch, "resource", "dependency", string(jresDepInstr))\r
-        if err != nil {\r
-            return pkgerrors.Wrapf(err, "Error adding instruction for resource ::%s to AppContext", resource_name)\r
-        }\r
-    }\r
-    return nil\r
-}\r
-\r
-func (d *ResUtil) Query(app_name string) (string, error) {\r
-    if d.qryCtxId == "" {\r
-        // Generate Application context\r
-        cca, err := makeAppContextForCompositeApp(project_name, app_name + "-d", "1.0", "1.0", "di", "default", "0")\r
-        if err != nil {\r
-            log.Println(err)\r
-            return "", err\r
-        }\r
-\r
-        context := cca.context  // appcontext.AppContext\r
-        ctxval := cca.ctxval    // id\r
-        compositeHandle := cca.compositeAppHandle // cid\r
-\r
-        var appOrderInstr struct {\r
-            Apporder []string `json:"apporder"`\r
-        }\r
-        var appDepInstr struct {\r
-                Appdep map[string]string `json:"appdependency"`\r
-            }\r
-        appdep := make(map[string]string)\r
-        // create a com_app for each device\r
-        for device, res := range d.qryResmap {\r
-            // Add application\r
-            app_name := device.GetMetadata().Name + "-query-app"\r
-            appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)\r
-            appdep[app_name] = "go"\r
-\r
-            apphandle, _ := context.AddApp(compositeHandle, app_name)\r
-\r
-            // Add cluster\r
-            clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)\r
-            err = addQueryResourcesToCluster(context, clusterhandle, &res.Resources)\r
-        }\r
-\r
-        jappOrderInstr, _ := json.Marshal(appOrderInstr)\r
-        appDepInstr.Appdep = appdep\r
-        jappDepInstr, _ := json.Marshal(appDepInstr)\r
-        context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))\r
-        context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))\r
-\r
-        // invoke query process\r
-        appContextID := fmt.Sprintf("%v", ctxval)\r
-        d.qryCtxId = appContextID\r
-    }\r
-\r
-    err := rsyncclient.InvokeGetResource(d.qryCtxId)\r
-    if err != nil {\r
-        log.Println(err)\r
-        d.qryCtxId = ""\r
-        return "", err\r
-    }\r
-\r
-    return d.qryCtxId, nil\r
-}\r
-\r
-func (d *ResUtil) GetResourceData(device module.ControllerObject, ns string, name string) (string, error) {\r
-    if d.qryCtxId == "" {\r
-        return "", pkgerrors.New("Query failed to be executed.")\r
-    }\r
-\r
-    var ac appcontext.AppContext\r
-    ah, err := ac.LoadAppContext(d.qryCtxId)\r
-    if err != nil {\r
-        return "", pkgerrors.Wrap(err, "AppContext is not found.")\r
-    }\r
-\r
-    // wait for resource ready\r
-    err = wait.PollImmediate(time.Second, time.Second*20,\r
-        func() (bool, error) {\r
-            sh, err := ac.GetLevelHandle(ah, "status")\r
-            if err != nil {\r
-                log.Println("Waiting for Resource status to be ready.")\r
-                return false, nil\r
-            }\r
-\r
-            s, err := ac.GetValue(sh)\r
-            if err != nil {\r
-                log.Println("Waiting for Resource status to be ready..")\r
-                return false, nil\r
-            }\r
-\r
-            acStatus := appcontext.AppContextStatus{}\r
-            js, _ := json.Marshal(s)\r
-            json.Unmarshal(js, &acStatus)\r
-            log.Println(acStatus.Status)\r
-            if acStatus.Status == appcontext.AppContextStatusEnum.Instantiated {\r
-                return true, nil\r
-            }\r
-            \r
-            log.Println("Waiting for Resource status to be ready...")\r
-            return false, nil\r
-        },\r
-    )\r
-\r
-    if err != nil {\r
-        log.Println(err)\r
-        return "", pkgerrors.Wrap(err, "Resource is not available")\r
-    }\r
-\r
-    // found resource handle\r
-    if d.qryResmap[device] == nil {\r
-        return "", pkgerrors.Wrap(err, "No query resource found.")\r
-    }\r
-\r
-    for _, resource := range d.qryResmap[device].Resources {\r
-        if ns == resource.Resource.Namespace && name == resource.Resource.Name {\r
-            rdh, _ := ac.GetLevelHandle(resource.Handle, "definition")\r
-            if rdh != nil {\r
-                ret, err := ac.GetValue(rdh)\r
-                if err == nil {\r
-                    return ret.(string), nil\r
-                }\r
-            }\r
-            return "", pkgerrors.Wrap(err, "Failed to query the resource value.")\r
-        }\r
-    }\r
-\r
-    return "", pkgerrors.New("No query resource found.")\r
-}
\ No newline at end of file
+/*
+ * 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 manager
+
+import (
+       rsyncclient "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/client"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/resourcestatus"
+
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/appcontext"
+       //    rsyncclient "github.com/open-ness/EMCO/src/orchestrator/pkg/grpc/installappclient"
+       "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/rpc"
+       controller "github.com/open-ness/EMCO/src/orchestrator/pkg/module/controller"
+
+       "k8s.io/apimachinery/pkg/runtime/schema"
+       "k8s.io/apimachinery/pkg/util/wait"
+
+       "encoding/json"
+       "fmt"
+       pkgerrors "github.com/pkg/errors"
+       "log"
+       "time"
+)
+
+var rsync_initialized = false
+var provider_name = "akraino_scc"
+var project_name = "akraino_scc"
+
+// sdewan definition
+type DeployResource struct {
+       Action   string
+       Resource resource.ISdewanResource
+}
+
+type DeployResources struct {
+       Resources []DeployResource
+}
+
+type ReadResource struct {
+       Gvk       schema.GroupVersionKind `json:"GVK,omitempty"`
+       Name      string                  `json:"name,omitempty"`
+       Namespace string                  `json:"namespace,omitempty"`
+}
+
+type QueryResource struct {
+       Handle   interface{}
+       Resource ReadResource
+}
+
+type QueryResources struct {
+       Resources []*QueryResource
+}
+
+type ResUtil struct {
+       resmap    map[module.ControllerObject]*DeployResources
+       qryResmap map[module.ControllerObject]*QueryResources
+       qryCtxId  string
+}
+
+func NewResUtil() *ResUtil {
+       if rsync_initialized == false {
+               rsync_initialized = InitRsyncClient()
+       }
+
+       return &ResUtil{
+               resmap:    make(map[module.ControllerObject]*DeployResources),
+               qryResmap: make(map[module.ControllerObject]*QueryResources),
+               qryCtxId:  "",
+       }
+}
+
+type contextForCompositeApp struct {
+       context            appcontext.AppContext
+       ctxval             interface{}
+       compositeAppHandle interface{}
+}
+
+func makeAppContextForCompositeApp(p, ca, v, rName, dig string, namespace string, level string) (contextForCompositeApp, error) {
+       // ctxval: context.rtcObj.id
+       context := appcontext.AppContext{}
+       ctxval, err := context.InitAppContext()
+       if err != nil {
+               return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error creating AppContext CompositeApp")
+       }
+       compositeHandle, err := context.CreateCompositeApp()
+       if err != nil {
+               return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error creating CompositeApp handle")
+       }
+       err = context.AddCompositeAppMeta(appcontext.CompositeAppMeta{Project: p, CompositeApp: ca, Version: v, Release: rName, DeploymentIntentGroup: dig, Namespace: namespace, Level: level})
+       if err != nil {
+               return contextForCompositeApp{}, pkgerrors.Wrap(err, "Error Adding CompositeAppMeta")
+       }
+
+       //_, err = context.GetCompositeAppMeta()
+
+       log.Println(":: The meta data stored in the runtime context :: ")
+
+       cca := contextForCompositeApp{context: context, ctxval: ctxval, compositeAppHandle: compositeHandle}
+
+       return cca, nil
+}
+
+func addResourcesToCluster(ct appcontext.AppContext, ch interface{}, target string, resources []DeployResource, isDeploy bool) error {
+
+       var resOrderInstr struct {
+               Resorder []string `json:"resorder"`
+       }
+
+       var resDepInstr struct {
+               Resdep map[string]string `json:"resdependency"`
+       }
+       resdep := make(map[string]string)
+
+       for _, resource := range resources {
+               resource_name := resource.Resource.GetName() + "+" + resource.Resource.GetType()
+               resource_data := resource.Resource.ToYaml(target)
+               resOrderInstr.Resorder = append(resOrderInstr.Resorder, resource_name)
+               resdep[resource_name] = "go"
+               // rtc.RtcAddResource("<cid>/app/app_name/cluster/clusername/", res.name, res.content)
+               // -> save ("<cid>/app/app_name/cluster/clusername/resource/res.name/", res.content) in etcd
+               // return ("<cid>/app/app_name/cluster/clusername/resource/res.name/"
+               rh, err := ct.AddResource(ch, resource_name, resource_data)
+               if isDeploy == false {
+                       //Delete resource
+                       ct.AddLevelValue(rh, "status", resourcestatus.ResourceStatus{Status: resourcestatus.RsyncStatusEnum.Applied})
+               }
+               if err != nil {
+                       cleanuperr := ct.DeleteCompositeApp()
+                       if cleanuperr != nil {
+                               log.Printf(":: Error Cleaning up AppContext after add resource failure ::")
+                       }
+                       return pkgerrors.Wrapf(err, "Error adding resource ::%s to AppContext", resource_name)
+               }
+               jresOrderInstr, _ := json.Marshal(resOrderInstr)
+               resDepInstr.Resdep = resdep
+               jresDepInstr, _ := json.Marshal(resDepInstr)
+               // rtc.RtcAddInstruction("<cid>app/app_name/cluster/clusername/", "resource", "order", "{[res.name]}")
+               // ->save ("<cid>/app/app_name/cluster/clusername/resource/instruction/order/", "{[res.name]}") in etcd
+               // return "<cid>/app/app_name/cluster/clusername/resource/instruction/order/"
+               _, err = ct.AddInstruction(ch, "resource", "order", string(jresOrderInstr))
+               _, err = ct.AddInstruction(ch, "resource", "dependency", string(jresDepInstr))
+               if err != nil {
+                       cleanuperr := ct.DeleteCompositeApp()
+                       if cleanuperr != nil {
+                               log.Printf(":: Error Cleaning up AppContext after add instruction failure ::")
+                       }
+                       return pkgerrors.Wrapf(err, "Error adding instruction for resource ::%s to AppContext", resource_name)
+               }
+       }
+       return nil
+}
+
+func InitRsyncClient() bool {
+       client := controller.NewControllerClient()
+
+       vals, _ := client.GetControllers()
+       found := false
+       for _, v := range vals {
+               if v.Metadata.Name == "rsync" {
+                       log.Println("Initializing RPC connection to resource synchronizer")
+                       rpc.UpdateRpcConn(v.Metadata.Name, v.Spec.Host, v.Spec.Port)
+                       found = true
+                       break
+               }
+       }
+       return found
+}
+
+func initializeAppContextStatus(ac appcontext.AppContext, acStatus appcontext.AppContextStatus) error {
+       h, err := ac.GetCompositeAppHandle()
+       if err != nil {
+               return err
+       }
+       sh, err := ac.GetLevelHandle(h, "status")
+       if sh == nil {
+               _, err = ac.AddLevelValue(h, "status", acStatus)
+       } else {
+               err = ac.UpdateValue(sh, acStatus)
+       }
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+func (d *ResUtil) contains(reses []DeployResource, res DeployResource) bool {
+       for _, r := range reses {
+               if r.Action == res.Action &&
+                       r.Resource.GetName() == res.Resource.GetName() &&
+                       r.Resource.GetType() == res.Resource.GetType() {
+                       return true
+               }
+       }
+
+       return false
+}
+
+func (d *ResUtil) AddResource(device module.ControllerObject, action string, resource resource.ISdewanResource) error {
+       if d.resmap[device] == nil {
+               d.resmap[device] = &DeployResources{Resources: []DeployResource{}}
+       }
+
+       ds := DeployResource{Action: action, Resource: resource}
+       if !d.contains(d.resmap[device].Resources, ds) {
+               d.resmap[device].Resources = append(d.resmap[device].Resources, ds)
+       }
+       return nil
+}
+
+func (d *ResUtil) TargetName(o module.ControllerObject) string {
+       return o.GetType() + "." + o.GetMetadata().Name
+}
+
+func (d *ResUtil) Deploy(app_name string, format string) (string, error) {
+       // Generate Application context
+       cca, err := makeAppContextForCompositeApp(project_name, app_name+"-d", "1.0", "1.0", "di", "default", "0")
+       context := cca.context                    // appcontext.AppContext
+       ctxval := cca.ctxval                      // id
+       compositeHandle := cca.compositeAppHandle // cid
+
+       var appOrderInstr struct {
+               Apporder []string `json:"apporder"`
+       }
+       var appDepInstr struct {
+               Appdep map[string]string `json:"appdependency"`
+       }
+       appdep := make(map[string]string)
+       // create a com_app for each device
+       for device, res := range d.resmap {
+               // Add application
+               app_name := device.GetMetadata().Name + "-app"
+               appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)
+               appdep[app_name] = "go"
+
+               // rtc.RtcAddLevel(cid, "app", app_name) -> save ("<cid>app/app_name/", app_name) in etcd
+               // apphandle = "<cid>app/app_name/"
+               apphandle, _ := context.AddApp(compositeHandle, app_name)
+
+               // Add cluster
+               // err = addClustersToAppContext(listOfClusters, context, apphandle, resources)
+               // rtc.RtcAddLevel("<cid>app/app_name/", "cluster", clustername)
+               // -> save ("<cid>app/app_name/cluster/clusername/", clustername) in etcd
+               // return "<cid>app/app_name/cluster/clusername/"
+               clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)
+               err = addResourcesToCluster(context, clusterhandle, d.TargetName(device), res.Resources, true)
+       }
+
+       jappOrderInstr, _ := json.Marshal(appOrderInstr)
+       appDepInstr.Appdep = appdep
+       jappDepInstr, _ := json.Marshal(appDepInstr)
+       context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))
+       context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))
+
+       // invoke deployment process
+       appContextID := fmt.Sprintf("%v", ctxval)
+       err = rsyncclient.InvokeInstallApp(appContextID)
+       if err != nil {
+               log.Println(err)
+               return appContextID, err
+       }
+
+       return appContextID, nil
+}
+
+func (d *ResUtil) Undeploy(app_name string, format string) (string, error) {
+       // Generate Application context
+       cca, err := makeAppContextForCompositeApp(project_name, app_name+"-u", "1.0", "1.0", "di", "default", "0")
+       context := cca.context                    // appcontext.AppContext
+       ctxval := cca.ctxval                      // id
+       compositeHandle := cca.compositeAppHandle // cid
+
+       var appOrderInstr struct {
+               Apporder []string `json:"apporder"`
+       }
+       var appDepInstr struct {
+               Appdep map[string]string `json:"appdependency"`
+       }
+       appdep := make(map[string]string)
+       // create a com_app for each device
+       for device, res := range d.resmap {
+               // Add application
+               app_name := device.GetMetadata().Name + "-app"
+               appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)
+               appdep[app_name] = "go"
+               apphandle, _ := context.AddApp(compositeHandle, app_name)
+
+               // Add cluster
+               clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)
+               err = addResourcesToCluster(context, clusterhandle, d.TargetName(device), res.Resources, false)
+       }
+
+       jappOrderInstr, _ := json.Marshal(appOrderInstr)
+       appDepInstr.Appdep = appdep
+       jappDepInstr, _ := json.Marshal(appDepInstr)
+       context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))
+       context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))
+
+       initializeAppContextStatus(context, appcontext.AppContextStatus{Status: appcontext.AppContextStatusEnum.Instantiated})
+       // invoke deployment process
+       appContextID := fmt.Sprintf("%v", ctxval)
+       err = rsyncclient.InvokeUninstallApp(appContextID)
+       if err != nil {
+               log.Println(err)
+               return appContextID, err
+       }
+
+       return appContextID, nil
+}
+
+func (d *ResUtil) AddQueryResource(device module.ControllerObject, resource QueryResource) error {
+       if d.qryResmap[device] == nil {
+               d.qryResmap[device] = &QueryResources{Resources: []*QueryResource{}}
+       }
+
+       d.qryResmap[device].Resources = append(d.qryResmap[device].Resources, &resource)
+       d.qryCtxId = ""
+
+       return nil
+}
+
+func addQueryResourcesToCluster(ct appcontext.AppContext, ch interface{}, resources *[]*QueryResource) error {
+
+       var resOrderInstr struct {
+               Resorder []string `json:"resorder"`
+       }
+
+       var resDepInstr struct {
+               Resdep map[string]string `json:"resdependency"`
+       }
+       resdep := make(map[string]string)
+
+       for _, resource := range *resources {
+               resource_name := resource.Resource.Namespace + "+" + resource.Resource.Name
+               v, _ := json.Marshal(resource.Resource)
+               resOrderInstr.Resorder = append(resOrderInstr.Resorder, resource_name)
+               resdep[resource_name] = "go"
+
+               rh, err := ct.AddResource(ch, resource_name, string(v))
+
+               if err != nil {
+                       return pkgerrors.Wrapf(err, "Error adding resource ::%s to AppContext", resource_name)
+               }
+
+               // save the resource handler for query result
+               resource.Handle = rh
+
+               jresOrderInstr, _ := json.Marshal(resOrderInstr)
+               resDepInstr.Resdep = resdep
+               jresDepInstr, _ := json.Marshal(resDepInstr)
+
+               _, err = ct.AddInstruction(ch, "resource", "order", string(jresOrderInstr))
+               _, err = ct.AddInstruction(ch, "resource", "dependency", string(jresDepInstr))
+               if err != nil {
+                       return pkgerrors.Wrapf(err, "Error adding instruction for resource ::%s to AppContext", resource_name)
+               }
+       }
+       return nil
+}
+
+func (d *ResUtil) Query(app_name string) (string, error) {
+       if d.qryCtxId == "" {
+               // Generate Application context
+               cca, err := makeAppContextForCompositeApp(project_name, app_name+"-d", "1.0", "1.0", "di", "default", "0")
+               if err != nil {
+                       log.Println(err)
+                       return "", err
+               }
+
+               context := cca.context                    // appcontext.AppContext
+               ctxval := cca.ctxval                      // id
+               compositeHandle := cca.compositeAppHandle // cid
+
+               var appOrderInstr struct {
+                       Apporder []string `json:"apporder"`
+               }
+               var appDepInstr struct {
+                       Appdep map[string]string `json:"appdependency"`
+               }
+               appdep := make(map[string]string)
+               // create a com_app for each device
+               for device, res := range d.qryResmap {
+                       // Add application
+                       app_name := device.GetMetadata().Name + "-query-app"
+                       appOrderInstr.Apporder = append(appOrderInstr.Apporder, app_name)
+                       appdep[app_name] = "go"
+
+                       apphandle, _ := context.AddApp(compositeHandle, app_name)
+
+                       // Add cluster
+                       clusterhandle, _ := context.AddCluster(apphandle, provider_name+"+"+device.GetMetadata().Name)
+                       err = addQueryResourcesToCluster(context, clusterhandle, &res.Resources)
+               }
+
+               jappOrderInstr, _ := json.Marshal(appOrderInstr)
+               appDepInstr.Appdep = appdep
+               jappDepInstr, _ := json.Marshal(appDepInstr)
+               context.AddInstruction(compositeHandle, "app", "order", string(jappOrderInstr))
+               context.AddInstruction(compositeHandle, "app", "dependency", string(jappDepInstr))
+
+               // invoke query process
+               appContextID := fmt.Sprintf("%v", ctxval)
+               d.qryCtxId = appContextID
+       }
+
+       err := rsyncclient.InvokeGetResource(d.qryCtxId)
+       if err != nil {
+               log.Println(err)
+               d.qryCtxId = ""
+               return "", err
+       }
+
+       return d.qryCtxId, nil
+}
+
+func (d *ResUtil) GetResourceData(device module.ControllerObject, ns string, name string) (string, error) {
+       if d.qryCtxId == "" {
+               return "", pkgerrors.New("Query failed to be executed.")
+       }
+
+       var ac appcontext.AppContext
+       ah, err := ac.LoadAppContext(d.qryCtxId)
+       if err != nil {
+               return "", pkgerrors.Wrap(err, "AppContext is not found.")
+       }
+
+       // wait for resource ready
+       err = wait.PollImmediate(time.Second, time.Second*20,
+               func() (bool, error) {
+                       sh, err := ac.GetLevelHandle(ah, "status")
+                       if err != nil {
+                               log.Println("Waiting for Resource status to be ready.")
+                               return false, nil
+                       }
+
+                       s, err := ac.GetValue(sh)
+                       if err != nil {
+                               log.Println("Waiting for Resource status to be ready..")
+                               return false, nil
+                       }
+
+                       acStatus := appcontext.AppContextStatus{}
+                       js, _ := json.Marshal(s)
+                       json.Unmarshal(js, &acStatus)
+                       log.Println(acStatus.Status)
+                       if acStatus.Status == appcontext.AppContextStatusEnum.Instantiated {
+                               return true, nil
+                       }
+
+                       log.Println("Waiting for Resource status to be ready...")
+                       return false, nil
+               },
+       )
+
+       if err != nil {
+               log.Println(err)
+               return "", pkgerrors.Wrap(err, "Resource is not available")
+       }
+
+       // found resource handle
+       if d.qryResmap[device] == nil {
+               return "", pkgerrors.Wrap(err, "No query resource found.")
+       }
+
+       for _, resource := range d.qryResmap[device].Resources {
+               if ns == resource.Resource.Namespace && name == resource.Resource.Name {
+                       rdh, _ := ac.GetLevelHandle(resource.Handle, "definition")
+                       if rdh != nil {
+                               ret, err := ac.GetValue(rdh)
+                               if err == nil {
+                                       return ret.(string), nil
+                               }
+                       }
+                       return "", pkgerrors.Wrap(err, "Failed to query the resource value.")
+               }
+       }
+
+       return "", pkgerrors.New("No query resource found.")
+}
index 44194fe..f1a8ab1 100644 (file)
@@ -1,28 +1,28 @@
-/*\r
- * Copyright 2021 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package manager\r
-\r
-import (\r
-       "strings"\r
-)\r
-\r
-func format_resource_name(name1 string, name2 string) string {\r
-       name1 = strings.Replace(name1, "-", "", -1)\r
-       name2 = strings.Replace(name2, "-", "", -1)\r
-\r
-       return strings.ToLower(name1+name2)\r
-}\r
+/*
+ * Copyright 2021 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 manager
+
+import (
+       "strings"
+)
+
+func format_resource_name(name1 string, name2 string) string {
+       name1 = strings.Replace(name1, "-", "", -1)
+       name2 = strings.Replace(name2, "-", "", -1)
+
+       return strings.ToLower(name1 + name2)
+}
index 9f1bf3b..5835449 100644 (file)
@@ -1,42 +1,42 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type CertificateObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification CertificateObjectSpec `json:"spec"`\r
-       Data CertificateObjectData `json:"data"`\r
-}\r
-\r
-// CertificateObjectSpec contains the parameters\r
-type CertificateObjectSpec struct {\r
-}\r
-\r
-type CertificateObjectData struct {\r
-       RootCA  string `json:"rootca"`\r
-       Ca string `json:"ca"`\r
-    Key string `json:"key"`\r
-}\r
-\r
-func (c *CertificateObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *CertificateObject) GetType() string {\r
-    return "Certificate"\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// App contains metadata for Apps
+type CertificateObject struct {
+       Metadata      ObjectMetaData        `json:"metadata"`
+       Specification CertificateObjectSpec `json:"spec"`
+       Data          CertificateObjectData `json:"data"`
+}
+
+// CertificateObjectSpec contains the parameters
+type CertificateObjectSpec struct {
+}
+
+type CertificateObjectData struct {
+       RootCA string `json:"rootca"`
+       Ca     string `json:"ca"`
+       Key    string `json:"key"`
+}
+
+func (c *CertificateObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *CertificateObject) GetType() string {
+       return "Certificate"
+}
index 2c5c78a..c3b5a6b 100644 (file)
@@ -1,31 +1,31 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type CNFObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Status string `json:"status"`\r
-}\r
-\r
-func (c *CNFObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *CNFObject) GetType() string {\r
-    return "CNF"\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// App contains metadata for Apps
+type CNFObject struct {
+       Metadata ObjectMetaData `json:"metadata"`
+       Status   string         `json:"status"`
+}
+
+func (c *CNFObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *CNFObject) GetType() string {
+       return "CNF"
+}
index 6aeeae4..466b3ff 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-import (\r
-       "log"\r
-       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"\r
-)\r
-\r
-\r
-type states struct {\r
-       Created    string\r
-       Deployed  string\r
-       Undeployed string\r
-       Error      string\r
-}\r
-\r
-var StateEnum = &states{\r
-       Created:    "Created",\r
-       Deployed:   "Deployed",\r
-       Undeployed:   "Undeployed",\r
-       Error:      "Error",\r
-}\r
-\r
-type ConnectionObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Info ConnectionInfo `json:"information"`\r
-}\r
-\r
-//ConnectionInfo contains the connection information\r
-type ConnectionInfo struct {\r
-    End1 ConnectionEnd `json:"end1"`\r
-    End2 ConnectionEnd `json:"end2"`\r
-    ContextId string `json:"-"`\r
-    State string `json:"state"`\r
-       ErrorMessage string `json:"message"`\r
-}\r
-\r
-type ConnectionEnd struct {\r
-       Name  string `json:"name"`\r
-       Type  string `json:"type"`\r
-    IP         string `json:"ip"`\r
-    ConnObject string `json:"-"`\r
-    Resources []string `json:"-"`\r
-    ReservedRes []string `json:"-"`\r
-}\r
-\r
-func (c *ConnectionObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *ConnectionObject) GetType() string {\r
-       return "Connection"\r
-}\r
-\r
-func CreateEndName(t string, n string) string {\r
-    return t + "." + n\r
-}\r
-\r
-func CreateConnectionName(e1 string, e2 string) string {\r
-    return e1 + "-" + e2\r
-}\r
-\r
-func NewConnectionEnd(conn_obj ControllerObject, ip string) ConnectionEnd {\r
-    obj_str, err := GetObjectBuilder().ToString(conn_obj)\r
-    if err == nil {\r
-           return ConnectionEnd{\r
-               Name: CreateEndName(conn_obj.GetType(), conn_obj.GetMetadata().Name),\r
-               Type: conn_obj.GetType(),\r
-               IP: ip,\r
-               ConnObject: obj_str,\r
-               Resources: []string{},\r
-               ReservedRes: []string{},\r
-           }\r
-       } else {\r
-               log.Println(err)\r
-               return ConnectionEnd{}\r
-       }\r
-}\r
-\r
-func NewConnectionObject(end1 ConnectionEnd, end2 ConnectionEnd) ConnectionObject {\r
-    return ConnectionObject{\r
-        Metadata: ObjectMetaData{CreateConnectionName(end1.Name, end2.Name), "", "", ""}, \r
-        Info: ConnectionInfo{\r
-               End1: end1,\r
-               End2: end2,\r
-               ContextId: "",\r
-               State: StateEnum.Created,\r
-               ErrorMessage: "",\r
-        },\r
-    }\r
-}\r
-\r
-func (c *ConnectionEnd) contains(res resource.ISdewanResource, isReserved bool) bool {\r
-    if isReserved {\r
-        for _, r_str := range c.ReservedRes {\r
-            r, err := resource.GetResourceBuilder().ToObject(r_str)\r
-            if err == nil {\r
-                if r.GetName() == res.GetName() &&\r
-                   r.GetType() == res.GetType() {\r
-                    return true\r
-                }\r
-            }\r
-        }\r
-    } else {\r
-        for _, r_str := range c.Resources {\r
-               r, err := resource.GetResourceBuilder().ToObject(r_str)\r
-            if err == nil {\r
-                if r.GetName() == res.GetName() &&\r
-                   r.GetType() == res.GetType() {\r
-                    return true\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    return false\r
-}\r
-\r
-func (c *ConnectionEnd) AddResource(res resource.ISdewanResource, isReserved bool) error {\r
-       if !c.contains(res, isReserved) {\r
-               res_str, err := resource.GetResourceBuilder().ToString(res)\r
-               if err == nil {\r
-                       if isReserved {\r
-                               c.ReservedRes = append(c.ReservedRes, res_str)\r
-                       } else {\r
-                               c.Resources = append(c.Resources, res_str)\r
-                       }\r
-               }\r
-       }\r
-\r
-       return nil\r
-}\r
+/*
+ * 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/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+       "log"
+)
+
+type states struct {
+       Created    string
+       Deployed   string
+       Undeployed string
+       Error      string
+}
+
+var StateEnum = &states{
+       Created:    "Created",
+       Deployed:   "Deployed",
+       Undeployed: "Undeployed",
+       Error:      "Error",
+}
+
+type ConnectionObject struct {
+       Metadata ObjectMetaData `json:"metadata"`
+       Info     ConnectionInfo `json:"information"`
+}
+
+//ConnectionInfo contains the connection information
+type ConnectionInfo struct {
+       End1         ConnectionEnd `json:"end1"`
+       End2         ConnectionEnd `json:"end2"`
+       ContextId    string        `json:"-"`
+       State        string        `json:"state"`
+       ErrorMessage string        `json:"message"`
+}
+
+type ConnectionEnd struct {
+       Name        string   `json:"name"`
+       Type        string   `json:"type"`
+       IP          string   `json:"ip"`
+       ConnObject  string   `json:"-"`
+       Resources   []string `json:"-"`
+       ReservedRes []string `json:"-"`
+}
+
+func (c *ConnectionObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *ConnectionObject) GetType() string {
+       return "Connection"
+}
+
+func CreateEndName(t string, n string) string {
+       return t + "." + n
+}
+
+func CreateConnectionName(e1 string, e2 string) string {
+       return e1 + "-" + e2
+}
+
+func NewConnectionEnd(conn_obj ControllerObject, ip string) ConnectionEnd {
+       obj_str, err := GetObjectBuilder().ToString(conn_obj)
+       if err == nil {
+               return ConnectionEnd{
+                       Name:        CreateEndName(conn_obj.GetType(), conn_obj.GetMetadata().Name),
+                       Type:        conn_obj.GetType(),
+                       IP:          ip,
+                       ConnObject:  obj_str,
+                       Resources:   []string{},
+                       ReservedRes: []string{},
+               }
+       } else {
+               log.Println(err)
+               return ConnectionEnd{}
+       }
+}
+
+func NewConnectionObject(end1 ConnectionEnd, end2 ConnectionEnd) ConnectionObject {
+       return ConnectionObject{
+               Metadata: ObjectMetaData{CreateConnectionName(end1.Name, end2.Name), "", "", ""},
+               Info: ConnectionInfo{
+                       End1:         end1,
+                       End2:         end2,
+                       ContextId:    "",
+                       State:        StateEnum.Created,
+                       ErrorMessage: "",
+               },
+       }
+}
+
+func (c *ConnectionEnd) contains(res resource.ISdewanResource, isReserved bool) bool {
+       if isReserved {
+               for _, r_str := range c.ReservedRes {
+                       r, err := resource.GetResourceBuilder().ToObject(r_str)
+                       if err == nil {
+                               if r.GetName() == res.GetName() &&
+                                       r.GetType() == res.GetType() {
+                                       return true
+                               }
+                       }
+               }
+       } else {
+               for _, r_str := range c.Resources {
+                       r, err := resource.GetResourceBuilder().ToObject(r_str)
+                       if err == nil {
+                               if r.GetName() == res.GetName() &&
+                                       r.GetType() == res.GetType() {
+                                       return true
+                               }
+                       }
+               }
+       }
+
+       return false
+}
+
+func (c *ConnectionEnd) AddResource(res resource.ISdewanResource, isReserved bool) error {
+       if !c.contains(res, isReserved) {
+               res_str, err := resource.GetResourceBuilder().ToString(res)
+               if err == nil {
+                       if isReserved {
+                               c.ReservedRes = append(c.ReservedRes, res_str)
+                       } else {
+                               c.Resources = append(c.Resources, res_str)
+                       }
+               }
+       }
+
+       return nil
+}
index 22754a5..a194208 100644 (file)
@@ -1,31 +1,31 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// ControllerObject define the basic functionality of ControllerObject\r
-type ControllerObject interface {\r
-       GetMetadata() ObjectMetaData\r
-       GetType() string\r
-}\r
-\r
-// ObjectMetaData contains the parameters \r
-type ObjectMetaData struct {\r
-       Name        string `json:"name" validate:"required,hostname_rfc1123"`\r
-       Description string `json:"description"`\r
-       UserData1   string `json:"userData1"`\r
-       UserData2   string `json:"userData2"`\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// ControllerObject define the basic functionality of ControllerObject
+type ControllerObject interface {
+       GetMetadata() ObjectMetaData
+       GetType() string
+}
+
+// ObjectMetaData contains the parameters
+type ObjectMetaData struct {
+       Name        string `json:"name" validate:"required,hostname_rfc1123"`
+       Description string `json:"description"`
+       UserData1   string `json:"userData1"`
+       UserData2   string `json:"userData2"`
+}
index bbc7b52..1a27ebe 100644 (file)
@@ -1,72 +1,72 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type DeviceObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification DeviceObjectSpec `json:"spec"`\r
-       Status DeviceObjectStatus `json:"-"`\r
-}\r
-\r
-// DeviceObjectSpec contains the parameters\r
-type DeviceObjectSpec struct {\r
-       PublicIps       []string        `json:"publicIps"`\r
-       ForceHubConnectivity            bool    `json:"forceHubConnectivity"`\r
-       ProxyHub                string  `json:"proxyHub"`\r
-       ProxyHubPort    int     `json:"proxyHubPort"`\r
-       UseHub4Internet bool    `json:"useHub4Internet"`\r
-       DedicatedSFC    bool    `json:"dedicatedSFC"`   \r
-       CertificateId   string  `json:"certificateId"`\r
-       KubeConfig              string  `json:"kubeConfig"`\r
-}\r
-\r
-// DeviceObjectStatus\r
-type DeviceObjectStatus struct {\r
-    // 1: use public ip 2: use hub as proxy\r
-    Mode  int\r
-    // ip used for external connection\r
-    // if Mode=1, ip is one of public ip\r
-    // if Mode=2, ip is the OIP allocated by SCC\r
-    Ip string\r
-    // Status Data\r
-    Data map[string]string\r
-}\r
-\r
-func (c *DeviceObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *DeviceObject) GetType() string {\r
-       return "Device"\r
-}\r
-\r
-func (c *DeviceObject) IsProxyHub(hub_name string) bool {\r
-       if c.Status.Mode == 2 {\r
-        return c.Specification.ProxyHub == hub_name\r
-       }\r
-\r
-    return false\r
-}\r
-\r
-func init() {\r
-       GetObjectBuilder().Register("Device", &DeviceObject{})\r
-}\r
-\r
-func (c *DeviceObject) GetCertName() string {\r
-    return "device-" + c.Metadata.Name + "-cert"\r
-}\r
+/*
+ * 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
+
+// App contains metadata for Apps
+type DeviceObject struct {
+       Metadata      ObjectMetaData     `json:"metadata"`
+       Specification DeviceObjectSpec   `json:"spec"`
+       Status        DeviceObjectStatus `json:"-"`
+}
+
+// DeviceObjectSpec contains the parameters
+type DeviceObjectSpec struct {
+       PublicIps            []string `json:"publicIps"`
+       ForceHubConnectivity bool     `json:"forceHubConnectivity"`
+       ProxyHub             string   `json:"proxyHub"`
+       ProxyHubPort         int      `json:"proxyHubPort"`
+       UseHub4Internet      bool     `json:"useHub4Internet"`
+       DedicatedSFC         bool     `json:"dedicatedSFC"`
+       CertificateId        string   `json:"certificateId"`
+       KubeConfig           string   `json:"kubeConfig"`
+}
+
+// DeviceObjectStatus
+type DeviceObjectStatus struct {
+       // 1: use public ip 2: use hub as proxy
+       Mode int
+       // ip used for external connection
+       // if Mode=1, ip is one of public ip
+       // if Mode=2, ip is the OIP allocated by SCC
+       Ip string
+       // Status Data
+       Data map[string]string
+}
+
+func (c *DeviceObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *DeviceObject) GetType() string {
+       return "Device"
+}
+
+func (c *DeviceObject) IsProxyHub(hub_name string) bool {
+       if c.Status.Mode == 2 {
+               return c.Specification.ProxyHub == hub_name
+       }
+
+       return false
+}
+
+func init() {
+       GetObjectBuilder().Register("Device", &DeviceObject{})
+}
+
+func (c *DeviceObject) GetCertName() string {
+       return "device-" + c.Metadata.Name + "-cert"
+}
index 6f55544..21aae42 100644 (file)
@@ -1,30 +1,30 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type EmptyObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-}\r
-\r
-func (c *EmptyObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *EmptyObject) GetType() string {\r
-       return "Empty"\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// App contains metadata for Apps
+type EmptyObject struct {
+       Metadata ObjectMetaData `json:"metadata"`
+}
+
+func (c *EmptyObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *EmptyObject) GetType() string {
+       return "Empty"
+}
index 27d7855..876b45a 100644 (file)
@@ -1,36 +1,36 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type HubDeviceObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification HubDeviceObjectSpec `json:"spec"`\r
-}\r
-\r
-//HubDeviceObjectSpec contains the parameters\r
-type HubDeviceObjectSpec struct {\r
-       Device string `json:"device"`\r
-}\r
-\r
-func (c *HubDeviceObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *HubDeviceObject) GetType() string {\r
-       return "HubDevice"\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// App contains metadata for Apps
+type HubDeviceObject struct {
+       Metadata      ObjectMetaData      `json:"metadata"`
+       Specification HubDeviceObjectSpec `json:"spec"`
+}
+
+//HubDeviceObjectSpec contains the parameters
+type HubDeviceObjectSpec struct {
+       Device string `json:"device"`
+}
+
+func (c *HubDeviceObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *HubDeviceObject) GetType() string {
+       return "HubDevice"
+}
index 1fb77f2..70d221e 100644 (file)
@@ -1,93 +1,92 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-import (\r
-       "strconv"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-const (\r
-    MinProxyPort = 10000\r
-    MaxProxyPort = 16000\r
-)\r
-\r
-// App contains metadata for Apps\r
-type HubObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification HubObjectSpec `json:"spec"`\r
-       Status HubObjectStatus `json:"-"`\r
-}\r
-\r
-//HubObjectSpec contains the parameters\r
-type HubObjectSpec struct {\r
-       PublicIps       []string        `json:"publicIps"`\r
-       CertificateId   string          `json:"certificateId"`\r
-       KubeConfig              string          `json:"kubeConfig"`\r
-}\r
-\r
-//HubObjectStatus\r
-type HubObjectStatus struct {\r
-           Ip              string\r
-        Data            map[string]string\r
-        // Allocated proxy port for device\r
-        ProxyPort       map[string]string\r
-}\r
-\r
-func (c *HubObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-\r
-func (c *HubObject) GetCertName() string {\r
-    return "hub-" + c.Metadata.Name + "-cert"\r
-}\r
-\r
-func (c *HubObject) GetType() string {\r
-       return "Hub"\r
-}\r
-\r
-func (c *HubObject) IsProxyPortUsed(port int) bool {\r
-       _, ok := c.Status.ProxyPort[strconv.Itoa(port)]\r
-       return ok\r
-}\r
-\r
-func (c *HubObject) SetProxyPort(port int, device string) {\r
-       c.Status.ProxyPort[strconv.Itoa(port)] = device\r
-}\r
-\r
-func (c *HubObject) UnsetProxyPort(port int) {\r
-       delete(c.Status.ProxyPort, strconv.Itoa(port))\r
-}\r
-\r
-func (c *HubObject) GetProxyPort(port int) string {\r
-       return c.Status.ProxyPort[strconv.Itoa(port)]\r
-}\r
-\r
-func (c *HubObject) AllocateProxyPort() (int, error) {\r
-       for i:=MinProxyPort; i<MaxProxyPort; i++ {\r
-               if !c.IsProxyPortUsed(i) {\r
-                       return i, nil\r
-               }\r
-       }\r
-\r
-       return 0, pkgerrors.New("Fail to allocate proxy port")\r
-}\r
-\r
-func init() {\r
-       GetObjectBuilder().Register("Hub", &HubObject{})\r
-}\r
+/*
+ * 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 (
+       pkgerrors "github.com/pkg/errors"
+       "strconv"
+)
+
+const (
+       MinProxyPort = 10000
+       MaxProxyPort = 16000
+)
+
+// App contains metadata for Apps
+type HubObject struct {
+       Metadata      ObjectMetaData  `json:"metadata"`
+       Specification HubObjectSpec   `json:"spec"`
+       Status        HubObjectStatus `json:"-"`
+}
+
+//HubObjectSpec contains the parameters
+type HubObjectSpec struct {
+       PublicIps     []string `json:"publicIps"`
+       CertificateId string   `json:"certificateId"`
+       KubeConfig    string   `json:"kubeConfig"`
+}
+
+//HubObjectStatus
+type HubObjectStatus struct {
+       Ip   string
+       Data map[string]string
+       // Allocated proxy port for device
+       ProxyPort map[string]string
+}
+
+func (c *HubObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *HubObject) GetCertName() string {
+       return "hub-" + c.Metadata.Name + "-cert"
+}
+
+func (c *HubObject) GetType() string {
+       return "Hub"
+}
+
+func (c *HubObject) IsProxyPortUsed(port int) bool {
+       _, ok := c.Status.ProxyPort[strconv.Itoa(port)]
+       return ok
+}
+
+func (c *HubObject) SetProxyPort(port int, device string) {
+       c.Status.ProxyPort[strconv.Itoa(port)] = device
+}
+
+func (c *HubObject) UnsetProxyPort(port int) {
+       delete(c.Status.ProxyPort, strconv.Itoa(port))
+}
+
+func (c *HubObject) GetProxyPort(port int) string {
+       return c.Status.ProxyPort[strconv.Itoa(port)]
+}
+
+func (c *HubObject) AllocateProxyPort() (int, error) {
+       for i := MinProxyPort; i < MaxProxyPort; i++ {
+               if !c.IsProxyPortUsed(i) {
+                       return i, nil
+               }
+       }
+
+       return 0, pkgerrors.New("Fail to allocate proxy port")
+}
+
+func init() {
+       GetObjectBuilder().Register("Hub", &HubObject{})
+}
index eb220bf..0de7ccf 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-import (\r
-       "math"\r
-       "strconv"\r
-    "strings"\r
-    pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-// App contains metadata for Apps\r
-type IPRangeObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification IPRangeObjectSpec `json:"spec"`\r
-       Status IPRangeObjectStatus `json:"-"`\r
-}\r
-\r
-//IPRangeObjectSpec contains the parameters\r
-type IPRangeObjectSpec struct {\r
-       Subnet     string    `json:"subnet" validate:"required,ipv4"`\r
-       MinIp      int    `json:"minIp" validate:"gte=1,lte=255"`\r
-       MaxIp      int    `json:"maxIp" validate:"gte=1,lte=255"`\r
-}\r
-\r
-type IPRangeObjectStatus struct {\r
-       Masks       [32]byte\r
-       Data        map[string]string\r
-}\r
-\r
-func (c *IPRangeObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *IPRangeObject) GetType() string {\r
-    return "IPRange"\r
-}\r
-\r
-func (c *IPRangeObject) base() string {\r
-    index := strings.LastIndex(c.Specification.Subnet, ".")\r
-    if index == -1 {\r
-        return c.Specification.Subnet\r
-    } else {\r
-        return c.Specification.Subnet[0:index+1]\r
-    }\r
-}\r
-\r
-func (c *IPRangeObject) IsConflict(o *IPRangeObject) bool {\r
-    if strings.Compare(c.base(), o.base()) != 0 {\r
-        return false\r
-    }\r
-\r
-    if c.Specification.MinIp > o.Specification.MaxIp || c.Specification.MaxIp < o.Specification.MinIp {\r
-        return false\r
-    }\r
-\r
-    return true\r
-}\r
-\r
-func (c *IPRangeObject) InUsed() bool {\r
-    return (len(c.Status.Data) != 0)\r
-}\r
-\r
-func (c *IPRangeObject) Allocate(name string) (string, error) {\r
-    i := c.Specification.MinIp\r
-    index := (c.Specification.MinIp-1)/8\r
-    b := byte(math.Exp2(float64(7-(c.Specification.MinIp-1)%8)))\r
-    for i <= c.Specification.MaxIp {\r
-        if c.Status.Masks[index] & b == 0 {\r
-            c.Status.Masks[index] |= b\r
-            c.Status.Data[strconv.Itoa(i)] = name\r
-            return c.base() + strconv.Itoa(i), nil\r
-        }\r
-        if (i % 8 == 0) {\r
-            b = 0x80\r
-            index += 1\r
-            for c.Status.Masks[index] == 0xff {\r
-            //    log.Println("by pass", index)\r
-                i += 8\r
-                index += 1\r
-            }\r
-        } else {\r
-            b = b / 2\r
-        }\r
-        i = i + 1\r
-    }\r
-\r
-    return "", pkgerrors.New("No available IP")\r
-}\r
-\r
-func (c *IPRangeObject) Free(sip string) error {\r
-    ip := 0\r
-    i := strings.LastIndex(sip, ".")\r
-    if i == -1 {\r
-        return pkgerrors.New("invalid ip")\r
-    } else {\r
-        base_ip := sip[0:i+1]\r
-        if c.base() != base_ip {\r
-            return pkgerrors.New("ip is not in range")\r
-        }\r
-\r
-        ip, _ = strconv.Atoi(sip[i+1:len(sip)])\r
-    }\r
-    \r
-    if ip < c.Specification.MinIp || ip > c.Specification.MaxIp {\r
-        return pkgerrors.New("ip is not in range")\r
-    }\r
-\r
-    index := (ip-1)/8\r
-    b := byte(math.Exp2(float64(7-(ip-1)%8)))\r
-    if c.Status.Masks[index] & b == 0 {\r
-        return pkgerrors.New("ip is not allocated")\r
-    }\r
-\r
-    delete(c.Status.Data, strconv.Itoa(ip))\r
-    c.Status.Masks[index] &= (^b)\r
-    return nil\r
-}\r
-\r
-func (c *IPRangeObject) FreeAll() error {\r
-    for sip, _ := range c.Status.Data {\r
-        ip, _ := strconv.Atoi(sip)\r
-           index := (ip-1)/8\r
-           b := byte(math.Exp2(float64(7-(ip-1)%8)))\r
-           delete(c.Status.Data, sip)\r
-           c.Status.Masks[index] &= (^b)\r
-       }\r
-    return nil\r
-}
\ No newline at end of file
+/*
+ * 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 (
+       pkgerrors "github.com/pkg/errors"
+       "math"
+       "strconv"
+       "strings"
+)
+
+// App contains metadata for Apps
+type IPRangeObject struct {
+       Metadata      ObjectMetaData      `json:"metadata"`
+       Specification IPRangeObjectSpec   `json:"spec"`
+       Status        IPRangeObjectStatus `json:"-"`
+}
+
+//IPRangeObjectSpec contains the parameters
+type IPRangeObjectSpec struct {
+       Subnet string `json:"subnet" validate:"required,ipv4"`
+       MinIp  int    `json:"minIp" validate:"gte=1,lte=255"`
+       MaxIp  int    `json:"maxIp" validate:"gte=1,lte=255"`
+}
+
+type IPRangeObjectStatus struct {
+       Masks [32]byte
+       Data  map[string]string
+}
+
+func (c *IPRangeObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *IPRangeObject) GetType() string {
+       return "IPRange"
+}
+
+func (c *IPRangeObject) base() string {
+       index := strings.LastIndex(c.Specification.Subnet, ".")
+       if index == -1 {
+               return c.Specification.Subnet
+       } else {
+               return c.Specification.Subnet[0 : index+1]
+       }
+}
+
+func (c *IPRangeObject) IsConflict(o *IPRangeObject) bool {
+       if strings.Compare(c.base(), o.base()) != 0 {
+               return false
+       }
+
+       if c.Specification.MinIp > o.Specification.MaxIp || c.Specification.MaxIp < o.Specification.MinIp {
+               return false
+       }
+
+       return true
+}
+
+func (c *IPRangeObject) InUsed() bool {
+       return (len(c.Status.Data) != 0)
+}
+
+func (c *IPRangeObject) Allocate(name string) (string, error) {
+       i := c.Specification.MinIp
+       index := (c.Specification.MinIp - 1) / 8
+       b := byte(math.Exp2(float64(7 - (c.Specification.MinIp-1)%8)))
+       for i <= c.Specification.MaxIp {
+               if c.Status.Masks[index]&b == 0 {
+                       c.Status.Masks[index] |= b
+                       c.Status.Data[strconv.Itoa(i)] = name
+                       return c.base() + strconv.Itoa(i), nil
+               }
+               if i%8 == 0 {
+                       b = 0x80
+                       index += 1
+                       for c.Status.Masks[index] == 0xff {
+                               //    log.Println("by pass", index)
+                               i += 8
+                               index += 1
+                       }
+               } else {
+                       b = b / 2
+               }
+               i = i + 1
+       }
+
+       return "", pkgerrors.New("No available IP")
+}
+
+func (c *IPRangeObject) Free(sip string) error {
+       ip := 0
+       i := strings.LastIndex(sip, ".")
+       if i == -1 {
+               return pkgerrors.New("invalid ip")
+       } else {
+               base_ip := sip[0 : i+1]
+               if c.base() != base_ip {
+                       return pkgerrors.New("ip is not in range")
+               }
+
+               ip, _ = strconv.Atoi(sip[i+1 : len(sip)])
+       }
+
+       if ip < c.Specification.MinIp || ip > c.Specification.MaxIp {
+               return pkgerrors.New("ip is not in range")
+       }
+
+       index := (ip - 1) / 8
+       b := byte(math.Exp2(float64(7 - (ip-1)%8)))
+       if c.Status.Masks[index]&b == 0 {
+               return pkgerrors.New("ip is not allocated")
+       }
+
+       delete(c.Status.Data, strconv.Itoa(ip))
+       c.Status.Masks[index] &= (^b)
+       return nil
+}
+
+func (c *IPRangeObject) FreeAll() error {
+       for sip, _ := range c.Status.Data {
+               ip, _ := strconv.Atoi(sip)
+               index := (ip - 1) / 8
+               b := byte(math.Exp2(float64(7 - (ip-1)%8)))
+               delete(c.Status.Data, sip)
+               c.Status.Masks[index] &= (^b)
+       }
+       return nil
+}
index d84a278..c702cb8 100644 (file)
@@ -1,64 +1,64 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-import (\r
-       "strings"\r
-       "reflect"\r
-       "encoding/json"\r
-       pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type ObjectBuilder struct {\r
-       omap map[string]reflect.Type\r
-}\r
-\r
-var obj_builder = ObjectBuilder{\r
-       omap: make(map[string]reflect.Type),\r
-}\r
-\r
-func GetObjectBuilder() *ObjectBuilder {\r
-    return &obj_builder\r
-}\r
-\r
-func (c *ObjectBuilder) Register(name string, r interface{}) {\r
-       c.omap[name] = reflect.TypeOf(r).Elem()\r
-}\r
-\r
-func (c *ObjectBuilder) ToString(obj ControllerObject) (string, error) {\r
-       obj_str, err := json.Marshal(obj)\r
-       if err != nil {\r
-               return "", err\r
-       }\r
-\r
-       return obj.GetType() + "-" + string(obj_str), nil\r
-}\r
-\r
-func (c *ObjectBuilder) ToObject(obj_str string) (ControllerObject, error) {\r
-       if !strings.Contains(obj_str, "-") {\r
-               return &EmptyObject{}, pkgerrors.New("Not a valid object")\r
-       }\r
-       strs := strings.SplitN(obj_str, "-", 2)\r
-\r
-       if v, ok := c.omap[strs[0]]; ok {\r
-               retObj := reflect.New(v).Interface()\r
-               err := json.Unmarshal([]byte(strs[1]), retObj)\r
-               return retObj.(ControllerObject), err\r
-       } else {\r
-           return &EmptyObject{}, pkgerrors.New("Not a valid object")\r
-       }\r
-}\r
+/*
+ * 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"
+       pkgerrors "github.com/pkg/errors"
+       "reflect"
+       "strings"
+)
+
+type ObjectBuilder struct {
+       omap map[string]reflect.Type
+}
+
+var obj_builder = ObjectBuilder{
+       omap: make(map[string]reflect.Type),
+}
+
+func GetObjectBuilder() *ObjectBuilder {
+       return &obj_builder
+}
+
+func (c *ObjectBuilder) Register(name string, r interface{}) {
+       c.omap[name] = reflect.TypeOf(r).Elem()
+}
+
+func (c *ObjectBuilder) ToString(obj ControllerObject) (string, error) {
+       obj_str, err := json.Marshal(obj)
+       if err != nil {
+               return "", err
+       }
+
+       return obj.GetType() + "-" + string(obj_str), nil
+}
+
+func (c *ObjectBuilder) ToObject(obj_str string) (ControllerObject, error) {
+       if !strings.Contains(obj_str, "-") {
+               return &EmptyObject{}, pkgerrors.New("Not a valid object")
+       }
+       strs := strings.SplitN(obj_str, "-", 2)
+
+       if v, ok := c.omap[strs[0]]; ok {
+               retObj := reflect.New(v).Interface()
+               err := json.Unmarshal([]byte(strs[1]), retObj)
+               return retObj.(ControllerObject), err
+       } else {
+               return &EmptyObject{}, pkgerrors.New("Not a valid object")
+       }
+}
index 9f398c6..64d9aaa 100644 (file)
@@ -1,35 +1,35 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-// App contains metadata for Apps\r
-type OverlayObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification OverlayObjectSpec `json:"spec"`\r
-}\r
-\r
-//OverlayObjectSpec contains the parameters\r
-type OverlayObjectSpec struct {\r
-}\r
-\r
-func (c *OverlayObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *OverlayObject) GetType() string {\r
-    return "Overlay"\r
-}
\ No newline at end of file
+/*
+ * 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
+
+// App contains metadata for Apps
+type OverlayObject struct {
+       Metadata      ObjectMetaData    `json:"metadata"`
+       Specification OverlayObjectSpec `json:"spec"`
+}
+
+//OverlayObjectSpec contains the parameters
+type OverlayObjectSpec struct {
+}
+
+func (c *OverlayObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *OverlayObject) GetType() string {
+       return "Overlay"
+}
index cdb1e6f..f989170 100644 (file)
@@ -1,51 +1,51 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package module\r
-\r
-import (\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"\r
-)\r
-\r
-// App contains metadata for Apps\r
-type ProposalObject struct {\r
-       Metadata ObjectMetaData `json:"metadata"`\r
-       Specification ProposalObjectSpec `json:"spec"`\r
-}\r
-\r
-//ProposalObjectSpec contains the parameters\r
-type ProposalObjectSpec struct {\r
-       Encryption      string  `json:"encryption"`\r
-       Hash                    string  `json:"hash"`\r
-       DhGroup                 string  `json:"dhGroup"`\r
-}\r
-\r
-func (c *ProposalObject) GetMetadata() ObjectMetaData {\r
-       return c.Metadata\r
-}\r
-\r
-func (c *ProposalObject) GetType() string {\r
-    return "Proposal"\r
-}\r
-\r
-func (c *ProposalObject) ToResource() *resource.ProposalResource {\r
-    return &resource.ProposalResource{\r
-        Name: c.Metadata.Name,\r
-        Encryption: c.Specification.Encryption,\r
-        Hash: c.Specification.Hash,\r
-        DhGroup: c.Specification.DhGroup,\r
-    }\r
-}
\ No newline at end of file
+/*
+ * 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/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/resource"
+)
+
+// App contains metadata for Apps
+type ProposalObject struct {
+       Metadata      ObjectMetaData     `json:"metadata"`
+       Specification ProposalObjectSpec `json:"spec"`
+}
+
+//ProposalObjectSpec contains the parameters
+type ProposalObjectSpec struct {
+       Encryption string `json:"encryption"`
+       Hash       string `json:"hash"`
+       DhGroup    string `json:"dhGroup"`
+}
+
+func (c *ProposalObject) GetMetadata() ObjectMetaData {
+       return c.Metadata
+}
+
+func (c *ProposalObject) GetType() string {
+       return "Proposal"
+}
+
+func (c *ProposalObject) ToResource() *resource.ProposalResource {
+       return &resource.ProposalResource{
+               Name:       c.Metadata.Name,
+               Encryption: c.Specification.Encryption,
+               Hash:       c.Specification.Hash,
+               DhGroup:    c.Specification.DhGroup,
+       }
+}
index 814218c..52db254 100644 (file)
@@ -1,35 +1,34 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-)\r
-\r
-type EmptyResource struct {\r
-}\r
-\r
-func (c *EmptyResource) GetName() string {\r
-       return ""\r
-}\r
-\r
-func (c *EmptyResource) GetType() string {\r
-       return "Empty"\r
-}\r
-\r
-func (c *EmptyResource) ToYaml(target string) string {\r
-       return ""\r
-}
\ No newline at end of file
+/*
+ * 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 resource
+
+import ()
+
+type EmptyResource struct {
+}
+
+func (c *EmptyResource) GetName() string {
+       return ""
+}
+
+func (c *EmptyResource) GetType() string {
+       return "Empty"
+}
+
+func (c *EmptyResource) ToYaml(target string) string {
+       return ""
+}
index 62baa34..1cba996 100644 (file)
@@ -1,44 +1,44 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-       "io/ioutil"\r
-)\r
-\r
-type FileResource struct {\r
-       Name string\r
-       Type string\r
-       FileName string\r
-}\r
-\r
-func (c *FileResource) GetName() string {\r
-       return c.Name\r
-}\r
-\r
-func (c *FileResource) GetType() string {\r
-       return "File"\r
-}\r
-\r
-func (c *FileResource) ToYaml(target string) string {\r
-       yamlFile, _ := ioutil.ReadFile(c.FileName)\r
-       return string(yamlFile)\r
-}\r
-\r
-func init() {\r
-       GetResourceBuilder().Register("File", &FileResource{})\r
-}
\ No newline at end of file
+/*
+ * 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 resource
+
+import (
+       "io/ioutil"
+)
+
+type FileResource struct {
+       Name     string
+       Type     string
+       FileName string
+}
+
+func (c *FileResource) GetName() string {
+       return c.Name
+}
+
+func (c *FileResource) GetType() string {
+       return "File"
+}
+
+func (c *FileResource) ToYaml(target string) string {
+       yamlFile, _ := ioutil.ReadFile(c.FileName)
+       return string(yamlFile)
+}
+
+func init() {
+       GetResourceBuilder().Register("File", &FileResource{})
+}
index db7dcac..8b47291 100644 (file)
@@ -1,69 +1,68 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-)\r
-\r
-type FirewallDnatResource struct {\r
-    Name string\r
-    Source string\r
-    SourceIP string\r
-    SourceDestIP string\r
-    SourceDestPort string\r
-    DestinationIP string\r
-    DestinationPort string\r
-    Protocol string\r
-}\r
-\r
-func (c *FirewallDnatResource) GetName() string {\r
-    return c.Name\r
-}\r
-\r
-func (c *FirewallDnatResource) GetType() string {\r
-    return "FirewallDNAT"\r
-}\r
-\r
-func (c *FirewallDnatResource) ToYaml(target string) string {\r
-    basic := `apiVersion: ` + SdewanApiVersion + `\r
-kind: FirewallDNAT\r
-metadata:\r
-  name: ` + c.Name + `\r
-  namespace: default\r
-  labels:\r
-    sdewanPurpose: ` + SdewanPurpose + `\r
-    targetCluster: ` + target + `\r
-spec:\r
-  src: ` + c.Source + `\r
-  src_dip: ` + c.SourceDestIP + `\r
-  src_dport: ` + c.SourceDestPort + `\r
-  dest_ip: ` + c.DestinationIP + `\r
-  dest_port: ` + c.DestinationPort + `\r
-  proto: ` + c.Protocol + `\r
-  target: DNAT `\r
-\r
-    if c.SourceIP != "" {\r
-      basic +=  `\r
-  src_ip: ` + c.SourceIP\r
-  }\r
-\r
-  return basic\r
-}\r
-\r
-func init() {\r
-  GetResourceBuilder().Register("FirewallDnat", &FirewallDnatResource{})\r
-}\r
+/*
+ * 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 resource
+
+import ()
+
+type FirewallDnatResource struct {
+       Name            string
+       Source          string
+       SourceIP        string
+       SourceDestIP    string
+       SourceDestPort  string
+       DestinationIP   string
+       DestinationPort string
+       Protocol        string
+}
+
+func (c *FirewallDnatResource) GetName() string {
+       return c.Name
+}
+
+func (c *FirewallDnatResource) GetType() string {
+       return "FirewallDNAT"
+}
+
+func (c *FirewallDnatResource) ToYaml(target string) string {
+       basic := `apiVersion: ` + SdewanApiVersion + `
+kind: FirewallDNAT
+metadata:
+  name: ` + c.Name + `
+  namespace: default
+  labels:
+    sdewanPurpose: ` + SdewanPurpose + `
+    targetCluster: ` + target + `
+spec:
+  src: ` + c.Source + `
+  src_dip: ` + c.SourceDestIP + `
+  src_dport: ` + c.SourceDestPort + `
+  dest_ip: ` + c.DestinationIP + `
+  dest_port: ` + c.DestinationPort + `
+  proto: ` + c.Protocol + `
+  target: DNAT `
+
+       if c.SourceIP != "" {
+               basic += `
+  src_ip: ` + c.SourceIP
+       }
+
+       return basic
+}
+
+func init() {
+       GetResourceBuilder().Register("FirewallDnat", &FirewallDnatResource{})
+}
index 31f9997..b69e667 100644 (file)
@@ -1,68 +1,68 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-       "strings"\r
-)\r
-\r
-type FirewallZoneResource struct {\r
-    Name string\r
-    Network []string\r
-    Input string\r
-    Output string\r
-    Forward string\r
-    MASQ string\r
-    MTU_FIX string\r
-}\r
-\r
-func (c *FirewallZoneResource) GetName() string {\r
-    return c.Name\r
-}\r
-\r
-func (c *FirewallZoneResource) GetType() string {\r
-    return "FirewallZone"\r
-}\r
-\r
-func (c *FirewallZoneResource) ToYaml(target string) string {\r
-    basic := `apiVersion: ` + SdewanApiVersion + `\r
-kind: FirewallZone\r
-metadata:\r
-  name: ` + c.Name + `\r
-  namespace: default\r
-  labels:\r
-    sdewanPurpose: ` + SdewanPurpose + `\r
-    targetCluster: ` + target + `\r
-spec:\r
-  network: [` + strings.Join(c.Network, ",") + `]\r
-  input: ` + c.Input + `\r
-  output: ` + c.Output + `\r
-  forward: ` + c.Forward\r
-\r
-    if (c.MASQ != "" && c.MTU_FIX != "") {\r
-      optional := `\r
-  masq: ` + c.MASQ + `\r
-  mtu_fix: ` + c.MTU_FIX\r
-      basic += optional\r
-    }\r
-\r
-    return basic\r
-}\r
-\r
-func init() {\r
-  GetResourceBuilder().Register("FirewallZone", &FirewallZoneResource{})\r
-}\r
+/*
+ * 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 resource
+
+import (
+       "strings"
+)
+
+type FirewallZoneResource struct {
+       Name    string
+       Network []string
+       Input   string
+       Output  string
+       Forward string
+       MASQ    string
+       MTU_FIX string
+}
+
+func (c *FirewallZoneResource) GetName() string {
+       return c.Name
+}
+
+func (c *FirewallZoneResource) GetType() string {
+       return "FirewallZone"
+}
+
+func (c *FirewallZoneResource) ToYaml(target string) string {
+       basic := `apiVersion: ` + SdewanApiVersion + `
+kind: FirewallZone
+metadata:
+  name: ` + c.Name + `
+  namespace: default
+  labels:
+    sdewanPurpose: ` + SdewanPurpose + `
+    targetCluster: ` + target + `
+spec:
+  network: [` + strings.Join(c.Network, ",") + `]
+  input: ` + c.Input + `
+  output: ` + c.Output + `
+  forward: ` + c.Forward
+
+       if c.MASQ != "" && c.MTU_FIX != "" {
+               optional := `
+  masq: ` + c.MASQ + `
+  mtu_fix: ` + c.MTU_FIX
+               basic += optional
+       }
+
+       return basic
+}
+
+func init() {
+       GetResourceBuilder().Register("FirewallZone", &FirewallZoneResource{})
+}
index 2a962a9..70d0ad4 100644 (file)
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governinog permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-        "strings"\r
-)\r
-\r
-const (\r
-    AuthTypePSK = "psk"\r
-    AuthTypePUBKEY = "pubkey"\r
-)\r
-\r
-type Connection struct {\r
-        Name           string\r
-        ConnectionType string\r
-        Mode           string\r
-        LocalSubnet    string\r
-        LocalSourceIp  string\r
-        LocalUpDown    string\r
-        LocalFirewall  string\r
-        RemoteSubnet   string\r
-        RemoteSourceIp string\r
-        RemoteUpDown   string\r
-        RemoteFirewall string\r
-        CryptoProposal []string\r
-        Mark           string\r
-        IfId           string\r
-}\r
-\r
-type IpsecResource struct {\r
-        Name                 string\r
-        Type                 string\r
-        Remote               string\r
-        AuthenticationMethod string\r
-        CryptoProposal       []string\r
-        LocalIdentifier      string\r
-        RemoteIdentifier     string\r
-        ForceCryptoProposal  string\r
-        PresharedKey         string\r
-        PublicCert      string\r
-        PrivateCert     string\r
-        SharedCA             string\r
-        Connections          Connection\r
-}\r
-\r
-func (c *IpsecResource) GetName() string {\r
-        return c.Name\r
-}\r
-\r
-func (c *IpsecResource) GetType() string {\r
-        return "Ipsec"\r
-}\r
-\r
-func (c *IpsecResource) ToYaml(target string) string {\r
-        p := strings.Join(c.CryptoProposal, ",")\r
-        pr := strings.Join(c.Connections.CryptoProposal, ",")\r
-       var connection = ""\r
-\r
-        if c.Connections.LocalSubnet != "" {\r
-          base := `apiVersion: ` + SdewanApiVersion + ` \r
-kind: IpsecSite\r
-metadata:\r
-  name: ` +  c.Name + `\r
-  namespace: default\r
-  labels:\r
-    sdewanPurpose: ` + SdewanPurpose + `\r
-    targetCluster: ` + target + `\r
-spec:\r
-  type: ` + c.Type + `\r
-  remote: '` + c.Remote + `'\r
-  authentication_method: `+ c.AuthenticationMethod + `\r
-  force_crypto_proposal: "` + c.ForceCryptoProposal + `\r
-  crypto_proposal: [` + p + `]`\r
-\r
-          connection = `\r
-  connections: \r
-  - name: ` + c.Connections.Name + `\r
-    conn_type: ` + c.Connections.ConnectionType + `\r
-    mode: ` +  c.Connections.Mode + `\r
-    mark: "` +  c.Connections.Mark + `"\r
-    local_updown: ` + c.Connections.LocalUpDown + `\r
-    local_subnet: ` + c.Connections.LocalSubnet + `\r
-    crypto_proposal: [` + pr +`]`\r
-\r
-          if c.Connections.RemoteSourceIp != "" {\r
-            remote_source_ip := `\r
-    remote_source_ip: '` + c.Connections.RemoteSourceIp + `'`\r
-            connection += remote_source_ip\r
-          }\r
-\r
-          if c.AuthenticationMethod == AuthTypePUBKEY {\r
-            auth := `\r
-  local_public_cert: ` + c.PublicCert + `\r
-  local_private_cert: ` + c.PrivateCert + `\r
-  shared_ca: ` + c.SharedCA + `\r
-  local_identifier: ` + c.LocalIdentifier + `\r
-  remote_identifier: ` + c.RemoteIdentifier\r
-            return base + auth + connection\r
-          } else if c.AuthenticationMethod == AuthTypePSK {\r
-            auth := `\r
-  pre_shared_key: ` + c.PresharedKey + `\r
-  local_identifier: ` + c.LocalIdentifier + `\r
-  remote_identifier: ` + c.RemoteIdentifier\r
-            return base + auth + connection\r
-          } else {\r
-            return "Error in authentication method"\r
-          }\r
-\r
-        }\r
-\r
-        base := `apiVersion: ` + SdewanApiVersion + ` \r
-kind: IpsecHost\r
-metadata:\r
-  name: ` +  c.Name + `\r
-  namespace: default\r
-  labels:\r
-    sdewanPurpose: ` + SdewanPurpose + `\r
-spec:\r
-  type: ` + c.Type + `\r
-  remote: '` + c.Remote + `'\r
-  authentication_method: `+ c.AuthenticationMethod +`\r
-  force_crypto_proposal: "` + c.ForceCryptoProposal + `"\r
-  crypto_proposal: [` + p + `]`\r
-\r
-        if c.Connections.LocalSourceIp != "" {\r
-          connection = `\r
-  connections: \r
-  - name: ` + c.Connections.Name + `\r
-    conn_type: ` + c.Connections.ConnectionType + `\r
-    mode: ` +  c.Connections.Mode + `\r
-    mark: "` +  c.Connections.Mark + `"\r
-    local_updown: ` + c.Connections.LocalUpDown + `\r
-    local_sourceip: '` + c.Connections.LocalSourceIp + `'\r
-    crypto_proposal: [` + pr +`]`\r
-        } else {\r
-          connection = `\r
-  connections: \r
-  - name: ` + c.Connections.Name + `\r
-    conn_type: ` + c.Connections.ConnectionType + `\r
-    mode: ` +  c.Connections.Mode + `\r
-    mark: "` +  c.Connections.Mark + `"\r
-    local_updown: ` + c.Connections.LocalUpDown + `\r
-    crypto_proposal: [` + pr +`]`\r
-        }\r
-\r
-        if c.Connections.RemoteSourceIp != "" {\r
-          remote_source_ip := `\r
-    remote_sourceip: '` + c.Connections.RemoteSourceIp + `'`\r
-          connection += remote_source_ip\r
-        }\r
-\r
-        if c.AuthenticationMethod == AuthTypePUBKEY {\r
-          auth := `\r
-  local_public_cert: ` + c.PublicCert + `\r
-  local_private_cert: ` + c.PrivateCert + `\r
-  shared_ca: ` + c.SharedCA + `\r
-  local_identifier: ` + c.LocalIdentifier + `\r
-  remote_identifier: ` + c.RemoteIdentifier\r
-          return base + auth + connection\r
-        } else if c.AuthenticationMethod == AuthTypePSK {\r
-          auth := `\r
-  pre_shared_key: ` + c.PresharedKey + `\r
-  local_identifier: ` + c.LocalIdentifier + `\r
-  remote_identifier: ` + c.RemoteIdentifier\r
-          return base + auth + connection\r
-        } else {\r
-          return "Error in authentication method"\r
-        }\r
-\r
-}\r
-\r
-func init() {\r
-  GetResourceBuilder().Register("Ipsec", &IpsecResource{})\r
-}\r
+/*
+ * 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 governinog permissions and
+ * limitations under the License.
+ */
+
+package resource
+
+import (
+       "strings"
+)
+
+const (
+       AuthTypePSK    = "psk"
+       AuthTypePUBKEY = "pubkey"
+)
+
+type Connection struct {
+       Name           string
+       ConnectionType string
+       Mode           string
+       LocalSubnet    string
+       LocalSourceIp  string
+       LocalUpDown    string
+       LocalFirewall  string
+       RemoteSubnet   string
+       RemoteSourceIp string
+       RemoteUpDown   string
+       RemoteFirewall string
+       CryptoProposal []string
+       Mark           string
+       IfId           string
+}
+
+type IpsecResource struct {
+       Name                 string
+       Type                 string
+       Remote               string
+       AuthenticationMethod string
+       CryptoProposal       []string
+       LocalIdentifier      string
+       RemoteIdentifier     string
+       ForceCryptoProposal  string
+       PresharedKey         string
+       PublicCert           string
+       PrivateCert          string
+       SharedCA             string
+       Connections          Connection
+}
+
+func (c *IpsecResource) GetName() string {
+       return c.Name
+}
+
+func (c *IpsecResource) GetType() string {
+       return "Ipsec"
+}
+
+func (c *IpsecResource) ToYaml(target string) string {
+       p := strings.Join(c.CryptoProposal, ",")
+       pr := strings.Join(c.Connections.CryptoProposal, ",")
+       var connection = ""
+
+       if c.Connections.LocalSubnet != "" {
+               base := `apiVersion: ` + SdewanApiVersion + ` 
+kind: IpsecSite
+metadata:
+  name: ` + c.Name + `
+  namespace: default
+  labels:
+    sdewanPurpose: ` + SdewanPurpose + `
+    targetCluster: ` + target + `
+spec:
+  type: ` + c.Type + `
+  remote: '` + c.Remote + `'
+  authentication_method: ` + c.AuthenticationMethod + `
+  force_crypto_proposal: "` + c.ForceCryptoProposal + `
+  crypto_proposal: [` + p + `]`
+
+               connection = `
+  connections: 
+  - name: ` + c.Connections.Name + `
+    conn_type: ` + c.Connections.ConnectionType + `
+    mode: ` + c.Connections.Mode + `
+    mark: "` + c.Connections.Mark + `"
+    local_updown: ` + c.Connections.LocalUpDown + `
+    local_subnet: ` + c.Connections.LocalSubnet + `
+    crypto_proposal: [` + pr + `]`
+
+               if c.Connections.RemoteSourceIp != "" {
+                       remote_source_ip := `
+    remote_source_ip: '` + c.Connections.RemoteSourceIp + `'`
+                       connection += remote_source_ip
+               }
+
+               if c.AuthenticationMethod == AuthTypePUBKEY {
+                       auth := `
+  local_public_cert: ` + c.PublicCert + `
+  local_private_cert: ` + c.PrivateCert + `
+  shared_ca: ` + c.SharedCA + `
+  local_identifier: ` + c.LocalIdentifier + `
+  remote_identifier: ` + c.RemoteIdentifier
+                       return base + auth + connection
+               } else if c.AuthenticationMethod == AuthTypePSK {
+                       auth := `
+  pre_shared_key: ` + c.PresharedKey + `
+  local_identifier: ` + c.LocalIdentifier + `
+  remote_identifier: ` + c.RemoteIdentifier
+                       return base + auth + connection
+               } else {
+                       return "Error in authentication method"
+               }
+
+       }
+
+       base := `apiVersion: ` + SdewanApiVersion + ` 
+kind: IpsecHost
+metadata:
+  name: ` + c.Name + `
+  namespace: default
+  labels:
+    sdewanPurpose: ` + SdewanPurpose + `
+spec:
+  type: ` + c.Type + `
+  remote: '` + c.Remote + `'
+  authentication_method: ` + c.AuthenticationMethod + `
+  force_crypto_proposal: "` + c.ForceCryptoProposal + `"
+  crypto_proposal: [` + p + `]`
+
+       if c.Connections.LocalSourceIp != "" {
+               connection = `
+  connections: 
+  - name: ` + c.Connections.Name + `
+    conn_type: ` + c.Connections.ConnectionType + `
+    mode: ` + c.Connections.Mode + `
+    mark: "` + c.Connections.Mark + `"
+    local_updown: ` + c.Connections.LocalUpDown + `
+    local_sourceip: '` + c.Connections.LocalSourceIp + `'
+    crypto_proposal: [` + pr + `]`
+       } else {
+               connection = `
+  connections: 
+  - name: ` + c.Connections.Name + `
+    conn_type: ` + c.Connections.ConnectionType + `
+    mode: ` + c.Connections.Mode + `
+    mark: "` + c.Connections.Mark + `"
+    local_updown: ` + c.Connections.LocalUpDown + `
+    crypto_proposal: [` + pr + `]`
+       }
+
+       if c.Connections.RemoteSourceIp != "" {
+               remote_source_ip := `
+    remote_sourceip: '` + c.Connections.RemoteSourceIp + `'`
+               connection += remote_source_ip
+       }
+
+       if c.AuthenticationMethod == AuthTypePUBKEY {
+               auth := `
+  local_public_cert: ` + c.PublicCert + `
+  local_private_cert: ` + c.PrivateCert + `
+  shared_ca: ` + c.SharedCA + `
+  local_identifier: ` + c.LocalIdentifier + `
+  remote_identifier: ` + c.RemoteIdentifier
+               return base + auth + connection
+       } else if c.AuthenticationMethod == AuthTypePSK {
+               auth := `
+  pre_shared_key: ` + c.PresharedKey + `
+  local_identifier: ` + c.LocalIdentifier + `
+  remote_identifier: ` + c.RemoteIdentifier
+               return base + auth + connection
+       } else {
+               return "Error in authentication method"
+       }
+
+}
+
+func init() {
+       GetResourceBuilder().Register("Ipsec", &IpsecResource{})
+}
index 26df257..9d94e53 100644 (file)
@@ -1,54 +1,53 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-)\r
-\r
-type ProposalResource struct {\r
-    Name string\r
-    Encryption string\r
-    Hash string\r
-    DhGroup string\r
-}\r
-\r
-func (c *ProposalResource) GetName() string {\r
-    return c.Name\r
-}\r
-\r
-func (c *ProposalResource) GetType() string {\r
-    return "Proposal"\r
-}\r
-\r
-func (c *ProposalResource) ToYaml(target string) string {\r
-    return `apiVersion: ` + SdewanApiVersion + `\r
-kind: IpsecProposal\r
-metadata:\r
-  name: ` + c.Name + `\r
-  namespace: default\r
-  labels:\r
-    sdewanPurpose: ` + SdewanPurpose + `\r
-    targetCluster: ` + target + `\r
-spec:\r
-  encryption_algorithm: ` + c.Encryption + `\r
-  hash_algorithm: ` + c.Hash + `\r
-  dh_group: ` + c.DhGroup\r
-}\r
-\r
-func init() {\r
-  GetResourceBuilder().Register("Proposal", &ProposalResource{})\r
-}
\ No newline at end of file
+/*
+ * 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 resource
+
+import ()
+
+type ProposalResource struct {
+       Name       string
+       Encryption string
+       Hash       string
+       DhGroup    string
+}
+
+func (c *ProposalResource) GetName() string {
+       return c.Name
+}
+
+func (c *ProposalResource) GetType() string {
+       return "Proposal"
+}
+
+func (c *ProposalResource) ToYaml(target string) string {
+       return `apiVersion: ` + SdewanApiVersion + `
+kind: IpsecProposal
+metadata:
+  name: ` + c.Name + `
+  namespace: default
+  labels:
+    sdewanPurpose: ` + SdewanPurpose + `
+    targetCluster: ` + target + `
+spec:
+  encryption_algorithm: ` + c.Encryption + `
+  hash_algorithm: ` + c.Hash + `
+  dh_group: ` + c.DhGroup
+}
+
+func init() {
+       GetResourceBuilder().Register("Proposal", &ProposalResource{})
+}
index c17c319..06abc40 100644 (file)
@@ -1,67 +1,67 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-       "strings"\r
-       "reflect"\r
-       "encoding/json"\r
-       pkgerrors "github.com/pkg/errors"\r
-)\r
-\r
-type ResourceBuilder struct {\r
-       omap map[string]reflect.Type\r
-}\r
-\r
-var res_builder = ResourceBuilder{\r
-       omap: make(map[string]reflect.Type),\r
-}\r
-\r
-func GetResourceBuilder() *ResourceBuilder {\r
-    return &res_builder\r
-}\r
-\r
-func (c *ResourceBuilder) Register(name string, r interface{}) {\r
-       c.omap[name] = reflect.TypeOf(r).Elem()\r
-}\r
-\r
-func (c *ResourceBuilder) ToString(obj ISdewanResource) (string, error) {\r
-       obj_str, err := json.Marshal(obj)\r
-       if err != nil {\r
-               return "", err\r
-       }\r
-\r
-       return obj.GetType() + "-" + string(obj_str), nil\r
-}\r
-\r
-func (c *ResourceBuilder) ToObject(obj_str string) (ISdewanResource, error) {\r
-       if !strings.Contains(obj_str, "-") {\r
-               return &EmptyResource{}, pkgerrors.New("Not a valid object")\r
-       }\r
-       strs := strings.SplitN(obj_str, "-", 2)\r
-       if len(strs) != 2 {\r
-               return &EmptyResource{}, pkgerrors.New("Not a valid object")\r
-       }\r
-\r
-       if v, ok := c.omap[strs[0]]; ok {\r
-               retObj := reflect.New(v).Interface()\r
-               err := json.Unmarshal([]byte(strs[1]), retObj)\r
-               return retObj.(ISdewanResource), err\r
-       } else {\r
-           return &EmptyResource{}, pkgerrors.New("Not a valid object")\r
-       }\r
-}\r
+/*
+ * 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 resource
+
+import (
+       "encoding/json"
+       pkgerrors "github.com/pkg/errors"
+       "reflect"
+       "strings"
+)
+
+type ResourceBuilder struct {
+       omap map[string]reflect.Type
+}
+
+var res_builder = ResourceBuilder{
+       omap: make(map[string]reflect.Type),
+}
+
+func GetResourceBuilder() *ResourceBuilder {
+       return &res_builder
+}
+
+func (c *ResourceBuilder) Register(name string, r interface{}) {
+       c.omap[name] = reflect.TypeOf(r).Elem()
+}
+
+func (c *ResourceBuilder) ToString(obj ISdewanResource) (string, error) {
+       obj_str, err := json.Marshal(obj)
+       if err != nil {
+               return "", err
+       }
+
+       return obj.GetType() + "-" + string(obj_str), nil
+}
+
+func (c *ResourceBuilder) ToObject(obj_str string) (ISdewanResource, error) {
+       if !strings.Contains(obj_str, "-") {
+               return &EmptyResource{}, pkgerrors.New("Not a valid object")
+       }
+       strs := strings.SplitN(obj_str, "-", 2)
+       if len(strs) != 2 {
+               return &EmptyResource{}, pkgerrors.New("Not a valid object")
+       }
+
+       if v, ok := c.omap[strs[0]]; ok {
+               retObj := reflect.New(v).Interface()
+               err := json.Unmarshal([]byte(strs[1]), retObj)
+               return retObj.(ISdewanResource), err
+       } else {
+               return &EmptyResource{}, pkgerrors.New("Not a valid object")
+       }
+}
index 7c588ea..dffdac7 100644 (file)
@@ -1,31 +1,30 @@
-/*\r
- * Copyright 2020 Intel Corporation, Inc\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package resource\r
-\r
-import (\r
-)\r
-\r
-const (\r
-    SdewanApiVersion = "batch.sdewan.akraino.org/v1alpha1"\r
-    SdewanPurpose = "base"\r
-)\r
-\r
-type ISdewanResource interface {\r
-       GetName() string\r
-       GetType() string\r
-       ToYaml(target string) string\r
-}
\ No newline at end of file
+/*
+ * 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 resource
+
+import ()
+
+const (
+       SdewanApiVersion = "batch.sdewan.akraino.org/v1alpha1"
+       SdewanPurpose    = "base"
+)
+
+type ISdewanResource interface {
+       GetName() string
+       GetType() string
+       ToYaml(target string) string
+}
index 1cfa1c2..3179b49 100644 (file)
-package test\r
-\r
-import (\r
-    "testing"\r
-    "flag"\r
-    "encoding/json"\r
-    "fmt"\r
-    "os"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-)\r
-\r
-var BaseUrl string\r
-var OverlayUrl string\r
-\r
-func TestMain(m *testing.M) {\r
-    servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")\r
-    flag.Parse()\r
-    OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection\r
-    BaseUrl = OverlayUrl + "/overlay1/" + manager.CertCollection\r
-\r
-    var overlay_object = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-    \r
-    var cert_object1 = module.CertificateObject{\r
-        Metadata: module.ObjectMetaData{"device1", "", "", ""}}\r
-    var cert_object2 = module.CertificateObject{\r
-        Metadata: module.ObjectMetaData{"device2", "", "", ""}}\r
-    \r
-    createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})\r
-    createControllerObject(BaseUrl, &cert_object1, &module.CertificateObject{})\r
-    createControllerObject(BaseUrl, &cert_object2, &module.CertificateObject{})\r
-\r
-    var ret = m.Run()\r
-\r
-    deleteControllerObject(BaseUrl, "device1")\r
-    deleteControllerObject(BaseUrl, "device2")\r
-    deleteControllerObject(OverlayUrl, "overlay1")\r
-\r
-    os.Exit(ret)\r
-}\r
-\r
-func TestGetObjects(t *testing.T) {\r
-    url := BaseUrl\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test case GetObjects: can not get Objects")\r
-        return\r
-    }\r
-\r
-    var objs []module.CertificateObject\r
-    err = json.Unmarshal([]byte(res), &objs)\r
-\r
-    if len(objs) == 0 {\r
-        fmt.Printf("Test case GetObjects: no object found")\r
-        return\r
-    }\r
-\r
-    p_data, _ := json.Marshal(objs)\r
-    fmt.Printf("%s\n", string(p_data))\r
-}\r
-\r
-func TestGetObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "Normal",\r
-            object_name: "device1",\r
-        },\r
-        {\r
-            name: "GetFoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        obj, err := getControllerObject(BaseUrl, tcase.object_name, &module.CertificateObject{})\r
-        if err == nil {\r
-            p_data, _ := json.Marshal(obj)\r
-            fmt.Printf("%s\n", string(p_data))\r
-        }\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestCreateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        url string\r
-        obj module.CertificateObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            obj: module.CertificateObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "WrongOverlayName",\r
-            obj: module.CertificateObject{\r
-                Metadata: module.ObjectMetaData{"device3", "", "", ""}},\r
-            url: OverlayUrl + "/foooverlay/" + manager.CertCollection,\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-        {\r
-            name: "DumplicateName",\r
-            obj: module.CertificateObject{\r
-                Metadata: module.ObjectMetaData{"device1", "", "", ""}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 409,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := createControllerObject(tcase.url, &tcase.obj, &module.CertificateObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestDeleteObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "FoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := deleteControllerObject(BaseUrl, tcase.object_name)\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestHappyPath(t *testing.T) {\r
-    cert_name := "my-device"\r
-\r
-    obj := module.CertificateObject{\r
-        Metadata: module.ObjectMetaData{cert_name, "", "", ""}}\r
-\r
-    _, err := createControllerObject(BaseUrl, &obj, &module.CertificateObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    _, err = deleteControllerObject(BaseUrl, cert_name)\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: delete object")\r
-        return\r
-    }\r
-}
\ No newline at end of file
+package test
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "os"
+       "testing"
+)
+
+var BaseUrl string
+var OverlayUrl string
+
+func TestMain(m *testing.M) {
+       servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")
+       flag.Parse()
+       OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection
+       BaseUrl = OverlayUrl + "/overlay1/" + manager.CertCollection
+
+       var overlay_object = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       var cert_object1 = module.CertificateObject{
+               Metadata: module.ObjectMetaData{"device1", "", "", ""}}
+       var cert_object2 = module.CertificateObject{
+               Metadata: module.ObjectMetaData{"device2", "", "", ""}}
+
+       createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})
+       createControllerObject(BaseUrl, &cert_object1, &module.CertificateObject{})
+       createControllerObject(BaseUrl, &cert_object2, &module.CertificateObject{})
+
+       var ret = m.Run()
+
+       deleteControllerObject(BaseUrl, "device1")
+       deleteControllerObject(BaseUrl, "device2")
+       deleteControllerObject(OverlayUrl, "overlay1")
+
+       os.Exit(ret)
+}
+
+func TestGetObjects(t *testing.T) {
+       url := BaseUrl
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               printError(err)
+               t.Errorf("Test case GetObjects: can not get Objects")
+               return
+       }
+
+       var objs []module.CertificateObject
+       err = json.Unmarshal([]byte(res), &objs)
+
+       if len(objs) == 0 {
+               fmt.Printf("Test case GetObjects: no object found")
+               return
+       }
+
+       p_data, _ := json.Marshal(objs)
+       fmt.Printf("%s\n", string(p_data))
+}
+
+func TestGetObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "Normal",
+                       object_name: "device1",
+               },
+               {
+                       name:            "GetFoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               obj, err := getControllerObject(BaseUrl, tcase.object_name, &module.CertificateObject{})
+               if err == nil {
+                       p_data, _ := json.Marshal(obj)
+                       fmt.Printf("%s\n", string(p_data))
+               }
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestCreateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               url             string
+               obj             module.CertificateObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name: "EmptyName",
+                       obj: module.CertificateObject{
+                               Metadata: module.ObjectMetaData{"", "object 1", "", ""}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "WrongOverlayName",
+                       obj: module.CertificateObject{
+                               Metadata: module.ObjectMetaData{"device3", "", "", ""}},
+                       url:             OverlayUrl + "/foooverlay/" + manager.CertCollection,
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+               {
+                       name: "DumplicateName",
+                       obj: module.CertificateObject{
+                               Metadata: module.ObjectMetaData{"device1", "", "", ""}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 409,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := createControllerObject(tcase.url, &tcase.obj, &module.CertificateObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestDeleteObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:            "FoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := deleteControllerObject(BaseUrl, tcase.object_name)
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestHappyPath(t *testing.T) {
+       cert_name := "my-device"
+
+       obj := module.CertificateObject{
+               Metadata: module.ObjectMetaData{cert_name, "", "", ""}}
+
+       _, err := createControllerObject(BaseUrl, &obj, &module.CertificateObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       _, err = deleteControllerObject(BaseUrl, cert_name)
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: delete object")
+               return
+       }
+}
index 26bd674..6a042ae 100644 (file)
@@ -1,52 +1,52 @@
-package test\r
-\r
-import (\r
-    "testing"\r
-    "flag"\r
-    "encoding/json"\r
-    "fmt"\r
-    "os"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-)\r
-\r
-var BaseUrl string\r
-\r
-func TestMain(m *testing.M) {\r
-    servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")\r
-    flag.Parse()\r
-    BaseUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection\r
-\r
-    var object1 = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-\r
-    createControllerObject(BaseUrl, &object1, &module.OverlayObject{})\r
-\r
-    var ret = m.Run()\r
-\r
-    deleteControllerObject(BaseUrl, "overlay1")\r
-\r
-    os.Exit(ret)\r
-}\r
-\r
-func TestGetObjects(t *testing.T) {\r
-    url := BaseUrl + "/overlay1/devices/device1/cnfs"\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test case GetObjects: can not get Objects")\r
-        return\r
-    }\r
-\r
-    var objs []module.CNFObject\r
-    err = json.Unmarshal([]byte(res), &objs)\r
-\r
-    if len(objs) == 0 {\r
-        fmt.Printf("Test case GetObjects: no object found")\r
-        return\r
-    }\r
-\r
-    p_data, _ := json.Marshal(objs)\r
-    fmt.Printf("%s\n", string(p_data))\r
-}
\ No newline at end of file
+package test
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "os"
+       "testing"
+)
+
+var BaseUrl string
+
+func TestMain(m *testing.M) {
+       servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")
+       flag.Parse()
+       BaseUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection
+
+       var object1 = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       createControllerObject(BaseUrl, &object1, &module.OverlayObject{})
+
+       var ret = m.Run()
+
+       deleteControllerObject(BaseUrl, "overlay1")
+
+       os.Exit(ret)
+}
+
+func TestGetObjects(t *testing.T) {
+       url := BaseUrl + "/overlay1/devices/device1/cnfs"
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               printError(err)
+               t.Errorf("Test case GetObjects: can not get Objects")
+               return
+       }
+
+       var objs []module.CNFObject
+       err = json.Unmarshal([]byte(res), &objs)
+
+       if len(objs) == 0 {
+               fmt.Printf("Test case GetObjects: no object found")
+               return
+       }
+
+       p_data, _ := json.Marshal(objs)
+       fmt.Printf("%s\n", string(p_data))
+}
index e756feb..541eaa6 100644 (file)
-package test\r
-\r
-import (\r
-    "testing"\r
-    "flag"\r
-    "encoding/json"\r
-    "fmt"\r
-    "os"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-)\r
-\r
-var BaseUrl string\r
-var OverlayUrl string\r
-\r
-func TestMain(m *testing.M) {\r
-    servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")\r
-    flag.Parse()\r
-    OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection\r
-    BaseUrl = OverlayUrl + "/overlay1/" + manager.IPRangeCollection\r
-\r
-    var overlay_object = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-    \r
-    var iprange_object1 = module.IPRangeObject{\r
-        Metadata: module.ObjectMetaData{"ipr1", "", "", ""}, \r
-        Specification: module.IPRangeObjectSpec{"192.168.0.2", 10, 12}}\r
-    var iprange_object2 = module.IPRangeObject{\r
-        Metadata: module.ObjectMetaData{"ipr2", "", "", ""}, \r
-        Specification: module.IPRangeObjectSpec{"192.168.1.3", 32, 36}}\r
-    \r
-    createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})\r
-    createControllerObject(BaseUrl, &iprange_object1, &module.IPRangeObject{})\r
-    createControllerObject(BaseUrl, &iprange_object2, &module.IPRangeObject{})\r
-\r
-    var ret = m.Run()\r
-\r
-    deleteControllerObject(BaseUrl, "ipr1")\r
-    deleteControllerObject(BaseUrl, "ipr2")\r
-    deleteControllerObject(OverlayUrl, "overlay1")\r
-\r
-    os.Exit(ret)\r
-}\r
-\r
-func TestGetObjects(t *testing.T) {\r
-    url := BaseUrl\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test case GetObjects: can not get Objects")\r
-        return\r
-    }\r
-\r
-    var objs []module.IPRangeObject\r
-    err = json.Unmarshal([]byte(res), &objs)\r
-\r
-    if len(objs) == 0 {\r
-        fmt.Printf("Test case GetObjects: no object found")\r
-        return\r
-    }\r
-\r
-    p_data, _ := json.Marshal(objs)\r
-    fmt.Printf("%s\n", string(p_data))\r
-}\r
-\r
-func TestGetObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "Normal",\r
-            object_name: "ipr1",\r
-        },\r
-        {\r
-            name: "GetFoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := getControllerObject(BaseUrl, tcase.object_name, &module.IPRangeObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestCreateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        url string\r
-        obj module.IPRangeObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "DumplicateName",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"ipr1", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 409,\r
-        },\r
-        {\r
-            name: "WrongOverlayName",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}},\r
-            url: OverlayUrl + "/foooverlay/" + manager.IPRangeCollection,\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-        {\r
-            name: "WrongSubnet",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.2.3.0", 1, 15}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "WrongMinIP",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.2.3", 0, 15}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "WrongMaxIP",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.1.3", 1, 300}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "WrongMinMaxIP",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.2.3", 20, 15}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "ConflictRange1",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.0.3", 11, 15}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-        {\r
-            name: "ConflictRange2",\r
-            obj: module.IPRangeObject{\r
-                Metadata: module.ObjectMetaData{"my-ipr", "", "", ""}, \r
-                Specification: module.IPRangeObjectSpec{"192.168.1.3", 30, 40}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := createControllerObject(tcase.url, &tcase.obj, &module.IPRangeObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestDeleteObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "FoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := deleteControllerObject(BaseUrl, tcase.object_name)\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestHappyPath(t *testing.T) {\r
-    ipr_name := "my-ipr"\r
-\r
-    obj := module.IPRangeObject{\r
-        Metadata: module.ObjectMetaData{ipr_name, "", "", ""},\r
-        Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}}\r
-\r
-    ret_obj, err := createControllerObject(BaseUrl, &obj, &module.IPRangeObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    if ret_obj.(*module.IPRangeObject).Specification.Subnet != "192.168.2.3" {\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    _, err = deleteControllerObject(BaseUrl, ipr_name)\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: delete object")\r
-        return\r
-    }\r
-}
\ No newline at end of file
+package test
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "os"
+       "testing"
+)
+
+var BaseUrl string
+var OverlayUrl string
+
+func TestMain(m *testing.M) {
+       servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")
+       flag.Parse()
+       OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection
+       BaseUrl = OverlayUrl + "/overlay1/" + manager.IPRangeCollection
+
+       var overlay_object = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       var iprange_object1 = module.IPRangeObject{
+               Metadata:      module.ObjectMetaData{"ipr1", "", "", ""},
+               Specification: module.IPRangeObjectSpec{"192.168.0.2", 10, 12}}
+       var iprange_object2 = module.IPRangeObject{
+               Metadata:      module.ObjectMetaData{"ipr2", "", "", ""},
+               Specification: module.IPRangeObjectSpec{"192.168.1.3", 32, 36}}
+
+       createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})
+       createControllerObject(BaseUrl, &iprange_object1, &module.IPRangeObject{})
+       createControllerObject(BaseUrl, &iprange_object2, &module.IPRangeObject{})
+
+       var ret = m.Run()
+
+       deleteControllerObject(BaseUrl, "ipr1")
+       deleteControllerObject(BaseUrl, "ipr2")
+       deleteControllerObject(OverlayUrl, "overlay1")
+
+       os.Exit(ret)
+}
+
+func TestGetObjects(t *testing.T) {
+       url := BaseUrl
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               printError(err)
+               t.Errorf("Test case GetObjects: can not get Objects")
+               return
+       }
+
+       var objs []module.IPRangeObject
+       err = json.Unmarshal([]byte(res), &objs)
+
+       if len(objs) == 0 {
+               fmt.Printf("Test case GetObjects: no object found")
+               return
+       }
+
+       p_data, _ := json.Marshal(objs)
+       fmt.Printf("%s\n", string(p_data))
+}
+
+func TestGetObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "Normal",
+                       object_name: "ipr1",
+               },
+               {
+                       name:            "GetFoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := getControllerObject(BaseUrl, tcase.object_name, &module.IPRangeObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestCreateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               url             string
+               obj             module.IPRangeObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name: "EmptyName",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"", "object 1", "", ""},
+                               Specification: module.IPRangeObjectSpec{}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "DumplicateName",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"ipr1", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 409,
+               },
+               {
+                       name: "WrongOverlayName",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}},
+                       url:             OverlayUrl + "/foooverlay/" + manager.IPRangeCollection,
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+               {
+                       name: "WrongSubnet",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.2.3.0", 1, 15}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "WrongMinIP",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.2.3", 0, 15}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "WrongMaxIP",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.1.3", 1, 300}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "WrongMinMaxIP",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.2.3", 20, 15}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "ConflictRange1",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.0.3", 11, 15}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+               {
+                       name: "ConflictRange2",
+                       obj: module.IPRangeObject{
+                               Metadata:      module.ObjectMetaData{"my-ipr", "", "", ""},
+                               Specification: module.IPRangeObjectSpec{"192.168.1.3", 30, 40}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := createControllerObject(tcase.url, &tcase.obj, &module.IPRangeObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestDeleteObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:            "FoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := deleteControllerObject(BaseUrl, tcase.object_name)
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestHappyPath(t *testing.T) {
+       ipr_name := "my-ipr"
+
+       obj := module.IPRangeObject{
+               Metadata:      module.ObjectMetaData{ipr_name, "", "", ""},
+               Specification: module.IPRangeObjectSpec{"192.168.2.3", 10, 15}}
+
+       ret_obj, err := createControllerObject(BaseUrl, &obj, &module.IPRangeObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       if ret_obj.(*module.IPRangeObject).Specification.Subnet != "192.168.2.3" {
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       _, err = deleteControllerObject(BaseUrl, ipr_name)
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: delete object")
+               return
+       }
+}
index 7ec2f09..ab5c693 100644 (file)
-package test\r
-\r
-import (\r
-    "testing"\r
-    "flag"\r
-    "encoding/json"\r
-    "fmt"\r
-    "os"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-)\r
-\r
-var BaseUrl string\r
-\r
-func TestMain(m *testing.M) {\r
-    servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")\r
-    flag.Parse()\r
-    BaseUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection\r
-\r
-    var object1 = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-    var object2 = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay2", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-\r
-    createControllerObject(BaseUrl, &object1, &module.OverlayObject{})\r
-    createControllerObject(BaseUrl, &object2, &module.OverlayObject{})\r
-\r
-    var ret = m.Run()\r
-\r
-    deleteControllerObject(BaseUrl, "overlay1")\r
-    deleteControllerObject(BaseUrl, "overlay2")\r
-\r
-    os.Exit(ret)\r
-}\r
-\r
-func TestGetObjects(t *testing.T) {\r
-    url := BaseUrl\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test case GetObjects: can not get Objects")\r
-        return\r
-    }\r
-\r
-    var objs []module.OverlayObject\r
-    err = json.Unmarshal([]byte(res), &objs)\r
-\r
-    if len(objs) == 0 {\r
-        fmt.Printf("Test case GetObjects: no object found")\r
-        return\r
-    }\r
-\r
-    p_data, _ := json.Marshal(objs)\r
-    fmt.Printf("%s\n", string(p_data))\r
-}\r
-\r
-func TestGetObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "Normal",\r
-            object_name: "overlay1",\r
-        },\r
-        {\r
-            name: "GetFoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := getControllerObject(BaseUrl, tcase.object_name, &module.OverlayObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestCreateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        obj module.OverlayObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            obj: module.OverlayObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}, \r
-                Specification: module.OverlayObjectSpec{}},\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "DumplicateName",\r
-            obj: module.OverlayObject{\r
-                Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-                Specification: module.OverlayObjectSpec{}},\r
-            expectedErr: true,\r
-            expectedErrCode: 409,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := createControllerObject(BaseUrl, &tcase.obj, &module.OverlayObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestUpdateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        obj module.OverlayObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            object_name: "overlay1",\r
-            obj: module.OverlayObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}, \r
-                Specification: module.OverlayObjectSpec{}},\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "MisMatchName",\r
-            object_name: "overlay2",\r
-            obj: module.OverlayObject{\r
-                Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-                Specification: module.OverlayObjectSpec{}},\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := updateControllerObject(BaseUrl, tcase.object_name, &tcase.obj, &module.OverlayObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestDeleteObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "FoolName",\r
-            object_name: "foo_name",\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := deleteControllerObject(BaseUrl, tcase.object_name)\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestHappyPath(t *testing.T) {\r
-    overlay_name := "my-overlay"\r
-\r
-    obj := module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{overlay_name, "object 1", "", ""},\r
-        Specification: module.OverlayObjectSpec{}}\r
-\r
-    obj_update := module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{overlay_name, "object 2", "", ""},\r
-        Specification: module.OverlayObjectSpec{}}\r
-\r
-    ret_obj, err := createControllerObject(BaseUrl, &obj, &module.OverlayObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    if ret_obj.(*module.OverlayObject).Metadata.Description != "object 1" {\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    ret_obj, err = updateControllerObject(BaseUrl, overlay_name, &obj_update, &module.OverlayObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: update object")\r
-        return\r
-    }\r
-\r
-    if ret_obj.(*module.OverlayObject).Metadata.Description != "object 2" {\r
-        t.Errorf("Test Case 'Happy Path' failed: update object")\r
-        return\r
-    }\r
-\r
-    _, err = deleteControllerObject(BaseUrl, overlay_name)\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: delete object")\r
-        return\r
-    }\r
-}\r
+package test
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "os"
+       "testing"
+)
+
+var BaseUrl string
+
+func TestMain(m *testing.M) {
+       servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")
+       flag.Parse()
+       BaseUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection
+
+       var object1 = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+       var object2 = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay2", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       createControllerObject(BaseUrl, &object1, &module.OverlayObject{})
+       createControllerObject(BaseUrl, &object2, &module.OverlayObject{})
+
+       var ret = m.Run()
+
+       deleteControllerObject(BaseUrl, "overlay1")
+       deleteControllerObject(BaseUrl, "overlay2")
+
+       os.Exit(ret)
+}
+
+func TestGetObjects(t *testing.T) {
+       url := BaseUrl
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               printError(err)
+               t.Errorf("Test case GetObjects: can not get Objects")
+               return
+       }
+
+       var objs []module.OverlayObject
+       err = json.Unmarshal([]byte(res), &objs)
+
+       if len(objs) == 0 {
+               fmt.Printf("Test case GetObjects: no object found")
+               return
+       }
+
+       p_data, _ := json.Marshal(objs)
+       fmt.Printf("%s\n", string(p_data))
+}
+
+func TestGetObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "Normal",
+                       object_name: "overlay1",
+               },
+               {
+                       name:            "GetFoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := getControllerObject(BaseUrl, tcase.object_name, &module.OverlayObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestCreateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               obj             module.OverlayObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name: "EmptyName",
+                       obj: module.OverlayObject{
+                               Metadata:      module.ObjectMetaData{"", "object 1", "", ""},
+                               Specification: module.OverlayObjectSpec{}},
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "DumplicateName",
+                       obj: module.OverlayObject{
+                               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+                               Specification: module.OverlayObjectSpec{}},
+                       expectedErr:     true,
+                       expectedErrCode: 409,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := createControllerObject(BaseUrl, &tcase.obj, &module.OverlayObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestUpdateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               obj             module.OverlayObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "EmptyName",
+                       object_name: "overlay1",
+                       obj: module.OverlayObject{
+                               Metadata:      module.ObjectMetaData{"", "object 1", "", ""},
+                               Specification: module.OverlayObjectSpec{}},
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name:        "MisMatchName",
+                       object_name: "overlay2",
+                       obj: module.OverlayObject{
+                               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+                               Specification: module.OverlayObjectSpec{}},
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := updateControllerObject(BaseUrl, tcase.object_name, &tcase.obj, &module.OverlayObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestDeleteObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "FoolName",
+                       object_name: "foo_name",
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := deleteControllerObject(BaseUrl, tcase.object_name)
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestHappyPath(t *testing.T) {
+       overlay_name := "my-overlay"
+
+       obj := module.OverlayObject{
+               Metadata:      module.ObjectMetaData{overlay_name, "object 1", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       obj_update := module.OverlayObject{
+               Metadata:      module.ObjectMetaData{overlay_name, "object 2", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       ret_obj, err := createControllerObject(BaseUrl, &obj, &module.OverlayObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       if ret_obj.(*module.OverlayObject).Metadata.Description != "object 1" {
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       ret_obj, err = updateControllerObject(BaseUrl, overlay_name, &obj_update, &module.OverlayObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: update object")
+               return
+       }
+
+       if ret_obj.(*module.OverlayObject).Metadata.Description != "object 2" {
+               t.Errorf("Test Case 'Happy Path' failed: update object")
+               return
+       }
+
+       _, err = deleteControllerObject(BaseUrl, overlay_name)
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: delete object")
+               return
+       }
+}
index e2c9559..7a72176 100644 (file)
-package test\r
-\r
-import (\r
-    "testing"\r
-    "flag"\r
-    "encoding/json"\r
-    "fmt"\r
-    "os"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"\r
-)\r
-\r
-var BaseUrl string\r
-var OverlayUrl string\r
-\r
-func TestMain(m *testing.M) {\r
-    servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")\r
-    flag.Parse()\r
-    OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection\r
-    IPBaseUrl := OverlayUrl + "/overlay1/" + manager.IPRangeCollection\r
-    BaseUrl = OverlayUrl + "/overlay1/" + manager.ProposalCollection\r
-\r
-    var overlay_object = module.OverlayObject{\r
-        Metadata: module.ObjectMetaData{"overlay1", "", "", ""}, \r
-        Specification: module.OverlayObjectSpec{}}\r
-    \r
-    var iprange_object1 = module.IPRangeObject{\r
-        Metadata: module.ObjectMetaData{"ipr1", "", "", ""}, \r
-        Specification: module.IPRangeObjectSpec{"192.168.0.2", 10, 20}}\r
-    var iprange_object2 = module.IPRangeObject{\r
-        Metadata: module.ObjectMetaData{"ipr2", "", "", ""}, \r
-        Specification: module.IPRangeObjectSpec{"192.168.2.2", 18, 20}}\r
-\r
-    var proposal_object1 = module.ProposalObject{\r
-        Metadata: module.ObjectMetaData{"proposal1", "", "", ""}, \r
-        Specification: module.ProposalObjectSpec{"aes256", "sha256", "modp4096"}}\r
-    var proposal_object2 = module.ProposalObject{\r
-        Metadata: module.ObjectMetaData{"proposal2", "", "", ""}, \r
-        Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}}\r
-    \r
-    createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})\r
-    createControllerObject(IPBaseUrl, &iprange_object1, &module.IPRangeObject{})\r
-    createControllerObject(IPBaseUrl, &iprange_object2, &module.IPRangeObject{})\r
-    createControllerObject(BaseUrl, &proposal_object1, &module.ProposalObject{})\r
-    createControllerObject(BaseUrl, &proposal_object2, &module.ProposalObject{})\r
-\r
-    var ret = m.Run()\r
-\r
-    deleteControllerObject(BaseUrl, "proposal1")\r
-    deleteControllerObject(BaseUrl, "proposal2")\r
-    deleteControllerObject(IPBaseUrl, "ipr1")\r
-    deleteControllerObject(IPBaseUrl, "ipr2")\r
-    deleteControllerObject(OverlayUrl, "overlay1")\r
-\r
-    os.Exit(ret)\r
-}\r
-\r
-func TestGetObjects(t *testing.T) {\r
-    url := BaseUrl\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test case GetObjects: can not get Objects")\r
-        return\r
-    }\r
-\r
-    var objs []module.ProposalObject\r
-    err = json.Unmarshal([]byte(res), &objs)\r
-\r
-    if len(objs) == 0 {\r
-        fmt.Printf("Test case GetObjects: no object found")\r
-        return\r
-    }\r
-\r
-    p_data, _ := json.Marshal(objs)\r
-    fmt.Printf("%s\n", string(p_data))\r
-}\r
-\r
-func TestGetObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "Normal",\r
-            object_name: "proposal1",\r
-        },\r
-        {\r
-            name: "GetFoolName",\r
-            object_name: "foo_name",\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := getControllerObject(BaseUrl, tcase.object_name, &module.ProposalObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestCreateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        url string\r
-        obj module.ProposalObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            obj: module.ProposalObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}, \r
-                Specification: module.ProposalObjectSpec{}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "WrongOverlayName",\r
-            obj: module.ProposalObject{\r
-                Metadata: module.ObjectMetaData{"proposal1", "", "", ""}, \r
-                Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},\r
-            url: OverlayUrl + "/foooverlay/" + manager.ProposalCollection,\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-        {\r
-            name: "DumplicateName",\r
-            obj: module.ProposalObject{\r
-                Metadata: module.ObjectMetaData{"proposal1", "", "", ""}, \r
-                Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},\r
-            url: BaseUrl,\r
-            expectedErr: true,\r
-            expectedErrCode: 409,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := createControllerObject(tcase.url, &tcase.obj, &module.ProposalObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestUpdateObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        obj module.ProposalObject\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "EmptyName",\r
-            object_name: "proposal1",\r
-            obj: module.ProposalObject{\r
-                Metadata: module.ObjectMetaData{"", "object 1", "", ""}, \r
-                Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},\r
-            expectedErr: true,\r
-            expectedErrCode: 422,\r
-        },\r
-        {\r
-            name: "MisMatchName",\r
-            object_name: "proposal2",\r
-            obj: module.ProposalObject{\r
-                Metadata: module.ObjectMetaData{"proposal1", "", "", ""}, \r
-                Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},\r
-            expectedErr: true,\r
-            expectedErrCode: 500,\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := updateControllerObject(BaseUrl, tcase.object_name, &tcase.obj, &module.ProposalObject{})\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestDeleteObject(t *testing.T) {\r
-    tcases := []struct {\r
-        name string\r
-        object_name string\r
-        expectedErr bool\r
-        expectedErrCode int\r
-    }{\r
-        {\r
-            name: "FoolName",\r
-            object_name: "foo_name",\r
-        },\r
-    }\r
-\r
-    for _, tcase := range tcases {\r
-        _, err := deleteControllerObject(BaseUrl, tcase.object_name)\r
-        handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)\r
-    }\r
-}\r
-\r
-func TestHappyPath(t *testing.T) {\r
-    proposal_name := "my-proposal"\r
-\r
-    obj := module.ProposalObject{\r
-        Metadata: module.ObjectMetaData{proposal_name, "object 1", "", ""},\r
-        Specification: module.ProposalObjectSpec{"aes256", "sha256", "modp4096"}}\r
-\r
-    obj_update := module.ProposalObject{\r
-        Metadata: module.ObjectMetaData{proposal_name, "object 1", "", ""},\r
-        Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}}\r
-\r
-    ret_obj, err := createControllerObject(BaseUrl, &obj, &module.ProposalObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    if ret_obj.(*module.ProposalObject).Specification.Encryption != "aes256" {\r
-        t.Errorf("Test Case 'Happy Path' failed: create object")\r
-        return\r
-    }\r
-\r
-    ret_obj, err = updateControllerObject(BaseUrl, proposal_name, &obj_update, &module.ProposalObject{})\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: update object")\r
-        return\r
-    }\r
-\r
-    if ret_obj.(*module.ProposalObject).Specification.Encryption != "aes512" {\r
-        t.Errorf("Test Case 'Happy Path' failed: update object")\r
-        return\r
-    }\r
-\r
-    _, err = deleteControllerObject(BaseUrl, proposal_name)\r
-    if err != nil {\r
-        printError(err)\r
-        t.Errorf("Test Case 'Happy Path' failed: delete object")\r
-        return\r
-    }\r
-}
\ No newline at end of file
+package test
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/manager"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "os"
+       "testing"
+)
+
+var BaseUrl string
+var OverlayUrl string
+
+func TestMain(m *testing.M) {
+       servIp := flag.String("ip", "127.0.0.1", "SDEWAN Central Controller IP Address")
+       flag.Parse()
+       OverlayUrl = "http://" + *servIp + ":9015/scc/v1/" + manager.OverlayCollection
+       IPBaseUrl := OverlayUrl + "/overlay1/" + manager.IPRangeCollection
+       BaseUrl = OverlayUrl + "/overlay1/" + manager.ProposalCollection
+
+       var overlay_object = module.OverlayObject{
+               Metadata:      module.ObjectMetaData{"overlay1", "", "", ""},
+               Specification: module.OverlayObjectSpec{}}
+
+       var iprange_object1 = module.IPRangeObject{
+               Metadata:      module.ObjectMetaData{"ipr1", "", "", ""},
+               Specification: module.IPRangeObjectSpec{"192.168.0.2", 10, 20}}
+       var iprange_object2 = module.IPRangeObject{
+               Metadata:      module.ObjectMetaData{"ipr2", "", "", ""},
+               Specification: module.IPRangeObjectSpec{"192.168.2.2", 18, 20}}
+
+       var proposal_object1 = module.ProposalObject{
+               Metadata:      module.ObjectMetaData{"proposal1", "", "", ""},
+               Specification: module.ProposalObjectSpec{"aes256", "sha256", "modp4096"}}
+       var proposal_object2 = module.ProposalObject{
+               Metadata:      module.ObjectMetaData{"proposal2", "", "", ""},
+               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}}
+
+       createControllerObject(OverlayUrl, &overlay_object, &module.OverlayObject{})
+       createControllerObject(IPBaseUrl, &iprange_object1, &module.IPRangeObject{})
+       createControllerObject(IPBaseUrl, &iprange_object2, &module.IPRangeObject{})
+       createControllerObject(BaseUrl, &proposal_object1, &module.ProposalObject{})
+       createControllerObject(BaseUrl, &proposal_object2, &module.ProposalObject{})
+
+       var ret = m.Run()
+
+       deleteControllerObject(BaseUrl, "proposal1")
+       deleteControllerObject(BaseUrl, "proposal2")
+       deleteControllerObject(IPBaseUrl, "ipr1")
+       deleteControllerObject(IPBaseUrl, "ipr2")
+       deleteControllerObject(OverlayUrl, "overlay1")
+
+       os.Exit(ret)
+}
+
+func TestGetObjects(t *testing.T) {
+       url := BaseUrl
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               printError(err)
+               t.Errorf("Test case GetObjects: can not get Objects")
+               return
+       }
+
+       var objs []module.ProposalObject
+       err = json.Unmarshal([]byte(res), &objs)
+
+       if len(objs) == 0 {
+               fmt.Printf("Test case GetObjects: no object found")
+               return
+       }
+
+       p_data, _ := json.Marshal(objs)
+       fmt.Printf("%s\n", string(p_data))
+}
+
+func TestGetObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "Normal",
+                       object_name: "proposal1",
+               },
+               {
+                       name:            "GetFoolName",
+                       object_name:     "foo_name",
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := getControllerObject(BaseUrl, tcase.object_name, &module.ProposalObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestCreateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               url             string
+               obj             module.ProposalObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name: "EmptyName",
+                       obj: module.ProposalObject{
+                               Metadata:      module.ObjectMetaData{"", "object 1", "", ""},
+                               Specification: module.ProposalObjectSpec{}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name: "WrongOverlayName",
+                       obj: module.ProposalObject{
+                               Metadata:      module.ObjectMetaData{"proposal1", "", "", ""},
+                               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},
+                       url:             OverlayUrl + "/foooverlay/" + manager.ProposalCollection,
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+               {
+                       name: "DumplicateName",
+                       obj: module.ProposalObject{
+                               Metadata:      module.ObjectMetaData{"proposal1", "", "", ""},
+                               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},
+                       url:             BaseUrl,
+                       expectedErr:     true,
+                       expectedErrCode: 409,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := createControllerObject(tcase.url, &tcase.obj, &module.ProposalObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestUpdateObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               obj             module.ProposalObject
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "EmptyName",
+                       object_name: "proposal1",
+                       obj: module.ProposalObject{
+                               Metadata:      module.ObjectMetaData{"", "object 1", "", ""},
+                               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},
+                       expectedErr:     true,
+                       expectedErrCode: 422,
+               },
+               {
+                       name:        "MisMatchName",
+                       object_name: "proposal2",
+                       obj: module.ProposalObject{
+                               Metadata:      module.ObjectMetaData{"proposal1", "", "", ""},
+                               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}},
+                       expectedErr:     true,
+                       expectedErrCode: 500,
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := updateControllerObject(BaseUrl, tcase.object_name, &tcase.obj, &module.ProposalObject{})
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestDeleteObject(t *testing.T) {
+       tcases := []struct {
+               name            string
+               object_name     string
+               expectedErr     bool
+               expectedErrCode int
+       }{
+               {
+                       name:        "FoolName",
+                       object_name: "foo_name",
+               },
+       }
+
+       for _, tcase := range tcases {
+               _, err := deleteControllerObject(BaseUrl, tcase.object_name)
+               handleError(t, err, tcase.name, tcase.expectedErr, tcase.expectedErrCode)
+       }
+}
+
+func TestHappyPath(t *testing.T) {
+       proposal_name := "my-proposal"
+
+       obj := module.ProposalObject{
+               Metadata:      module.ObjectMetaData{proposal_name, "object 1", "", ""},
+               Specification: module.ProposalObjectSpec{"aes256", "sha256", "modp4096"}}
+
+       obj_update := module.ProposalObject{
+               Metadata:      module.ObjectMetaData{proposal_name, "object 1", "", ""},
+               Specification: module.ProposalObjectSpec{"aes512", "sha512", "modp4096"}}
+
+       ret_obj, err := createControllerObject(BaseUrl, &obj, &module.ProposalObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       if ret_obj.(*module.ProposalObject).Specification.Encryption != "aes256" {
+               t.Errorf("Test Case 'Happy Path' failed: create object")
+               return
+       }
+
+       ret_obj, err = updateControllerObject(BaseUrl, proposal_name, &obj_update, &module.ProposalObject{})
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: update object")
+               return
+       }
+
+       if ret_obj.(*module.ProposalObject).Specification.Encryption != "aes512" {
+               t.Errorf("Test Case 'Happy Path' failed: update object")
+               return
+       }
+
+       _, err = deleteControllerObject(BaseUrl, proposal_name)
+       if err != nil {
+               printError(err)
+               t.Errorf("Test Case 'Happy Path' failed: delete object")
+               return
+       }
+}
index 516f103..e24351a 100644 (file)
-package test\r
-\r
-import (\r
-    "fmt"\r
-    "io/ioutil"\r
-    \r
-        "net/http"\r
-    \r
-        "bytes"\r
-    "reflect"\r
-    "testing"\r
-    "encoding/json"\r
-    "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"\r
-)\r
-\r
-type TestError struct {\r
-    Code    int\r
-    Message string\r
-}\r
-\r
-func (e *TestError) Error() string {\r
-    return fmt.Sprintf("Error Code: %d, Error Message: %s", e.Code, e.Message)\r
-}\r
-\r
-// Error handler\r
-func handleError(t *testing.T, err error, name string, expectedErr bool, errorCode int) {\r
-    if (err != nil) {\r
-        if (expectedErr) {\r
-            switch err.(type) {\r
-            case *TestError:\r
-                if(errorCode != err.(*TestError).Code) {\r
-                    t.Errorf("Test case '%s': expected '%d', but got '%d'", name, errorCode, err.(*TestError).Code)\r
-                } else {\r
-                    fmt.Printf("%s\n", err.(*TestError).Message)\r
-                }\r
-            default:\r
-                t.Errorf("Test case '%s': expected openwrt.OpenwrtError, but got '%s'", name, reflect.TypeOf(err).String())\r
-            }\r
-        } else {\r
-            t.Errorf("Test case '%s': expected success, but got '%s'", name, reflect.TypeOf(err).String())\r
-        }\r
-    } else {\r
-        if (expectedErr) {\r
-            t.Errorf("Test case '%s': expected error code '%d', but success", name, errorCode)\r
-        }\r
-    }\r
-}\r
-\r
-func printError(err error) {\r
-    switch err.(type) {\r
-    case *TestError:\r
-        fmt.Printf("%s\n", err.(*TestError).Message)\r
-    default:\r
-        fmt.Printf("%s\n", reflect.TypeOf(err).String())\r
-    }\r
-}\r
-\r
-func callRest(method string, url string, request string) (string, error) {\r
-    client := &http.Client{}\r
-    req_body := bytes.NewBuffer([]byte(request))\r
-    req, _ := http.NewRequest(method, url, req_body)\r
-\r
-    req.Header.Set("Cache-Control", "no-cache")\r
-    \r
-    resp, err := client.Do(req)\r
-    if err != nil {\r
-        return "", err\r
-    }\r
-    defer resp.Body.Close()\r
-\r
-    body, _ := ioutil.ReadAll(resp.Body)\r
-    if resp.StatusCode >= 400 {\r
-        return "", &TestError{Code: resp.StatusCode, Message: string(body)}\r
-    }\r
-\r
-    return string(body), nil\r
-}\r
-\r
-func createControllerObject(baseUrl string, obj module.ControllerObject, retObj module.ControllerObject) (module.ControllerObject, error) {\r
-    url := baseUrl\r
-    obj_str, _ := json.Marshal(obj)\r
-\r
-    res, err := callRest("POST", url, string(obj_str))\r
-    if err != nil {\r
-        return retObj, err\r
-    }\r
-\r
-    err = json.Unmarshal([]byte(res), retObj)\r
-    if err != nil {\r
-        return retObj, err\r
-    }\r
-\r
-    return retObj, nil\r
-}\r
-\r
-func getControllerObject(baseUrl string, name string, retObj module.ControllerObject) (module.ControllerObject, error) {\r
-    url := baseUrl + "/" + name\r
-\r
-    res, err := callRest("GET", url, "")\r
-    if err != nil {\r
-         return retObj, err\r
-    }\r
-\r
-    err = json.Unmarshal([]byte(res), retObj)\r
-    if err != nil {\r
-        return retObj, err\r
-    }\r
-\r
-    return retObj, nil\r
-}\r
-\r
-func updateControllerObject(baseUrl string, name string, obj module.ControllerObject, retObj module.ControllerObject) (module.ControllerObject, error) {\r
-    url := baseUrl + "/" + name\r
-    obj_str, _ := json.Marshal(obj)\r
-\r
-    res, err := callRest("PUT", url, string(obj_str))\r
-    if err != nil {\r
-        return retObj, err\r
-    }\r
-\r
-    err = json.Unmarshal([]byte(res), retObj)\r
-    if err != nil {\r
-        return retObj, err\r
-    }\r
-\r
-    return retObj, nil\r
-}\r
-\r
-func deleteControllerObject(baseUrl string, name string) (bool, error) {\r
-    url := baseUrl + "/" + name\r
-\r
-    _, err := callRest("DELETE", url, "")\r
-    if err != nil {\r
-        printError(err)\r
-        return false, err\r
-    }\r
-\r
-    _, err = callRest("GET", url, "")\r
-    if err == nil {\r
-         return false, &TestError{Code: 500, Message: "Filed to delete object"}\r
-    }\r
-\r
-    return true, nil\r
-}
\ No newline at end of file
+package test
+
+import (
+       "fmt"
+       "io/ioutil"
+
+       "net/http"
+
+       "bytes"
+       "encoding/json"
+       "github.com/akraino-edge-stack/icn-sdwan/central-controller/src/scc/pkg/module"
+       "reflect"
+       "testing"
+)
+
+type TestError struct {
+       Code    int
+       Message string
+}
+
+func (e *TestError) Error() string {
+       return fmt.Sprintf("Error Code: %d, Error Message: %s", e.Code, e.Message)
+}
+
+// Error handler
+func handleError(t *testing.T, err error, name string, expectedErr bool, errorCode int) {
+       if err != nil {
+               if expectedErr {
+                       switch err.(type) {
+                       case *TestError:
+                               if errorCode != err.(*TestError).Code {
+                                       t.Errorf("Test case '%s': expected '%d', but got '%d'", name, errorCode, err.(*TestError).Code)
+                               } else {
+                                       fmt.Printf("%s\n", err.(*TestError).Message)
+                               }
+                       default:
+                               t.Errorf("Test case '%s': expected openwrt.OpenwrtError, but got '%s'", name, reflect.TypeOf(err).String())
+                       }
+               } else {
+                       t.Errorf("Test case '%s': expected success, but got '%s'", name, reflect.TypeOf(err).String())
+               }
+       } else {
+               if expectedErr {
+                       t.Errorf("Test case '%s': expected error code '%d', but success", name, errorCode)
+               }
+       }
+}
+
+func printError(err error) {
+       switch err.(type) {
+       case *TestError:
+               fmt.Printf("%s\n", err.(*TestError).Message)
+       default:
+               fmt.Printf("%s\n", reflect.TypeOf(err).String())
+       }
+}
+
+func callRest(method string, url string, request string) (string, error) {
+       client := &http.Client{}
+       req_body := bytes.NewBuffer([]byte(request))
+       req, _ := http.NewRequest(method, url, req_body)
+
+       req.Header.Set("Cache-Control", "no-cache")
+
+       resp, err := client.Do(req)
+       if err != nil {
+               return "", err
+       }
+       defer resp.Body.Close()
+
+       body, _ := ioutil.ReadAll(resp.Body)
+       if resp.StatusCode >= 400 {
+               return "", &TestError{Code: resp.StatusCode, Message: string(body)}
+       }
+
+       return string(body), nil
+}
+
+func createControllerObject(baseUrl string, obj module.ControllerObject, retObj module.ControllerObject) (module.ControllerObject, error) {
+       url := baseUrl
+       obj_str, _ := json.Marshal(obj)
+
+       res, err := callRest("POST", url, string(obj_str))
+       if err != nil {
+               return retObj, err
+       }
+
+       err = json.Unmarshal([]byte(res), retObj)
+       if err != nil {
+               return retObj, err
+       }
+
+       return retObj, nil
+}
+
+func getControllerObject(baseUrl string, name string, retObj module.ControllerObject) (module.ControllerObject, error) {
+       url := baseUrl + "/" + name
+
+       res, err := callRest("GET", url, "")
+       if err != nil {
+               return retObj, err
+       }
+
+       err = json.Unmarshal([]byte(res), retObj)
+       if err != nil {
+               return retObj, err
+       }
+
+       return retObj, nil
+}
+
+func updateControllerObject(baseUrl string, name string, obj module.ControllerObject, retObj module.ControllerObject) (module.ControllerObject, error) {
+       url := baseUrl + "/" + name
+       obj_str, _ := json.Marshal(obj)
+
+       res, err := callRest("PUT", url, string(obj_str))
+       if err != nil {
+               return retObj, err
+       }
+
+       err = json.Unmarshal([]byte(res), retObj)
+       if err != nil {
+               return retObj, err
+       }
+
+       return retObj, nil
+}
+
+func deleteControllerObject(baseUrl string, name string) (bool, error) {
+       url := baseUrl + "/" + name
+
+       _, err := callRest("DELETE", url, "")
+       if err != nil {
+               printError(err)
+               return false, err
+       }
+
+       _, err = callRest("GET", url, "")
+       if err == nil {
+               return false, &TestError{Code: 500, Message: "Filed to delete object"}
+       }
+
+       return true, nil
+}