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)
// 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
// 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)
}
// 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,
}
}
- //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)
// * 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", "", "", ""}}
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)
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
+}
}
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)
hub_manager := GetManagerset().Hub
dev_manager := GetManagerset().Device
+ overlay_manager := GetManagerset().Overlay
conn_manager := GetConnectionManager()
hub, err := hub_manager.GetObject(m)
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)
}
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: "",
}
proposalresources = append(proposalresources, pr)
}
+ device_mgr := GetManagerset().Device
+
//Get the overlay cert
var root_ca string
root_ca = GetRootCA(m[OverlayResource])
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)
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
+}
type DeviceObject struct {
Metadata ObjectMetaData `json:"metadata"`
Specification DeviceObjectSpec `json:"spec"`
- Status DeviceObjectStatus `json:"-"`
+ Status DeviceObjectStatus `json:"status"`
}
// DeviceObjectSpec contains the parameters
// 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
}
}
- 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 + `'
if c.Connections.LocalSourceIp != "" {
connection = `
- connections:
+ connections:
- name: ` + c.Connections.Name + `
conn_type: ` + c.Connections.ConnectionType + `
mode: ` + c.Connections.Mode + `