1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
//go:build integration && perftest
// +build integration,perftest
package main
import (
"flag"
"fmt"
"net/http"
"strings"
"time"
)
type Config struct {
RequestDuration time.Duration
RequestCount int64
RequestDelay time.Duration
Endpoint string
Bucket, Key string
SDK SDKConfig
Client ClientConfig
}
func (c *Config) SetupFlags(prefix string, flagset *flag.FlagSet) {
flagset.DurationVar(&c.RequestDuration, "duration", 0,
"The duration to make requests for. Use instead of count for specific running duration.")
flagset.Int64Var(&c.RequestCount, "count", 0,
"The total `number` of requests to make. Use instead of duration for specific count.")
flagset.DurationVar(&c.RequestDelay, "delay", 0,
"The detail between sequential requests.")
flagset.StringVar(&c.Endpoint, prefix+"endpoint", "",
"Optional overridden endpoint S3 client will connect to.")
flagset.StringVar(&c.Bucket, "bucket", "",
"The S3 bucket `name` to request the object from.")
flagset.StringVar(&c.Key, "key", "",
"The S3 object key `name` to request the object from.")
c.SDK.SetupFlags(prefix, flagset)
c.Client.SetupFlags(prefix, flagset)
}
func (c *Config) Validate() error {
var errs Errors
if c.RequestDuration != 0 && c.RequestCount != 0 {
errs = append(errs, fmt.Errorf("duration and count canot be used together"))
}
if c.RequestDuration == 0 && c.RequestCount == 0 {
errs = append(errs, fmt.Errorf("duration or count must be provided"))
}
if len(c.Bucket) == 0 || len(c.Key) == 0 {
errs = append(errs, fmt.Errorf("bucket and key are required"))
}
if err := c.SDK.Validate(); err != nil {
errs = append(errs, err)
}
if err := c.Client.Validate(); err != nil {
errs = append(errs, err)
}
if len(errs) != 0 {
return errs
}
return nil
}
type SDKConfig struct {
Anonymous bool
ExpectContinue bool
}
func (c *SDKConfig) SetupFlags(prefix string, flagset *flag.FlagSet) {
prefix += "sdk."
flagset.BoolVar(&c.Anonymous, prefix+"anonymous", false,
"Specifies if the SDK will make requests anonymously, and unsigned.")
c.ExpectContinue = true
// flagset.BoolVar(&c.ExpectContinue, prefix+"100-continue", true,
// "Specifies if the SDK requests will wait for the 100 continue response before sending request payload.")
}
func (c *SDKConfig) Validate() error {
return nil
}
type ClientConfig struct {
KeepAlive bool
Timeouts Timeouts
}
func (c *ClientConfig) SetupFlags(prefix string, flagset *flag.FlagSet) {
prefix += "client."
flagset.BoolVar(&c.KeepAlive, prefix+"http-keep-alive", true,
"Specifies if HTTP keep alive is enabled.")
c.Timeouts.SetupFlags(prefix, flagset)
}
func (c *ClientConfig) Validate() error {
var errs Errors
if err := c.Timeouts.Validate(); err != nil {
errs = append(errs, err)
}
if len(errs) != 0 {
return errs
}
return nil
}
type Timeouts struct {
Connect time.Duration
TLSHandshake time.Duration
ExpectContinue time.Duration
ResponseHeader time.Duration
}
func (c *Timeouts) SetupFlags(prefix string, flagset *flag.FlagSet) {
prefix += "timeout."
flagset.DurationVar(&c.Connect, prefix+"connect", 30*time.Second,
"The `timeout` connecting to the remote host.")
defTR := http.DefaultTransport.(*http.Transport)
flagset.DurationVar(&c.TLSHandshake, prefix+"tls", defTR.TLSHandshakeTimeout,
"The `timeout` waiting for the TLS handshake to complete.")
c.ExpectContinue = defTR.ExpectContinueTimeout
// flagset.DurationVar(&c.ExpectContinue, prefix+"expect-continue", defTR.ExpectContinueTimeout,
// "The `timeout` waiting for the TLS handshake to complete.")
flagset.DurationVar(&c.ResponseHeader, prefix+"response-header", defTR.ResponseHeaderTimeout,
"The `timeout` waiting for the TLS handshake to complete.")
}
func (c *Timeouts) Validate() error {
return nil
}
type Errors []error
func (es Errors) Error() string {
var buf strings.Builder
for _, e := range es {
buf.WriteString(e.Error())
}
return buf.String()
}
|