diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go index 54c2d55efe2e8a2b9914f1ea46871f0ca9d71924..298803804f7a43bfbd7abf021a5b7c792d6f6c55 100644 --- a/applications/rtdt-manager/main.go +++ b/applications/rtdt-manager/main.go @@ -24,6 +24,8 @@ func main() { var user string var topology_file string var withTwin bool + var benchmark bool + flag.StringVar(&address, "address", "172.100.0.5:55055", "Address of the gosdn controller") flag.StringVar(&address, "a", "172.100.0.5:55055", "Address of the gosdn controller (shorthand)") flag.StringVar(&pass, "password", "TestPassword", "Password for admin user") @@ -33,6 +35,8 @@ func main() { flag.BoolVar(&withTwin, "with-twin", false, "Whether to start a twin") flag.StringVar(&topology_file, "topology", "data/clab.yaml", "Containerlab file on the basis of which to create topo") flag.StringVar(&topology_file, "t", "data/clab.yaml", "Containerlab file on the basis of which to create topo (shorthand)") + flag.BoolVar(&benchmark, "benchmark", false, "Run performance tests (measure propagation delay)") + flag.BoolVar(&benchmark, "b", false, "Run performance tests (measure propagation delay)") flag.Usage = func() { fmt.Println("--address, -a: Address of the gosdn controller (realnet)") @@ -63,6 +67,12 @@ func main() { fmt.Printf("Error occured while initializing event system: %v", err) return } + // Do performance tests of realnet before starting twin + if benchmark { + fmt.Println("Now doing performance measurements of gosdn's propagation delay ") + rtdtMan.RunBenchmark() + } + if withTwin { rtdtMan.LaunchTwin("172.101.0.0/16", "2001:db9::/64", "TEST-TWIN") } diff --git a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go index 10d96bde226cfa8484def426b5fe0ee997bde76a..e25f216d0d22f226e114232341ef2dd25db9d63c 100644 --- a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go +++ b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go @@ -5,8 +5,10 @@ import ( "os" "path/filepath" "regexp" + "strconv" "strings" "sync" + "time" "code.fbi.h-da.de/danet/gosdn/application-framework/event" @@ -62,6 +64,30 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string return nil } +// Performance benchmarks of realnet +func (r *RtdtManager) RunBenchmark() error { + var mneid string + for _, node := range r.realnet.GetTopology().Nodes { + if strings.HasPrefix(node.Name, "gnmi-target-switch0") { + mneid = node.ID + } + } + numTests := int64(200) + results := make([]time.Duration, numTests) + // Change a property and measure the time when it's applied + for i, value := 0, int64(2001); i < int(numTests); i, value = i+1, value+1 { + t1 := time.Now() + r.realnet.SetGnmiPath("/interfaces/interface[name=eth2]/config/mtu", strconv.FormatInt(value, 10), mneid, false) + timeDiff := time.Now().Sub(t1) + results[i] = timeDiff + } + + for i, res := range results { + fmt.Printf("%d - %v\n", i, res) + } + return nil +} + // Run realnet and twins (if present) until signal received, manage clean up func (r *RtdtManager) Run() error { if r.realnet == nil { @@ -185,11 +211,11 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) { } } - // MTU Change + // MTU Change if strings.HasPrefix(path, prefix) && strings.HasSuffix(path, suffixMTU) { fmt.Println("--- CHANGE MTU TRIGGERED ---") fmt.Println("Value of new MTU: ", value) - twin.SetGnmiPath(path, value, twinEntityID) + twin.SetGnmiPath(path, value, twinEntityID, false) } // Hostname change if strings.HasPrefix(path, prefixHostname) { @@ -200,7 +226,7 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) { continue } fmt.Println("ENTERING SETGNMIPATH, value: ", value, "path:", path) - twin.SetGnmiPath(path, value, twinEntityID) + twin.SetGnmiPath(path, value, twinEntityID, false) } } // LINK UP/DOWN @@ -215,7 +241,7 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) { } else { value = "true" } - twin.SetGnmiPath(path, value, twinEntityID) + twin.SetGnmiPath(path, value, twinEntityID, false) } } } diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go index 57d80f53dc9b3a7891b62c42f76a75f6b89143ca..3e3afee16c676ca97b4b817a7eb74e6f8206c343 100644 --- a/applications/rtdt-manager/venv/venv.go +++ b/applications/rtdt-manager/venv/venv.go @@ -38,6 +38,7 @@ type VEnv struct { waitGroup *sync.WaitGroup topology rtdt_topology.Topology containerRegistryURL string + savedChanges []*networkelement.ChangeRequest } // Accepts a yaml filename to deploy a container lab environment @@ -231,7 +232,7 @@ func getTypedValue(value string) *gnmi.TypedValue { } } -func (v *VEnv) SetGnmiPath(path, value, mneid string) error { +func (v *VEnv) SetGnmiPath(path, value, mneid string, save bool) error { ctx := v.auth.CreateContextWithAuthorization() fmt.Println("--IN SETGNMIPATH-----------------------") mneService := networkelement.NewNetworkElementServiceClient(v.conn) @@ -242,14 +243,14 @@ func (v *VEnv) SetGnmiPath(path, value, mneid string) error { //gosdnAddr := v.auth.GetAddress() gnmiVal := getTypedValue(value) - request := &networkelement.ChangeRequest{ + changeRequest := &networkelement.ChangeRequest{ Mneid: mneid, Path: gnmiPath, Value: gnmiVal, ApiOp: networkelement.ApiOperation_API_OPERATION_UPDATE, } - changeRequests := []*networkelement.ChangeRequest{request} + changeRequests := []*networkelement.ChangeRequest{changeRequest} pid := v.pnd.Id setPathResponse, err := mneService.SetPathList(ctx, &networkelement.SetPathListRequest{ @@ -281,6 +282,9 @@ func (v *VEnv) SetGnmiPath(path, value, mneid string) error { } else { fmt.Println("Successfully applied changes:", clResponse) } + if save { + v.savedChanges = append(v.savedChanges, changeRequest) + } return nil }