diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go index c1171118910f76e5ab44e46255e4e1760f3ae090..1983201e222d4628713fb62321b375e773e74a07 100644 --- a/applications/rtdt-manager/main.go +++ b/applications/rtdt-manager/main.go @@ -1,11 +1,11 @@ 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) diff --git a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go index 723c96db2f86a9050b87d21c855b27d9c8f3a1d2..075b7fbee2f0f923af85ee5363a45c07ba782d01 100644 --- a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go +++ b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go @@ -1,6 +1,7 @@ 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) }