├── .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 |

2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
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 |
--------------------------------------------------------------------------------