Skip to content

Commit

Permalink
feat: support nacos degradation
Browse files Browse the repository at this point in the history
  • Loading branch information
Madxf committed Jun 4, 2024
1 parent 783d6b8 commit d28ae6a
Show file tree
Hide file tree
Showing 10 changed files with 250 additions and 26 deletions.
12 changes: 6 additions & 6 deletions client/degradation.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ func WithDegradation(dest, src string, nacosClient nacos.Client, opts utils.Opti

uniqueID := nacos.GetUniqueID()

dgContainer := initDegradation(param, dest, src, nacosClient, uniqueID)
degradationContainer := initDegradation(param, dest, src, nacosClient, uniqueID)

return []client.Option{
client.WithACLRules(dgContainer.GetACLRule()),
client.WithACLRules(degradationContainer.GetACLRule()),
client.WithCloseCallbacks(func() error {
err := nacosClient.DeregisterConfig(param, uniqueID)
if err != nil {
Expand All @@ -59,7 +59,7 @@ func WithDegradation(dest, src string, nacosClient nacos.Client, opts utils.Opti
func initDegradation(param vo.ConfigParam, dest, src string,
nacosClient nacos.Client, uniqueID int64,
) *degradation.Container {
dgContainer := degradation.NewDeGradationContainer()
degradationContainer := degradation.NewDegradationContainer()

onChangeCallback := func(data string, parser nacos.ConfigParser) {
config := &degradation.Config{}
Expand All @@ -68,11 +68,11 @@ func initDegradation(param vo.ConfigParam, dest, src string,
klog.Warnf("[nacos] %s client nacos rpc degradation: unmarshal data %s failed: %s, skip...", dest, data, err)
return
}
// update degradation config & rule
dgContainer.NotifyPolicyChange(config)
// update degradation config
degradationContainer.NotifyPolicyChange(config)
}

nacosClient.RegisterConfigCallback(param, onChangeCallback, uniqueID)

return dgContainer
return degradationContainer
}
4 changes: 1 addition & 3 deletions client/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ const (
retryConfigName = "retry"
rpcTimeoutConfigName = "rpc_timeout"
circuitBreakerConfigName = "circuit_break"
// 新增降级策略
degradationName = "degradation"
degradationName = "degradation"
)

// NacosClientSuite nacos client config suite, configure retry timeout limit and circuitbreak dynamically from nacos.
Expand Down Expand Up @@ -55,7 +54,6 @@ func (s *NacosClientSuite) Options() []client.Option {
opts = append(opts, WithRetryPolicy(s.service, s.client, s.nacosClient, s.opts)...)
opts = append(opts, WithRPCTimeout(s.service, s.client, s.nacosClient, s.opts)...)
opts = append(opts, WithCircuitBreaker(s.service, s.client, s.nacosClient, s.opts)...)
// 新增降级策略选项
opts = append(opts, WithDegradation(s.service, s.client, s.nacosClient, s.opts)...)

Check failure on line 57 in client/suite.go

View workflow job for this annotation

GitHub Actions / unit-benchmark-test (1.20.1, ARM64)

cannot use s.nacosClient (variable of type "github.com/kitex-contrib/config-nacos/v2/nacos".Client) as "github.com/kitex-contrib/config-nacos/nacos".Client value in argument to WithDegradation: "github.com/kitex-contrib/config-nacos/v2/nacos".Client does not implement "github.com/kitex-contrib/config-nacos/nacos".Client (wrong type for method ClientConfigParam)

Check failure on line 57 in client/suite.go

View workflow job for this annotation

GitHub Actions / unit-benchmark-test (1.20.1, ARM64)

cannot use s.opts (variable of type "github.com/kitex-contrib/config-nacos/v2/utils".Options) as "github.com/kitex-contrib/config-nacos/utils".Options value in argument to WithDegradation
return opts
}
24 changes: 12 additions & 12 deletions pkg/degradation/degradation.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,29 @@ type Config struct {

type Container struct {
sync.RWMutex
dgConfig atomic.Value
config atomic.Value
}

var defaultDGConfig = &Config{Enable: false, Percentage: 0}
var defaultConfig = &Config{Enable: false, Percentage: 0}

// GetDefaultDGConfig return defaultConfig of degradation.
func GetDefaultDGConfig() *Config {
return defaultDGConfig
// GetDefaultDegradationConfig return defaultConfig of degradation.
func GetDefaultDegradationConfig() *Config {
return defaultConfig
}

func NewDeGradationContainer() *Container {
dgContainer := &Container{}
dgContainer.dgConfig.Store(GetDefaultDGConfig())
return dgContainer
func NewDegradationContainer() *Container {
degradationContainer := &Container{}
degradationContainer.config.Store(GetDefaultDegradationConfig())
return degradationContainer
}

func (s *Container) NotifyPolicyChange(cfg *Config) {
s.dgConfig.Store(cfg)
s.config.Store(cfg)
}

func (s *Container) GetACLRule() acl.RejectFunc {
return func(ctx context.Context, request interface{}) (reason error) {
config := s.dgConfig.Load().(*Config)
config := s.config.Load().(*Config)
if !config.Enable {
return nil
}
Expand All @@ -67,7 +67,7 @@ func (s *Container) GetACLRule() acl.RejectFunc {
}
}

// DeepCopy returns a full copy of DGConfig.
// DeepCopy returns a full copy of DegradationConfig.
func (c *Config) DeepCopy() *Config {
if c == nil {
return nil
Expand Down
2 changes: 1 addition & 1 deletion pkg/degradation/degradation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func invoke(ctx context.Context, request, response interface{}) error {
}

func TestNewContainer(t *testing.T) {
container := NewDeGradationContainer()
container := NewDegradationContainer()
aclMiddleware := acl.NewACLMiddleware([]acl.RejectFunc{container.GetACLRule()})
test.Assert(t, errors.Is(aclMiddleware(invoke)(context.Background(), nil, nil), errFake))
container.NotifyPolicyChange(&Config{Enable: false, Percentage: 100})
Expand Down
78 changes: 78 additions & 0 deletions v2/client/degradation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright 2024 CloudWeGo Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package client

import (
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/pkg/klog"
"github.com/kitex-contrib/config-nacos/v2/pkg/degradation"
"github.com/nacos-group/nacos-sdk-go/vo"

"github.com/kitex-contrib/config-nacos/nacos"
"github.com/kitex-contrib/config-nacos/utils"
)

// WithDegradation sets the degradation policy from nacos configuration center.
func WithDegradation(dest, src string, nacosClient nacos.Client, opts utils.Options) []client.Option {
param, err := nacosClient.ClientConfigParam(&nacos.ConfigParamConfig{
Category: degradationName,
ServerServiceName: dest,
ClientServiceName: src,
})
if err != nil {
panic(err)
}

for _, f := range opts.NacosCustomFunctions {
f(&param)
}

uniqueID := nacos.GetUniqueID()

degradationContainer := initDegradation(param, dest, src, nacosClient, uniqueID)

return []client.Option{
client.WithACLRules(degradationContainer.GetACLRule()),
client.WithCloseCallbacks(func() error {
err := nacosClient.DeregisterConfig(param, uniqueID)
if err != nil {
return err
}
// cancel the configuration listener when client is closed.
return nil
}),
}
}

func initDegradation(param vo.ConfigParam, dest, src string,
nacosClient nacos.Client, uniqueID int64,
) *degradation.Container {
degradationContainer := degradation.NewDegradationContainer()

onChangeCallback := func(data string, parser nacos.ConfigParser) {
config := &degradation.Config{}
err := parser.Decode(param.Type, data, config)
if err != nil {
klog.Warnf("[nacos] %s client nacos rpc degradation: unmarshal data %s failed: %s, skip...", dest, data, err)
return
}
// update degradation config
degradationContainer.NotifyPolicyChange(config)
}

nacosClient.RegisterConfigCallback(param, onChangeCallback, uniqueID)

return degradationContainer
}
2 changes: 2 additions & 0 deletions v2/client/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ const (
retryConfigName = "retry"
rpcTimeoutConfigName = "rpc_timeout"
circuitBreakerConfigName = "circuit_break"
degradationName = "degradation"
)

// NacosClientSuite nacos client config suite, configure retry timeout limit and circuitbreak dynamically from nacos.
Expand Down Expand Up @@ -53,5 +54,6 @@ func (s *NacosClientSuite) Options() []client.Option {
opts = append(opts, WithRetryPolicy(s.service, s.client, s.nacosClient, s.opts)...)
opts = append(opts, WithRPCTimeout(s.service, s.client, s.nacosClient, s.opts)...)
opts = append(opts, WithCircuitBreaker(s.service, s.client, s.nacosClient, s.opts)...)
opts = append(opts, WithDegradation(s.service, s.client, s.nacosClient, s.opts)...)
return opts
}
10 changes: 6 additions & 4 deletions v2/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@ module github.com/kitex-contrib/config-nacos/v2

go 1.19


require (
github.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b
github.com/cloudwego/kitex v0.8.0
github.com/cloudwego/kitex-examples v0.2.4
github.com/cloudwego/thriftgo v0.3.3
github.com/kitex-contrib/config-nacos v0.3.0
github.com/nacos-group/nacos-sdk-go v1.1.4
github.com/nacos-group/nacos-sdk-go/v2 v2.2.5
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.9.0
go.uber.org/atomic v1.11.0
sigs.k8s.io/yaml v1.4.0
Expand All @@ -22,7 +26,6 @@ require (
github.com/apache/thrift v0.16.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect
github.com/bytedance/sonic v1.10.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
Expand All @@ -34,9 +37,9 @@ require (
github.com/cloudwego/frugal v0.1.12 // indirect
github.com/cloudwego/localsession v0.0.2 // indirect
github.com/cloudwego/netpoll v0.5.1 // indirect
github.com/cloudwego/thriftgo v0.3.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/go-errors/errors v1.0.1 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a // indirect
Expand All @@ -50,7 +53,6 @@ require (
github.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/oleiade/lane v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.4.0 // indirect
Expand Down
15 changes: 15 additions & 0 deletions v2/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ github.com/alibabacloud-go/tea v1.1.17 h1:05R5DnaJXe9sCNIe8KUgWHC/z6w/VZIwczgUwz
github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
github.com/alibabacloud-go/tea-utils v1.4.4 h1:lxCDvNCdTo9FaXKKq45+4vGETQUKNOW/qKTcX9Sk53o=
github.com/alibabacloud-go/tea-utils v1.4.4/go.mod h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1800 h1:ie/8RxBOfKZWcrbYSJi2Z8uX8TcOlSMwPlEJh83OeOw=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1800/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
github.com/aliyun/alibabacloud-dkms-gcs-go-sdk v0.2.2 h1:rWkH6D2XlXb/Y+tNAQROxBzp3a0p92ni+pXcaHBe/WI=
Expand Down Expand Up @@ -157,6 +158,8 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
Expand Down Expand Up @@ -274,6 +277,8 @@ github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kitex-contrib/config-nacos v0.3.0 h1:3ZAIqmnircDli7OZPyf8LNrysJ2rMNOzbYBfhjUlezk=
github.com/kitex-contrib/config-nacos v0.3.0/go.mod h1:UtVblMUcSCQTsLu786/0A80V7mxAJ3isRIWhbiWUVfQ=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
Expand Down Expand Up @@ -301,6 +306,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nacos-group/nacos-sdk-go v1.1.4 h1:qyrZ7HTWM4aeymFfqnbgNRERh7TWuER10pCB7ddRcTY=
github.com/nacos-group/nacos-sdk-go v1.1.4/go.mod h1:cBv9wy5iObs7khOqov1ERFQrCuTR4ILpgaiaVMxEmGI=
github.com/nacos-group/nacos-sdk-go/v2 v2.2.5 h1:r0wwT7PayEjvEHzWXwr1ROi/JSqzujM4w+1L5ikThzQ=
github.com/nacos-group/nacos-sdk-go/v2 v2.2.5/go.mod h1:OObBon0prVJVPoIbSZxpEkFiBfL0d1LcBtuAMiNn+8c=
github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso=
Expand Down Expand Up @@ -350,6 +357,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down Expand Up @@ -393,11 +401,15 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
Expand Down Expand Up @@ -620,6 +632,8 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
Expand Down Expand Up @@ -759,6 +773,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
Expand Down
Loading

0 comments on commit d28ae6a

Please sign in to comment.