├── .dockerignore ├── .DS_Store ├── libs ├── ping │ └── main.go ├── logger │ └── logger.go ├── memory_cache │ └── main.go ├── reflect │ └── main.go ├── system │ └── main.go └── httpclient │ └── main.go ├── .github ├── images │ └── logo.png └── workflows │ └── release.yaml ├── Dockerfile.dev ├── .gitignore ├── Dockerfile ├── controllers ├── version │ └── main.go ├── filesystem │ ├── delete.go │ ├── cat.go │ ├── write.go │ └── ls.go ├── teapot │ └── main.go ├── system │ └── main.go ├── liveness │ └── main.go ├── ping │ └── main.go ├── readiness │ └── main.go ├── burn │ └── main.go ├── proxy │ └── main.go ├── reflection │ └── main.go ├── healthcheck │ └── main.go └── logging │ └── main.go ├── docker-compose.yml ├── go.mod ├── LICENSE ├── kubernetes └── contour │ └── deploy.yml ├── main.go ├── docs ├── swagger.yaml ├── swagger.json └── docs.go ├── README.md └── go.sum /.dockerignore: -------------------------------------------------------------------------------- 1 | .github 2 | tmp -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msfidelis/chip/HEAD/.DS_Store -------------------------------------------------------------------------------- /libs/ping/main.go: -------------------------------------------------------------------------------- 1 | package ping 2 | 3 | func Tcp() { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /.github/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/msfidelis/chip/HEAD/.github/images/logo.png -------------------------------------------------------------------------------- /Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM golang:1.22 AS builder 2 | 3 | # Install Air 4 | RUN go get -u github.com/cosmtrek/air 5 | 6 | WORKDIR $GOPATH/src/chip 7 | 8 | COPY . ./ 9 | 10 | RUN pwd; ls -lha 11 | 12 | CMD ["air"] -------------------------------------------------------------------------------- /libs/logger/logger.go: -------------------------------------------------------------------------------- 1 | package logger 2 | 3 | import ( 4 | "github.com/rs/zerolog" 5 | "os" 6 | ) 7 | 8 | func Instance() zerolog.Logger { 9 | zerolog.TimeFieldFormat = zerolog.TimeFormatUnix 10 | logger := zerolog.New(os.Stderr).With().Timestamp().Logger() 11 | return logger 12 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | vendor/ 16 | 17 | tmp/ -------------------------------------------------------------------------------- /libs/memory_cache/main.go: -------------------------------------------------------------------------------- 1 | package memory_cache 2 | 3 | import ( 4 | "github.com/patrickmn/go-cache" 5 | "time" 6 | ) 7 | 8 | var instance *cache.Cache 9 | 10 | func GetInstance() *cache.Cache { 11 | // Memory Cache Singleton - Used to store key / values into container memory 12 | if instance == nil { 13 | instance = cache.New(5*time.Minute, 10*time.Minute) 14 | } 15 | return instance 16 | } 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM fidelissauro/apko-go:latest-amd64 AS builder 2 | 3 | WORKDIR /root/src/chip 4 | 5 | COPY . ./ 6 | 7 | RUN go install github.com/swaggo/swag/cmd/swag@v1.7.8 8 | 9 | RUN go get -u 10 | 11 | RUN swag init 12 | 13 | RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . 14 | 15 | 16 | FROM fidelissauro/apko-run:latest-amd64 17 | 18 | COPY --from=builder /root/src/chip/main ./ 19 | 20 | EXPOSE 8080 21 | 22 | ENTRYPOINT ["./main"] 23 | -------------------------------------------------------------------------------- /controllers/version/main.go: -------------------------------------------------------------------------------- 1 | package version 2 | 3 | import ( 4 | "net/http" 5 | "os" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | // Get godoc 11 | // @Summary Return version for container 12 | // @Produce json 13 | // @Tags Version 14 | // @Router /version [get] 15 | func Get(c *gin.Context) { 16 | 17 | version := os.Getenv("VERSION") 18 | if version == "" { 19 | version = "v2" 20 | } 21 | 22 | c.JSON(http.StatusOK, gin.H{ 23 | "version": version, 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /controllers/filesystem/delete.go: -------------------------------------------------------------------------------- 1 | package filesystem 2 | 3 | import ( 4 | "net/http" 5 | "os" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | type RequestDelete struct { 11 | Path string `json:"path"` 12 | } 13 | 14 | func DeleteFile(c *gin.Context) { 15 | var request RequestDelete 16 | if err := c.ShouldBindJSON(&request); err != nil { 17 | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 18 | return 19 | } 20 | if err := os.Remove(request.Path); err != nil { 21 | c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) 22 | return 23 | } 24 | c.JSON(http.StatusOK, gin.H{"message": "file deleted"}) 25 | } 26 | -------------------------------------------------------------------------------- /controllers/filesystem/cat.go: -------------------------------------------------------------------------------- 1 | package filesystem 2 | 3 | import ( 4 | "net/http" 5 | "os" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | type RequestCat struct { 11 | Path string `json:"path"` 12 | } 13 | 14 | func Cat(c *gin.Context) { 15 | var request RequestCat 16 | 17 | if err := c.ShouldBindJSON(&request); err != nil { 18 | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 19 | return 20 | } 21 | 22 | content, err := os.ReadFile(request.Path) 23 | if err != nil { 24 | c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) 25 | return 26 | } 27 | 28 | c.String(http.StatusOK, string(content)) 29 | } 30 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.2" 2 | services: 3 | chip: 4 | build: 5 | context: ./ 6 | dockerfile: Dockerfile.dev 7 | environment: 8 | - ENVIRONMENT=dev 9 | - VERSION=v1 10 | - READINESS_PROBE_MOCK_TIME_IN_SECONDS=10 11 | - CHAOS_MONKEY_ENABLED=true 12 | - CHAOS_MONKEY_MODE=critical 13 | - CHAOS_MONKEY_LATENCY=true 14 | - CHAOS_MONKEY_LATENCY_MAX_TIME=5000 15 | - CHAOS_MONKEY_LATENCY_MIN_TIME=2000 16 | - CHAOS_MONKEY_EXCEPTION=true 17 | - CHAOS_MONKEY_APP_KILLER=true 18 | - CHAOS_MONKEY_MEMORY=true 19 | ports: 20 | - 8080:8080 21 | volumes: 22 | - ./:/go/src/chip -------------------------------------------------------------------------------- /controllers/teapot/main.go: -------------------------------------------------------------------------------- 1 | package teapot 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/gin-gonic/gin" 7 | ) 8 | 9 | type Teapot struct { 10 | Body string 11 | } 12 | 13 | // Teapot godoc 14 | // @Summary Return 200 status Teapot in Teapot 15 | // @Tags ImATeaPot 16 | // @Produce plain 17 | // @Success 200 {object} Teapot 18 | // @Router /whoami [get] 19 | func Get(c *gin.Context) { 20 | 21 | var response Teapot 22 | 23 | response.Body = "" + 24 | " ;,'\n" + 25 | " _o_ ;:;'\n" + 26 | " ,-.'---`.__ ;\n" + 27 | "((j`=====',-'\n" + 28 | " `-\\ /\n" + 29 | " `-=-' " 30 | 31 | c.String(http.StatusTeapot, response.Body) 32 | } 33 | -------------------------------------------------------------------------------- /controllers/system/main.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "chip/libs/system" 5 | "net/http" 6 | "os" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | // // System godoc 12 | // // @Summary Return 500 Error Status Code 13 | // // @Tags System 14 | // // @Produce json 15 | // // @Success 200 {object} system.Capabilities 16 | // // @Router /system [get] 17 | func System(c *gin.Context) { 18 | 19 | var info = system.Info() 20 | c.JSON(http.StatusOK, info) 21 | } 22 | 23 | // Environment godoc 24 | // @Summary Dump all environment variables in container 25 | // @Produce json 26 | // @Tags System 27 | // @Router /system/environment [get] 28 | func Environment(c *gin.Context) { 29 | c.JSON(http.StatusOK, os.Environ()) 30 | } 31 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module chip 2 | 3 | go 1.15 4 | 5 | require ( 6 | github.com/Depado/ginprom v1.7.0 7 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 8 | github.com/bxcodec/faker/v3 v3.6.0 9 | github.com/gin-contrib/logger v0.2.0 10 | github.com/gin-gonic/gin v1.9.1 11 | github.com/go-openapi/jsonreference v0.19.6 // indirect 12 | github.com/go-openapi/spec v0.20.3 // indirect 13 | github.com/go-openapi/swag v0.19.15 // indirect 14 | github.com/mailru/easyjson v0.7.7 // indirect 15 | github.com/msfidelis/gin-chaos-monkey v0.0.5 16 | github.com/patrickmn/go-cache v2.1.0+incompatible 17 | github.com/rs/zerolog v1.23.0 18 | github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 19 | github.com/swaggo/gin-swagger v1.2.0 20 | github.com/swaggo/swag v1.6.7 21 | ) 22 | -------------------------------------------------------------------------------- /controllers/liveness/main.go: -------------------------------------------------------------------------------- 1 | package liveness 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/gin-gonic/gin" 7 | ) 8 | 9 | type Liveness struct { 10 | Status string `json:"status" binding:"required"` 11 | } 12 | 13 | // Ok godoc 14 | // @Summary Return 200 status Ok in Liveness 15 | // @Tags Liveness 16 | // @Produce json 17 | // @Success 200 {object} Liveness 18 | // @Router /liveness [get] 19 | func Ok(c *gin.Context) { 20 | var response Liveness 21 | response.Status = "Live" 22 | c.JSON(http.StatusOK, response) 23 | } 24 | 25 | // Error godoc 26 | // @Summary Return 500 Error Status Code 27 | // @Tags Liveness 28 | // @Produce json 29 | // @Success 200 {object} Liveness 30 | // @Error 503 {object} Liveness 31 | // @Router /liveness/error [get] 32 | func Error(c *gin.Context) { 33 | var response Liveness 34 | response.Status = "Dead" 35 | c.JSON(http.StatusServiceUnavailable, response) 36 | } 37 | -------------------------------------------------------------------------------- /libs/reflect/main.go: -------------------------------------------------------------------------------- 1 | package reflect 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | ) 6 | 7 | type Request struct { 8 | Method string `json:"method" binding:"required"` 9 | Params string `json:"params" binding:"required"` 10 | Headers map[string][]string `json:"headers" binding:"required"` 11 | // Cookies []*http.Cookie `json:"cookies" binding:"required"` 12 | Body string `json:"body" binding:"required"` 13 | Path string `json:"path" binding:"required"` 14 | } 15 | 16 | func Read(c *gin.Context) Request { 17 | 18 | var request Request 19 | 20 | buf := make([]byte, 1024) 21 | num, _ := c.Request.Body.Read(buf) 22 | reqBody := string(buf[0:num]) 23 | 24 | request.Method = c.Request.Method 25 | request.Headers = c.Request.Header 26 | // request.Cookies = c.Request.Cookies() 27 | request.Path = c.Request.URL.Path 28 | request.Body = reqBody 29 | request.Params = c.Request.URL.RawQuery 30 | 31 | return request 32 | 33 | } 34 | -------------------------------------------------------------------------------- /controllers/ping/main.go: -------------------------------------------------------------------------------- 1 | package ping 2 | 3 | import ( 4 | "fmt" 5 | "net" 6 | "net/http" 7 | "time" 8 | 9 | "github.com/gin-gonic/gin" 10 | ) 11 | 12 | func Tcp(c *gin.Context) { 13 | 14 | host := c.Param("host") 15 | port := c.Param("port") 16 | connection_string := net.JoinHostPort(host, port) 17 | 18 | fmt.Println("Testing connection on: " + connection_string) 19 | 20 | conn, err := net.DialTimeout("tcp", connection_string, 3*time.Second) 21 | defer conn.Close() 22 | 23 | if err != nil { 24 | fmt.Println("Error in connection:", err) 25 | 26 | c.JSON(http.StatusOK, gin.H{ 27 | "host": host, 28 | "port": port, 29 | "protocol": "tcp", 30 | "status": "error to connect", 31 | }) 32 | 33 | } else { 34 | fmt.Println("Success to connect: " + connection_string) 35 | c.JSON(http.StatusOK, gin.H{ 36 | "host": host, 37 | "port": port, 38 | "protocol": "tcp", 39 | "status": "connected", 40 | }) 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /controllers/filesystem/write.go: -------------------------------------------------------------------------------- 1 | package filesystem 2 | 3 | import ( 4 | "encoding/base64" 5 | "net/http" 6 | "os" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | type RequestWrite struct { 12 | Path string `json:"path"` 13 | Content string `json:"content"` 14 | } 15 | 16 | func WriteFile(c *gin.Context) { 17 | var request RequestWrite 18 | 19 | if err := c.ShouldBindJSON(&request); err != nil { 20 | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 21 | return 22 | } 23 | 24 | decodedContent, err := base64.StdEncoding.DecodeString(request.Content) 25 | if err != nil { 26 | c.JSON(http.StatusBadRequest, gin.H{"error": "invalid base64 content"}) 27 | return 28 | } 29 | 30 | err = os.WriteFile(request.Path, decodedContent, 0644) 31 | if err != nil { 32 | c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) 33 | return 34 | } 35 | 36 | c.JSON(http.StatusAccepted, gin.H{"message": "file written", "path": request.Path}) 37 | } 38 | -------------------------------------------------------------------------------- /controllers/filesystem/ls.go: -------------------------------------------------------------------------------- 1 | package filesystem 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "os" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | type RequestLs struct { 12 | Path string `json:"path"` 13 | } 14 | 15 | type ResponseLs struct { 16 | Path string `json:"path"` 17 | Files []string `json:"files"` 18 | } 19 | 20 | func Ls(c *gin.Context) { 21 | 22 | var request RequestLs 23 | var response ResponseLs 24 | 25 | if err := c.ShouldBindJSON(&request); err != nil { 26 | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 27 | return 28 | } 29 | 30 | files, err := os.ReadDir(request.Path) 31 | if err != nil { 32 | c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) 33 | return 34 | } 35 | 36 | var fileNames []string 37 | for _, file := range files { 38 | fileNames = append(fileNames, file.Name()) 39 | } 40 | 41 | fmt.Println(files) 42 | 43 | response.Path = request.Path 44 | response.Files = fileNames 45 | 46 | c.JSON(200, response) 47 | } 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Matheus Fidelis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /controllers/readiness/main.go: -------------------------------------------------------------------------------- 1 | package readiness 2 | 3 | import ( 4 | "chip/libs/memory_cache" 5 | "github.com/gin-gonic/gin" 6 | "net/http" 7 | ) 8 | 9 | type Readiness struct { 10 | Status string `json:"status" binding:"required"` 11 | } 12 | 13 | // Ok godoc 14 | // @Summary Return 200 status Ok in Readiness 15 | // @Tags Readiness 16 | // @Produce json 17 | // @Success 200 {object} Readiness 18 | // @Router /readiness [get] 19 | func Ok(c *gin.Context) { 20 | 21 | m := memory_cache.GetInstance() 22 | var response Readiness 23 | 24 | _, found := m.Get("readiness.ok") 25 | if found { 26 | response.Status = "NotReady" 27 | c.JSON(http.StatusServiceUnavailable, response) 28 | } else { 29 | response.Status = "Ready" 30 | c.JSON(http.StatusOK, response) 31 | } 32 | 33 | } 34 | 35 | // Error godoc 36 | // @Summary Return 500 Error Status Code 37 | // @Tags Readiness 38 | // @Produce json 39 | // @Success 200 {object} Readiness 40 | // @Error 503 {object} Readiness 41 | // @Router /readiness/error [get] 42 | func Error(c *gin.Context) { 43 | var response Readiness 44 | response.Status = "NotReady" 45 | c.JSON(http.StatusServiceUnavailable, response) 46 | } 47 | -------------------------------------------------------------------------------- /libs/system/main.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "runtime" 7 | ) 8 | 9 | type Capabilities struct { 10 | Hostname string `json:"hostname" binding:"required"` 11 | Cpus int `json:"cpus" binding:"required"` 12 | Os string `json:"os" binding:"required"` 13 | Hypervisor string `json:"hypervisor" binding:"required"` 14 | Ram struct { 15 | AllocMiB uint64 `json:"alloc_MiB"` 16 | SystemMiB uint64 `json:"system_MiB"` 17 | Gc uint32 `json:"gc"` 18 | } `json:"memory"` 19 | } 20 | 21 | func Info() Capabilities { 22 | 23 | var capabilities Capabilities 24 | // Memory 25 | var m runtime.MemStats 26 | runtime.ReadMemStats(&m) 27 | 28 | // Hostname 29 | hostname, err := os.Hostname() 30 | if err != nil { 31 | fmt.Println(err) 32 | os.Exit(1) 33 | } 34 | 35 | capabilities.Hostname = hostname 36 | capabilities.Cpus = runtime.NumCPU() 37 | 38 | capabilities.Ram.AllocMiB = bToMb(m.TotalAlloc) 39 | capabilities.Ram.SystemMiB = bToMb(bToMb(m.Sys)) 40 | capabilities.Ram.Gc = m.NumGC 41 | 42 | return capabilities 43 | 44 | } 45 | 46 | func bToMb(b uint64) uint64 { 47 | return b / 1024 / 1024 48 | } 49 | -------------------------------------------------------------------------------- /controllers/burn/main.go: -------------------------------------------------------------------------------- 1 | package burn 2 | 3 | import ( 4 | "net/http" 5 | "runtime" 6 | "time" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | // Cpu godoc 12 | // @Summary Burn CPU for Loadtests and Auto Scaling Tests 13 | // @Produce json 14 | // @Tags Loadtest 15 | // @Router /burn/cpu [get] 16 | func Cpu(c *gin.Context) { 17 | 18 | n := runtime.NumCPU() 19 | runtime.GOMAXPROCS(n) 20 | 21 | quit := make(chan bool) 22 | 23 | for i := 0; i < n; i++ { 24 | go func() { 25 | for { 26 | select { 27 | case <-quit: 28 | return 29 | default: 30 | } 31 | } 32 | }() 33 | } 34 | 35 | time.Sleep(3 * time.Second) 36 | for i := 0; i < n; i++ { 37 | quit <- true 38 | } 39 | 40 | c.JSON(http.StatusOK, gin.H{ 41 | "status": "On Fire", 42 | }) 43 | 44 | } 45 | 46 | // Cpu godoc 47 | // @Summary Burn RAM for Loadtests and Auto Scaling Tests 48 | // @Produce json 49 | // @Tags Loadtest 50 | // @Router /burn/ram [get] 51 | func Mem(c *gin.Context) { 52 | 53 | var s []int 54 | 55 | sum := 1 56 | for sum < 9999998 { 57 | sum += 1 58 | s = append(s, sum) 59 | } 60 | 61 | c.JSON(http.StatusOK, gin.H{ 62 | "status": "On Fire", 63 | }) 64 | 65 | } 66 | -------------------------------------------------------------------------------- /controllers/proxy/main.go: -------------------------------------------------------------------------------- 1 | package proxy 2 | 3 | import ( 4 | "chip/libs/httpclient" 5 | "net/http" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | type Request struct { 11 | Method string `json:"method"` 12 | Host string `json:"host"` 13 | Path string `json:"path"` 14 | Headers []struct { 15 | Name string `json:"name"` 16 | Value string `json:"value"` 17 | } `json:"headers"` 18 | Body string `json:"body"` 19 | } 20 | 21 | type Response struct { 22 | StatusCode int `json:"status_code"` 23 | Body string `json:"body"` 24 | Headers map[string][]string `json:"headers"` 25 | } 26 | 27 | // Proxy godoc 28 | // @Summary Proxy Request 29 | // @Tags Proxy 30 | // @Produce json 31 | // @Param message body Request true "Proxy Information" 32 | // @Success 200 {object} Response 33 | // @Router /proxy [post] 34 | func Post(c *gin.Context) { 35 | 36 | var request Request 37 | var response Response 38 | 39 | if err := c.ShouldBindJSON(&request); err != nil { 40 | c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) 41 | return 42 | } 43 | 44 | headers := make(map[string][]string) 45 | for _, header := range request.Headers { 46 | headers[header.Name] = append(headers[header.Name], header.Value) 47 | } 48 | 49 | res, body := httpclient.Request(request.Method, request.Host, request.Path, headers, request.Body) 50 | 51 | response.StatusCode = res.StatusCode 52 | response.Body = body 53 | response.Headers = res.Header 54 | 55 | c.JSON(http.StatusOK, response) 56 | } 57 | -------------------------------------------------------------------------------- /libs/httpclient/main.go: -------------------------------------------------------------------------------- 1 | package httpclient 2 | 3 | import ( 4 | "chip/libs/logger" 5 | "crypto/tls" 6 | "fmt" 7 | "io/ioutil" 8 | "net/http" 9 | "net/url" 10 | "strings" 11 | ) 12 | 13 | func Request(method string, host string, path string, headers map[string][]string, body string) (*http.Response, string) { 14 | 15 | log := logger.Instance() 16 | log.Info(). 17 | Str("action", "proxy"). 18 | Str("method", strings.ToUpper(method)). 19 | Str("host", host). 20 | Str("path", path). 21 | Str("body", body). 22 | Msg("Execution an HTTP request as proxy") 23 | 24 | reqURL, _ := url.Parse(fmt.Sprintf("%s%s", host, path)) 25 | reqBody := ioutil.NopCloser(strings.NewReader(body)) 26 | 27 | http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} 28 | req := &http.Request{ 29 | Method: strings.ToUpper(method), 30 | URL: reqURL, 31 | Header: headers, 32 | Body: reqBody, 33 | } 34 | 35 | res, err := http.DefaultClient.Do(req) 36 | 37 | if err != nil { 38 | log.Error(). 39 | Str("action", "proxy"). 40 | Str("method", strings.ToUpper(method)). 41 | Str("host", host). 42 | Str("path", path). 43 | Str("body", body). 44 | Str("error", err.Error()). 45 | Msg("Error during request execution") 46 | } 47 | 48 | data, _ := ioutil.ReadAll(res.Body) 49 | res.Body.Close() 50 | 51 | log.Info(). 52 | Str("action", "proxy"). 53 | Str("method", strings.ToUpper(method)). 54 | Str("host", host). 55 | Str("path", path). 56 | Str("body", string(data)). 57 | Int("status_code", res.StatusCode). 58 | Msg("Success on request execution") 59 | 60 | return res, string(data) 61 | 62 | } 63 | -------------------------------------------------------------------------------- /controllers/reflection/main.go: -------------------------------------------------------------------------------- 1 | package reflection 2 | 3 | import ( 4 | "chip/libs/reflect" 5 | "net/http" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | // Get godoc 11 | // @Summary Retun request parameters in response for transformation tests 12 | // @Tags Reflection 13 | // @Produce json 14 | // @Success 200 {object} reflect.Request 15 | // @Router /reflection [get] 16 | func Get(c *gin.Context) { 17 | request := reflect.Read(c) 18 | c.JSON(http.StatusOK, request) 19 | } 20 | 21 | // Post godoc 22 | // @Summary Retun request parameters in response for transformation tests 23 | // @Tags Reflection 24 | // @Produce json 25 | // @Success 200 {object} reflect.Request 26 | // @Router /reflection [post] 27 | func Post(c *gin.Context) { 28 | request := reflect.Read(c) 29 | c.JSON(http.StatusOK, request) 30 | } 31 | 32 | // Put godoc 33 | // @Summary Retun request parameters in response for transformation tests 34 | // @Tags Reflection 35 | // @Produce json 36 | // @Success 200 {object} reflect.Request 37 | // @Router /reflection [put] 38 | func Put(c *gin.Context) { 39 | request := reflect.Read(c) 40 | c.JSON(http.StatusOK, request) 41 | } 42 | 43 | // Patch godoc 44 | // @Summary Retun request parameters in response for transformation tests 45 | // @Tags Reflection 46 | // @Produce json 47 | // @Success 200 {object} reflect.Request 48 | // @Router /reflection [patch] 49 | func Patch(c *gin.Context) { 50 | request := reflect.Read(c) 51 | c.JSON(http.StatusOK, request) 52 | } 53 | 54 | // Delete godoc 55 | // @Summary Retun request parameters in response for transformation tests 56 | // @Tags Reflection 57 | // @Produce json 58 | // @Success 200 {object} reflect.Request 59 | // @Router /reflection [delete] 60 | func Delete(c *gin.Context) { 61 | request := reflect.Read(c) 62 | c.JSON(http.StatusOK, request) 63 | } 64 | -------------------------------------------------------------------------------- /kubernetes/contour/deploy.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | annotations: 5 | linkerd.io/inject: enabled 6 | name: chip 7 | --- 8 | apiVersion: apps/v1 9 | kind: Deployment 10 | metadata: 11 | labels: 12 | name: chip 13 | name: chip 14 | namespace: chip 15 | spec: 16 | replicas: 3 17 | selector: 18 | matchLabels: 19 | name: chip 20 | template: 21 | metadata: 22 | annotations: 23 | linkerd.io/inject: enabled 24 | labels: 25 | name: chip 26 | spec: 27 | containers: 28 | - image: msfidelis/chip:v2 29 | imagePullPolicy: Always 30 | name: chip 31 | ports: 32 | - containerPort: 8080 33 | name: http 34 | readinessProbe: 35 | httpGet: 36 | path: /healthcheck 37 | port: 8080 38 | resources: 39 | requests: 40 | cpu: 256m 41 | memory: 512m 42 | terminationGracePeriodSeconds: 60 43 | --- 44 | kind: Service 45 | apiVersion: v1 46 | metadata: 47 | name: chip 48 | namespace: chip 49 | spec: 50 | selector: 51 | name: chip 52 | ports: 53 | - protocol: TCP 54 | port: 8080 55 | name: web 56 | type: ClusterIP 57 | 58 | --- 59 | apiVersion: extensions/v1beta1 60 | kind: Ingress 61 | metadata: 62 | name: chip 63 | namespace: chip 64 | annotations: 65 | cert-manager.io/cluster-issuer: letsencrypt-prod 66 | ingress.kubernetes.io/force-ssl-redirect: "false" 67 | kubernetes.io/ingress.class: contour 68 | kubernetes.io/tls-acme: "true" 69 | spec: 70 | tls: 71 | - secretName: chip 72 | hosts: 73 | - chip.raj.ninja 74 | rules: 75 | - http: 76 | paths: 77 | - backend: 78 | serviceName: chip 79 | servicePort: 8080 80 | --- 81 | apiVersion: projectcontour.io/v1 82 | kind: HTTPProxy 83 | metadata: 84 | name: chip 85 | namespace: chip 86 | spec: 87 | virtualhost: 88 | fqdn: chip.raj.ninja 89 | tls: 90 | secretName: chip 91 | routes: 92 | - services: 93 | - name: chip 94 | port: 8080 95 | --- 96 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: 'chip ci' 2 | on: 3 | push: 4 | jobs: 5 | unit-test: 6 | strategy: 7 | matrix: 8 | go-version: [1.22.x] 9 | platform: [ubuntu-latest] 10 | runs-on: ${{ matrix.platform }} 11 | steps: 12 | 13 | - uses: actions/setup-go@v1 14 | with: 15 | go-version: ${{ matrix.go-version }} 16 | 17 | - name: setup GOPATH into PATH 18 | run: | 19 | echo "::set-env name=GOPATH::$(go env GOPATH)" 20 | echo "::add-path::$(go env GOPATH)/bin" 21 | shell: bash 22 | env: 23 | ACTIONS_ALLOW_UNSECURE_COMMANDS: true 24 | 25 | - uses: actions/checkout@v2 26 | 27 | - name: Install dependencies 28 | run: go get -u 29 | 30 | # - name: Run's Golint 31 | # run: | 32 | # export PATH=$PATH:$(go env GOPATH)/bin 33 | # go get -u golang.org/x/lint/golint 34 | # golint -set_exit_status ./... 35 | # - name: Test 36 | # run: go test -v 37 | 38 | build-docker-artifacts: 39 | needs: [ unit-test ] 40 | runs-on: ubuntu-latest 41 | if: contains(github.ref, 'main') 42 | steps: 43 | - uses: actions/setup-go@v1 44 | with: 45 | go-version: '1.22.x' 46 | 47 | - uses: actions/checkout@v1 48 | 49 | - name: Docker Build 50 | run: docker build -t chip:latest . 51 | 52 | - name: Docker Tag Latest 53 | run: docker tag chip:latest fidelissauro/chip:latest 54 | 55 | - name: Docker Tag V1 56 | run: docker tag chip:latest fidelissauro/chip:v1 57 | 58 | - name: Docker Tag V2 59 | run: docker tag chip:latest fidelissauro/chip:v2 60 | 61 | - name: Login to DockerHub 62 | uses: docker/login-action@v1 63 | with: 64 | username: ${{ secrets.DOCKER_USERNAME }} 65 | password: ${{ secrets.DOCKER_PASSWORD}} 66 | 67 | - name: Docker Push Latest 68 | run: docker push fidelissauro/chip:latest 69 | 70 | - name: Docker Push v1 71 | run: docker push fidelissauro/chip:v1 72 | 73 | - name: Docker Push v2 74 | run: docker push fidelissauro/chip:v2 -------------------------------------------------------------------------------- /controllers/healthcheck/main.go: -------------------------------------------------------------------------------- 1 | package healthcheck 2 | 3 | import ( 4 | "math/rand" 5 | "net/http" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | type Healthcheck struct { 11 | Status int `json:"status" binding:"required"` 12 | Description string `json:"description" binding:"required"` 13 | } 14 | 15 | // Ok godoc 16 | // @Summary Return 200 status Ok in healthcheck 17 | // @Tags Healthcheck 18 | // @Produce json 19 | // @Success 200 {object} Healthcheck 20 | // @Router /healthcheck [get] 21 | func Ok(c *gin.Context) { 22 | 23 | var response Healthcheck 24 | response.Status = http.StatusOK 25 | response.Description = "default" 26 | 27 | c.JSON(http.StatusOK, response) 28 | } 29 | 30 | // FaultRandom godoc 31 | // @Summary Inject common errors in healthcheck 32 | // @Tags Healthcheck 33 | // @Produce json 34 | // @Router /healthcheck/fault [get] 35 | // @Success 200 {object} Healthcheck 36 | // @Error 503 {object} Healthcheck 37 | // @Tag healthcheck 38 | func FaultRandom(c *gin.Context) { 39 | var response Healthcheck 40 | 41 | status := []int{ 42 | http.StatusServiceUnavailable, 43 | http.StatusOK, 44 | } 45 | 46 | n := rand.Int() % len(status) 47 | 48 | response.Status = status[n] 49 | response.Description = "fault injection" 50 | 51 | c.JSON(status[n], response) 52 | } 53 | 54 | // FaultSoft godoc 55 | // @Summary Inject ocasional erros in healthcheck 56 | // @Tags Healthcheck 57 | // @Produce json 58 | // @Success 200 {object} Healthcheck 59 | // @Error 503 {object} Healthcheck 60 | // @Router /healthcheck/fault/soft [get] 61 | func FaultSoft(c *gin.Context) { 62 | var response Healthcheck 63 | status := []int{ 64 | http.StatusServiceUnavailable, 65 | http.StatusOK, 66 | http.StatusOK, 67 | http.StatusOK, 68 | http.StatusOK, 69 | http.StatusOK, 70 | http.StatusOK, 71 | http.StatusOK, 72 | http.StatusOK, 73 | http.StatusOK, 74 | http.StatusOK, 75 | http.StatusOK, 76 | } 77 | 78 | n := rand.Int() % len(status) 79 | 80 | response.Status = status[n] 81 | response.Description = "fault injection - soft mode with ocasional failures" 82 | 83 | c.JSON(status[n], response) 84 | } 85 | 86 | // Error godoc 87 | // @Summary Return 500 Error Status Code 88 | // @Tags Healthcheck 89 | // @Produce json 90 | // @Success 200 {object} Healthcheck 91 | // @Error 503 {object} Healthcheck 92 | // @Router /healthcheck/error [get] 93 | func Error(c *gin.Context) { 94 | var response Healthcheck 95 | response.Status = http.StatusServiceUnavailable 96 | response.Description = "intentional error" 97 | c.JSON(http.StatusServiceUnavailable, response) 98 | } 99 | -------------------------------------------------------------------------------- /controllers/logging/main.go: -------------------------------------------------------------------------------- 1 | package logging 2 | 3 | import ( 4 | "chip/libs/logger" 5 | "fmt" 6 | "net/http" 7 | "strconv" 8 | 9 | "github.com/bxcodec/faker/v3" 10 | "github.com/gin-gonic/gin" 11 | ) 12 | 13 | type response struct { 14 | Status int `json:"status" binding:"required"` 15 | Message string `json:"message" binding:"required"` 16 | } 17 | 18 | type fake struct { 19 | UserName string `faker:"username"` 20 | PhoneNumber string `faker:"phone_number"` 21 | IPV4 string `faker:"ipv4"` 22 | IPV6 string `faker:"ipv6"` 23 | MacAddress string `faker:"mac_address"` 24 | URL string `faker:"url"` 25 | DayOfWeek string `faker:"day_of_week"` 26 | DayOfMonth string `faker:"day_of_month"` 27 | Timestamp string `faker:"timestamp"` 28 | Century string `faker:"century"` 29 | TimeZone string `faker:"timezone"` 30 | TimePeriod string `faker:"time_period"` 31 | Word string `faker:"word"` 32 | Sentence string `faker:"sentence"` 33 | Paragraph string `faker:"paragraph"` 34 | Currency string `faker:"currency"` 35 | Amount float64 `faker:"amount"` 36 | AmountWithCurrency string `faker:"amount_with_currency"` 37 | UUIDHypenated string `faker:"uuid_hyphenated"` 38 | UUID string `faker:"uuid_digit"` 39 | PaymentMethod string `faker:"oneof: cc, paypal, check, money order"` 40 | } 41 | 42 | // Logs godoc 43 | // @Summary Sent log events to application stdout 44 | // @Tags Logging 45 | // @Produce json 46 | // @Param events query string false "Number of log events; default 1000" 47 | // @Success 200 {object} response 48 | // @Router /logging [get] 49 | func Get(c *gin.Context) { 50 | log := logger.Instance() 51 | 52 | events := c.DefaultQuery("events", "1000") 53 | 54 | intEvents, err := strconv.Atoi(events) 55 | 56 | if err != nil { 57 | fmt.Println(err) 58 | } 59 | 60 | for i := 0; i < intEvents; i++ { 61 | 62 | a := fake{} 63 | err := faker.FakeData(&a) 64 | if err != nil { 65 | fmt.Println(err) 66 | } 67 | 68 | log.Info(). 69 | Str("username", a.UserName). 70 | Str("phone", a.PhoneNumber). 71 | Str("mac_address", a.MacAddress). 72 | Str("ipv4", a.IPV4). 73 | Str("ipv6", a.IPV6). 74 | Str("url", a.URL). 75 | Str("day_of_week", a.DayOfWeek). 76 | Str("day_of_month", a.DayOfMonth). 77 | Str("timestamp", a.Timestamp). 78 | Str("century", a.Century). 79 | Str("timezone", a.TimeZone). 80 | Str("period", a.TimePeriod). 81 | Str("word", a.Word). 82 | Str("message", a.Sentence). 83 | Str("paragraph", a.Paragraph). 84 | Str("currency", a.Currency). 85 | Str("id", a.UUID). 86 | Str("transaction", a.UUIDHypenated). 87 | Str("amount", a.AmountWithCurrency). 88 | Str("payment_method", a.PaymentMethod). 89 | Msg("Mock log") 90 | } 91 | 92 | var res response 93 | res.Message = fmt.Sprintf("%v logging events sent to stdout", events) 94 | res.Status = http.StatusOK 95 | c.JSON(http.StatusOK, res) 96 | } 97 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "chip/controllers/burn" 5 | "chip/controllers/filesystem" 6 | "chip/controllers/healthcheck" 7 | "chip/controllers/liveness" 8 | "chip/controllers/logging" 9 | "chip/controllers/ping" 10 | "chip/controllers/proxy" 11 | "chip/controllers/readiness" 12 | "chip/controllers/reflection" 13 | "chip/controllers/system" 14 | 15 | // "chip/controllers/system" 16 | "chip/controllers/teapot" 17 | "chip/controllers/version" 18 | loggerInternal "chip/libs/logger" 19 | "context" 20 | "fmt" 21 | "net/http" 22 | "os" 23 | "os/signal" 24 | "strconv" 25 | "syscall" 26 | "time" 27 | 28 | "github.com/Depado/ginprom" 29 | "github.com/gin-contrib/logger" 30 | "github.com/gin-gonic/gin" 31 | "github.com/rs/zerolog" 32 | "github.com/rs/zerolog/log" 33 | 34 | // "github.com/patrickmn/go-cache" 35 | "chip/libs/memory_cache" 36 | 37 | chaos "github.com/msfidelis/gin-chaos-monkey" 38 | 39 | swaggerFiles "github.com/swaggo/files" 40 | ginSwagger "github.com/swaggo/gin-swagger" 41 | 42 | _ "chip/docs" 43 | ) 44 | 45 | // @title Chip 46 | // @version 1.0 47 | // @description Cloud Native Toolset Running in Containers. 48 | // @termsOfService http://swagger.io/terms/ 49 | 50 | // @contact.name API Support 51 | // @contact.email matheus@nanoshots.com.br 52 | 53 | // @license.name MIT 54 | // @license.url https://github.com/mfidelis/chip/blob/master/LICENSE 55 | 56 | // @BasePath / 57 | func main() { 58 | 59 | router := gin.New() 60 | 61 | // Logger 62 | zerolog.SetGlobalLevel(zerolog.InfoLevel) 63 | if gin.IsDebugging() { 64 | zerolog.SetGlobalLevel(zerolog.DebugLevel) 65 | } 66 | 67 | log.Logger = log.Output( 68 | zerolog.ConsoleWriter{ 69 | Out: os.Stderr, 70 | NoColor: false, 71 | }, 72 | ) 73 | 74 | // Memory Cache Singleton 75 | c := memory_cache.GetInstance() 76 | 77 | // Readiness Probe Mock Config 78 | probe_time_raw := os.Getenv("READINESS_PROBE_MOCK_TIME_IN_SECONDS") 79 | if probe_time_raw == "" { 80 | probe_time_raw = "5" 81 | } 82 | probe_time, err := strconv.ParseUint(probe_time_raw, 10, 64) 83 | if err != nil { 84 | fmt.Println("Environment variable READINESS_PROBE_MOCK_TIME_IN_SECONDS conversion error", err) 85 | } 86 | c.Set("readiness.ok", "false", time.Duration(probe_time)*time.Second) 87 | 88 | // Prometheus Exporter Config 89 | p := ginprom.New( 90 | ginprom.Engine(router), 91 | ginprom.Subsystem("gin"), 92 | ginprom.Path("/metrics"), 93 | ) 94 | 95 | // Logger 96 | logInternal := loggerInternal.Instance() 97 | 98 | //Middlewares 99 | router.Use(p.Instrument()) 100 | router.Use(gin.Recovery()) 101 | router.Use(chaos.Load()) 102 | router.Use(logger.SetLogger( 103 | logger.WithSkipPath([]string{"/skip"}), 104 | logger.WithUTC(true), 105 | // logger.WithLogger(func(c *gin.Context, out io.Writer, latency time.Duration) zerolog.Logger { 106 | // return zerolog.New(out).With(). 107 | // Str("method", c.Request.Method). 108 | // Str("path", c.Request.URL.Path). 109 | // Dur("latency", latency). 110 | // Logger() 111 | // }), 112 | )) 113 | 114 | //Swagger 115 | router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) 116 | 117 | // Healthcheck 118 | router.GET("/healthcheck", healthcheck.Ok) 119 | router.GET("/healthcheck/fault", healthcheck.FaultRandom) 120 | router.GET("/healthcheck/fault/soft", healthcheck.FaultSoft) 121 | router.GET("/healthcheck/error", healthcheck.Error) 122 | 123 | // Liveness 124 | router.GET("/liveness", liveness.Ok) 125 | router.GET("/liveness/error", liveness.Error) 126 | 127 | // Readinesscurl 128 | router.GET("/readiness", readiness.Ok) 129 | router.GET("/readiness/error", readiness.Error) 130 | 131 | // Version 132 | router.GET("/version", version.Get) 133 | 134 | // // System 135 | router.GET("/system", system.System) 136 | router.GET("/system/environment", system.Environment) 137 | 138 | // Stress Test 139 | router.GET("/burn/cpu", burn.Cpu) 140 | router.GET("/burn/ram", burn.Mem) 141 | 142 | // Reflection - DEPRECATED 143 | router.GET("/reflection", reflection.Get) 144 | router.POST("/reflection", reflection.Post) 145 | router.PUT("/reflection", reflection.Put) 146 | router.PATCH("/reflection", reflection.Patch) 147 | router.DELETE("/reflection", reflection.Delete) 148 | 149 | // Echo 150 | router.GET("/echo", reflection.Get) 151 | router.POST("/echo", reflection.Post) 152 | router.PUT("/echo", reflection.Put) 153 | router.PATCH("/echo", reflection.Patch) 154 | router.DELETE("/echo", reflection.Delete) 155 | 156 | // Logging 157 | router.GET("/logging", logging.Get) 158 | 159 | //Ping 160 | router.GET("/ping/:host/:port", ping.Tcp) 161 | 162 | // I'am a Teapot 163 | router.GET("/whoami", teapot.Get) 164 | 165 | // Proxy 166 | router.POST("/proxy", proxy.Post) 167 | 168 | // Filesystem 169 | router.POST("/filesystem/ls", filesystem.Ls) 170 | router.POST("/filesystem/cat", filesystem.Cat) 171 | router.POST("/filesystem/write", filesystem.WriteFile) 172 | router.DELETE("/filesystem/delete", filesystem.DeleteFile) 173 | 174 | // Graceful Shutdown Config 175 | srv := &http.Server{ 176 | Addr: ":8080", 177 | Handler: router, 178 | } 179 | 180 | go func() { 181 | if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { 182 | logInternal. 183 | Error(). 184 | Str("Error", err.Error()). 185 | Msg("Failed to listen") 186 | } 187 | }() 188 | 189 | quit := make(chan os.Signal, 1) 190 | 191 | signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) 192 | <-quit 193 | 194 | logInternal. 195 | Warn(). 196 | Msg("Shutting down server...") 197 | 198 | ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) 199 | defer cancel() 200 | 201 | if err := srv.Shutdown(ctx); err != nil { 202 | logInternal. 203 | Error(). 204 | Str("Error", err.Error()). 205 | Msg("Server forced to shutdown: ") 206 | } 207 | 208 | fmt.Println("Server exiting") 209 | 210 | } 211 | -------------------------------------------------------------------------------- /docs/swagger.yaml: -------------------------------------------------------------------------------- 1 | basePath: / 2 | definitions: 3 | healthcheck.Healthcheck: 4 | properties: 5 | description: 6 | type: string 7 | status: 8 | type: integer 9 | required: 10 | - description 11 | - status 12 | type: object 13 | liveness.Liveness: 14 | properties: 15 | status: 16 | type: string 17 | required: 18 | - status 19 | type: object 20 | logging.response: 21 | properties: 22 | message: 23 | type: string 24 | status: 25 | type: integer 26 | required: 27 | - message 28 | - status 29 | type: object 30 | proxy.Request: 31 | properties: 32 | body: 33 | type: string 34 | headers: 35 | items: 36 | properties: 37 | name: 38 | type: string 39 | value: 40 | type: string 41 | type: object 42 | type: array 43 | host: 44 | type: string 45 | method: 46 | type: string 47 | path: 48 | type: string 49 | type: object 50 | proxy.Response: 51 | properties: 52 | body: 53 | type: string 54 | headers: 55 | additionalProperties: 56 | items: 57 | type: string 58 | type: array 59 | type: object 60 | status_code: 61 | type: integer 62 | type: object 63 | readiness.Readiness: 64 | properties: 65 | status: 66 | type: string 67 | required: 68 | - status 69 | type: object 70 | reflect.Request: 71 | properties: 72 | body: 73 | description: Cookies []*http.Cookie `json:"cookies" binding:"required"` 74 | type: string 75 | headers: 76 | additionalProperties: 77 | items: 78 | type: string 79 | type: array 80 | type: object 81 | method: 82 | type: string 83 | params: 84 | type: string 85 | path: 86 | type: string 87 | required: 88 | - body 89 | - headers 90 | - method 91 | - params 92 | - path 93 | type: object 94 | teapot.Teapot: 95 | properties: 96 | body: 97 | type: string 98 | type: object 99 | info: 100 | contact: 101 | email: matheus@nanoshots.com.br 102 | name: API Support 103 | description: Cloud Native Toolset Running in Containers. 104 | license: 105 | name: MIT 106 | url: https://github.com/mfidelis/chip/blob/master/LICENSE 107 | termsOfService: http://swagger.io/terms/ 108 | title: Chip 109 | version: "1.0" 110 | paths: 111 | /burn/cpu: 112 | get: 113 | produces: 114 | - application/json 115 | responses: {} 116 | summary: Burn CPU for Loadtests and Auto Scaling Tests 117 | tags: 118 | - Loadtest 119 | /burn/ram: 120 | get: 121 | produces: 122 | - application/json 123 | responses: {} 124 | summary: Burn RAM for Loadtests and Auto Scaling Tests 125 | tags: 126 | - Loadtest 127 | /healthcheck: 128 | get: 129 | produces: 130 | - application/json 131 | responses: 132 | "200": 133 | description: OK 134 | schema: 135 | $ref: '#/definitions/healthcheck.Healthcheck' 136 | summary: Return 200 status Ok in healthcheck 137 | tags: 138 | - Healthcheck 139 | /healthcheck/error: 140 | get: 141 | produces: 142 | - application/json 143 | responses: 144 | "200": 145 | description: OK 146 | schema: 147 | $ref: '#/definitions/healthcheck.Healthcheck' 148 | summary: Return 500 Error Status Code 149 | tags: 150 | - Healthcheck 151 | /healthcheck/fault: 152 | get: 153 | produces: 154 | - application/json 155 | responses: 156 | "200": 157 | description: OK 158 | schema: 159 | $ref: '#/definitions/healthcheck.Healthcheck' 160 | summary: Inject common errors in healthcheck 161 | tags: 162 | - Healthcheck 163 | /healthcheck/fault/soft: 164 | get: 165 | produces: 166 | - application/json 167 | responses: 168 | "200": 169 | description: OK 170 | schema: 171 | $ref: '#/definitions/healthcheck.Healthcheck' 172 | summary: Inject ocasional erros in healthcheck 173 | tags: 174 | - Healthcheck 175 | /liveness: 176 | get: 177 | produces: 178 | - application/json 179 | responses: 180 | "200": 181 | description: OK 182 | schema: 183 | $ref: '#/definitions/liveness.Liveness' 184 | summary: Return 200 status Ok in Liveness 185 | tags: 186 | - Liveness 187 | /liveness/error: 188 | get: 189 | produces: 190 | - application/json 191 | responses: 192 | "200": 193 | description: OK 194 | schema: 195 | $ref: '#/definitions/liveness.Liveness' 196 | summary: Return 500 Error Status Code 197 | tags: 198 | - Liveness 199 | /logging: 200 | get: 201 | parameters: 202 | - description: Number of log events; default 1000 203 | in: query 204 | name: events 205 | type: string 206 | produces: 207 | - application/json 208 | responses: 209 | "200": 210 | description: OK 211 | schema: 212 | $ref: '#/definitions/logging.response' 213 | summary: Sent log events to application stdout 214 | tags: 215 | - Logging 216 | /proxy: 217 | post: 218 | parameters: 219 | - description: Proxy Information 220 | in: body 221 | name: message 222 | required: true 223 | schema: 224 | $ref: '#/definitions/proxy.Request' 225 | produces: 226 | - application/json 227 | responses: 228 | "200": 229 | description: OK 230 | schema: 231 | $ref: '#/definitions/proxy.Response' 232 | summary: Proxy Request 233 | tags: 234 | - Proxy 235 | /readiness: 236 | get: 237 | produces: 238 | - application/json 239 | responses: 240 | "200": 241 | description: OK 242 | schema: 243 | $ref: '#/definitions/readiness.Readiness' 244 | summary: Return 200 status Ok in Readiness 245 | tags: 246 | - Readiness 247 | /readiness/error: 248 | get: 249 | produces: 250 | - application/json 251 | responses: 252 | "200": 253 | description: OK 254 | schema: 255 | $ref: '#/definitions/readiness.Readiness' 256 | summary: Return 500 Error Status Code 257 | tags: 258 | - Readiness 259 | /reflection: 260 | delete: 261 | produces: 262 | - application/json 263 | responses: 264 | "200": 265 | description: OK 266 | schema: 267 | $ref: '#/definitions/reflect.Request' 268 | summary: Retun request parameters in response for transformation tests 269 | tags: 270 | - Reflection 271 | get: 272 | produces: 273 | - application/json 274 | responses: 275 | "200": 276 | description: OK 277 | schema: 278 | $ref: '#/definitions/reflect.Request' 279 | summary: Retun request parameters in response for transformation tests 280 | tags: 281 | - Reflection 282 | patch: 283 | produces: 284 | - application/json 285 | responses: 286 | "200": 287 | description: OK 288 | schema: 289 | $ref: '#/definitions/reflect.Request' 290 | summary: Retun request parameters in response for transformation tests 291 | tags: 292 | - Reflection 293 | post: 294 | produces: 295 | - application/json 296 | responses: 297 | "200": 298 | description: OK 299 | schema: 300 | $ref: '#/definitions/reflect.Request' 301 | summary: Retun request parameters in response for transformation tests 302 | tags: 303 | - Reflection 304 | put: 305 | produces: 306 | - application/json 307 | responses: 308 | "200": 309 | description: OK 310 | schema: 311 | $ref: '#/definitions/reflect.Request' 312 | summary: Retun request parameters in response for transformation tests 313 | tags: 314 | - Reflection 315 | /system/environment: 316 | get: 317 | produces: 318 | - application/json 319 | responses: {} 320 | summary: Dump all environment variables in container 321 | tags: 322 | - System 323 | /version: 324 | get: 325 | produces: 326 | - application/json 327 | responses: {} 328 | summary: Return version for container 329 | tags: 330 | - Version 331 | /whoami: 332 | get: 333 | produces: 334 | - text/plain 335 | responses: 336 | "200": 337 | description: OK 338 | schema: 339 | $ref: '#/definitions/teapot.Teapot' 340 | summary: Return 200 status Teapot in Teapot 341 | tags: 342 | - ImATeaPot 343 | swagger: "2.0" 344 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Version

2 |

3 | Version 4 | 5 | Documentation 6 | 7 | 8 | License: MIT 9 | 10 | 11 | Twitter: fidelissauro 12 | 13 |

14 | 15 | > Docker container to make runtime and platforms tests easy :whale: :package: :rocket: 16 | 17 | ### 🏠 [Homepage](/) 18 | 19 | ### ✨ [Demo](/) 20 | 21 | #### Available images for test 22 | 23 | * [v1]() 24 | * [v2]() 25 | * [latest]() 26 | 27 | ```sh 28 | docker run -it -p 8080:8080 fidelissauro/chip:v1 29 | ``` 30 | 31 | 32 | ## Compile Go Binary (Without Docker) 33 | 34 | ```sh 35 | go get -u 36 | CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . 37 | ``` 38 | 39 | ## Run tests 40 | 41 | ```sh 42 | go test 43 | ``` 44 | 45 | ## Setup Development Environment 46 | 47 | * Development environment uses [air project](https://github.com/cosmtrek/air) to execute live reload on `.go` files. 48 | 49 | ```sh 50 | docker-compose up --force-recreate 51 | ``` 52 | 53 | ## Build image 54 | 55 | ```sh 56 | docker build -it chip 57 | ``` 58 | 59 | ## Usage 60 | 61 | ```sh 62 | docker run -it -p 8080:8080 msfidelis/chip:v1 63 | ``` 64 | 65 | ## Swagger 66 | 67 | check on http://localhost:8080/swagger/index.html 68 | 69 | 70 | # Endpoints 71 | 72 | 73 | ## Healthcheck Endpoint 74 | 75 | Common healthcheck, dummy mock 76 | 77 | ```sh 78 | curl 0.0.0.0:8080/healthcheck -i 79 | 80 | HTTP/1.1 200 OK 81 | Content-Type: application/json; charset=utf-8 82 | Date: Sat, 30 May 2020 22:43:11 GMT 83 | Content-Length: 14 84 | 85 | {"status":200} 86 | ``` 87 | 88 | ## Healthcheck Endpoint (Error) 89 | 90 | Simulate error on Healthcheck 91 | 92 | ```sh 93 | curl 0.0.0.0:8080/healthcheck/error -i 94 | 95 | HTTP/1.1 503 Service Unavailable 96 | Content-Type: application/json; charset=utf-8 97 | Date: Sat, 30 May 2020 22:44:35 GMT 98 | Content-Length: 14 99 | 100 | {"status":503} 101 | ``` 102 | 103 | ## Healthcheck with Fault Injection (Random Mode) 104 | 105 | Use this for fault injection, circuit breaker, self healing tests on your readiness probe 106 | 107 | ```sh 108 | while true; do curl 0.0.0.0:8080/healthcheck/fault; echo; done 109 | 110 | {"status":503} 111 | {"status":503} 112 | {"status":200} 113 | {"status":503} 114 | {"status":503} 115 | {"status":200} 116 | {"status":503} 117 | {"status":200} 118 | {"status":200} 119 | {"status":503} 120 | {"status":503} 121 | {"status":200} 122 | {"status":200} 123 | {"status":200} 124 | {"status":200} 125 | {"status":503} 126 | {"status":200} 127 | {"status":200} 128 | {"status":200} 129 | ``` 130 | 131 | ## Healthcheck with Fault Injection (Soft Mode) 132 | 133 | Cause ocasional failure in your probe 134 | 135 | ```sh 136 | while true; do curl 0.0.0.0:8080/healthcheck/fault/soft; echo; done 137 | 138 | {"status":200} 139 | {"status":200} 140 | {"status":200} 141 | {"status":200} 142 | {"status":200} 143 | {"status":200} 144 | {"status":200} 145 | {"status":200} 146 | {"status":200} 147 | {"status":200} 148 | {"status":503} 149 | {"status":200} 150 | {"status":200} 151 | {"status":503} 152 | ``` 153 | 154 | ## Liveness Probe OK 155 | 156 | For Liveness tests 157 | 158 | ```sh 159 | curl 0.0.0.0:8080/liveness -i 160 | HTTP/1.1 200 OK 161 | Content-Type: application/json; charset=utf-8 162 | Date: Sat, 08 May 2021 14:00:05 GMT 163 | Content-Length: 17 164 | 165 | {"status":"Live"} 166 | ``` 167 | 168 | ## Liveness Probe with intentional failure 169 | 170 | ```sh 171 | curl 0.0.0.0:8080/liveness/error -i 172 | HTTP/1.1 503 Service Unavailable 173 | Content-Type: application/json; charset=utf-8 174 | Date: Sat, 08 May 2021 14:01:08 GMT 175 | Content-Length: 17 176 | 177 | {"status":"Dead"} 178 | ``` 179 | 180 | ## Readiness 181 | 182 | For readiness tests 183 | 184 | ```sh 185 | curl 0.0.0.0:8080/readiness -i 186 | HTTP/1.1 200 OK 187 | Content-Type: application/json; charset=utf-8 188 | Date: Sat, 08 May 2021 14:02:02 GMT 189 | Content-Length: 18 190 | 191 | {"status":"Ready"} 192 | ``` 193 | 194 | * You can set the environment variable `READINESS_PROBE_MOCK_TIME_IN_SECONDS` to customize your readiness probe in seconds for testing. Default is 5 seconds. 195 | 196 | ## Liveness Probe with intentional failure 197 | 198 | ```sh 199 | curl 0.0.0.0:8080/readiness/error -i 200 | HTTP/1.1 503 Service Unavailable 201 | Content-Type: application/json; charset=utf-8 202 | Date: Sat, 08 May 2021 14:02:37 GMT 203 | Content-Length: 22 204 | 205 | {"status":"Not Ready"} 206 | ``` 207 | 208 | ## Version 209 | 210 | This endpoint return different values in accord to tag version, v1, v2, v1-blue, v1-green, v2-blue and v2-green. Ideal to tests deployment scenarios behavior, like rollout, canary, blue / green etc. 211 | 212 | This variable can be customized using environment variable called `VERSION`` 213 | 214 | ```sh 215 | export VERSION=v3 216 | ``` 217 | 218 | ```sh 219 | curl 0.0.0.0:8080/version -i 220 | 221 | HTTP/1.1 200 OK 222 | Content-Type: application/json; charset=utf-8 223 | Date: Sun, 31 May 2020 03:38:21 GMT 224 | Content-Length: 16 225 | 226 | {"version":"v1"} 227 | ``` 228 | 229 | 230 | ## System Info 231 | Retrieve some system info. Use this to test memory, cpu limits and isolation. Host name for load balancing tests and etc. 232 | 233 | ```sh 234 | curl 0.0.0.0:8080/system -i 235 | 236 | HTTP/1.1 200 OK 237 | Content-Type: application/json; charset=utf-8 238 | Date: Sun, 31 May 2020 03:33:12 GMT 239 | Content-Length: 76 240 | 241 | {"hostname":"21672316d98d","cpus":2,"os":"","hypervisor":"bhyve","memory":0} 242 | ``` 243 | 244 | ## Dump Environment Variables 245 | 246 | ```sh 247 | curl http://0.0.0.0:8080/system/environment -i 248 | 249 | [ 250 | "HOSTNAME=78339a8484d4", 251 | "HOME=/root", 252 | "ENVIRONMENT=dev", 253 | "PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 254 | "GOPATH=/go", 255 | "PWD=/go/src/chip", 256 | "GOLANG_VERSION=1.13.11" 257 | ] 258 | ``` 259 | 260 | ## Reflection (In Progress) 261 | 262 | Use this endpoint to retrieve request headers, body, querystrings, cookies, etc. Ideal to tests API Gateway, CDN, Proxys, Load Balancers transformations on request. Available for all HTTP methods 263 | 264 | ```sh 265 | curl -X GET 0.0.0.0:8080/reflect -i 266 | 267 | { 268 | "method": "GET", 269 | "params": "", 270 | "headers": { 271 | "Accept": [ 272 | "*/*" 273 | ], 274 | "User-Agent": [ 275 | "curl/7.64.1" 276 | ] 277 | }, 278 | "cookies": [], 279 | "body": "", 280 | "path": "/reflection" 281 | } 282 | ``` 283 | 284 | ## Proxy Request 285 | 286 | Use this endpoint to proxy HTTP requests betweet chip and another endpoint 287 | 288 | 289 | ```sh 290 | curl --location --request POST 'http://0.0.0.0:8080/proxy' \ ─╯ 291 | --header 'Content-Type: application/json' \ 292 | --data-raw '{ 293 | "method": "GET", 294 | "host": "https://google.com.br/", 295 | "path": "/whoami", 296 | "headers": [ 297 | { 298 | "name": "content-type", 299 | "value": "application/json" 300 | }, 301 | { 302 | "name": "foo", 303 | "value": "bar" 304 | } 305 | ], 306 | "body": "{\"vai\": \"sim\"}" 307 | }' 308 | ``` 309 | 310 | ```sh 311 | curl -X POST "0.0.0.0:8080/reflection?id=1" -H "Header-Foo: Bar" -d '{"foo":"bar"}' | jq . 312 | 313 | { 314 | "method": "POST", 315 | "params": "id=1", 316 | "headers": { 317 | "Accept": [ 318 | "*/*" 319 | ], 320 | "Content-Length": [ 321 | "13" 322 | ], 323 | "Content-Type": [ 324 | "application/x-www-form-urlencoded" 325 | ], 326 | "Header-Foo": [ 327 | "Bar" 328 | ], 329 | "User-Agent": [ 330 | "curl/7.64.1" 331 | ] 332 | }, 333 | "cookies": [], 334 | "body": "{\"foo\":\"bar\"}", 335 | "path": "/reflection" 336 | } 337 | ``` 338 | 339 | 340 | ## Load 341 | 342 | Use this endpoint to consume some CPU resources. Ideal to test auto scale policies, isolation, monitoring and alerts behaviors. 343 | 344 | > Danger 345 | 346 | ```sh 347 | curl -X GET 0.0.0.0:8080/burn/cpu -i 348 | 349 | HTTP/1.1 200 OK 350 | Content-Type: application/json; charset=utf-8 351 | Date: Tue, 02 Jun 2020 04:42:24 GMT 352 | Content-Length: 20 353 | 354 | {"status":"On Fire"} 355 | ``` 356 | 357 | ```sh 358 | curl -X GET 0.0.0.0:8080/burn/ram -i 359 | 360 | HTTP/1.1 200 OK 361 | Content-Type: application/json; charset=utf-8 362 | Date: Tue, 02 Jun 2020 04:42:24 GMT 363 | Content-Length: 20 364 | 365 | {"status":"On Fire"} 366 | ``` 367 | 368 | ## Check ACL and Connection to Ports 369 | 370 | Check connection between container environment / namespace and services and another applications 371 | 372 | 373 | ```sh 374 | curl -X GET 0.0.0.0:8080/ping/google.com/80 -i 375 | 376 | HTTP/1.1 200 OK 377 | Content-Type: application/json; charset=utf-8 378 | Date: Mon, 20 Jul 2020 16:04:02 GMT 379 | Content-Length: 71 380 | 381 | {"host":"google.com","port":"80","protocol":"tcp","status":"connected"} 382 | ``` 383 | 384 | ## Logging Events 385 | 386 | Sent a log of logs to stdout. Sent querystring `events` to customize the number of logs; Default `1000`. 387 | 388 | ```sh 389 | curl -X GET "0.0.0.0:8080/logging?events=2000" -i 390 | 391 | HTTP/1.1 200 OK 392 | Content-Type: application/json; charset=utf-8 393 | Date: Sat, 28 Aug 2021 14:50:41 GMT 394 | Content-Length: 61 395 | 396 | {"status":200,"message":"2000 logging events sent to stdout"} 397 | ``` 398 | 399 | ## Filesystem 400 | 401 | List some directory contents 402 | 403 | ```bash 404 | curl -X POST "0.0.0.0:8080/filesystem/ls" -i -d '{"path": "./"}' 405 | 406 | HTTP/1.1 200 OK 407 | Content-Type: application/json; charset=utf-8 408 | Date: Fri, 10 Jan 2025 11:52:26 GMT 409 | Content-Length: 86 410 | 411 | {"path":"./","files":[".dockerenv","dev","etc","lib","main","proc","sys","tmp","var"]} 412 | ``` 413 | 414 | Write file - base64 content 415 | 416 | ```bash 417 | curl -X POST "0.0.0.0:8080/filesystem/write" -i -d '{"path": "./test", "content": "V3JpdGUgVGVzdAo="}'; 418 | 419 | HTTP/1.1 202 Accepted 420 | Content-Type: application/json; charset=utf-8 421 | Date: Fri, 10 Jan 2025 11:58:13 GMT 422 | Content-Length: 42 423 | 424 | {"message":"file written","path":"./test"} 425 | ``` 426 | 427 | Read files on filesystem 428 | 429 | ```bash 430 | curl -X POST "0.0.0.0:8080/filesystem/cat" -i -d '{"path": "./test"}'; 431 | 432 | HTTP/1.1 200 OK 433 | Content-Type: text/plain; charset=utf-8 434 | Date: Fri, 10 Jan 2025 11:58:44 GMT 435 | Content-Length: 11 436 | 437 | Write Test 438 | ``` 439 | 440 | Delete files on filesystem 441 | 442 | ```bash 443 | curl -X DELETE "0.0.0.0:8080/filesystem/delete" -i -d '{"path": "./test"}'; 444 | 445 | HTTP/1.1 200 OK 446 | Content-Type: application/json; charset=utf-8 447 | Date: Fri, 10 Jan 2025 11:59:01 GMT 448 | Content-Length: 26 449 | 450 | {"message":"file deleted"} 451 | ``` 452 | 453 | ## Whoami? 454 | 455 | ```sh 456 | curl -X GET 0.0.0.0:8080/whoami -i 457 | 458 | HTTP/1.1 418 I'm a teapot 459 | Content-Type: text/plain; charset=utf-8 460 | Date: Sun, 23 May 2021 00:53:46 GMT 461 | Content-Length: 85 462 | 463 | 464 | ;,' 465 | _o_ ;:;' 466 | ,-.'---`.__ ; 467 | ((j`=====',-' 468 | `-\ / 469 | `-=-' 470 | ``` 471 | 472 | ## Author 473 | 474 | 👤 **Matheus Fidelis** 475 | 476 | * Website: https://raj.ninja 477 | * Twitter: [@fidelissauro](https://twitter.com/fidelissauro) 478 | * Github: [@msfidelis](https://github.com/msfidelis) 479 | * LinkedIn: [@msfidelis](https://linkedin.com/in/msfidelis) 480 | 481 | ## 🤝 Contributing 482 | 483 | Contributions, issues and feature requests are welcome!
Feel free to check [issues page](/issues). 484 | 485 | ## Show your support 486 | 487 | Give a ⭐️ if this project helped you! 488 | 489 | ## 📝 License 490 | 491 | Copyright © 2020 [Matheus Fidelis](https://github.com/msfidelis).
492 | This project is [MIT](LICENSE) licensed. 493 | 494 | *** 495 | _This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_ 496 | -------------------------------------------------------------------------------- /docs/swagger.json: -------------------------------------------------------------------------------- 1 | { 2 | "swagger": "2.0", 3 | "info": { 4 | "description": "Cloud Native Toolset Running in Containers.", 5 | "title": "Chip", 6 | "termsOfService": "http://swagger.io/terms/", 7 | "contact": { 8 | "name": "API Support", 9 | "email": "matheus@nanoshots.com.br" 10 | }, 11 | "license": { 12 | "name": "MIT", 13 | "url": "https://github.com/mfidelis/chip/blob/master/LICENSE" 14 | }, 15 | "version": "1.0" 16 | }, 17 | "basePath": "/", 18 | "paths": { 19 | "/burn/cpu": { 20 | "get": { 21 | "produces": [ 22 | "application/json" 23 | ], 24 | "tags": [ 25 | "Loadtest" 26 | ], 27 | "summary": "Burn CPU for Loadtests and Auto Scaling Tests", 28 | "responses": {} 29 | } 30 | }, 31 | "/burn/ram": { 32 | "get": { 33 | "produces": [ 34 | "application/json" 35 | ], 36 | "tags": [ 37 | "Loadtest" 38 | ], 39 | "summary": "Burn RAM for Loadtests and Auto Scaling Tests", 40 | "responses": {} 41 | } 42 | }, 43 | "/healthcheck": { 44 | "get": { 45 | "produces": [ 46 | "application/json" 47 | ], 48 | "tags": [ 49 | "Healthcheck" 50 | ], 51 | "summary": "Return 200 status Ok in healthcheck", 52 | "responses": { 53 | "200": { 54 | "description": "OK", 55 | "schema": { 56 | "$ref": "#/definitions/healthcheck.Healthcheck" 57 | } 58 | } 59 | } 60 | } 61 | }, 62 | "/healthcheck/error": { 63 | "get": { 64 | "produces": [ 65 | "application/json" 66 | ], 67 | "tags": [ 68 | "Healthcheck" 69 | ], 70 | "summary": "Return 500 Error Status Code", 71 | "responses": { 72 | "200": { 73 | "description": "OK", 74 | "schema": { 75 | "$ref": "#/definitions/healthcheck.Healthcheck" 76 | } 77 | } 78 | } 79 | } 80 | }, 81 | "/healthcheck/fault": { 82 | "get": { 83 | "produces": [ 84 | "application/json" 85 | ], 86 | "tags": [ 87 | "Healthcheck" 88 | ], 89 | "summary": "Inject common errors in healthcheck", 90 | "responses": { 91 | "200": { 92 | "description": "OK", 93 | "schema": { 94 | "$ref": "#/definitions/healthcheck.Healthcheck" 95 | } 96 | } 97 | } 98 | } 99 | }, 100 | "/healthcheck/fault/soft": { 101 | "get": { 102 | "produces": [ 103 | "application/json" 104 | ], 105 | "tags": [ 106 | "Healthcheck" 107 | ], 108 | "summary": "Inject ocasional erros in healthcheck", 109 | "responses": { 110 | "200": { 111 | "description": "OK", 112 | "schema": { 113 | "$ref": "#/definitions/healthcheck.Healthcheck" 114 | } 115 | } 116 | } 117 | } 118 | }, 119 | "/liveness": { 120 | "get": { 121 | "produces": [ 122 | "application/json" 123 | ], 124 | "tags": [ 125 | "Liveness" 126 | ], 127 | "summary": "Return 200 status Ok in Liveness", 128 | "responses": { 129 | "200": { 130 | "description": "OK", 131 | "schema": { 132 | "$ref": "#/definitions/liveness.Liveness" 133 | } 134 | } 135 | } 136 | } 137 | }, 138 | "/liveness/error": { 139 | "get": { 140 | "produces": [ 141 | "application/json" 142 | ], 143 | "tags": [ 144 | "Liveness" 145 | ], 146 | "summary": "Return 500 Error Status Code", 147 | "responses": { 148 | "200": { 149 | "description": "OK", 150 | "schema": { 151 | "$ref": "#/definitions/liveness.Liveness" 152 | } 153 | } 154 | } 155 | } 156 | }, 157 | "/logging": { 158 | "get": { 159 | "produces": [ 160 | "application/json" 161 | ], 162 | "tags": [ 163 | "Logging" 164 | ], 165 | "summary": "Sent log events to application stdout", 166 | "parameters": [ 167 | { 168 | "type": "string", 169 | "description": "Number of log events; default 1000", 170 | "name": "events", 171 | "in": "query" 172 | } 173 | ], 174 | "responses": { 175 | "200": { 176 | "description": "OK", 177 | "schema": { 178 | "$ref": "#/definitions/logging.response" 179 | } 180 | } 181 | } 182 | } 183 | }, 184 | "/proxy": { 185 | "post": { 186 | "produces": [ 187 | "application/json" 188 | ], 189 | "tags": [ 190 | "Proxy" 191 | ], 192 | "summary": "Proxy Request", 193 | "parameters": [ 194 | { 195 | "description": "Proxy Information", 196 | "name": "message", 197 | "in": "body", 198 | "required": true, 199 | "schema": { 200 | "$ref": "#/definitions/proxy.Request" 201 | } 202 | } 203 | ], 204 | "responses": { 205 | "200": { 206 | "description": "OK", 207 | "schema": { 208 | "$ref": "#/definitions/proxy.Response" 209 | } 210 | } 211 | } 212 | } 213 | }, 214 | "/readiness": { 215 | "get": { 216 | "produces": [ 217 | "application/json" 218 | ], 219 | "tags": [ 220 | "Readiness" 221 | ], 222 | "summary": "Return 200 status Ok in Readiness", 223 | "responses": { 224 | "200": { 225 | "description": "OK", 226 | "schema": { 227 | "$ref": "#/definitions/readiness.Readiness" 228 | } 229 | } 230 | } 231 | } 232 | }, 233 | "/readiness/error": { 234 | "get": { 235 | "produces": [ 236 | "application/json" 237 | ], 238 | "tags": [ 239 | "Readiness" 240 | ], 241 | "summary": "Return 500 Error Status Code", 242 | "responses": { 243 | "200": { 244 | "description": "OK", 245 | "schema": { 246 | "$ref": "#/definitions/readiness.Readiness" 247 | } 248 | } 249 | } 250 | } 251 | }, 252 | "/reflection": { 253 | "get": { 254 | "produces": [ 255 | "application/json" 256 | ], 257 | "tags": [ 258 | "Reflection" 259 | ], 260 | "summary": "Retun request parameters in response for transformation tests", 261 | "responses": { 262 | "200": { 263 | "description": "OK", 264 | "schema": { 265 | "$ref": "#/definitions/reflect.Request" 266 | } 267 | } 268 | } 269 | }, 270 | "put": { 271 | "produces": [ 272 | "application/json" 273 | ], 274 | "tags": [ 275 | "Reflection" 276 | ], 277 | "summary": "Retun request parameters in response for transformation tests", 278 | "responses": { 279 | "200": { 280 | "description": "OK", 281 | "schema": { 282 | "$ref": "#/definitions/reflect.Request" 283 | } 284 | } 285 | } 286 | }, 287 | "post": { 288 | "produces": [ 289 | "application/json" 290 | ], 291 | "tags": [ 292 | "Reflection" 293 | ], 294 | "summary": "Retun request parameters in response for transformation tests", 295 | "responses": { 296 | "200": { 297 | "description": "OK", 298 | "schema": { 299 | "$ref": "#/definitions/reflect.Request" 300 | } 301 | } 302 | } 303 | }, 304 | "delete": { 305 | "produces": [ 306 | "application/json" 307 | ], 308 | "tags": [ 309 | "Reflection" 310 | ], 311 | "summary": "Retun request parameters in response for transformation tests", 312 | "responses": { 313 | "200": { 314 | "description": "OK", 315 | "schema": { 316 | "$ref": "#/definitions/reflect.Request" 317 | } 318 | } 319 | } 320 | }, 321 | "patch": { 322 | "produces": [ 323 | "application/json" 324 | ], 325 | "tags": [ 326 | "Reflection" 327 | ], 328 | "summary": "Retun request parameters in response for transformation tests", 329 | "responses": { 330 | "200": { 331 | "description": "OK", 332 | "schema": { 333 | "$ref": "#/definitions/reflect.Request" 334 | } 335 | } 336 | } 337 | } 338 | }, 339 | "/system/environment": { 340 | "get": { 341 | "produces": [ 342 | "application/json" 343 | ], 344 | "tags": [ 345 | "System" 346 | ], 347 | "summary": "Dump all environment variables in container", 348 | "responses": {} 349 | } 350 | }, 351 | "/version": { 352 | "get": { 353 | "produces": [ 354 | "application/json" 355 | ], 356 | "tags": [ 357 | "Version" 358 | ], 359 | "summary": "Return version for container", 360 | "responses": {} 361 | } 362 | }, 363 | "/whoami": { 364 | "get": { 365 | "produces": [ 366 | "text/plain" 367 | ], 368 | "tags": [ 369 | "ImATeaPot" 370 | ], 371 | "summary": "Return 200 status Teapot in Teapot", 372 | "responses": { 373 | "200": { 374 | "description": "OK", 375 | "schema": { 376 | "$ref": "#/definitions/teapot.Teapot" 377 | } 378 | } 379 | } 380 | } 381 | } 382 | }, 383 | "definitions": { 384 | "healthcheck.Healthcheck": { 385 | "type": "object", 386 | "required": [ 387 | "description", 388 | "status" 389 | ], 390 | "properties": { 391 | "description": { 392 | "type": "string" 393 | }, 394 | "status": { 395 | "type": "integer" 396 | } 397 | } 398 | }, 399 | "liveness.Liveness": { 400 | "type": "object", 401 | "required": [ 402 | "status" 403 | ], 404 | "properties": { 405 | "status": { 406 | "type": "string" 407 | } 408 | } 409 | }, 410 | "logging.response": { 411 | "type": "object", 412 | "required": [ 413 | "message", 414 | "status" 415 | ], 416 | "properties": { 417 | "message": { 418 | "type": "string" 419 | }, 420 | "status": { 421 | "type": "integer" 422 | } 423 | } 424 | }, 425 | "proxy.Request": { 426 | "type": "object", 427 | "properties": { 428 | "body": { 429 | "type": "string" 430 | }, 431 | "headers": { 432 | "type": "array", 433 | "items": { 434 | "type": "object", 435 | "properties": { 436 | "name": { 437 | "type": "string" 438 | }, 439 | "value": { 440 | "type": "string" 441 | } 442 | } 443 | } 444 | }, 445 | "host": { 446 | "type": "string" 447 | }, 448 | "method": { 449 | "type": "string" 450 | }, 451 | "path": { 452 | "type": "string" 453 | } 454 | } 455 | }, 456 | "proxy.Response": { 457 | "type": "object", 458 | "properties": { 459 | "body": { 460 | "type": "string" 461 | }, 462 | "headers": { 463 | "type": "object", 464 | "additionalProperties": { 465 | "type": "array", 466 | "items": { 467 | "type": "string" 468 | } 469 | } 470 | }, 471 | "status_code": { 472 | "type": "integer" 473 | } 474 | } 475 | }, 476 | "readiness.Readiness": { 477 | "type": "object", 478 | "required": [ 479 | "status" 480 | ], 481 | "properties": { 482 | "status": { 483 | "type": "string" 484 | } 485 | } 486 | }, 487 | "reflect.Request": { 488 | "type": "object", 489 | "required": [ 490 | "body", 491 | "headers", 492 | "method", 493 | "params", 494 | "path" 495 | ], 496 | "properties": { 497 | "body": { 498 | "description": "Cookies []*http.Cookie `json:\"cookies\" binding:\"required\"`", 499 | "type": "string" 500 | }, 501 | "headers": { 502 | "type": "object", 503 | "additionalProperties": { 504 | "type": "array", 505 | "items": { 506 | "type": "string" 507 | } 508 | } 509 | }, 510 | "method": { 511 | "type": "string" 512 | }, 513 | "params": { 514 | "type": "string" 515 | }, 516 | "path": { 517 | "type": "string" 518 | } 519 | } 520 | }, 521 | "teapot.Teapot": { 522 | "type": "object", 523 | "properties": { 524 | "body": { 525 | "type": "string" 526 | } 527 | } 528 | } 529 | } 530 | } -------------------------------------------------------------------------------- /docs/docs.go: -------------------------------------------------------------------------------- 1 | // Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT 2 | // This file was generated by swaggo/swag 3 | package docs 4 | 5 | import ( 6 | "bytes" 7 | "encoding/json" 8 | "strings" 9 | "text/template" 10 | 11 | "github.com/swaggo/swag" 12 | ) 13 | 14 | var doc = `{ 15 | "schemes": {{ marshal .Schemes }}, 16 | "swagger": "2.0", 17 | "info": { 18 | "description": "{{escape .Description}}", 19 | "title": "{{.Title}}", 20 | "termsOfService": "http://swagger.io/terms/", 21 | "contact": { 22 | "name": "API Support", 23 | "email": "matheus@nanoshots.com.br" 24 | }, 25 | "license": { 26 | "name": "MIT", 27 | "url": "https://github.com/mfidelis/chip/blob/master/LICENSE" 28 | }, 29 | "version": "{{.Version}}" 30 | }, 31 | "host": "{{.Host}}", 32 | "basePath": "{{.BasePath}}", 33 | "paths": { 34 | "/burn/cpu": { 35 | "get": { 36 | "produces": [ 37 | "application/json" 38 | ], 39 | "tags": [ 40 | "Loadtest" 41 | ], 42 | "summary": "Burn CPU for Loadtests and Auto Scaling Tests", 43 | "responses": {} 44 | } 45 | }, 46 | "/burn/ram": { 47 | "get": { 48 | "produces": [ 49 | "application/json" 50 | ], 51 | "tags": [ 52 | "Loadtest" 53 | ], 54 | "summary": "Burn RAM for Loadtests and Auto Scaling Tests", 55 | "responses": {} 56 | } 57 | }, 58 | "/healthcheck": { 59 | "get": { 60 | "produces": [ 61 | "application/json" 62 | ], 63 | "tags": [ 64 | "Healthcheck" 65 | ], 66 | "summary": "Return 200 status Ok in healthcheck", 67 | "responses": { 68 | "200": { 69 | "description": "OK", 70 | "schema": { 71 | "$ref": "#/definitions/healthcheck.Healthcheck" 72 | } 73 | } 74 | } 75 | } 76 | }, 77 | "/healthcheck/error": { 78 | "get": { 79 | "produces": [ 80 | "application/json" 81 | ], 82 | "tags": [ 83 | "Healthcheck" 84 | ], 85 | "summary": "Return 500 Error Status Code", 86 | "responses": { 87 | "200": { 88 | "description": "OK", 89 | "schema": { 90 | "$ref": "#/definitions/healthcheck.Healthcheck" 91 | } 92 | } 93 | } 94 | } 95 | }, 96 | "/healthcheck/fault": { 97 | "get": { 98 | "produces": [ 99 | "application/json" 100 | ], 101 | "tags": [ 102 | "Healthcheck" 103 | ], 104 | "summary": "Inject common errors in healthcheck", 105 | "responses": { 106 | "200": { 107 | "description": "OK", 108 | "schema": { 109 | "$ref": "#/definitions/healthcheck.Healthcheck" 110 | } 111 | } 112 | } 113 | } 114 | }, 115 | "/healthcheck/fault/soft": { 116 | "get": { 117 | "produces": [ 118 | "application/json" 119 | ], 120 | "tags": [ 121 | "Healthcheck" 122 | ], 123 | "summary": "Inject ocasional erros in healthcheck", 124 | "responses": { 125 | "200": { 126 | "description": "OK", 127 | "schema": { 128 | "$ref": "#/definitions/healthcheck.Healthcheck" 129 | } 130 | } 131 | } 132 | } 133 | }, 134 | "/liveness": { 135 | "get": { 136 | "produces": [ 137 | "application/json" 138 | ], 139 | "tags": [ 140 | "Liveness" 141 | ], 142 | "summary": "Return 200 status Ok in Liveness", 143 | "responses": { 144 | "200": { 145 | "description": "OK", 146 | "schema": { 147 | "$ref": "#/definitions/liveness.Liveness" 148 | } 149 | } 150 | } 151 | } 152 | }, 153 | "/liveness/error": { 154 | "get": { 155 | "produces": [ 156 | "application/json" 157 | ], 158 | "tags": [ 159 | "Liveness" 160 | ], 161 | "summary": "Return 500 Error Status Code", 162 | "responses": { 163 | "200": { 164 | "description": "OK", 165 | "schema": { 166 | "$ref": "#/definitions/liveness.Liveness" 167 | } 168 | } 169 | } 170 | } 171 | }, 172 | "/logging": { 173 | "get": { 174 | "produces": [ 175 | "application/json" 176 | ], 177 | "tags": [ 178 | "Logging" 179 | ], 180 | "summary": "Sent log events to application stdout", 181 | "parameters": [ 182 | { 183 | "type": "string", 184 | "description": "Number of log events; default 1000", 185 | "name": "events", 186 | "in": "query" 187 | } 188 | ], 189 | "responses": { 190 | "200": { 191 | "description": "OK", 192 | "schema": { 193 | "$ref": "#/definitions/logging.response" 194 | } 195 | } 196 | } 197 | } 198 | }, 199 | "/proxy": { 200 | "post": { 201 | "produces": [ 202 | "application/json" 203 | ], 204 | "tags": [ 205 | "Proxy" 206 | ], 207 | "summary": "Proxy Request", 208 | "parameters": [ 209 | { 210 | "description": "Proxy Information", 211 | "name": "message", 212 | "in": "body", 213 | "required": true, 214 | "schema": { 215 | "$ref": "#/definitions/proxy.Request" 216 | } 217 | } 218 | ], 219 | "responses": { 220 | "200": { 221 | "description": "OK", 222 | "schema": { 223 | "$ref": "#/definitions/proxy.Response" 224 | } 225 | } 226 | } 227 | } 228 | }, 229 | "/readiness": { 230 | "get": { 231 | "produces": [ 232 | "application/json" 233 | ], 234 | "tags": [ 235 | "Readiness" 236 | ], 237 | "summary": "Return 200 status Ok in Readiness", 238 | "responses": { 239 | "200": { 240 | "description": "OK", 241 | "schema": { 242 | "$ref": "#/definitions/readiness.Readiness" 243 | } 244 | } 245 | } 246 | } 247 | }, 248 | "/readiness/error": { 249 | "get": { 250 | "produces": [ 251 | "application/json" 252 | ], 253 | "tags": [ 254 | "Readiness" 255 | ], 256 | "summary": "Return 500 Error Status Code", 257 | "responses": { 258 | "200": { 259 | "description": "OK", 260 | "schema": { 261 | "$ref": "#/definitions/readiness.Readiness" 262 | } 263 | } 264 | } 265 | } 266 | }, 267 | "/reflection": { 268 | "get": { 269 | "produces": [ 270 | "application/json" 271 | ], 272 | "tags": [ 273 | "Reflection" 274 | ], 275 | "summary": "Retun request parameters in response for transformation tests", 276 | "responses": { 277 | "200": { 278 | "description": "OK", 279 | "schema": { 280 | "$ref": "#/definitions/reflect.Request" 281 | } 282 | } 283 | } 284 | }, 285 | "put": { 286 | "produces": [ 287 | "application/json" 288 | ], 289 | "tags": [ 290 | "Reflection" 291 | ], 292 | "summary": "Retun request parameters in response for transformation tests", 293 | "responses": { 294 | "200": { 295 | "description": "OK", 296 | "schema": { 297 | "$ref": "#/definitions/reflect.Request" 298 | } 299 | } 300 | } 301 | }, 302 | "post": { 303 | "produces": [ 304 | "application/json" 305 | ], 306 | "tags": [ 307 | "Reflection" 308 | ], 309 | "summary": "Retun request parameters in response for transformation tests", 310 | "responses": { 311 | "200": { 312 | "description": "OK", 313 | "schema": { 314 | "$ref": "#/definitions/reflect.Request" 315 | } 316 | } 317 | } 318 | }, 319 | "delete": { 320 | "produces": [ 321 | "application/json" 322 | ], 323 | "tags": [ 324 | "Reflection" 325 | ], 326 | "summary": "Retun request parameters in response for transformation tests", 327 | "responses": { 328 | "200": { 329 | "description": "OK", 330 | "schema": { 331 | "$ref": "#/definitions/reflect.Request" 332 | } 333 | } 334 | } 335 | }, 336 | "patch": { 337 | "produces": [ 338 | "application/json" 339 | ], 340 | "tags": [ 341 | "Reflection" 342 | ], 343 | "summary": "Retun request parameters in response for transformation tests", 344 | "responses": { 345 | "200": { 346 | "description": "OK", 347 | "schema": { 348 | "$ref": "#/definitions/reflect.Request" 349 | } 350 | } 351 | } 352 | } 353 | }, 354 | "/system/environment": { 355 | "get": { 356 | "produces": [ 357 | "application/json" 358 | ], 359 | "tags": [ 360 | "System" 361 | ], 362 | "summary": "Dump all environment variables in container", 363 | "responses": {} 364 | } 365 | }, 366 | "/version": { 367 | "get": { 368 | "produces": [ 369 | "application/json" 370 | ], 371 | "tags": [ 372 | "Version" 373 | ], 374 | "summary": "Return version for container", 375 | "responses": {} 376 | } 377 | }, 378 | "/whoami": { 379 | "get": { 380 | "produces": [ 381 | "text/plain" 382 | ], 383 | "tags": [ 384 | "ImATeaPot" 385 | ], 386 | "summary": "Return 200 status Teapot in Teapot", 387 | "responses": { 388 | "200": { 389 | "description": "OK", 390 | "schema": { 391 | "$ref": "#/definitions/teapot.Teapot" 392 | } 393 | } 394 | } 395 | } 396 | } 397 | }, 398 | "definitions": { 399 | "healthcheck.Healthcheck": { 400 | "type": "object", 401 | "required": [ 402 | "description", 403 | "status" 404 | ], 405 | "properties": { 406 | "description": { 407 | "type": "string" 408 | }, 409 | "status": { 410 | "type": "integer" 411 | } 412 | } 413 | }, 414 | "liveness.Liveness": { 415 | "type": "object", 416 | "required": [ 417 | "status" 418 | ], 419 | "properties": { 420 | "status": { 421 | "type": "string" 422 | } 423 | } 424 | }, 425 | "logging.response": { 426 | "type": "object", 427 | "required": [ 428 | "message", 429 | "status" 430 | ], 431 | "properties": { 432 | "message": { 433 | "type": "string" 434 | }, 435 | "status": { 436 | "type": "integer" 437 | } 438 | } 439 | }, 440 | "proxy.Request": { 441 | "type": "object", 442 | "properties": { 443 | "body": { 444 | "type": "string" 445 | }, 446 | "headers": { 447 | "type": "array", 448 | "items": { 449 | "type": "object", 450 | "properties": { 451 | "name": { 452 | "type": "string" 453 | }, 454 | "value": { 455 | "type": "string" 456 | } 457 | } 458 | } 459 | }, 460 | "host": { 461 | "type": "string" 462 | }, 463 | "method": { 464 | "type": "string" 465 | }, 466 | "path": { 467 | "type": "string" 468 | } 469 | } 470 | }, 471 | "proxy.Response": { 472 | "type": "object", 473 | "properties": { 474 | "body": { 475 | "type": "string" 476 | }, 477 | "headers": { 478 | "type": "object", 479 | "additionalProperties": { 480 | "type": "array", 481 | "items": { 482 | "type": "string" 483 | } 484 | } 485 | }, 486 | "status_code": { 487 | "type": "integer" 488 | } 489 | } 490 | }, 491 | "readiness.Readiness": { 492 | "type": "object", 493 | "required": [ 494 | "status" 495 | ], 496 | "properties": { 497 | "status": { 498 | "type": "string" 499 | } 500 | } 501 | }, 502 | "reflect.Request": { 503 | "type": "object", 504 | "required": [ 505 | "body", 506 | "headers", 507 | "method", 508 | "params", 509 | "path" 510 | ], 511 | "properties": { 512 | "body": { 513 | "description": "Cookies []*http.Cookie ` + "`" + `json:\"cookies\" binding:\"required\"` + "`" + `", 514 | "type": "string" 515 | }, 516 | "headers": { 517 | "type": "object", 518 | "additionalProperties": { 519 | "type": "array", 520 | "items": { 521 | "type": "string" 522 | } 523 | } 524 | }, 525 | "method": { 526 | "type": "string" 527 | }, 528 | "params": { 529 | "type": "string" 530 | }, 531 | "path": { 532 | "type": "string" 533 | } 534 | } 535 | }, 536 | "teapot.Teapot": { 537 | "type": "object", 538 | "properties": { 539 | "body": { 540 | "type": "string" 541 | } 542 | } 543 | } 544 | } 545 | }` 546 | 547 | type swaggerInfo struct { 548 | Version string 549 | Host string 550 | BasePath string 551 | Schemes []string 552 | Title string 553 | Description string 554 | } 555 | 556 | // SwaggerInfo holds exported Swagger Info so clients can modify it 557 | var SwaggerInfo = swaggerInfo{ 558 | Version: "1.0", 559 | Host: "", 560 | BasePath: "/", 561 | Schemes: []string{}, 562 | Title: "Chip", 563 | Description: "Cloud Native Toolset Running in Containers.", 564 | } 565 | 566 | type s struct{} 567 | 568 | func (s *s) ReadDoc() string { 569 | sInfo := SwaggerInfo 570 | sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1) 571 | 572 | t, err := template.New("swagger_info").Funcs(template.FuncMap{ 573 | "marshal": func(v interface{}) string { 574 | a, _ := json.Marshal(v) 575 | return string(a) 576 | }, 577 | "escape": func(v interface{}) string { 578 | // escape tabs 579 | str := strings.Replace(v.(string), "\t", "\\t", -1) 580 | // replace " with \", and if that results in \\", replace that with \\\" 581 | str = strings.Replace(str, "\"", "\\\"", -1) 582 | return strings.Replace(str, "\\\\\"", "\\\\\\\"", -1) 583 | }, 584 | }).Parse(doc) 585 | if err != nil { 586 | return doc 587 | } 588 | 589 | var tpl bytes.Buffer 590 | if err := t.Execute(&tpl, sInfo); err != nil { 591 | return doc 592 | } 593 | 594 | return tpl.String() 595 | } 596 | 597 | func init() { 598 | swag.Register("swagger", &s{}) 599 | } 600 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 4 | github.com/Depado/ginprom v1.7.0 h1:Jw+qytNg4fwjzpUIajzjEK9dVlG2Ov9/ve/q26e/hFI= 5 | github.com/Depado/ginprom v1.7.0/go.mod h1:cMlQwg/daHJdgGlaDHBlzse+7CZxkVgcqZqvDcIKg6c= 6 | github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= 7 | github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= 8 | github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= 9 | github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 10 | github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 11 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 12 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= 13 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 14 | github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= 15 | github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= 16 | github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= 17 | github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= 18 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 19 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= 20 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 21 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 22 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 23 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 24 | github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 25 | github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 26 | github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= 27 | github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= 28 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 29 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 30 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 31 | github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= 32 | github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= 33 | github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 34 | github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= 35 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 36 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 37 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 38 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 39 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 40 | github.com/bxcodec/faker/v3 v3.6.0 h1:Meuh+M6pQJsQJwxVALq6H5wpDzkZ4pStV9pmH7gbKKs= 41 | github.com/bxcodec/faker/v3 v3.6.0/go.mod h1:gF31YgnMSMKgkvl+fyEo1xuSMbEuieyqfeslGYFjneM= 42 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= 43 | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= 44 | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= 45 | github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= 46 | github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 47 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 48 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 49 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 50 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= 51 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= 52 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= 53 | github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= 54 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 55 | github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 56 | github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= 57 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 58 | github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 59 | github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 60 | github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 61 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 62 | github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 63 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 64 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 65 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 66 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 67 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 68 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 69 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= 70 | github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= 71 | github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 72 | github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 73 | github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 74 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 75 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 76 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 77 | github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= 78 | github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= 79 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 80 | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= 81 | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= 82 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 83 | github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= 84 | github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= 85 | github.com/gin-contrib/logger v0.2.0 h1:YkdOGKdm/Nnrrd3bjBjcjd3ow1kR2KUfxxP4/rlL23E= 86 | github.com/gin-contrib/logger v0.2.0/go.mod h1:dYxbt3GB+rvPyJSvox5lLsnKYwh8PjWrC9TQtR+hpUw= 87 | github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= 88 | github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= 89 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 90 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 91 | github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= 92 | github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= 93 | github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= 94 | github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= 95 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 96 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 97 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 98 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 99 | github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= 100 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 101 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 102 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 103 | github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= 104 | github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= 105 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 106 | github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= 107 | github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 108 | github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= 109 | github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= 110 | github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= 111 | github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 112 | github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= 113 | github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= 114 | github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= 115 | github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= 116 | github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= 117 | github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= 118 | github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= 119 | github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= 120 | github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 121 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 122 | github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 123 | github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= 124 | github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 125 | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 126 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 127 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 128 | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= 129 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 130 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 131 | github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= 132 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 133 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 134 | github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= 135 | github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= 136 | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= 137 | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= 138 | github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 139 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 140 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 141 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 142 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 143 | github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 144 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 145 | github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 146 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 147 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 148 | github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 149 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 150 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 151 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 152 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 153 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 154 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 155 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 156 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 157 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 158 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 159 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 160 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 161 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 162 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 163 | github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= 164 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 165 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 166 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 167 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 168 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 169 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 170 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 171 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 172 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 173 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 174 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 175 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 176 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 177 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 178 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 179 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 180 | github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= 181 | github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 182 | github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 183 | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 184 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 185 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 186 | github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 187 | github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= 188 | github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 189 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 190 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 191 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 192 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 193 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 194 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 195 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 196 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 197 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 198 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 199 | github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 200 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 201 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 202 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 203 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 204 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 205 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 206 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 207 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 208 | github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= 209 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 210 | github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= 211 | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 212 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 213 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 214 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 215 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 216 | github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 217 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 218 | github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 219 | github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 220 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 221 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 222 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 223 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 224 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 225 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 226 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 227 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 228 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 229 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 230 | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= 231 | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= 232 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 233 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 234 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 235 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 236 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 237 | github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 238 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 239 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 240 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 241 | github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 242 | github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= 243 | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= 244 | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= 245 | github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= 246 | github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= 247 | github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= 248 | github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 249 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 250 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 251 | github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 252 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= 253 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 254 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 255 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 256 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 257 | github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 258 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 259 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 260 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 261 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 262 | github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 263 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 264 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 265 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 266 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 267 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 268 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 269 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 270 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 271 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 272 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 273 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 274 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 275 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 276 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 277 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 278 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 279 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 280 | github.com/msfidelis/gin-chaos-monkey v0.0.5 h1:G4R70dvEM5nG+jyyWPXmnOA2CYUA62WWU6I0hrotuT4= 281 | github.com/msfidelis/gin-chaos-monkey v0.0.5/go.mod h1:Gl1jwZ8jcJEH7SCQR2oogFT5Stwjvs3taWykF6fJzUw= 282 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 283 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 284 | github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= 285 | github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= 286 | github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= 287 | github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= 288 | github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 289 | github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 290 | github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 291 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 292 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 293 | github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= 294 | github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= 295 | github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 296 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 297 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 298 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 299 | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 300 | github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= 301 | github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= 302 | github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 303 | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 304 | github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= 305 | github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= 306 | github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= 307 | github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= 308 | github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= 309 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 310 | github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= 311 | github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= 312 | github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= 313 | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= 314 | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= 315 | github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= 316 | github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= 317 | github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 318 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 319 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 320 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 321 | github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= 322 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 323 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 324 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 325 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 326 | github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= 327 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 328 | github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= 329 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 330 | github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= 331 | github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= 332 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 333 | github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 334 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 335 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 336 | github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 337 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 338 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 339 | github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 340 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 341 | github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= 342 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 343 | github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= 344 | github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= 345 | github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= 346 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 347 | github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 348 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 349 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 350 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 351 | github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 352 | github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= 353 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 354 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 355 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 356 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 357 | github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= 358 | github.com/rs/zerolog v1.23.0 h1:UskrK+saS9P9Y789yNNulYKdARjPZuS35B8gJF2x60g= 359 | github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= 360 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 361 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 362 | github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= 363 | github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 364 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 365 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 366 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 367 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 368 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 369 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 370 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 371 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 372 | github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= 373 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 374 | github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 375 | github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= 376 | github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= 377 | github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 378 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 379 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 380 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 381 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 382 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 383 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 384 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 385 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 386 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 387 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 388 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 389 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 390 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 391 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 392 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= 393 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 394 | github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM= 395 | github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= 396 | github.com/swaggo/gin-swagger v1.2.0 h1:YskZXEiv51fjOMTsXrOetAjrMDfFaXD79PEoQBOe2W0= 397 | github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI= 398 | github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= 399 | github.com/swaggo/swag v1.6.7 h1:e8GC2xDllJZr3omJkm9YfmK0Y56+rMO3cg0JBKNz09s= 400 | github.com/swaggo/swag v1.6.7/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= 401 | github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 402 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 403 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 404 | github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 405 | github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= 406 | github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= 407 | github.com/ugorji/go v1.2.4 h1:cTciPbZ/VSOzCLKclmssnfQ/jyoVyOcJ3aoJyUV1Urc= 408 | github.com/ugorji/go v1.2.4/go.mod h1:EuaSCk8iZMdIspsu6HXH7X2UGKw1ezO4wCfGszGmmo4= 409 | github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= 410 | github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= 411 | github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= 412 | github.com/ugorji/go/codec v1.2.4/go.mod h1:bWBu1+kIRWcF8uMklKaJrR6fTWQOwAlrIzX22pHwryA= 413 | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= 414 | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 415 | github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= 416 | github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 417 | github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= 418 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 419 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 420 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 421 | go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 422 | go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= 423 | go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 424 | go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 425 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 426 | go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 427 | go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 428 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 429 | go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= 430 | go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 431 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 432 | go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= 433 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 434 | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= 435 | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 436 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 437 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 438 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 439 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 440 | golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 441 | golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 442 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 443 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 444 | golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 445 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 446 | golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= 447 | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= 448 | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 449 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 450 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 451 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 452 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 453 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 454 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 455 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 456 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 457 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 458 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 459 | golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= 460 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 461 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 462 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 463 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 464 | golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 465 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 466 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 467 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 468 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 469 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 470 | golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 471 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 472 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 473 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 474 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 475 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 476 | golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 477 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 478 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 479 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 480 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 481 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 482 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 483 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 484 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 485 | golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= 486 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 487 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 488 | golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 489 | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= 490 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 491 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 492 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 493 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 494 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 495 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 496 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 497 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 498 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 499 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 500 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 501 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 502 | golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= 503 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 504 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 505 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 506 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 507 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 508 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 509 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 510 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 511 | golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 512 | golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 513 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 514 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 515 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 516 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 517 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 518 | golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 519 | golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 520 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 521 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 522 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 523 | golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 524 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 525 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 526 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 527 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 528 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 529 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 530 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 531 | golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 532 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 533 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 534 | golang.org/x/sys v0.0.0-20210305034016-7844c3c200c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 535 | golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 536 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 537 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 538 | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 539 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 540 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 541 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 542 | golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= 543 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 544 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 545 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 546 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 547 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 548 | golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 549 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 550 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 551 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 552 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 553 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 554 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 555 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 556 | golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= 557 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 558 | golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 559 | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= 560 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 561 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 562 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 563 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 564 | golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 565 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 566 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 567 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 568 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 569 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 570 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 571 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 572 | golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 573 | golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 574 | golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 575 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 576 | golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 577 | golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 578 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 579 | golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 580 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 581 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 582 | golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= 583 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 584 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 585 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 586 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 587 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 588 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 589 | google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= 590 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 591 | google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 592 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 593 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 594 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 595 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 596 | google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= 597 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 598 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 599 | google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= 600 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 601 | google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= 602 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 603 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 604 | google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 605 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 606 | google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 607 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 608 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 609 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 610 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 611 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 612 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 613 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 614 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 615 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 616 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 617 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 618 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 619 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= 620 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 621 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 622 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 623 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 624 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 625 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 626 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 627 | gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 628 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 629 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 630 | gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= 631 | gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= 632 | gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= 633 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 634 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 635 | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 636 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 637 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 638 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 639 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 640 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 641 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 642 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 643 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 644 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 645 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 646 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 647 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 648 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 649 | honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 650 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 651 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 652 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 653 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 654 | sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= 655 | sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= 656 | --------------------------------------------------------------------------------