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

Implement simple CLI that can launch twins, exit and run benchmarks

parent 38b0222a
No related branches found
No related tags found
No related merge requests found
Pipeline #268107 failed
package main
import (
"flag"
"fmt"
clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config"
RtdtMan "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-manager"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
"flag"
"fmt"
//"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
)
......@@ -78,15 +78,7 @@ func main() {
fmt.Printf("In main(): %v\n", err)
return
}
// Do performance tests of realnet before starting twin
if benchmark {
fmt.Println("Now doing performance measurements of gosdn's propagation delay")
rtdtMan.RunBenchmark0()
}
if withTwin {
rtdtMan.LaunchTwin("172.101.0.0/16", "2001:db9::/64", "test-twin")
}
// Runs the main loop
if err := rtdtMan.Run(); err != nil {
fmt.Println("Program exited with errors: %w", err)
......
package rtdtmanager
import (
"bufio"
"fmt"
"os"
"os/signal"
......@@ -14,7 +15,7 @@ import (
// "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
// submanagement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/subscriptionmanagement"
"code.fbi.h-da.de/danet/gosdn/application-framework/event"
"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"
"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/sdnconfig"
......@@ -261,13 +262,13 @@ func (r *RtdtManager) Run() error {
select {
// idea: make channels for different events?
case stop := <-r.stopChan:
fmt.Print("Received SIGINT/SIGSTOP, quitting..\n")
fmt.Print("Stop routine triggered!\n")
// this takes full path now
for _, twin := range r.rtdt_twins {
twin_path := twin.GetClabFilePath()
err := clabconfig.ClabDestroy(twin_path)
if err != nil {
fmt.Printf("Error occured while cleaning up twin with name %s: %v\n", twin.GetName(), err)
fmt.Printf("Error occured while cleaning up twin with name %s (this can probably be ignored): %v\n", twin.GetName(), err)
}
twin.GetWaitgroup().Done()
}
......@@ -281,6 +282,54 @@ func (r *RtdtManager) Run() error {
}
}
}()
go func() {
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("$: ")
if !scanner.Scan() {
fmt.Println("Failed to read from stdin. Exiting!")
close(r.stopChan)
return
}
inputLine := scanner.Text()
tokens := strings.Fields(inputLine)
switch tokens[0] {
case "launch-twin":
if len(tokens) == 1 {
ipv4 := "172.101.0.0/16"
ipv6 := "2001:db9::/64"
twinName := "test-twin"
fmt.Printf("Launching default twin '%s' with IPv4 %s and IPv6 %s...\n", twinName, ipv4, ipv6)
r.LaunchTwin(ipv4, ipv6, twinName)
} else if len(tokens) == 4 {
ipv4 := tokens[1]
ipv6 := tokens[2]
twinName := tokens[3]
fmt.Printf("Launching twin with name '%s' with IPv4 %s and IPv6 %s...\n", twinName, ipv4, ipv6)
r.LaunchTwin(ipv4, ipv6, twinName)
} else {
fmt.Printf("Wrong number of arguments for launch-twin!\nUsage: launch-twin <IPv4 range> <IPv6 range> <twin name>\n")
break
}
case "benchmark":
fmt.Printf("Launching benchmark!\n")
r.RunBenchmark0()
case "exit", "quit":
fmt.Printf("Exiting rtdt-manager!\n")
close(r.stopChan)
return
case "help":
fmt.Println("Available commands:")
fmt.Println(" launch-twin Launch a twin with default options")
fmt.Println(" launch-twin <IPv4> <IPv6> <name> Launch a twin with specified network ranges and name")
fmt.Println(" benchmark Measure propagation delay of twin")
fmt.Println(" exit / quit Exit the program")
}
}
}()
// This waits for as long as not all venvs have called waitGroup.Done()
r.waitGroup.Wait()
return nil
......@@ -288,60 +337,27 @@ func (r *RtdtManager) Run() error {
// Receive events from realnet VEnv
func (r *RtdtManager) InitEventSystem() error {
// THIS DOESN'T WORK YET
//Make sure that all network elements are subscribed to
//Get all networkelements present in realnet
// getAllReq := &networkelement.GetAllRequest{
// Timestamp: util.Now(),
// Pid: r.realnet.GetPnd().Id,
// }
// mneServiceClient := networkelement.NewNetworkElementServiceClient(r.realnet.GetAuth().GetConn())
// response, err := mneServiceClient.GetAll(r.realnet.GetAuth().CreateContextWithAuthorization(), getAllReq)
// if err != nil {
// fmt.Printf("Bad thing happened. Bad thing: %v\n", err)
// return err
// }
// rootpath := &submanagement.Path{
// Elem: []string{"/"},
// }
// subManager := submanagement.NewSubscriptionManagementServiceClient(r.realnet.GetAuth().GetConn())
// for _, mne := range response.GetMne() {
// sub := submanagement.Subscription{
// Pid: mne.GetAssociatedPnd(),
// Mneid: mne.Id,
// MneName: mne.Name,
// Paths: []*submanagement.Path{rootpath}, // Assign rootpath to Paths
// }
// subAddRequest := &submanagement.AddRequest{
// Timestamp: util.Now(),
// Mneid: mne.Id,
// Subscription: &sub,
// }
// addResponse, err := subManager.Add(r.realnet.GetAuth().CreateContextWithAuthorization(), subAddRequest)
// if err != nil {
// fmt.Printf("Error while subscribing mnes to events: %v\n", err)
// return err
// }
// fmt.Println("Added subscription:", addResponse)
// }
//
fmt.Println("Starting Event System for realnet!")
realnet_auth := r.realnet.GetAuth()
ctx := realnet_auth.CreateContextWithAuthorization()
queueCredentials, err := registration.Register(ctx, realnet_auth.GetAddress(), "basic-interface-monitoring", "SecurePresharedToken")
fmt.Println("Acquired queueCredentials: ", queueCredentials)
// TODO: Find out how I can receive the ip address here (it returns rabbitmq)
queueCredentials = "amqp://guest:guest@172.100.0.15:5672/" // TODO: retrieve this from clab struct
if err != nil {
return fmt.Errorf("Encountered error while trying to register event system: %w", err)
// realnet_auth := r.realnet.GetAuth()
// ctx := realnet_auth.CreateContextWithAuthorization()
// queueCredentials, err := registration.Register(ctx, realnet_auth.GetAddress(), "basic-interface-monitoring", "SecurePresharedToken")
var queueAddress string
for nodename, node := range r.realnet.GetClabData().Topology.Nodes {
if nodename == "rabbitmq" {
queueAddress = "amqp://guest:guest@" + node.MgmtIPv4 + ":5672/"
}
}
fmt.Println("Trying to register with amqp with following queueCredentials: ", queueCredentials)
// TODO: Find out how I can receive the ip address here (it returns rabbitmq)
// if err != nil {
// return fmt.Errorf("Encountered error while trying to register event system: %w", err)
// }
// You have to have one event service for a topic
eventServiceMNE, err := event.NewEventService(queueCredentials, []event.Topic{event.ManagedNetworkElement})
eventServiceMNE, err := event.NewEventService(queueAddress, []event.Topic{event.ManagedNetworkElement})
if err != nil {
return fmt.Errorf("Failed to attach to event system: %w", err)
}
eventServiceUser, err := event.NewEventService(queueCredentials, []event.Topic{event.User})
eventServiceUser, err := event.NewEventService(queueAddress, []event.Topic{event.User})
if err != nil {
return fmt.Errorf("Failed to attach to event system: %w", err)
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment