Skip to content
Snippets Groups Projects
Commit a261eea4 authored by S.H.'s avatar S.H.
Browse files

rtdt-manager.go: Call GetTopology() which returns topology from VEnv if

it has been generated yet
rtdt-topology: Implement ToYAML() which returns the ClabConfig of
topology nodes
venv.go: Add to RetrieveTopology() to also get the ports and add them to
the rtdt_topology.Link
parent 1ff43f1f
No related branches found
No related tags found
No related merge requests found
Pipeline #262874 failed
...@@ -72,7 +72,7 @@ func main() { ...@@ -72,7 +72,7 @@ func main() {
fmt.Printf("Error occured while trying to upload realnet topology to DB: %v\n", err) fmt.Printf("Error occured while trying to upload realnet topology to DB: %v\n", err)
return return
} }
// Register realnet with rtdt-manager // Register realnet with a new rtdt-manager
rtdtMan := RtdtMan.NewRtdtManager(realnet, &wg, &stopChan) rtdtMan := RtdtMan.NewRtdtManager(realnet, &wg, &stopChan)
if rtdtMan == nil { if rtdtMan == nil {
fmt.Println("Couldn't initialize rtdt-manager, quitting!") fmt.Println("Couldn't initialize rtdt-manager, quitting!")
......
...@@ -14,6 +14,7 @@ import ( ...@@ -14,6 +14,7 @@ import (
"code.fbi.h-da.de/danet/gosdn/application-framework/registration" "code.fbi.h-da.de/danet/gosdn/application-framework/registration"
clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config" 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" "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/venv"
) )
...@@ -47,8 +48,19 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string ...@@ -47,8 +48,19 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string
var derivedConfig *clabconfig.ClabConfig var derivedConfig *clabconfig.ClabConfig
var clabConfigPath string var clabConfigPath string
var err error 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() 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 { if derivedConfig, err = clabconfig.DeriveConfig(baseConfig, twinSubnetIPv4, twinSubnetIPv6, twinName); err != nil {
return fmt.Errorf("Failed to derive config for twin: %w", err) return fmt.Errorf("Failed to derive config for twin: %w", err)
} }
......
package rtdt_topology package rtdt_topology
import ( import (
"regexp"
"strings"
topoPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" 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" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
"regexp"
) )
// Struct definitions were taken from: // Struct definitions were taken from:
...@@ -70,12 +73,12 @@ func (t *Topology) GetPortByUUID(UUID string) *Port { ...@@ -70,12 +73,12 @@ func (t *Topology) GetPortByUUID(UUID string) *Port {
return nil return nil
} }
func (t *Topology) GetLinkByUUID(UUID string) *Link { func (t *Topology) GetLinkByUUID(UUID string) *Link {
for _, link := range t.Links { for _, link := range t.Links {
if link.ID == UUID { if link.ID == UUID {
return link return link
} }
} }
return nil return nil
} }
// Source for function: "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/link.go" // 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) { ...@@ -120,6 +123,54 @@ func (n *Node) FillAllFields(containerRegistryURL string) {
n.Image = containerRegistryURL + n.Kind + ":" + dockerTag 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 // Converter functions to convert between this and topoPb version of topology
func (n *Node) Convert() *topoPb.Node { func (n *Node) Convert() *topoPb.Node {
return &topoPb.Node{ return &topoPb.Node{
......
...@@ -317,6 +317,11 @@ func (v *VEnv) UploadTopology() error { ...@@ -317,6 +317,11 @@ func (v *VEnv) UploadTopology() error {
return nil 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 { func (v *VEnv) RetrieveTopology() error {
conn := v.auth.GetConn() conn := v.auth.GetConn()
ctx := v.auth.CreateContextWithAuthorization() ctx := v.auth.CreateContextWithAuthorization()
...@@ -332,14 +337,15 @@ func (v *VEnv) RetrieveTopology() error { ...@@ -332,14 +337,15 @@ func (v *VEnv) RetrieveTopology() error {
var n1 rtdt_topology.Node var n1 rtdt_topology.Node
if targetTopo.GetNodeByUUID(link.SourceNode.Id) == nil { if targetTopo.GetNodeByUUID(link.SourceNode.Id) == nil {
snode := link.SourceNode snode := link.SourceNode
n1 = rtdt_topology.Node{ n0 = rtdt_topology.Node{
ID: snode.Id, ID: snode.Id,
Name: snode.Name, Name: snode.Name,
Kind: "todo", Kind: "todo",
Image: "todo", // How to do this? Image: "todo", // How to do this?
MgmtIpv4: "todo", 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 { if targetTopo.GetNodeByUUID(link.TargetNode.Id) == nil {
tnode := link.TargetNode tnode := link.TargetNode
...@@ -350,17 +356,35 @@ func (v *VEnv) RetrieveTopology() error { ...@@ -350,17 +356,35 @@ func (v *VEnv) RetrieveTopology() error {
Image: "todo", // How to do this? Image: "todo", // How to do this?
MgmtIpv4: "todo", MgmtIpv4: "todo",
} }
n1.FillAllFields(v.containerRegistryURL)
v.topology.Nodes = append(v.topology.Nodes, &n1) v.topology.Nodes = append(v.topology.Nodes, &n1)
} }
if targetTopo.GetLinkByUUID(link.Id) == nil { 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{ var newLink = rtdt_topology.Link{
ID: link.Id, ID: link.Id,
Name: link.Name, Name: link.Name,
SourceNode: &n0, SourceNode: &n0,
TargetNode: &n1, 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 { ...@@ -488,6 +512,7 @@ func (v *VEnv) GetWaitgroup() *sync.WaitGroup {
func (v *VEnv) GetTopology() *rtdt_topology.Topology { func (v *VEnv) GetTopology() *rtdt_topology.Topology {
return v.topology return v.topology
} }
func (v *VEnv) GetSavedChanges() *[]*networkelement.ChangeRequest { func (v *VEnv) GetSavedChanges() *[]*networkelement.ChangeRequest {
return &v.savedChanges return &v.savedChanges
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment