diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 7300e2b0..0fef8a5d 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -34,3 +34,6 @@ jobs: - name: Install Go Deps run: go mod download + + - name: Build my5g-RANTester + run: go build ./cmd/my5g-RANTester diff --git a/cmd/app.go b/cmd/app.go deleted file mode 100644 index 9ade09a5..00000000 --- a/cmd/app.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "my5G-RANTester/config" - "my5G-RANTester/internal/templates" - - // "fmt" - "github.com/davecgh/go-spew/spew" - log "github.com/sirupsen/logrus" - "github.com/urfave/cli/v2" - "os" -) - -const version = "0.1" - -func init() { - // Output to stdout instead of the default stderr - // Can be any io.Writer, see below for File example - log.SetOutput(os.Stdout) - // Only log the warning severity or above. - log.SetLevel(log.InfoLevel) - spew.Config.Indent = "\t" - - log.Info("my5G-RANTester version " + version) - -} - -func main() { - - app := &cli.App{ - Commands: []*cli.Command{ - { - Name: "ue", - Aliases: []string{"ue"}, - Usage: "Testing an ue attached with configuration", - Action: func(c *cli.Context) error { - name := "Testing an ue attached with configuration" - cfg := config.Data - - log.Info("---------------------------------------") - log.Info("[TESTER] Starting test function: ", name) - log.Info("[TESTER][UE] Number of UEs: ", 1) - log.Info("[TESTER][GNB] Control interface IP/Port: ", cfg.GNodeB.ControlIF.Ip, "/", cfg.GNodeB.ControlIF.Port) - log.Info("[TESTER][GNB] Data interface IP/Port: ", cfg.GNodeB.DataIF.Ip, "/", cfg.GNodeB.DataIF.Port) - log.Info("[TESTER][AMF] AMF IP/Port: ", cfg.AMF.Ip, "/", cfg.AMF.Port) - log.Info("---------------------------------------") - templates.TestAttachUeWithConfiguration() - return nil - }, - }, - { - Name: "gnb", - Aliases: []string{"gnb"}, - Usage: "Testing an gnb attached with configuration", - Action: func(c *cli.Context) error { - name := "Testing an gnb attached with configuration" - cfg := config.Data - - log.Info("---------------------------------------") - log.Info("[TESTER] Starting test function: ", name) - log.Info("[TESTER][GNB] Number of GNBs: ", 1) - log.Info("[TESTER][GNB] Control interface IP/Port: ", cfg.GNodeB.ControlIF.Ip, "/", cfg.GNodeB.ControlIF.Port) - log.Info("[TESTER][GNB] Data interface IP/Port: ", cfg.GNodeB.DataIF.Ip, "/", cfg.GNodeB.DataIF.Port) - log.Info("[TESTER][AMF] AMF IP/Port: ", cfg.AMF.Ip, "/", cfg.AMF.Port) - log.Info("---------------------------------------") - templates.TestAttachGnbWithConfiguration() - return nil - }, - }, - { - Name: "load-test", - Aliases: []string{"load-test"}, - Usage: "\nLoad endurance stress tests.\n" + - "Example for testing multiple UEs: load-test -n 5 \n", - Flags: []cli.Flag{ - &cli.IntFlag{Name: "number-of-ues", Value: 1, Aliases: []string{"n"}}, - }, - Action: func(c *cli.Context) error { - var numUes int - name := "Testing registration of multiple UEs" - cfg := config.Data - - if c.IsSet("number-of-ues") { - numUes = c.Int("number-of-ues") - } else { - log.Info(c.Command.Usage) - return nil - } - - log.Info("---------------------------------------") - log.Info("[TESTER] Starting test function: ", name) - log.Info("[TESTER][UE] Number of UEs: ", numUes) - log.Info("[TESTER][GNB] gNodeB control interface IP/Port: ", cfg.GNodeB.ControlIF.Ip, "/", cfg.GNodeB.ControlIF.Port) - log.Info("[TESTER][GNB] gNodeB data interface IP/Port: ", cfg.GNodeB.DataIF.Ip, "/", cfg.GNodeB.DataIF.Port) - log.Info("[TESTER][AMF] AMF IP/Port: ", cfg.AMF.Ip, "/", cfg.AMF.Port) - log.Info("---------------------------------------") - templates.TestMultiUesInQueue(numUes) - - return nil - }, - }, - }, - } - err := app.Run(os.Args) - if err != nil { - log.Fatal(err) - } -} diff --git a/cmd/my5g-RANTester/commands.go b/cmd/my5g-RANTester/commands.go new file mode 100644 index 00000000..2c400bf3 --- /dev/null +++ b/cmd/my5g-RANTester/commands.go @@ -0,0 +1,48 @@ +package main + +import ( + "github.com/urfave/cli/v2" +) + +const ( + argNumUE = "number-of-ues" + argNumUEDefault = 1 + + cmdUeName = "ue" + cmdUeUsage = "Testing an UE attached with configuration" + + cmdGnbName = "gnb" + cmdGnbUsage = "Testing a GNB attached with configuration" + + cmdLoadTestName = "load-test" + cmdLoadTestUsage = `Load endurance stress tests. + Example for testing multiple UEs: load-test -n 5 + ` +) + +func setupCommands(a *cli.App) { + var commands []*cli.Command + + loadTestFlags := []cli.Flag{ + &cli.IntFlag{Name: argNumUE, Value: argNumUEDefault, Aliases: []string{"n"}}, + } + + for _, cmd := range []struct { + name, usage string + fn func(c *cli.Context) error + flags []cli.Flag + }{ + {cmdUeName, cmdUeUsage, testUE, nil}, + {cmdGnbName, cmdGnbUsage, testGNB, nil}, + {cmdLoadTestName, cmdLoadTestUsage, testRegisterMultiUE, loadTestFlags}, + } { + commands = append(commands, &cli.Command{ + Name: cmd.name, + Usage: cmd.usage, + Action: cmd.fn, + Flags: cmd.flags, + }) + } + + a.Commands = commands +} diff --git a/cmd/my5g-RANTester/logging_constants.go b/cmd/my5g-RANTester/logging_constants.go new file mode 100644 index 00000000..2ec070c8 --- /dev/null +++ b/cmd/my5g-RANTester/logging_constants.go @@ -0,0 +1,10 @@ +package main + +const ( + logPrefix = "[TESTER]" + logSep = "---------------------------------------" + fmtLog = logPrefix + " %s" + fmtLogUE = logPrefix + "[UE] %s" + fmtLogGNB = logPrefix + "[GNB] %s" + fmtLogAMF = logPrefix + "[GNB] %s" +) diff --git a/cmd/my5g-RANTester/main.go b/cmd/my5g-RANTester/main.go new file mode 100644 index 00000000..ffd224fd --- /dev/null +++ b/cmd/my5g-RANTester/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "os" + + "github.com/davecgh/go-spew/spew" + log "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +const ( + version = "0.1" + fmtMsgVersion = "my5G-RANTester version %v" +) + +func main() { + initLogger() + + log.Infof(fmtMsgVersion, version) + + app := &cli.App{} + + setupCommands(app) + + if err := app.Run(os.Args); err != nil { + log.Fatal(err) + } +} + +func initLogger() { + // Output to stdout instead of the default stderr + // Can be any io.Writer, see below for File example + log.SetOutput(os.Stdout) + + // Only log the warning severity or above. + log.SetLevel(log.WarnLevel) + + spew.Config.Indent = "\t" +} diff --git a/cmd/my5g-RANTester/test.go b/cmd/my5g-RANTester/test.go new file mode 100644 index 00000000..fca5aadf --- /dev/null +++ b/cmd/my5g-RANTester/test.go @@ -0,0 +1,41 @@ +package main + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + + "my5G-RANTester/config" +) + +func testLogCommonInfo(name string, numUE int) { + const ( + fmtStartTest = "Starting test function: %v" + fmtNumUE = "Number of UEs: %v" + fmtIPPort = "%v/%v" + fmtControlInfo = "Control interface IP/Port: " + fmtIPPort + fmtDataInfo = "Data interface IP/Port: " + fmtIPPort + fmtAMFInfo = "AMF IP/Port: " + fmtIPPort + ) + + cfg := config.Data + + log.Info(logSep) + + msgStartTest := fmt.Sprintf(fmtStartTest, name) + log.Infof(fmtLog, msgStartTest) + + msgNumUE := fmt.Sprintf(fmtNumUE, numUE) + log.Infof(fmtLogUE, msgNumUE) + + msgControlInfo := fmt.Sprintf(fmtControlInfo, cfg.GNodeB.ControlIF.Ip, cfg.GNodeB.ControlIF.Port) + log.Infof(fmtLogGNB, msgControlInfo) + + msgDataInfo := fmt.Sprintf(fmtDataInfo, cfg.GNodeB.DataIF.Ip, cfg.GNodeB.DataIF.Port) + log.Infof(fmtLogGNB, msgDataInfo) + + msgAMFInfo := fmt.Sprintf(fmtAMFInfo, cfg.AMF.Ip, cfg.AMF.Port) + log.Infof(fmtLogAMF, msgAMFInfo) + + log.Info(logSep) +} diff --git a/cmd/my5g-RANTester/test_gnb.go b/cmd/my5g-RANTester/test_gnb.go new file mode 100644 index 00000000..64773228 --- /dev/null +++ b/cmd/my5g-RANTester/test_gnb.go @@ -0,0 +1,19 @@ +package main + +import ( + "github.com/urfave/cli/v2" + + "my5G-RANTester/internal/templates" +) + +func testGNB(_ *cli.Context) error { + const ( + name = "Testing an gnb attached with configuration" + ) + + testLogCommonInfo(name, argNumUEDefault) + + templates.TestAttachGnbWithConfiguration() + + return nil +} diff --git a/cmd/my5g-RANTester/test_register_multi_ue.go b/cmd/my5g-RANTester/test_register_multi_ue.go new file mode 100644 index 00000000..683c1794 --- /dev/null +++ b/cmd/my5g-RANTester/test_register_multi_ue.go @@ -0,0 +1,27 @@ +package main + +import ( + log "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" + + "my5G-RANTester/internal/templates" +) + +func testRegisterMultiUE(c *cli.Context) error { + if !c.IsSet(argNumUE) { + log.Info(c.Command.Usage) + + return nil + } + + const ( + name = "Testing registration of multiple UEs" + ) + + numUE := c.Int(argNumUE) + + testLogCommonInfo(name, numUE) + templates.TestMultiUesInQueue(numUE) + + return nil +} diff --git a/cmd/my5g-RANTester/test_ue.go b/cmd/my5g-RANTester/test_ue.go new file mode 100644 index 00000000..a5c9ebc8 --- /dev/null +++ b/cmd/my5g-RANTester/test_ue.go @@ -0,0 +1,19 @@ +package main + +import ( + "github.com/urfave/cli/v2" + + "my5G-RANTester/internal/templates" +) + +func testUE(_ *cli.Context) error { + const ( + name = "Testing an ue attached with configuration" + ) + + testLogCommonInfo(name, argNumUEDefault) + + templates.TestAttachUeWithConfiguration() + + return nil +} diff --git a/go.sum b/go.sum index 0d37fa78..6ae2e05e 100644 --- a/go.sum +++ b/go.sum @@ -84,7 +84,6 @@ github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -151,7 +150,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=