Fix IpRange amd meta check 46/4346/2
authorLe Yao <le.yao@intel.com>
Tue, 15 Jun 2021 06:45:32 +0000 (06:45 +0000)
committerLe Yao <le.yao@intel.com>
Thu, 17 Jun 2021 01:27:37 +0000 (01:27 +0000)
Signed-off-by: Le Yao <le.yao@intel.com>
Change-Id: Ib6be76a352ac63ae7cf18f572cf8b44ea0b50de3

central-controller/src/scc/api/controller_handler.go
central-controller/src/scc/pkg/manager/device_objectmanager.go
central-controller/src/scc/pkg/manager/hub_objectmanager.go
central-controller/src/scc/pkg/manager/hubdevice_objectmanager.go
central-controller/src/scc/pkg/manager/iprange_objectmanager.go
central-controller/src/scc/pkg/manager/overlay_objectmanager.go
central-controller/src/scc/pkg/module/deviceobject.go
central-controller/src/scc/pkg/resource/ipsec_resource.go

index 655acff..529a853 100644 (file)
@@ -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)
index 8587a7e..4bf601a 100644 (file)
@@ -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
+}
index 466041b..db7e172 100644 (file)
@@ -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)
index a9776bf..821b6be 100644 (file)
@@ -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)
                }
index 398cbc2..1398cb8 100644 (file)
@@ -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: "",
                }
index f0aada0..22e8c8b 100644 (file)
@@ -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
+}
index 1a27ebe..53783de 100644 (file)
@@ -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
 }
index 70d0ad4..59cab05 100644 (file)
@@ -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 + `