diff --git a/Dockerfile b/Dockerfile index 21efce2..718b6e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM golang:1.15.4 -ARG RHINO_VERSION=1.3.0 +ARG RHINO_VERSION=1.4.0 ENV GO111MODULE=on diff --git a/README.md b/README.md index 100267e..e20f920 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@

- Rhino Logo + Rhino Logo

Rhino

HTTP Mocking & Debugging Service

- - + +

@@ -113,6 +113,53 @@ Test it. $ curl http://127.0.0.1:8080/_health ``` +You can use fake data flags inside response body and rhino will auto generate them. Here is the full list of supported types: + +```bash +Latitude: @fake(:lat) +Longitude: @fake(:long) +CreditCardNumber: @fake(:cc_number) +CreditCardType: @fake(:cc_type) +Email: @fake(:email) +DomainName: @fake(:domain_name) +IPV4: @fake(:ipv4) +IPV6: @fake(:ipv6) +Password: @fake(:password) +PhoneNumber: @fake(:phone_number) +MacAddress: @fake(:mac_address) +URL: @fake(:url) +UserName: @fake(:username) +TollFreeNumber: @fake(:toll_free_number) +E164PhoneNumber: @fake(:e_164_phone_number) +TitleMale: @fake(:title_male) +TitleFemale: @fake(:title_female) +FirstName: @fake(:first_name) +FirstNameMale: @fake(:first_name_male) +FirstNameFemale: @fake(:first_name_female) +LastName: @fake(:last_name) +Name: @fake(:name) +UnixTime: @fake(:unix_time) +Date: @fake(:date) +Time: @fake(:time) +MonthName: @fake(:month_name) +Year: @fake(:year) +DayOfWeek: @fake(:day_of_week) +DayOfMonth: @fake(:day_of_month) +Timestamp: @fake(:timestamp) +Century: @fake(:century) +TimeZone: @fake(:timezone) +TimePeriod: @fake(:time_period) +Word: @fake(:word) +Sentence: @fake(:sentence) +Paragraph: @fake(:paragraph) +Currency: @fake(:currency) +Amount: @fake(:amount) +AmountWithCurrency: @fake(:amount_with_currency) +UUIDHypenated: @fake(:uuid_hyphenated) +UUID: @fake(:uuid_digit) +``` + + ### Docker Clone and then run docker containers. diff --git a/config.dist.json b/config.dist.json index 1ee2c21..d11f752 100644 --- a/config.dist.json +++ b/config.dist.json @@ -48,6 +48,24 @@ "latency": "0s", "failRate": "0%" } + }, + { + "path": "/_fake_data", + "request": { + "method": "get", + "parameters": {} + }, + "response": { + "statusCode": 200, + "headers": [ + {"key": "Content-Type", "value": "application/json"} + ], + "body": "{\"Latitude\":\"@fake(:lat)\",\"Longitude\":\"@fake(:long)\",\"CreditCardNumber\":\"@fake(:cc_number)\",\"CreditCardType\":\"@fake(:cc_type)\",\"Email\":\"@fake(:email)\",\"DomainName\":\"@fake(:domain_name)\",\"IPV4\":\"@fake(:ipv4)\",\"IPV6\":\"@fake(:ipv6)\",\"Password\":\"@fake(:password)\",\"PhoneNumber\":\"@fake(:phone_number)\",\"MacAddress\":\"@fake(:mac_address)\",\"URL\":\"@fake(:url)\",\"UserName\":\"@fake(:username)\",\"TollFreeNumber\":\"@fake(:toll_free_number)\",\"E164PhoneNumber\":\"@fake(:e_164_phone_number)\",\"TitleMale\":\"@fake(:title_male)\",\"TitleFemale\":\"@fake(:title_female)\",\"FirstName\":\"@fake(:first_name)\",\"FirstNameMale\":\"@fake(:first_name_male)\",\"FirstNameFemale\":\"@fake(:first_name_female)\",\"LastName\":\"@fake(:last_name)\",\"Name\":\"@fake(:name)\",\"UnixTime\":\"@fake(:unix_time)\",\"Date\":\"@fake(:date)\",\"Time\":\"@fake(:time)\",\"MonthName\":\"@fake(:month_name)\",\"Year\":\"@fake(:year)\",\"DayOfWeek\":\"@fake(:day_of_week)\",\"DayOfMonth\":\"@fake(:day_of_month)\",\"Timestamp\":\"@fake(:timestamp)\",\"Century\":\"@fake(:century)\",\"TimeZone\":\"@fake(:timezone)\",\"TimePeriod\":\"@fake(:time_period)\",\"Word\":\"@fake(:word)\",\"Sentence\":\"@fake(:sentence)\",\"Paragraph\":\"@fake(:paragraph)\",\"Currency\":\"@fake(:currency)\",\"Amount\":\"@fake(:amount)\",\"AmountWithCurrency\":\"@fake(:amount_with_currency)\",\"UUIDHypenated\":\"@fake(:uuid_hyphenated)\",\"UUID\":\"@fake(:uuid_digit)\"}" + }, + "chaos": { + "latency": "0s", + "failRate": "0%" + } } ], "debug": [ diff --git a/core/controller/mock.go b/core/controller/mock.go index 04b8c31..866df5a 100644 --- a/core/controller/mock.go +++ b/core/controller/mock.go @@ -14,6 +14,7 @@ import ( "time" "github.com/clivern/rhino/core/model" + "github.com/clivern/rhino/core/module" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" @@ -102,5 +103,13 @@ func Mock(c *gin.Context) { route.Response.Body = strings.Replace(route.Response.Body, value, parameters[key], -1) } + faker := &module.Faker{} + var err error + route.Response.Body, err = faker.Transform(route.Response.Body) + + if err != nil { + panic(err) + } + c.String(route.Response.StatusCode, route.Response.Body) } diff --git a/core/module/faker.go b/core/module/faker.go new file mode 100644 index 0000000..fef0c20 --- /dev/null +++ b/core/module/faker.go @@ -0,0 +1,174 @@ +// Copyright 2020 Clivern. All rights reserved. +// Use of this source code is governed by the MIT +// license that can be found in the LICENSE file. + +package module + +import ( + "fmt" + "regexp" + "strings" + + "github.com/bxcodec/faker/v3" +) + +// Faker type +type Faker struct { + Latitude float32 `faker:"lat"` + Longitude float32 `faker:"long"` + CreditCardNumber string `faker:"cc_number"` + CreditCardType string `faker:"cc_type"` + Email string `faker:"email"` + DomainName string `faker:"domain_name"` + IPV4 string `faker:"ipv4"` + IPV6 string `faker:"ipv6"` + Password string `faker:"password"` + PhoneNumber string `faker:"phone_number"` + MacAddress string `faker:"mac_address"` + URL string `faker:"url"` + UserName string `faker:"username"` + TollFreeNumber string `faker:"toll_free_number"` + E164PhoneNumber string `faker:"e_164_phone_number"` + TitleMale string `faker:"title_male"` + TitleFemale string `faker:"title_female"` + FirstName string `faker:"first_name"` + FirstNameMale string `faker:"first_name_male"` + FirstNameFemale string `faker:"first_name_female"` + LastName string `faker:"last_name"` + Name string `faker:"name"` + UnixTime int64 `faker:"unix_time"` + Date string `faker:"date"` + Time string `faker:"time"` + MonthName string `faker:"month_name"` + Year string `faker:"year"` + DayOfWeek string `faker:"day_of_week"` + DayOfMonth string `faker:"day_of_month"` + Timestamp string `faker:"timestamp"` + Century string `faker:"century"` + TimeZone string `faker:"timezone"` + TimePeriod string `faker:"time_period"` + Word string `faker:"word"` + Sentence string `faker:"sentence"` + Paragraph string `faker:"paragraph"` + Currency string `faker:"currency"` + Amount float64 `faker:"amount"` + AmountWithCurrency string `faker:"amount_with_currency"` + UUIDHypenated string `faker:"uuid_hyphenated"` + UUID string `faker:"uuid_digit"` +} + +// Transform populate faked data +func (f *Faker) Transform(data string) (string, error) { + types := f.GetTypesFound(data) + + err := faker.FakeData(f) + + if err != nil { + return data, err + } + + for i := 0; i < len(types); i++ { + + if types[i] == "@fake(:lat)" { + data = strings.Replace(data, types[i], fmt.Sprintf("%f", f.Latitude), -1) + } else if types[i] == "@fake(:long)" { + data = strings.Replace(data, types[i], fmt.Sprintf("%f", f.Longitude), -1) + } else if types[i] == "@fake(:cc_number)" { + data = strings.Replace(data, types[i], f.CreditCardNumber, -1) + } else if types[i] == "@fake(:cc_type)" { + data = strings.Replace(data, types[i], f.CreditCardType, -1) + } else if types[i] == "@fake(:email)" { + data = strings.Replace(data, types[i], f.Email, -1) + } else if types[i] == "@fake(:domain_name)" { + data = strings.Replace(data, types[i], f.DomainName, -1) + } else if types[i] == "@fake(:ipv4)" { + data = strings.Replace(data, types[i], f.IPV4, -1) + } else if types[i] == "@fake(:ipv6)" { + data = strings.Replace(data, types[i], f.IPV6, -1) + } else if types[i] == "@fake(:password)" { + data = strings.Replace(data, types[i], f.Password, -1) + } else if types[i] == "@fake(:phone_number)" { + data = strings.Replace(data, types[i], f.PhoneNumber, -1) + } else if types[i] == "@fake(:mac_address)" { + data = strings.Replace(data, types[i], f.MacAddress, -1) + } else if types[i] == "@fake(:url)" { + data = strings.Replace(data, types[i], f.URL, -1) + } else if types[i] == "@fake(:username)" { + data = strings.Replace(data, types[i], f.UserName, -1) + } else if types[i] == "@fake(:toll_free_number)" { + data = strings.Replace(data, types[i], f.TollFreeNumber, -1) + } else if types[i] == "@fake(:e_164_phone_number)" { + data = strings.Replace(data, types[i], f.E164PhoneNumber, -1) + } else if types[i] == "@fake(:title_male)" { + data = strings.Replace(data, types[i], f.TitleMale, -1) + } else if types[i] == "@fake(:title_female)" { + data = strings.Replace(data, types[i], f.TitleFemale, -1) + } else if types[i] == "@fake(:first_name)" { + data = strings.Replace(data, types[i], f.FirstName, -1) + } else if types[i] == "@fake(:first_name_male)" { + data = strings.Replace(data, types[i], f.FirstNameMale, -1) + } else if types[i] == "@fake(:first_name_female)" { + data = strings.Replace(data, types[i], f.FirstNameFemale, -1) + } else if types[i] == "@fake(:last_name)" { + data = strings.Replace(data, types[i], f.LastName, -1) + } else if types[i] == "@fake(:name)" { + data = strings.Replace(data, types[i], f.Name, -1) + } else if types[i] == "@fake(:unix_time)" { + data = strings.Replace(data, types[i], fmt.Sprintf("%d", f.UnixTime), -1) + } else if types[i] == "@fake(:date)" { + data = strings.Replace(data, types[i], f.Date, -1) + } else if types[i] == "@fake(:time)" { + data = strings.Replace(data, types[i], f.Time, -1) + } else if types[i] == "@fake(:month_name)" { + data = strings.Replace(data, types[i], f.MonthName, -1) + } else if types[i] == "@fake(:year)" { + data = strings.Replace(data, types[i], f.Year, -1) + } else if types[i] == "@fake(:day_of_week)" { + data = strings.Replace(data, types[i], f.DayOfWeek, -1) + } else if types[i] == "@fake(:day_of_month)" { + data = strings.Replace(data, types[i], f.DayOfMonth, -1) + } else if types[i] == "@fake(:timestamp)" { + data = strings.Replace(data, types[i], f.Timestamp, -1) + } else if types[i] == "@fake(:century)" { + data = strings.Replace(data, types[i], f.Century, -1) + } else if types[i] == "@fake(:timezone)" { + data = strings.Replace(data, types[i], f.TimeZone, -1) + } else if types[i] == "@fake(:time_period)" { + data = strings.Replace(data, types[i], f.TimePeriod, -1) + } else if types[i] == "@fake(:word)" { + data = strings.Replace(data, types[i], f.Word, -1) + } else if types[i] == "@fake(:sentence)" { + data = strings.Replace(data, types[i], f.Sentence, -1) + } else if types[i] == "@fake(:paragraph)" { + data = strings.Replace(data, types[i], f.Paragraph, -1) + } else if types[i] == "@fake(:currency)" { + data = strings.Replace(data, types[i], f.Currency, -1) + } else if types[i] == "@fake(:amount)" { + data = strings.Replace(data, types[i], fmt.Sprintf("%f", f.Amount), -1) + } else if types[i] == "@fake(:amount_with_currency)" { + data = strings.Replace(data, types[i], f.AmountWithCurrency, -1) + } else if types[i] == "@fake(:uuid_hyphenated)" { + data = strings.Replace(data, types[i], f.UUIDHypenated, -1) + } else if types[i] == "@fake(:uuid_digit)" { + data = strings.Replace(data, types[i], f.UUID, -1) + } + } + + return data, nil +} + +// GetTypesFound grep all fake data tags +func (f *Faker) GetTypesFound(data string) []string { + result := []string{} + r := regexp.MustCompile(`@fake\((.)+?\)`) + matches := r.FindAllStringIndex(data, -1) + + for n := 0; n < len(matches); n++ { + result = append( + result, + data[matches[n][0]:matches[n][1]], + ) + } + + return result +} diff --git a/deployment/docker-compose/docker-compose.yml b/deployment/docker-compose/docker-compose.yml index 013862f..9d1a09d 100644 --- a/deployment/docker-compose/docker-compose.yml +++ b/deployment/docker-compose/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: rhino: - image: 'clivern/rhino:release-1.3.0' + image: 'clivern/rhino:release-1.4.0' ports: - "8080:8080" command: '/app/rhino serve -c /app/configs/config.prod.json' diff --git a/go.mod b/go.mod index 0dfa22c..2c72ac7 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/clivern/rhino go 1.15 require ( + github.com/bxcodec/faker/v3 v3.5.0 github.com/drone/envsubst v1.0.2 github.com/gin-gonic/gin v1.6.3 github.com/prometheus/client_golang v1.8.0 diff --git a/go.sum b/go.sum index 5697fac..59ab204 100644 --- a/go.sum +++ b/go.sum @@ -28,7 +28,6 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= @@ -41,6 +40,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bxcodec/faker/v3 v3.5.0 h1:Rahy6dwbd6up0wbwbV7dFyQb+jmdC51kpATuUdnzfMg= +github.com/bxcodec/faker/v3 v3.5.0/go.mod h1:gF31YgnMSMKgkvl+fyEo1xuSMbEuieyqfeslGYFjneM= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -53,7 +54,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -126,8 +126,8 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -151,7 +151,6 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -216,7 +215,6 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -288,7 +286,6 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0 h1:zvJNkoCFAnYFNC24FV8nW4JdRJ3GIFcLbg65lL/JDcw= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= @@ -304,7 +301,6 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= @@ -313,7 +309,6 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -345,18 +340,14 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.0/go.mod h1:yk5b0mALVusDL5fMM6Rd1wgnoO5jUPhwsQ6LQAJTidQ= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= @@ -373,7 +364,6 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -381,7 +371,6 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -439,7 +428,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -477,7 +465,6 @@ golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88= @@ -573,8 +560,8 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=