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
}
-/*\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)
+}
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"
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("", "")
+ }
}
-/*\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
+}
-// 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
+}
-/*\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
+}
-/*\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)
+}
-/*\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)
+}
-/*\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
+}
-/*\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")
+}
-/*\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
+}
-/*\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"
+)
-/*\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)
+}
-/*\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
+}
-/*\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
+}
-/*\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")
+}
-/*\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
+ }
+ }
+}
-/*\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")
+}
-/*\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
+}
-/*\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
+}
-/*\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")
+}
-/*\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
+}
-/*\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
+}
-/*\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
+}
-/*\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.")
+}
-/*\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)
+}
-/*\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"
+}
-/*\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"
+}
-/*\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
+}
-/*\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"`
+}
-/*\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"
+}
-/*\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"
+}
-/*\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"
+}
-/*\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{})
+}
-/*\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
+}
-/*\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")
+ }
+}
-/*\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"
+}
-/*\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,
+ }
+}
-/*\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 ""
+}
-/*\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{})
+}
-/*\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{})
+}
-/*\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{})
+}
-/*\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{})
+}
-/*\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{})
+}
-/*\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")
+ }
+}
-/*\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
+}
-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
+ }
+}
-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))
+}
-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
+ }
+}
-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
+ }
+}
-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
+ }
+}
-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
+}