From 1d0590f14d65aec0c508d024ed1debbde8a0f2b8 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Thu, 2 Apr 2020 03:19:29 +0900 Subject: [PATCH 1/7] change names of event --- event/http.go | 2 +- event/icmpv4.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/event/http.go b/event/http.go index b066bbc..0960b56 100644 --- a/event/http.go +++ b/event/http.go @@ -25,7 +25,7 @@ type HTTPEvent struct { // Name is Event name each event types func (he HTTPEvent) Name() string { - return "HTTP" + return "http" } // Fire execute a Event by parameters diff --git a/event/icmpv4.go b/event/icmpv4.go index e751c64..a609e19 100644 --- a/event/icmpv4.go +++ b/event/icmpv4.go @@ -23,7 +23,7 @@ func NewICMPv4Event(seq int, listenAddr, addr string) *ICMPv4Event { } func (e ICMPv4Event) Name() string { - return "ICMPv4" + return "ping" } func (e ICMPv4Event) Fire(ctx context.Context) error { From 59cdfc4374dd7ce04ba4c2012919d407acadcf35 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Thu, 2 Apr 2020 03:20:50 +0900 Subject: [PATCH 2/7] add command line interface in draft. --- README.md | 9 ++++++ cmd/evbundler/internal/base/base.go | 13 ++++++++ cmd/evbundler/internal/ping/ping.go | 50 +++++++++++++++++++++++++++++ cmd/evbundler/main.go | 46 ++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 cmd/evbundler/internal/base/base.go create mode 100644 cmd/evbundler/internal/ping/ping.go create mode 100644 cmd/evbundler/main.go diff --git a/README.md b/README.md index f499000..9b4f1ad 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,12 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) evundler is a performance testing framework written in Go. + + +## Installation +``` +go get -u github.com/github.com/go-loadtest/evbundler/cmd/evbundler +``` + +## Usage +`t.b.d` diff --git a/cmd/evbundler/internal/base/base.go b/cmd/evbundler/internal/base/base.go new file mode 100644 index 0000000..c0b0831 --- /dev/null +++ b/cmd/evbundler/internal/base/base.go @@ -0,0 +1,13 @@ +package base + +import "flag" + +type Command struct { + Name string + Doc string + Run func(args []string) error + Flags *flag.FlagSet +} + +// Commands is register subcommands +var Commands []*Command diff --git a/cmd/evbundler/internal/ping/ping.go b/cmd/evbundler/internal/ping/ping.go new file mode 100644 index 0000000..b2f35c4 --- /dev/null +++ b/cmd/evbundler/internal/ping/ping.go @@ -0,0 +1,50 @@ +package ping + +import ( + "context" + "flag" + "time" + + "github.com/go-loadtest/evbundler" + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/base" + "github.com/go-loadtest/evbundler/dispatcher" + "github.com/go-loadtest/evbundler/event" +) + +const name = "ping" + +var Cmd = &base.Command{ + Name: name, + Doc: "icmpv4 event generator", + Run: run, +} + +var target string +var interval string + +func run(args []string) error { + flags := flag.NewFlagSet(name, flag.ContinueOnError) + flags.StringVar(&target, "target", "", `send to host or ip`) + flags.StringVar(&interval, "interval", "1s", `interval of send each packets e.g. 1s, 300ms, 1m`) + + if err := flags.Parse(args); err != nil { + return err + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + d, err := time.ParseDuration(interval) + if err != nil { + return err + } + evCh := evbundler.TickerProducer(ctx, d, func(t time.Time, evCh chan evbundler.Event) { + evCh <- event.NewICMPv4Event(1, "0.0.0.0", target) + }) + + wp := evbundler.NewWorkerPool(10, nil) + disp := dispatcher.NewGoChannel(wp) + _ = disp.Dispatch(ctx, evCh) + + return nil +} diff --git a/cmd/evbundler/main.go b/cmd/evbundler/main.go new file mode 100644 index 0000000..08349e9 --- /dev/null +++ b/cmd/evbundler/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/base" + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/ping" +) + +type Commands []*base.Command + +func (cs Commands) Usage() { + usage := ` +Usage of evbundler: + evbundler [arguments] + +The commands are: + +` + fmt.Fprint(os.Stderr, usage) + for i := range cs { + fmt.Fprintf(os.Stderr, "\t\t%s\t%s\n", cs[i].Name, cs[i].Doc) + } + os.Exit(2) +} + +func main() { + commands := Commands{ + ping.Cmd, + } + + flag.Usage = commands.Usage + flag.Parse() + args := flag.Args() + if len(args) < 1 { + commands.Usage() + } + + for _, c := range commands { + if c.Name == args[0] { + c.Run(args[1:]) + } + } +} From 92cd41b48561c98419eec2ec558570560b94a194 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Fri, 3 Apr 2020 00:36:57 +0900 Subject: [PATCH 3/7] parse arguments not in each commands, but in main command --- cmd/evbundler/internal/base/base.go | 15 +++++++++++---- cmd/evbundler/internal/ping/ping.go | 24 ++++++++++-------------- cmd/evbundler/main.go | 5 ++++- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/cmd/evbundler/internal/base/base.go b/cmd/evbundler/internal/base/base.go index c0b0831..0137bec 100644 --- a/cmd/evbundler/internal/base/base.go +++ b/cmd/evbundler/internal/base/base.go @@ -1,13 +1,20 @@ package base -import "flag" +import ( + "flag" + "fmt" + "os" +) type Command struct { Name string Doc string Run func(args []string) error - Flags *flag.FlagSet + Flags flag.FlagSet } -// Commands is register subcommands -var Commands []*Command +func (c *Command) Usage() { + fmt.Fprintf(os.Stderr, "Usage of %s\n\n", c.Name) + c.Flags.PrintDefaults() + os.Exit(2) +} diff --git a/cmd/evbundler/internal/ping/ping.go b/cmd/evbundler/internal/ping/ping.go index b2f35c4..7edbe21 100644 --- a/cmd/evbundler/internal/ping/ping.go +++ b/cmd/evbundler/internal/ping/ping.go @@ -2,7 +2,6 @@ package ping import ( "context" - "flag" "time" "github.com/go-loadtest/evbundler" @@ -16,30 +15,27 @@ const name = "ping" var Cmd = &base.Command{ Name: name, Doc: "icmpv4 event generator", - Run: run, } -var target string -var interval string - -func run(args []string) error { - flags := flag.NewFlagSet(name, flag.ContinueOnError) - flags.StringVar(&target, "target", "", `send to host or ip`) - flags.StringVar(&interval, "interval", "1s", `interval of send each packets e.g. 1s, 300ms, 1m`) +func init() { + Cmd.Run = run +} - if err := flags.Parse(args); err != nil { - return err - } +var ( + target = Cmd.Flags.String("target", "", `send to host or ip`) + interval = Cmd.Flags.String("interval", "1s", `interval of send each packets e.g. 1s, 300ms, 1m`) +) +func run(args []string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - d, err := time.ParseDuration(interval) + d, err := time.ParseDuration(*interval) if err != nil { return err } evCh := evbundler.TickerProducer(ctx, d, func(t time.Time, evCh chan evbundler.Event) { - evCh <- event.NewICMPv4Event(1, "0.0.0.0", target) + evCh <- event.NewICMPv4Event(1, "0.0.0.0", *target) }) wp := evbundler.NewWorkerPool(10, nil) diff --git a/cmd/evbundler/main.go b/cmd/evbundler/main.go index 08349e9..33bc4f6 100644 --- a/cmd/evbundler/main.go +++ b/cmd/evbundler/main.go @@ -14,6 +14,7 @@ type Commands []*base.Command func (cs Commands) Usage() { usage := ` Usage of evbundler: + evbundler [arguments] The commands are: @@ -40,7 +41,9 @@ func main() { for _, c := range commands { if c.Name == args[0] { - c.Run(args[1:]) + c.Flags.Usage = c.Usage + c.Flags.Parse(args[1:]) + c.Run(c.Flags.Args()) } } } From 410b1d94d0370602b21a2260c542eccf4aefe53d Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Fri, 3 Apr 2020 00:39:09 +0900 Subject: [PATCH 4/7] fix for golangci-lint --- cmd/evbundler/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/evbundler/main.go b/cmd/evbundler/main.go index 33bc4f6..221dfe8 100644 --- a/cmd/evbundler/main.go +++ b/cmd/evbundler/main.go @@ -42,8 +42,8 @@ func main() { for _, c := range commands { if c.Name == args[0] { c.Flags.Usage = c.Usage - c.Flags.Parse(args[1:]) - c.Run(c.Flags.Args()) + _ = c.Flags.Parse(args[1:]) + _ = c.Run(c.Flags.Args()) } } } From c30c54a60b86a114e6e88997ff8d2cad2fa88fc0 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Fri, 3 Apr 2020 11:21:12 +0900 Subject: [PATCH 5/7] add bin directory --- .gitignore | 2 ++ bin/.gitkeep | 0 2 files changed, 2 insertions(+) create mode 100644 .gitignore create mode 100644 bin/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..42e7c34 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/* +!bin/.gitkeep diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 From 35e3f8d60bb1069c9c561aafb3edaef746e70639 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Fri, 3 Apr 2020 11:24:43 +0900 Subject: [PATCH 6/7] add Makefile --- Makefile | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ba0f10d --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +GOARCH ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) +GOOS ?= $(shell uname | tr A-Z a-z) +GO ?= GOOS=$(GOOS) GOARCH=$(GOARCH) go + +PKGS := $(shell go list -f '{{.Dir}}' ./...) +SOURCES := $(foreach dir, $(PKGS), $(wildcard $(dir)/*.go)) + +.DEFAULT_GOAL := build + +.PHONY: test +test: + $(GO) test -race -v $(PKGS) + +.PHONY: build +build: bin/evbundler + +bin/evbundler: $(SOURCES) + CGO_ENABLED=0 $(GO) build -o ./$@ ./cmd/evbundler + +clean: + @rm -f bin/* From ff534f0556072388a737803fe1612af27c9b1b53 Mon Sep 17 00:00:00 2001 From: Junki Kaneko Date: Fri, 3 Apr 2020 11:27:27 +0900 Subject: [PATCH 7/7] fix tabsize --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ba0f10d..ecff9d0 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ GOOS ?= $(shell uname | tr A-Z a-z) GO ?= GOOS=$(GOOS) GOARCH=$(GOARCH) go PKGS := $(shell go list -f '{{.Dir}}' ./...) -SOURCES := $(foreach dir, $(PKGS), $(wildcard $(dir)/*.go)) +SOURCES := $(foreach dir, $(PKGS), $(wildcard $(dir)/*.go)) .DEFAULT_GOAL := build