diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go index 77e6026e397a21de0fe2fd52c9d0b48153ddd3b1..fcd02133058ef724be327726dd3dffefc486dc7f 100644 --- a/applications/rtdt-manager/main.go +++ b/applications/rtdt-manager/main.go @@ -72,7 +72,7 @@ func main() { fmt.Printf("Error occured while trying to upload realnet topology to DB: %v\n", err) return } - // Register realnet with rtdt-manager + // Register realnet with a new rtdt-manager rtdtMan := RtdtMan.NewRtdtManager(realnet, &wg, &stopChan) if rtdtMan == nil { fmt.Println("Couldn't initialize rtdt-manager, quitting!") diff --git a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go index 1f1cd17a379a4eeabd97af69cdc181fa5c507710..67a40db137e64a5e4564075208ed0b7abdb89a7e 100644 --- a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go +++ b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go @@ -14,6 +14,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/application-framework/registration" clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config" + rtdt_topology "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-topology" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/venv" ) @@ -47,8 +48,19 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string var derivedConfig *clabconfig.ClabConfig var clabConfigPath string var err error + var topo *rtdt_topology.Topology + + topo = r.realnet.GetTopology() + if topo == nil { + return fmt.Errorf("Error: Couldn't get topology since it hasn't been retrieved from DB yet") + } baseConfig := r.realnet.GetClabData() + // Instead of deriving config do the following: + // - retrieve topology for realnet from DB + // - + + /// OOOOOLLLLDDD if derivedConfig, err = clabconfig.DeriveConfig(baseConfig, twinSubnetIPv4, twinSubnetIPv6, twinName); err != nil { return fmt.Errorf("Failed to derive config for twin: %w", err) } diff --git a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go index 46d75c2168661e9ea67d1ab29392dbb2a701a6d4..68dc231f23232cfb37bfaf3d953aaeace32ed7dd 100644 --- a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go +++ b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go @@ -1,9 +1,12 @@ package rtdt_topology import ( + "regexp" + "strings" + topoPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" + clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" - "regexp" ) // Struct definitions were taken from: @@ -70,12 +73,12 @@ func (t *Topology) GetPortByUUID(UUID string) *Port { return nil } func (t *Topology) GetLinkByUUID(UUID string) *Link { - for _, link := range t.Links { - if link.ID == UUID { - return link - } - } - return nil + for _, link := range t.Links { + if link.ID == UUID { + return link + } + } + return nil } // Source for function: "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/link.go" @@ -120,6 +123,54 @@ func (n *Node) FillAllFields(containerRegistryURL string) { n.Image = containerRegistryURL + n.Kind + ":" + dockerTag } +func (t *Topology) ToYAML() *clabconfig.ClabConfig { + var yamlMgmt clabconfig.Mgmt + var yamlNodes map[string]clabconfig.Node + var yamlLinks []clabconfig.Link + + // First get topology information, meaning gnmi-targets and hosts + for _, n := range t.Nodes { + // TODO This is very ugly, for now just fill in missing data based on name of node + var cmd string + var binds []string + var ports []string + var env map[string]string + var startupDelay int + switch { + case strings.Contains(n.Name, "gnmi-target"): + cmd = "start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key" + binds = []string{"../../../artifacts/ssl/gnmi-target", "/etc/gnmi-target/ssl"} + startupDelay = 5 + case strings.Contains(n.Name, "gosdn"): + cmd = "--config /app/configs/containerlab-gosdn.toml" + binds = []string{"../../../artifacts/ssl/gosdn", "/app/ssl"} + } + node := clabconfig.Node{ + Kind: n.Kind, + Image: n.Image, + Ports: ports, + Cmd: cmd, + MgmtIPv4: n.MgmtIpv4, + Env: env, + Binds: binds, + StartupDelay: startupDelay, + Group: "", + } + yamlNodes[n.Name] = node + } + + // Now: Get configuration for environment (controller, rabbitmq, mongodb) somehow.. + + return &clabconfig.ClabConfig{ + Name: "", + Mgmt: yamlMgmt, + Topology: clabconfig.Topology{ + Nodes: yamlNodes, + Links: yamlLinks, + }, + } +} + // Converter functions to convert between this and topoPb version of topology func (n *Node) Convert() *topoPb.Node { return &topoPb.Node{ diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go index d414651dabe1d3445847524d65ebe06984fd1cc6..ce5e4ce83eae06429682a6df3b972702736acf65 100644 --- a/applications/rtdt-manager/venv/venv.go +++ b/applications/rtdt-manager/venv/venv.go @@ -317,6 +317,11 @@ func (v *VEnv) UploadTopology() error { return nil } +// Topology doesn't give Kind, Image and MgmtIpv4 +// For Kind: could just set linux since we don't use arista switches +// For Image: möp +// For MgmtIpv4: Find some way to get it from realnet +// Also TODO Should be possible to retrieve topology from realnet, so maybe put this in rtdt-manager func (v *VEnv) RetrieveTopology() error { conn := v.auth.GetConn() ctx := v.auth.CreateContextWithAuthorization() @@ -332,14 +337,15 @@ func (v *VEnv) RetrieveTopology() error { var n1 rtdt_topology.Node if targetTopo.GetNodeByUUID(link.SourceNode.Id) == nil { snode := link.SourceNode - n1 = rtdt_topology.Node{ + n0 = rtdt_topology.Node{ ID: snode.Id, Name: snode.Name, Kind: "todo", Image: "todo", // How to do this? MgmtIpv4: "todo", } - v.topology.Nodes = append(v.topology.Nodes, &n1) + n0.FillAllFields(v.containerRegistryURL) + v.topology.Nodes = append(v.topology.Nodes, &n0) } if targetTopo.GetNodeByUUID(link.TargetNode.Id) == nil { tnode := link.TargetNode @@ -350,17 +356,35 @@ func (v *VEnv) RetrieveTopology() error { Image: "todo", // How to do this? MgmtIpv4: "todo", } + n1.FillAllFields(v.containerRegistryURL) v.topology.Nodes = append(v.topology.Nodes, &n1) } if targetTopo.GetLinkByUUID(link.Id) == nil { + var p0 rtdt_topology.Port + var p1 rtdt_topology.Port + + if targetTopo.GetPortByUUID(link.SourcePort.Id) == nil { + p0 = rtdt_topology.Port{ + Name: link.SourcePort.Name, + ID: link.SourcePort.Id, + } + } + if targetTopo.GetPortByUUID(link.SourcePort.Id) == nil { + p1 = rtdt_topology.Port{ + Name: link.TargetPort.Name, + ID: link.TargetPort.Id, + } + } var newLink = rtdt_topology.Link{ ID: link.Id, Name: link.Name, SourceNode: &n0, TargetNode: &n1, + SourcePort: &p0, + TargetPort: &p1, } - v.topology.Links = append(v.topology.Links, &newLink) + v.topology.Links = append(v.topology.Links, &newLink) } } @@ -488,6 +512,7 @@ func (v *VEnv) GetWaitgroup() *sync.WaitGroup { func (v *VEnv) GetTopology() *rtdt_topology.Topology { return v.topology } + func (v *VEnv) GetSavedChanges() *[]*networkelement.ChangeRequest { return &v.savedChanges }