diff --git a/go.mod b/go.mod index d45aa4da..aa35a0b7 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.17 require ( github.com/Masterminds/semver/v3 v3.1.1 - github.com/alessio/shellescape v1.4.1 github.com/argoproj/argo-workflows/v3 v3.2.6 github.com/go-logr/logr v0.4.0 github.com/onsi/ginkgo v1.16.4 diff --git a/go.sum b/go.sum index 62e88bb3..a08721da 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/test-load/dolphin/app/main.go b/test-load/dolphin/app/main.go deleted file mode 100644 index 8f7da51f..00000000 --- a/test-load/dolphin/app/main.go +++ /dev/null @@ -1,33 +0,0 @@ -package app - -import ( - "os" - - "github.com/keikoproj/addon-manager/test-load/pkg/cmd" - "github.com/keikoproj/addon-manager/test-load/pkg/cmd/dolphin" - "github.com/keikoproj/addon-manager/test-load/pkg/exec" - "github.com/keikoproj/addon-manager/test-load/pkg/log" -) - -func Main() { - if err := Run(cmd.NewLogger(), cmd.StandardIOStreams(), os.Args[1:]); err != nil { - os.Exit(1) - } -} - -func Run(logger log.Logger, streams cmd.IOStreams, args []string) error { - c := dolphin.NewCommand(logger, streams) - c.SetArgs(args) - if err := c.Execute(); err != nil { - logError(logger, err) - return err - } - return nil -} - -func logError(logger log.Logger, err error) { - logger.Errorf("ERROR: %v", err) - if err := exec.RunErrorForError(err); err != nil { - logger.Errorf("\nCommand Output: %s", err.Output) - } -} diff --git a/test-load/dolphin/main.go b/test-load/dolphin/main.go deleted file mode 100644 index 7d4feb08..00000000 --- a/test-load/dolphin/main.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import ( - "github.com/keikoproj/addon-manager/test-load/dolphin/app" -) - -func main() { - app.Main() -} diff --git a/test-load/pkg/cmd/dolphin/tests/load.go b/test-load/main.go similarity index 58% rename from test-load/pkg/cmd/dolphin/tests/load.go rename to test-load/main.go index 1570aa31..32160cb2 100644 --- a/test-load/pkg/cmd/dolphin/tests/load.go +++ b/test-load/main.go @@ -1,4 +1,18 @@ -package tests +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package main import ( "bufio" @@ -6,80 +20,55 @@ import ( "context" "fmt" "io" - "os" "os/exec" + "strconv" "strings" "sync" "time" "github.com/keikoproj/addon-manager/pkg/common" "github.com/keikoproj/addon-manager/test-bdd/testutil" - "github.com/keikoproj/addon-manager/test-load/pkg/cmd" - "github.com/keikoproj/addon-manager/test-load/pkg/log" - "github.com/spf13/cobra" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/dynamic" "sigs.k8s.io/controller-runtime/pkg/client/config" -) -type flagpole struct { - managerPID string // passed in kubeconfig - wfcontrollerPID string - numberOfGoRoutines int -} + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) const ( - NumberOfWFPerRoutine = 200 - eventNameBase = 100 + numberOfRoutines = 10 ) -// NewCommand ... -func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command { - flags := &flagpole{} - cmd := &cobra.Command{ - Args: cobra.NoArgs, - Use: "tests", - Short: "tests load", - Long: "tests addon-manager loads", - RunE: func(cmd *cobra.Command, args []string) error { - return RunLoads(logger, flags) - }, - } - cmd.Flags().StringVar(&flags.managerPID, "managerPID", "", " addon manager pid") - cmd.Flags().StringVar(&flags.wfcontrollerPID, "wfcontrollerPID", "", " workflow controller pid") - cmd.Flags().IntVar(&flags.numberOfGoRoutines, "numberOfGoRoutines", 10, " number of goroutines to be created. Each deploy 200 workflows.") - return cmd -} - -func RunLoads(logger log.Logger, flags *flagpole) error { +func main() { + s, e := os.Getenv("LOADTEST_START_NUMBER"), os.Getenv("LOADTEST_END_NUMBER") + x, _ := strconv.Atoi(s) + y, _ := strconv.Atoi(e) + fmt.Printf("start = %d end = %d", x, y) - if flags.numberOfGoRoutines == 0 { - fmt.Printf("please specify at least one goroutine.") - flags.numberOfGoRoutines = 2 - } - perfsummary, err := os.Create("summary.txt") + costsummary, err := os.Create("summary.txt") if err != nil { - return fmt.Errorf("failed creating summary file. %v", err) + return } - dataWriter := bufio.NewWriter(perfsummary) + dataWriter := bufio.NewWriter(costsummary) stop := make(chan bool) + mgrPid := os.Getenv("MANAGER_PID") + ctrlPid := os.Getenv("WFCTRL_PID") go func(mgrPid, ctrlPid string, writer *bufio.Writer) { for { select { case <-stop: return default: - fmt.Printf("\n every 2 minutes collecting mgr %s wfctrl %s %%cpu/%%mem ", mgrPid, ctrlPid) + fmt.Printf("\n every 2 minutes collecting data for mgr %s wfctrl %s", mgrPid, ctrlPid) Summary(mgrPid, ctrlPid, writer) time.Sleep(2 * time.Minute) } } - }(flags.managerPID, flags.wfcontrollerPID, dataWriter) + }(mgrPid, ctrlPid, dataWriter) var wg sync.WaitGroup - wg.Add(flags.numberOfGoRoutines) + wg.Add(numberOfRoutines) lock := &sync.Mutex{} cfg := config.GetConfigOrDie() @@ -90,22 +79,15 @@ func RunLoads(logger log.Logger, flags *flagpole) error { var relativeAddonPath = "docs/examples/eventrouter.yaml" var addonGroupSchema = common.AddonGVR() - for i := 1; i <= flags.numberOfGoRoutines; i++ { + for i := 1; i <= numberOfRoutines; i++ { go func(i int, lock *sync.Mutex) { defer wg.Done() - for j := i * eventNameBase; j < i*eventNameBase+int(NumberOfWFPerRoutine); j++ { + for j := i * 100; j < i*100+200; j++ { addon, err := testutil.CreateLoadTestsAddon(lock, dynClient, relativeAddonPath, fmt.Sprintf("-%d", j)) if err != nil { - fmt.Printf("\n create addon failure for %v. retry 10 times after every 1 second. \n", err) + fmt.Printf("\n\n create addon failure err %v", err) time.Sleep(1 * time.Second) - for i := 0; i < 10; i++ { - addon, err = testutil.CreateLoadTestsAddon(lock, dynClient, relativeAddonPath, fmt.Sprintf("-%d", j)) - if err != nil || addon == nil { - time.Sleep(1 * time.Second) - continue - } - break - } + continue } addonName = addon.GetName() @@ -113,7 +95,7 @@ func RunLoads(logger log.Logger, flags *flagpole) error { for x := 0; x <= 500; x++ { a, err := dynClient.Resource(addonGroupSchema).Namespace(addonNamespace).Get(ctx, addonName, metav1.GetOptions{}) if a == nil || err != nil || a.UnstructuredContent()["status"] == nil { - fmt.Printf("\n\n addon is not readdy err <%v> retry after 1 second ", err) + fmt.Printf("\n\n retry get addon status %v get ", err) time.Sleep(1 * time.Second) continue } @@ -124,11 +106,11 @@ func RunLoads(logger log.Logger, flags *flagpole) error { } wg.Wait() stop <- true - perfsummary.Close() - return nil + costsummary.Close() + } -// capture cpu/memory/addons number periodically +// capture cpu/memory/addons number every 3 mintues func Summary(managerPID, wfctrlPID string, datawriter *bufio.Writer) error { kubectlCmd := exec.Command("kubectl", "-n", "addon-manager-system", "get", "addons") @@ -162,8 +144,9 @@ func Summary(managerPID, wfctrlPID string, datawriter *bufio.Writer) error { reader.Close() AddonsNum := buf.String() - fmt.Printf("\n atm total addons number %s\n", AddonsNum) + fmt.Printf("\n addons number %s\n", AddonsNum) + //cmd = fmt.Sprintf("ps -p %s -o %%cpu,%%mem", managerPID) cmd := exec.Command("ps", "-p", managerPID, "-o", "%cpu,%mem") fmt.Printf("manager cpu cmd %v", *cmd) managerUsage, err := cmd.Output() @@ -171,6 +154,7 @@ func Summary(managerPID, wfctrlPID string, datawriter *bufio.Writer) error { fmt.Printf("failed to collect addonmanager cpu/mem usage. %v", err) return err } + //fmt.Printf("\n addonmanager cpu/mem usage %s ", managerUsage) cmd = exec.Command("ps", "-p", wfctrlPID, "-o", "%cpu,%mem") wfControllerUsage, err := cmd.Output() @@ -178,7 +162,7 @@ func Summary(managerPID, wfctrlPID string, datawriter *bufio.Writer) error { fmt.Printf("failed to collect addonmanager cpu/mem usage. %v", err) return err } - + //fmt.Printf("workflow controller cpu/mem usage %s ", wfControllerUsage) fmt.Printf("addons number %s addonmanager cpu/mem usage %s controller cpu/mem usage %s", AddonsNum, managerUsage, wfControllerUsage) oneline := fmt.Sprintf("", strings.TrimSpace(AddonsNum), strings.TrimSuffix(string(managerUsage), "\n"), strings.TrimSuffix(string(wfControllerUsage), "\n")) datawriter.WriteString(oneline + "\n#############\n") diff --git a/test-load/pkg/cmd/doc.go b/test-load/pkg/cmd/doc.go deleted file mode 100644 index 1d619dd0..00000000 --- a/test-load/pkg/cmd/doc.go +++ /dev/null @@ -1 +0,0 @@ -package cmd diff --git a/test-load/pkg/cmd/dolphin/root.go b/test-load/pkg/cmd/dolphin/root.go deleted file mode 100644 index 81384fff..00000000 --- a/test-load/pkg/cmd/dolphin/root.go +++ /dev/null @@ -1,98 +0,0 @@ -package dolphin - -import ( - "io" - "io/ioutil" - - "github.com/keikoproj/addon-manager/test-load/pkg/cmd" - "github.com/keikoproj/addon-manager/test-load/pkg/cmd/dolphin/tests" - "github.com/keikoproj/addon-manager/test-load/pkg/log" - "github.com/spf13/cobra" -) - -type flagpole struct { - LogLevel string - Verbosity int32 - Quiet bool -} - -func NewCommand(logger log.Logger, streams cmd.IOStreams) *cobra.Command { - flags := &flagpole{} - cmd := &cobra.Command{ - Args: cobra.NoArgs, - Use: "dolphin", - Short: "dolphin is a tool for managing local Kubernetes clusters pods", - Long: "dolphin creates and manages local Kubernetes clusters using Docker container 'nodes'", - PersistentPreRunE: func(cmd *cobra.Command, args []string) error { - return runE(logger, flags, cmd) - }, - SilenceUsage: true, - SilenceErrors: true, - // Version: version.Version(), - } - cmd.SetOut(streams.Out) - cmd.SetErr(streams.ErrOut) - cmd.PersistentFlags().StringVar( - &flags.LogLevel, - "loglevel", - "", - "DEPRECATED: see -v instead", - ) - cmd.PersistentFlags().Int32VarP( - &flags.Verbosity, - "verbosity", - "v", - 0, - "info log verbosity, higher value produces more output", - ) - cmd.PersistentFlags().BoolVarP( - &flags.Quiet, - "quiet", - "q", - false, - "silence all stderr output", - ) - cmd.AddCommand(tests.NewCommand(logger, streams)) - return cmd -} - -func runE(logger log.Logger, flags *flagpole, command *cobra.Command) error { - setLogLevel := command.Flag("loglevel").Changed - setVerbosity := command.Flag("verbosity").Changed - if setLogLevel && !setVerbosity { - switch flags.LogLevel { - case "debug": - flags.Verbosity = 3 - case "trace": - flags.Verbosity = 2147483647 - } - } - if flags.Quiet { - maybeSetWriter(logger, ioutil.Discard) - } - maybeSetVerbosity(logger, log.Level(flags.Verbosity)) - if setLogLevel { - logger.Warn("WARNING: --loglevel is deprecated, please switch to -v and -q!") - } - return nil -} - -func maybeSetWriter(logger log.Logger, w io.Writer) { - type writerSetter interface { - SetWriter(io.Writer) - } - v, ok := logger.(writerSetter) - if ok { - v.SetWriter(w) - } -} - -func maybeSetVerbosity(logger log.Logger, verbosity log.Level) { - type verboser interface { - SetVerbosity(log.Level) - } - v, ok := logger.(verboser) - if ok { - v.SetVerbosity(verbosity) - } -} diff --git a/test-load/pkg/cmd/iostreams.go b/test-load/pkg/cmd/iostreams.go deleted file mode 100644 index aaac039b..00000000 --- a/test-load/pkg/cmd/iostreams.go +++ /dev/null @@ -1,20 +0,0 @@ -package cmd - -import ( - "io" - "os" -) - -type IOStreams struct { - In io.Reader - Out io.Writer - ErrOut io.Writer -} - -func StandardIOStreams() IOStreams { - return IOStreams{ - In: os.Stdin, - Out: os.Stdout, - ErrOut: os.Stderr, - } -} diff --git a/test-load/pkg/cmd/log.go b/test-load/pkg/cmd/log.go deleted file mode 100644 index 5e675bc0..00000000 --- a/test-load/pkg/cmd/log.go +++ /dev/null @@ -1,14 +0,0 @@ -package cmd - -import ( - "io" - "os" - - "github.com/keikoproj/addon-manager/test-load/pkg/internal/cli" - "github.com/keikoproj/addon-manager/test-load/pkg/log" -) - -func NewLogger() log.Logger { - var writer io.Writer = os.Stderr - return cli.NewLogger(writer, 0) -} diff --git a/test-load/pkg/exec/doc.go b/test-load/pkg/exec/doc.go deleted file mode 100644 index 81c33c44..00000000 --- a/test-load/pkg/exec/doc.go +++ /dev/null @@ -1 +0,0 @@ -package exec diff --git a/test-load/pkg/exec/helpers.go b/test-load/pkg/exec/helpers.go deleted file mode 100644 index 108c06ef..00000000 --- a/test-load/pkg/exec/helpers.go +++ /dev/null @@ -1,68 +0,0 @@ -package exec - -import ( - "bufio" - "bytes" - "os" - "strings" - - "github.com/alessio/shellescape" -) - -func PrettyCommand(name string, args ...string) string { - var out strings.Builder - out.WriteString(shellescape.Quote(name)) - for _, arg := range args { - out.WriteByte(' ') - out.WriteString(shellescape.Quote(arg)) - } - return out.String() -} - -func RunErrorForError(err error) *RunError { - var runError *RunError - for { - if rErr, ok := err.(*RunError); ok { - runError = rErr - } else { - break - } - } - return runError -} - -func CombinedOutputLines(cmd Cmd) (lines []string, err error) { - var buff bytes.Buffer - cmd.SetStdout(&buff) - cmd.SetStderr(&buff) - err = cmd.Run() - scanner := bufio.NewScanner(&buff) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - return lines, err -} - -func OutputLines(cmd Cmd) (lines []string, err error) { - var buff bytes.Buffer - cmd.SetStdout(&buff) - err = cmd.Run() - scanner := bufio.NewScanner(&buff) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - return lines, err -} - -func Output(cmd Cmd) ([]byte, error) { - var buff bytes.Buffer - cmd.SetStdout(&buff) - err := cmd.Run() - return buff.Bytes(), err -} - -func InheritOutput(cmd Cmd) Cmd { - cmd.SetStderr(os.Stderr) - cmd.SetStdout(os.Stdout) - return cmd -} diff --git a/test-load/pkg/exec/types.go b/test-load/pkg/exec/types.go deleted file mode 100644 index 1a0b5c68..00000000 --- a/test-load/pkg/exec/types.go +++ /dev/null @@ -1,43 +0,0 @@ -package exec - -import ( - "context" - "fmt" - "io" -) - -type Cmd interface { - Run() error - SetEnv(...string) Cmd - SetStdin(io.Reader) Cmd - SetStdout(io.Writer) Cmd - SetStderr(io.Writer) Cmd -} - -type Cmder interface { - Command(string, ...string) Cmd - CommandContext(context.Context, string, ...string) Cmd -} - -type RunError struct { - Command []string - Output []byte - Inner error -} - -var _ error = &RunError{} - -func (e *RunError) Error() string { - return fmt.Sprintf("command \"%s\" failed with error: %v", e.PrettyCommand(), e.Inner) -} - -func (e *RunError) PrettyCommand() string { - return PrettyCommand(e.Command[0], e.Command[1:]...) -} - -func (e *RunError) Cause() error { - if e.Inner != nil { - return e.Inner - } - return e -} diff --git a/test-load/pkg/internal/cli/logger.go b/test-load/pkg/internal/cli/logger.go deleted file mode 100644 index cf2be3f6..00000000 --- a/test-load/pkg/internal/cli/logger.go +++ /dev/null @@ -1,221 +0,0 @@ -package cli - -import ( - "bytes" - "fmt" - "io" - "runtime" - "strings" - "sync" - "sync/atomic" - - "github.com/keikoproj/addon-manager/test-load/pkg/log" -) - -type Logger struct { - writer io.Writer - writerMu sync.Mutex - verbosity log.Level - bufferPool *bufferPool - isSmartWriter bool -} - -var _ log.Logger = &Logger{} - -func NewLogger(writer io.Writer, verbosity log.Level) *Logger { - l := &Logger{ - verbosity: verbosity, - bufferPool: newBufferPool(), - } - l.SetWriter(writer) - return l -} - -func (l *Logger) SetWriter(w io.Writer) { - l.writerMu.Lock() - defer l.writerMu.Unlock() - l.writer = w - l.isSmartWriter = false -} - -func (l *Logger) ColorEnabled() bool { - l.writerMu.Lock() - defer l.writerMu.Unlock() - return l.isSmartWriter -} - -func (l *Logger) getVerbosity() log.Level { - return log.Level(atomic.LoadInt32((*int32)(&l.verbosity))) -} - -func (l *Logger) SetVerbosity(verbosity log.Level) { - atomic.StoreInt32((*int32)(&l.verbosity), int32(verbosity)) -} - -func (l *Logger) write(p []byte) (n int, err error) { - l.writerMu.Lock() - defer l.writerMu.Unlock() - return l.writer.Write(p) -} - -func (l *Logger) writeBuffer(buf *bytes.Buffer) { - if buf.Len() == 0 || buf.Bytes()[buf.Len()-1] != '\n' { - buf.WriteByte('\n') - } - _, _ = l.write(buf.Bytes()) -} - -func (l *Logger) print(message string) { - buf := bytes.NewBufferString(message) - l.writeBuffer(buf) -} - -func (l *Logger) printf(format string, args ...interface{}) { - buf := l.bufferPool.Get() - fmt.Fprintf(buf, format, args...) - l.writeBuffer(buf) - l.bufferPool.Put(buf) -} - -func addDebugHeader(buf *bytes.Buffer) { - _, file, line, ok := runtime.Caller(3) - if !ok { - file = "???" - line = 1 - } else { - if slash := strings.LastIndex(file, "/"); slash >= 0 { - path := file - file = path[slash+1:] - if dirsep := strings.LastIndex(path[:slash], "/"); dirsep >= 0 { - file = path[dirsep+1:] - } - } - } - buf.Grow(len(file) + 11) // we know at least this many bytes are needed - buf.WriteString("DEBUG: ") - buf.WriteString(file) - buf.WriteByte(':') - fmt.Fprintf(buf, "%d", line) - buf.WriteByte(']') - buf.WriteByte(' ') -} - -// debug is like print but with a debug log header -func (l *Logger) debug(message string) { - buf := l.bufferPool.Get() - addDebugHeader(buf) - buf.WriteString(message) - l.writeBuffer(buf) - l.bufferPool.Put(buf) -} - -// debugf is like printf but with a debug log header -func (l *Logger) debugf(format string, args ...interface{}) { - buf := l.bufferPool.Get() - addDebugHeader(buf) - fmt.Fprintf(buf, format, args...) - l.writeBuffer(buf) - l.bufferPool.Put(buf) -} - -// Warn is part of the log.Logger interface -func (l *Logger) Warn(message string) { - l.print(message) -} - -// Warnf is part of the log.Logger interface -func (l *Logger) Warnf(format string, args ...interface{}) { - l.printf(format, args...) -} - -// Error is part of the log.Logger interface -func (l *Logger) Error(message string) { - l.print(message) -} - -// Errorf is part of the log.Logger interface -func (l *Logger) Errorf(format string, args ...interface{}) { - l.printf(format, args...) -} - -// V is part of the log.Logger interface -func (l *Logger) V(level log.Level) log.InfoLogger { - return infoLogger{ - logger: l, - level: level, - enabled: level <= l.getVerbosity(), - } -} - -// infoLogger implements log.InfoLogger for Logger -type infoLogger struct { - logger *Logger - level log.Level - enabled bool -} - -// Enabled is part of the log.InfoLogger interface -func (i infoLogger) Enabled() bool { - return i.enabled -} - -// Info is part of the log.InfoLogger interface -func (i infoLogger) Info(message string) { - if !i.enabled { - return - } - // for > 0, we are writing debug messages, include extra info - if i.level > 0 { - i.logger.debug(message) - } else { - i.logger.print(message) - } -} - -// Infof is part of the log.InfoLogger interface -func (i infoLogger) Infof(format string, args ...interface{}) { - if !i.enabled { - return - } - // for > 0, we are writing debug messages, include extra info - if i.level > 0 { - i.logger.debugf(format, args...) - } else { - i.logger.printf(format, args...) - } -} - -// bufferPool is a type safe sync.Pool of *byte.Buffer, guaranteed to be Reset -type bufferPool struct { - sync.Pool -} - -// newBufferPool returns a new bufferPool -func newBufferPool() *bufferPool { - return &bufferPool{ - sync.Pool{ - New: func() interface{} { - // The Pool's New function should generally only return pointer - // types, since a pointer can be put into the return interface - // value without an allocation: - return new(bytes.Buffer) - }, - }, - } -} - -// Get obtains a buffer from the pool -func (b *bufferPool) Get() *bytes.Buffer { - return b.Pool.Get().(*bytes.Buffer) -} - -// Put returns a buffer to the pool, resetting it first -func (b *bufferPool) Put(x *bytes.Buffer) { - // only store small buffers to avoid pointless allocation - // avoid keeping arbitrarily large buffers - if x.Len() > 256 { - return - } - x.Reset() - b.Pool.Put(x) -} diff --git a/test-load/pkg/internal/sets/doc.go b/test-load/pkg/internal/sets/doc.go deleted file mode 100644 index 5d36b104..00000000 --- a/test-load/pkg/internal/sets/doc.go +++ /dev/null @@ -1 +0,0 @@ -package sets diff --git a/test-load/pkg/internal/sets/empty.go b/test-load/pkg/internal/sets/empty.go deleted file mode 100644 index 4daf5ec4..00000000 --- a/test-load/pkg/internal/sets/empty.go +++ /dev/null @@ -1,5 +0,0 @@ -package sets - -// Empty is public since it is used by some internal API objects for conversions between external -// string arrays and internal sets, and conversion logic requires public types today. -type Empty struct{} diff --git a/test-load/pkg/internal/sets/string.go b/test-load/pkg/internal/sets/string.go deleted file mode 100644 index f5bf11ad..00000000 --- a/test-load/pkg/internal/sets/string.go +++ /dev/null @@ -1,153 +0,0 @@ -package sets - -import ( - "reflect" - "sort" -) - -type String map[string]Empty - -func NewString(items ...string) String { - ss := String{} - ss.Insert(items...) - return ss -} - -func StringKeySet(theMap interface{}) String { - v := reflect.ValueOf(theMap) - ret := String{} - - for _, keyValue := range v.MapKeys() { - ret.Insert(keyValue.Interface().(string)) - } - return ret -} - -func (s String) Insert(items ...string) String { - for _, item := range items { - s[item] = Empty{} - } - return s -} - -func (s String) Delete(items ...string) String { - for _, item := range items { - delete(s, item) - } - return s -} - -func (s String) Has(item string) bool { - _, contained := s[item] - return contained -} - -func (s String) HasAll(items ...string) bool { - for _, item := range items { - if !s.Has(item) { - return false - } - } - return true -} - -func (s String) HasAny(items ...string) bool { - for _, item := range items { - if s.Has(item) { - return true - } - } - return false -} - -func (s String) Difference(s2 String) String { - result := NewString() - for key := range s { - if !s2.Has(key) { - result.Insert(key) - } - } - return result -} - -func (s1 String) Union(s2 String) String { - result := NewString() - for key := range s1 { - result.Insert(key) - } - for key := range s2 { - result.Insert(key) - } - return result -} - -func (s1 String) Intersection(s2 String) String { - var walk, other String - result := NewString() - if s1.Len() < s2.Len() { - walk = s1 - other = s2 - } else { - walk = s2 - other = s1 - } - for key := range walk { - if other.Has(key) { - result.Insert(key) - } - } - return result -} - -func (s1 String) IsSuperset(s2 String) bool { - for item := range s2 { - if !s1.Has(item) { - return false - } - } - return true -} - -func (s1 String) Equal(s2 String) bool { - return len(s1) == len(s2) && s1.IsSuperset(s2) -} - -type sortableSliceOfString []string - -func (s sortableSliceOfString) Len() int { return len(s) } -func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) } -func (s sortableSliceOfString) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -func (s String) List() []string { - res := make(sortableSliceOfString, 0, len(s)) - for key := range s { - res = append(res, key) - } - sort.Sort(res) - return []string(res) -} - -func (s String) UnsortedList() []string { - res := make([]string, 0, len(s)) - for key := range s { - res = append(res, key) - } - return res -} - -func (s String) PopAny() (string, bool) { - for key := range s { - s.Delete(key) - return key, true - } - var zeroValue string - return zeroValue, false -} - -func (s String) Len() int { - return len(s) -} - -func lessString(lhs, rhs string) bool { - return lhs < rhs -} diff --git a/test-load/pkg/log/doc.go b/test-load/pkg/log/doc.go deleted file mode 100644 index 7330d540..00000000 --- a/test-load/pkg/log/doc.go +++ /dev/null @@ -1 +0,0 @@ -package log diff --git a/test-load/pkg/log/noop.go b/test-load/pkg/log/noop.go deleted file mode 100644 index 07031495..00000000 --- a/test-load/pkg/log/noop.go +++ /dev/null @@ -1,31 +0,0 @@ -package log - -// NoopLogger implements the Logger interface and never logs anything -type NoopLogger struct{} - -// Warn meets the Logger interface but does nothing -func (n NoopLogger) Warn(message string) {} - -// Warnf meets the Logger interface but does nothing -func (n NoopLogger) Warnf(format string, args ...interface{}) {} - -// Error meets the Logger interface but does nothing -func (n NoopLogger) Error(message string) {} - -// Errorf meets the Logger interface but does nothing -func (n NoopLogger) Errorf(format string, args ...interface{}) {} - -// V meets the Logger interface but does nothing -func (n NoopLogger) V(level Level) InfoLogger { return NoopInfoLogger{} } - -// NoopInfoLogger implements the InfoLogger interface and never logs anything -type NoopInfoLogger struct{} - -// Enabled meets the InfoLogger interface but always returns false -func (n NoopInfoLogger) Enabled() bool { return false } - -// Info meets the InfoLogger interface but does nothing -func (n NoopInfoLogger) Info(message string) {} - -// Infof meets the InfoLogger interface but does nothing -func (n NoopInfoLogger) Infof(format string, args ...interface{}) {} diff --git a/test-load/pkg/log/types.go b/test-load/pkg/log/types.go deleted file mode 100644 index 5178453e..00000000 --- a/test-load/pkg/log/types.go +++ /dev/null @@ -1,19 +0,0 @@ -package log - -// Level is a verbosity logging level for Info logs -// Refer https://github.com/kubernetes/klog -type Level int32 - -type Logger interface { - Warn(message string) - Warnf(format string, args ...interface{}) - Error(message string) - Errorf(format string, args ...interface{}) - V(Level) InfoLogger -} - -type InfoLogger interface { - Info(message string) - Infof(format string, args ...interface{}) - Enabled() bool -}