From: Le Yao Date: Tue, 15 Jun 2021 06:45:32 +0000 (+0000) Subject: Fix IpRange amd meta check X-Git-Tag: 21-12-01~8^2 X-Git-Url: https://gerrit.akraino.org/r/gitweb?a=commitdiff_plain;h=d21954e7aba2ab3078b91da6bf4e757866488924;p=icn%2Fsdwan.git Fix IpRange amd meta check Signed-off-by: Le Yao Change-Id: Ib6be76a352ac63ae7cf18f572cf8b44ea0b50de3 --- diff --git a/central-controller/src/scc/api/controller_handler.go b/central-controller/src/scc/api/controller_handler.go index 655acff..529a853 100644 --- a/central-controller/src/scc/api/controller_handler.go +++ b/central-controller/src/scc/api/controller_handler.go @@ -162,7 +162,7 @@ func (h ControllerHandler) updateHandler(w http.ResponseWriter, r *http.Request) return } - validate := validation.GetValidator(h.client.GetStoreName()) + validate := validation.GetValidator(h.client.GetStoreMeta()) isValid, msg := validate.Validate(v) if isValid == false { http.Error(w, msg, http.StatusUnprocessableEntity) diff --git a/central-controller/src/scc/pkg/manager/device_objectmanager.go b/central-controller/src/scc/pkg/manager/device_objectmanager.go index 8587a7e..4bf601a 100644 --- a/central-controller/src/scc/pkg/manager/device_objectmanager.go +++ b/central-controller/src/scc/pkg/manager/device_objectmanager.go @@ -110,13 +110,14 @@ func (c *DeviceObjectManager) ParseObject(r io.Reader) (module.ControllerObject, // initial Status v.Status.Data = make(map[string]string) + v.Status.DataIps = 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 + ipr_manager := GetManagerset().ProviderIPRange kubeutil := GetKubeConfigUtil() local_public_ips := to.Specification.PublicIps @@ -149,7 +150,7 @@ func (c *DeviceObjectManager) PreProcessing(m map[string]string, t module.Contro // allocate OIP for device overlay_name := m[OverlayResource] - oip, err := ipr_manager.Allocate(overlay_name, to.Metadata.Name) + oip, err := ipr_manager.Allocate("", to.Metadata.Name) if err != nil { return pkgerrors.Wrap(err, "Fail to allocate overlay ip for "+to.Metadata.Name) } @@ -187,7 +188,7 @@ func (c *DeviceObjectManager) PreProcessing(m map[string]string, t module.Contro // Build up ipsec resource scc_conn := resource.Connection{ - Name: DEFAULT_CONN, + Name: DEFAULT_CONN + format_resource_name(to.Metadata.Name, ""), ConnectionType: CONN_TYPE, Mode: MODE, Mark: DEFAULT_MARK, @@ -296,10 +297,9 @@ func (c *DeviceObjectManager) DeleteObject(m map[string]string) error { } } - //overlay_manager := GetManagerset().Overlay - ipr_manager := GetManagerset().IPRange + overlay_manager := GetManagerset().Overlay + ipr_manager := GetManagerset().ProviderIPRange - overlay_name := m[OverlayResource] device_name := m[DeviceResource] to := t.(*module.DeviceObject) @@ -309,7 +309,7 @@ func (c *DeviceObjectManager) DeleteObject(m map[string]string) error { // * Remove ipsec configuration on SCC if to.Status.Mode == 2 { // Free OIP - ipr_manager.Free(overlay_name, to.Status.Ip) + ipr_manager.Free("", to.Status.Ip) scc := module.EmptyObject{ Metadata: module.ObjectMetaData{"local", "", "", ""}} @@ -321,6 +321,12 @@ func (c *DeviceObjectManager) DeleteObject(m map[string]string) error { resutils.Undeploy("localto"+device_name, "YAML") } + log.Println("Delete device...") + err = overlay_manager.DeleteConnections(m, t) + if err != nil { + log.Println(err) + } + // DB Operation err = GetDBUtils().DeleteObject(c, m) @@ -394,3 +400,44 @@ func (c *DeviceObjectManager) PostRegister(m map[string]string, t module.Control c.UpdateObject(m, t) return nil } + +//Function allocate ip and update +func (c *DeviceObjectManager) AllocateIP(m map[string]string, t module.ControllerObject, name string) (string, error) { + to := t.(*module.DeviceObject) + overlay_name := m[OverlayResource] + ipr_manager := GetManagerset().IPRange + + // Allocate OIP for the device + 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) + } + // Record the OIP allocated in the 'Status' + to.Status.DataIps[name] = oip + log.Println("Allocate DataIp name:" + name) + + c.UpdateObject(m, t) + return oip, nil +} + +//Function free ip and update +func (c *DeviceObjectManager) FreeIP(m map[string]string, t module.ControllerObject, name string) error { + to := t.(*module.DeviceObject) + overlay_name := m[OverlayResource] + ipr_manager := GetManagerset().IPRange + + log.Println(to.Status.DataIps) + oip := to.Status.DataIps[name] + log.Println("Free DataIp name:" + name + " with ip" + oip) + + //Free the OIP + err := ipr_manager.Free(overlay_name, oip) + if err != nil { + return pkgerrors.Wrap(err, "Failed to free overlay ip for connection with"+to.Metadata.Name) + } + log.Println("Delete ip from dataips...") + delete(to.Status.DataIps, name) + + c.UpdateObject(m, t) + return nil +} diff --git a/central-controller/src/scc/pkg/manager/hub_objectmanager.go b/central-controller/src/scc/pkg/manager/hub_objectmanager.go index 466041b..db7e172 100644 --- a/central-controller/src/scc/pkg/manager/hub_objectmanager.go +++ b/central-controller/src/scc/pkg/manager/hub_objectmanager.go @@ -197,23 +197,11 @@ func (c *HubObjectManager) DeleteObject(m map[string]string) error { } 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)) + err = overlay_manager.DeleteConnections(m, t) 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) diff --git a/central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go b/central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go index a9776bf..821b6be 100644 --- a/central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go +++ b/central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go @@ -148,6 +148,7 @@ func (c *HubDeviceObjectManager) DeleteObject(m map[string]string) error { hub_manager := GetManagerset().Hub dev_manager := GetManagerset().Device + overlay_manager := GetManagerset().Overlay conn_manager := GetConnectionManager() hub, err := hub_manager.GetObject(m) @@ -167,7 +168,7 @@ func (c *HubDeviceObjectManager) DeleteObject(m map[string]string) error { log.Println(err) } else { conn_obj := conn.(*module.ConnectionObject) - err = conn_manager.Undeploy(overlay_name, *conn_obj) + err = overlay_manager.DeleteConnection(m, *conn_obj) if err != nil { log.Println(err) } diff --git a/central-controller/src/scc/pkg/manager/iprange_objectmanager.go b/central-controller/src/scc/pkg/manager/iprange_objectmanager.go index 398cbc2..1398cb8 100644 --- a/central-controller/src/scc/pkg/manager/iprange_objectmanager.go +++ b/central-controller/src/scc/pkg/manager/iprange_objectmanager.go @@ -101,12 +101,12 @@ func (c *IPRangeObjectManager) GetStoreKey(m map[string]string, t module.Control var key db.Key if c.provider { - key = ProviderIPRangeObjectKey{ + key = &ProviderIPRangeObjectKey{ IPRangeName: "", } } else { overlay_name := m[OverlayResource] - key = IPRangeObjectKey{ + key = &IPRangeObjectKey{ OverlayName: overlay_name, IPRangeName: "", } diff --git a/central-controller/src/scc/pkg/manager/overlay_objectmanager.go b/central-controller/src/scc/pkg/manager/overlay_objectmanager.go index f0aada0..22e8c8b 100644 --- a/central-controller/src/scc/pkg/manager/overlay_objectmanager.go +++ b/central-controller/src/scc/pkg/manager/overlay_objectmanager.go @@ -263,6 +263,8 @@ func (c *OverlayObjectManager) SetupConnection(m map[string]string, m1 module.Co proposalresources = append(proposalresources, pr) } + device_mgr := GetManagerset().Device + //Get the overlay cert var root_ca string root_ca = GetRootCA(m[OverlayResource]) @@ -333,7 +335,7 @@ func (c *OverlayObjectManager) SetupConnection(m map[string]string, m1 module.Co obj2 := m2.(*module.DeviceObject) obj1_ip := obj1.Status.Ip - obj2_ip := obj2.Status.Ip + obj2_ip, _ := device_mgr.AllocateIP(m, m2, module.CreateEndName(obj1.GetType(), obj1.Metadata.Name)) //Keypair obj1_crt, obj1_key, err := GetHubCertificate(obj1.GetCertName(), namespace) @@ -474,3 +476,53 @@ func (c *OverlayObjectManager) SetupConnection(m map[string]string, m1 module.Co return nil } + +func (c *OverlayObjectManager) DeleteConnection(m map[string]string, conn module.ConnectionObject) error { + // use connection object to get connection ends + // check if one of the ends is device object + // if end1 yes, free ip with end2's name + co1, _ := module.GetObjectBuilder().ToObject(conn.Info.End1.ConnObject) + co2, _ := module.GetObjectBuilder().ToObject(conn.Info.End2.ConnObject) + + //Error: the re-constructed obj doesn't obtain the status + if co1.GetType() == "Device" { + log.Println("Enter Delete Connection with device on co1...") + device_mgr := GetManagerset().Device + device_mgr.FreeIP(m, co1, module.CreateEndName(co2.GetType(), co2.GetMetadata().Name)) + } + + if co2.GetType() == "Device" { + log.Println("Enter Delete Connection with device on co2...") + device_mgr := GetManagerset().Device + device_mgr.FreeIP(m, co2, module.CreateEndName(co1.GetType(), co1.GetMetadata().Name)) + } + + conn_manager := GetConnectionManager() + err := conn_manager.Undeploy(m[OverlayResource], conn) + if err != nil { + log.Println(err) + return err + } + + return nil +} + +func (c *OverlayObjectManager) DeleteConnections(m map[string]string, m1 module.ControllerObject) error { + //Get all connections related to the ControllerObject and do deletion^M + conn_manager := GetConnectionManager() + overlay_name := m[OverlayResource] + conns, err := conn_manager.GetObjects(overlay_name, module.CreateEndName(m1.GetType(), m1.GetMetadata().Name)) + if err != nil { + log.Println(err) + return err + } else { + for i := 0; i < len(conns); i++ { + conn := conns[i].(*module.ConnectionObject) + err = c.DeleteConnection(m, *conn) + if err != nil { + log.Println("Failed to delete connection" + conn.GetMetadata().Name) + } + } + } + return nil +} diff --git a/central-controller/src/scc/pkg/module/deviceobject.go b/central-controller/src/scc/pkg/module/deviceobject.go index 1a27ebe..53783de 100644 --- a/central-controller/src/scc/pkg/module/deviceobject.go +++ b/central-controller/src/scc/pkg/module/deviceobject.go @@ -20,7 +20,7 @@ package module type DeviceObject struct { Metadata ObjectMetaData `json:"metadata"` Specification DeviceObjectSpec `json:"spec"` - Status DeviceObjectStatus `json:"-"` + Status DeviceObjectStatus `json:"status"` } // DeviceObjectSpec contains the parameters @@ -43,6 +43,8 @@ type DeviceObjectStatus struct { // if Mode=1, ip is one of public ip // if Mode=2, ip is the OIP allocated by SCC Ip string + // DataIps saves the overlay ips assigned for different traffic tunnel + DataIps map[string]string // Status Data Data map[string]string } diff --git a/central-controller/src/scc/pkg/resource/ipsec_resource.go b/central-controller/src/scc/pkg/resource/ipsec_resource.go index 70d0ad4..59cab05 100644 --- a/central-controller/src/scc/pkg/resource/ipsec_resource.go +++ b/central-controller/src/scc/pkg/resource/ipsec_resource.go @@ -123,13 +123,14 @@ spec: } - base := `apiVersion: ` + SdewanApiVersion + ` + base := `apiVersion: ` + SdewanApiVersion + ` kind: IpsecHost metadata: name: ` + c.Name + ` namespace: default labels: sdewanPurpose: ` + SdewanPurpose + ` + targetCluster: ` + target + ` spec: type: ` + c.Type + ` remote: '` + c.Remote + `' @@ -139,7 +140,7 @@ spec: if c.Connections.LocalSourceIp != "" { connection = ` - connections: + connections: - name: ` + c.Connections.Name + ` conn_type: ` + c.Connections.ConnectionType + ` mode: ` + c.Connections.Mode + `