From 128c97be6b5c5cd02b25c761289020da67382cba Mon Sep 17 00:00:00 2001 From: jkhelil Date: Wed, 6 May 2020 09:40:11 +0200 Subject: [PATCH] lint with golangci-lint --- .golangci.yml | 29 +++ Makefile | 6 +- cmd/manager/main.go | 4 +- go.mod | 3 +- go.sum | 178 ++++++++++++++++++ internal/render/render.go | 2 +- internal/try/until.go | 8 +- pkg/apis/apis.go | 4 +- pkg/apis/jenkins/v1alpha2/jenkins_types.go | 46 ++--- pkg/controller/jenkins/client/jenkins.go | 17 +- pkg/controller/jenkins/client/mockgen.go | 3 +- pkg/controller/jenkins/client/script.go | 1 + pkg/controller/jenkins/client/script_test.go | 5 +- pkg/controller/jenkins/client/token.go | 2 +- .../backuprestore/backuprestore.go | 2 +- .../jenkins/configuration/base/container.go | 2 +- .../jenkins/configuration/base/pod.go | 2 +- .../configuration/base/reconcile_test.go | 5 +- .../resources/base_configuration_configmap.go | 4 +- .../configuration/base/resources/rbac.go | 2 +- .../configuration/base/resources/route.go | 15 +- .../configuration/base/resources/service.go | 2 + .../base/resources/service_account.go | 2 +- .../jenkins/configuration/base/route.go | 3 +- .../configuration/base/validate_test.go | 33 ++-- .../jenkins/configuration/configuration.go | 8 +- .../configuration/configuration_test.go | 2 +- .../user/seedjobs/seedjobs_test.go | 8 +- .../configuration/user/seedjobs/validate.go | 2 +- pkg/controller/jenkins/groovy/groovy_test.go | 6 +- pkg/controller/jenkins/jenkins_controller.go | 26 ++- .../jenkins/notifications/event/event.go | 6 +- .../notifications/provider/provider.go | 7 +- .../jenkins/notifications/reason/reason.go | 46 ++--- .../notifications/reason/reason_test.go | 1 - .../jenkins/notifications/sender.go | 16 +- .../jenkins/notifications/slack/slack.go | 10 +- .../jenkins/notifications/smtp/smtp.go | 6 +- .../jenkins/notifications/smtp/smtp_test.go | 17 +- .../jenkins/plugins/base_plugins.go | 4 +- pkg/controller/jenkins/plugins/plugin.go | 10 +- pkg/event/event.go | 2 +- pkg/log/log.go | 6 +- test/e2e/configuration_test.go | 6 +- test/e2e/seedjobs_test.go | 4 +- version/version.go | 2 +- 46 files changed, 394 insertions(+), 181 deletions(-) create mode 100644 .golangci.yml diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..a3adedd0a --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,29 @@ +run: + deadline: 10m +linters-settings: + errcheck: + check-blank: false + ignore: fmt:.*,io/ioutil:^Read.*,Write + +linters: + enable-all: true + disable: + - funlen + - gocognit + - godox + - gomnd + - gochecknoglobals + - gochecknoinits + - lll + - prealloc + - wsl + - gocyclo + - scopelint + - dupl + - gosec + - maligned + - testpackage + - goerr113 + - nakedret + - nestif + - godot diff --git a/Makefile b/Makefile index fc920f1c6..f37412737 100644 --- a/Makefile +++ b/Makefile @@ -136,13 +136,13 @@ fmt: ## Verifies all files have been `gofmt`ed @go fmt $(PACKAGES) .PHONY: lint -HAS_GOLINT := $(shell which golint) +HAS_GOLINT := $(shell which golangci-lint) lint: ## Verifies `golint` passes @echo "+ $@" ifndef HAS_GOLINT - go get -u golang.org/x/lint/golint + go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.26.0 endif - @golint $(PACKAGES) + @golangci-lint run .PHONY: goimports HAS_GOIMPORTS := $(shell which goimports) diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 010998b55..44cd915a4 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -13,10 +13,10 @@ import ( "github.com/jenkinsci/kubernetes-operator/pkg/apis" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" + "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/constants" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/notifications" e "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/notifications/event" - "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/jenkinsci/kubernetes-operator/pkg/event" "github.com/jenkinsci/kubernetes-operator/pkg/log" "github.com/jenkinsci/kubernetes-operator/version" @@ -119,7 +119,7 @@ func main() { fatal(errors.Wrap(err, "failed to create Kubernetes client set"), *debug) } - if( resources.IsRouteAPIAvailable(clientSet) ) { + if resources.IsRouteAPIAvailable(clientSet) { log.Log.Info("Route API found: Route creation will be performed") } c := make(chan e.Event) diff --git a/go.mod b/go.mod index 03ab0bac2..5e95b57cd 100644 --- a/go.mod +++ b/go.mod @@ -13,13 +13,14 @@ require ( github.com/go-logr/zapr v0.1.1 github.com/go-openapi/spec v0.19.4 github.com/golang/mock v1.3.1 + github.com/golangci/golangci-lint v1.26.0 // indirect github.com/mailgun/mailgun-go/v3 v3.6.0 github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible github.com/operator-framework/operator-sdk v0.17.0 github.com/pkg/errors v0.9.1 github.com/robfig/cron v1.2.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.5.1 go.uber.org/zap v1.14.1 golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect golang.org/x/net v0.0.0-20200226121028-0de0cce0169b diff --git a/go.sum b/go.sum index 68b01f7e1..3c47e83a6 100644 --- a/go.sum +++ b/go.sum @@ -26,9 +26,12 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157 h1:hY39LwQHh+1kaovmIjOrlqnXNX6tygSRfLkkK33IkZU= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= @@ -50,6 +53,8 @@ github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEY github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -59,6 +64,7 @@ github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkF github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -91,6 +97,8 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR github.com/bndr/gojenkins v0.0.0-20181125150310-de43c03cf849 h1:nV1eKvUlIKhH4/atJIT9tpClzSRTs7TIHS/dRY1EQCw= github.com/bndr/gojenkins v0.0.0-20181125150310-de43c03cf849/go.mod h1:J2FxlujWW87NJJrdysyctcDllRVYUONGGlHX16134P4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bombsimon/wsl/v3 v3.0.0 h1:w9f49xQatuaeTJFaNP4SpiWSR5vfT6IstPtM62JjcqA= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -155,6 +163,8 @@ github.com/coreos/prometheus-operator v0.35.1 h1:Cl/0axMpifGsKTNMwQB5PWciOSkNFa/ github.com/coreos/prometheus-operator v0.35.1/go.mod h1:XHYZUStZWcwd1yk/1DjZv/fywqKIyAJ6pSwvIr+v9BQ= github.com/coreos/rkt v1.30.0/go.mod h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= @@ -235,10 +245,12 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqL github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= @@ -254,9 +266,13 @@ github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-chi/chi v4.0.0+incompatible h1:SiLLEDyAkqNnw+T/uDTf3aFB9T4FTrwMpuYrgaRcnW4= github.com/go-chi/chi v4.0.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-critic/go-critic v0.4.1 h1:4DTQfT1wWwLg/hzxwD9bkdhDQrdJtxe6DUTadPlrIeE= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= @@ -264,6 +280,7 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -308,6 +325,27 @@ github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6m github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= @@ -316,10 +354,13 @@ github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8z github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -352,6 +393,36 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.26.0 h1:CLLGRSA9BLMiNvsWPXHioYAdfIx9tkgdVWyA6bIdYCo= +github.com/golangci/golangci-lint v1.26.0/go.mod h1:tefbO6RcigFzvTnDC+Y51kntVGgkuCAVsC+mnfbPruc= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= @@ -396,6 +467,8 @@ github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gosuri/uitable v0.0.1/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7 h1:6TSoaYExHper8PYsJu23GWVNOyYRCSnIFyxKgLSZ54w= @@ -424,6 +497,7 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/heketi/heketi v9.0.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI= @@ -446,10 +520,15 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= @@ -469,7 +548,11 @@ github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46s github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= @@ -479,7 +562,9 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -487,12 +572,14 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= 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/mailgun/mailgun-go/v3 v3.6.0 h1:oQWhyDTFjSiuO6vx1PRlfLZ7Fu+oK0Axn0UTREh3k/g= github.com/mailgun/mailgun-go/v3 v3.6.0/go.mod h1:E81I5Agcfi/u1szdehi6p6ttdRX/UD3Rq2SrUzwyFIU= @@ -505,22 +592,30 @@ github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/maorfr/helm-plugin-utils v0.0.0-20181205064038-588190cb5e3b/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= github.com/maorfr/helm-plugin-utils v0.0.0-20200216074820-36d2fcf6ae86/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k= @@ -537,9 +632,11 @@ github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfv github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -553,16 +650,22 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/tls-observatory v0.0.0-20200220173314-aae45faa4006/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20190414153302-2ae31c8b6b30/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -570,10 +673,13 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= @@ -616,9 +722,11 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -677,6 +785,7 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robfig/cron v0.0.0-20170526150127-736158dc09e1/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= @@ -694,11 +803,19 @@ github.com/rubenv/sql-migrate v0.0.0-20191025130928-9355dd04f4b3/go.mod h1:WS0rl github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryancurrah/gomodguard v1.0.4 h1:oCreMAt9GuFXDe9jW4HBpc3GjdX3R/sUEcLAGh1zPx8= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/securego/gosec v0.0.0-20200316084457-7da9f46445fd h1:qB+l4fYZsH78xORC1aqVS0zNmgkQp4rkj2rvfxQMtzc= +github.com/securego/gosec v0.0.0-20200316084457-7da9f46445fd/go.mod h1:NurAFZsWJAEZjogSwdVPlHkOZB3DOAU7gsPP8VFZCHc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -709,17 +826,22 @@ github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= 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/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +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/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -729,24 +851,49 @@ 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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v0.3.3 h1:uJjg8N+Ee10rAnaqJGet1WeI0YW4fiX9pKbwqnsqH6k= +github.com/tetafro/godot v0.3.3/go.mod h1:pT6/T8+h6//L/LwQcFc4C0xpfy1euZwzS1sHdrFCms0= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= 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/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= @@ -825,6 +972,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -836,6 +984,7 @@ golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -862,6 +1011,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -911,6 +1061,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934 h1:u/E0NqCIWRDAo9WCFo6Ko49njPFDLSd3z+X1HgWDMpE= golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= @@ -926,34 +1077,49 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqG golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190213015956-f7e1b50d2251/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a/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-20191030203535-5e247c9ad0a0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200210192313-1ace956b0e17 h1:a/Fd23DJvg1CaeDH0dYHahE+hCI0v9rFgxSNIThoUcM= golang.org/x/tools v0.0.0-20200210192313-1ace956b0e17/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200228224639-71482053b885/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200327195553-82bb89366a1e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b h1:zSzQJAznWxAh9fZxiPy2FZo+ZZEYoYFYYDYdOrU7AaM= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200504022951-6b6965ac5dd1 h1:C8rdnd6KieI73Z2Av0sS0t4kW+geIH/M8kNX8Hmvn9E= @@ -1011,6 +1177,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -1023,6 +1190,8 @@ gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0E gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= @@ -1054,6 +1223,7 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.0.0-20191016110408-35e52d86657a h1:VVUE9xTCXP6KUPMf92cQmN88orz600ebexcRRaBTepQ= k8s.io/api v0.0.0-20191016110408-35e52d86657a/go.mod h1:/L5qH+AD540e7Cetbui1tuJeXdmNhO8jM6VkXeDdDhQ= @@ -1109,6 +1279,12 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLK k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= @@ -1121,4 +1297,6 @@ sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:I sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/internal/render/render.go b/internal/render/render.go index b37379cba..f49babed5 100644 --- a/internal/render/render.go +++ b/internal/render/render.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" ) -// Render executes a parsed template (go-template) with configuration from data +// Render executes a parsed template (go-template) with configuration from data. func Render(template *template.Template, data interface{}) (string, error) { var buffer bytes.Buffer if err := template.Execute(&buffer, data); err != nil { diff --git a/internal/try/until.go b/internal/try/until.go index 8c4a269f4..118ff1ba1 100644 --- a/internal/try/until.go +++ b/internal/try/until.go @@ -8,7 +8,7 @@ import ( time2 "github.com/jenkinsci/kubernetes-operator/internal/time" ) -// ErrTimeout is used when the set timeout has been reached +// ErrTimeout is used when the set timeout has been reached. type ErrTimeout struct { text string cause error @@ -18,7 +18,7 @@ func (e *ErrTimeout) Error() string { return fmt.Sprintf("%s: %s", e.text, e.cause.Error()) } -// Cause returns the error that caused ErrTimeout +// Cause returns the error that caused ErrTimeout. func (e *ErrTimeout) Cause() error { return e.cause } @@ -28,7 +28,7 @@ func (e *ErrTimeout) Format(s fmt.State, verb rune) { errors.Format(e.cause, s, verb) } -// Until keeps trying until timeout or there is a result or an error +// Until keeps trying until timeout or there is a result or an error. func Until(something func() (end bool, err error), tick, timeout time.Duration) error { counter := 0 tickChan := time2.Every(tick) @@ -42,7 +42,7 @@ func Until(something func() (end bool, err error), tick, timeout time.Duration) if end { return err } - counter = counter + 1 + counter++ case <-timeoutChan: return &ErrTimeout{ text: fmt.Sprintf("timed out after: %s, tries: %d", timeout, counter), diff --git a/pkg/apis/apis.go b/pkg/apis/apis.go index a3782ece3..515f2f6ff 100644 --- a/pkg/apis/apis.go +++ b/pkg/apis/apis.go @@ -7,10 +7,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -// AddToSchemes may be used to add all resources defined in the project to a Scheme +// AddToSchemes may be used to add all resources defined in the project to a Scheme. var AddToSchemes runtime.SchemeBuilder -// AddToScheme adds all Resources to the Scheme +// AddToScheme adds all Resources to the Scheme. func AddToScheme(s *runtime.Scheme) error { return AddToSchemes.AddToScheme(s) } diff --git a/pkg/apis/jenkins/v1alpha2/jenkins_types.go b/pkg/apis/jenkins/v1alpha2/jenkins_types.go index 07e0bd8d4..ae943d63f 100644 --- a/pkg/apis/jenkins/v1alpha2/jenkins_types.go +++ b/pkg/apis/jenkins/v1alpha2/jenkins_types.go @@ -6,7 +6,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -// JenkinsSpec defines the desired state of the Jenkins +// JenkinsSpec defines the desired state of the Jenkins. // +k8s:openapi-gen=true type JenkinsSpec struct { // Master represents Jenkins master pod properties and Jenkins plugins. @@ -92,7 +92,7 @@ type ServiceAccount struct { Annotations map[string]string `json:"annotations,omitempty"` } -// NotificationLevel defines the level of a Notification +// NotificationLevel defines the level of a Notification. type NotificationLevel string const ( @@ -103,7 +103,7 @@ const ( NotificationLevelInfo NotificationLevel = "info" ) -// Notification is a service configuration used to send notifications about Jenkins status +// Notification is a service configuration used to send notifications about Jenkins status. type Notification struct { LoggingLevel NotificationLevel `json:"level"` Verbose bool `json:"verbose"` @@ -114,13 +114,13 @@ type Notification struct { SMTP *SMTP `json:"smtp,omitempty"` } -// Slack is handler for Slack notification channel +// Slack is handler for Slack notification channel. type Slack struct { // The web hook URL to Slack App WebHookURLSecretKeySelector SecretKeySelector `json:"webHookURLSecretKeySelector"` } -// SMTP is handler for sending emails via this protocol +// SMTP is handler for sending emails via this protocol. type SMTP struct { UsernameSecretKeySelector SecretKeySelector `json:"usernameSecretKeySelector"` PasswordSecretKeySelector SecretKeySelector `json:"passwordSecretKeySelector"` @@ -131,13 +131,13 @@ type SMTP struct { To string `json:"to"` } -// MicrosoftTeams is handler for Microsoft MicrosoftTeams notification channel +// MicrosoftTeams is handler for Microsoft MicrosoftTeams notification channel. type MicrosoftTeams struct { // The web hook URL to MicrosoftTeams App WebHookURLSecretKeySelector SecretKeySelector `json:"webHookURLSecretKeySelector"` } -// Mailgun is handler for Mailgun email service notification channel +// Mailgun is handler for Mailgun email service notification channel. type Mailgun struct { Domain string `json:"domain"` APIKeySecretKeySelector SecretKeySelector `json:"apiKeySecretKeySelector"` @@ -153,7 +153,7 @@ type SecretKeySelector struct { Key string `json:"key"` } -// Container defines Kubernetes container attributes +// Container defines Kubernetes container attributes. type Container struct { // Name of the container specified as a DNS_LABEL. // Each container in a pod must have a unique name (DNS_LABEL). @@ -244,7 +244,7 @@ type Container struct { SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty"` } -// Plugin defines Jenkins plugin +// Plugin defines Jenkins plugin. type Plugin struct { // Name is the name of Jenkins plugin Name string `json:"name"` @@ -255,7 +255,7 @@ type Plugin struct { } // JenkinsMaster defines the Jenkins master pod attributes and plugins, -// every single change requires a Jenkins master pod restart +// every single change requires a Jenkins master pod restart. type JenkinsMaster struct { // Annotations is an unstructured key value map stored with a resource that may be // set by external tools to store and retrieve arbitrary metadata. They are not @@ -510,14 +510,14 @@ type Jenkins struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// JenkinsList contains a list of Jenkins +// JenkinsList contains a list of Jenkins. type JenkinsList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []Jenkins `json:"items"` } -// JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism +// JenkinsCredentialType defines type of Jenkins credential used to seed job mechanism. type JenkinsCredentialType string const ( @@ -531,7 +531,7 @@ const ( ExternalCredentialType JenkinsCredentialType = "external" ) -// AllowedJenkinsCredentialMap contains all allowed Jenkins credentials types +// AllowedJenkinsCredentialMap contains all allowed Jenkins credentials types. var AllowedJenkinsCredentialMap = map[string]string{ string(NoJenkinsCredentialCredentialType): "", string(BasicSSHCredentialType): "", @@ -540,7 +540,7 @@ var AllowedJenkinsCredentialMap = map[string]string{ } // SeedJob defines configuration for seed job -// More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines +// More info: https://github.com/jenkinsci/kubernetes-operator/blob/master/docs/getting-started.md#configure-seed-jobs-and-pipelines. type SeedJob struct { // ID is the unique seed job name ID string `json:"id,omitempty"` @@ -598,13 +598,13 @@ type SeedJob struct { UnstableOnDeprecation bool `json:"unstableOnDeprecation"` } -// Handler defines a specific action that should be taken +// Handler defines a specific action that should be taken. type Handler struct { // Exec specifies the action to take. Exec *corev1.ExecAction `json:"exec,omitempty"` } -// Backup defines configuration of Jenkins backup +// Backup defines configuration of Jenkins backup. type Backup struct { // ContainerName is the container name responsible for backup operation ContainerName string `json:"containerName"` @@ -620,7 +620,7 @@ type Backup struct { MakeBackupBeforePodDeletion bool `json:"makeBackupBeforePodDeletion"` } -// Restore defines configuration of Jenkins backup restore operation +// Restore defines configuration of Jenkins backup restore operation. type Restore struct { // ContainerName is the container name responsible for restore backup operation ContainerName string `json:"containerName"` @@ -633,7 +633,7 @@ type Restore struct { RecoveryOnce uint64 `json:"recoveryOnce,omitempty"` } -// AppliedGroovyScript is the applied groovy script in Jenkins by the operator +// AppliedGroovyScript is the applied groovy script in Jenkins by the operator. type AppliedGroovyScript struct { // ConfigurationType is the name of the configuration type(base-groovy, user-groovy, user-casc) ConfigurationType string `json:"configurationType"` @@ -645,28 +645,28 @@ type AppliedGroovyScript struct { Hash string `json:"hash"` } -// SecretRef is reference to Kubernetes secret +// SecretRef is reference to Kubernetes secret. type SecretRef struct { Name string `json:"name"` } -// ConfigMapRef is reference to Kubernetes ConfigMap +// ConfigMapRef is reference to Kubernetes ConfigMap. type ConfigMapRef struct { Name string `json:"name"` } -// Customization defines configuration of Jenkins customization +// Customization defines configuration of Jenkins customization. type Customization struct { Secret SecretRef `json:"secret"` Configurations []ConfigMapRef `json:"configurations"` } -// GroovyScripts defines configuration of Jenkins customization via groovy scripts +// GroovyScripts defines configuration of Jenkins customization via groovy scripts. type GroovyScripts struct { Customization `json:",inline"` } -// ConfigurationAsCode defines configuration of Jenkins customization via Configuration as Code Jenkins plugin +// ConfigurationAsCode defines configuration of Jenkins customization via Configuration as Code Jenkins plugin. type ConfigurationAsCode struct { Customization `json:",inline"` } diff --git a/pkg/controller/jenkins/client/jenkins.go b/pkg/controller/jenkins/client/jenkins.go index ee127dd17..062c7a041 100644 --- a/pkg/controller/jenkins/client/jenkins.go +++ b/pkg/controller/jenkins/client/jenkins.go @@ -16,7 +16,7 @@ var ( regex = regexp.MustCompile("()(?P[a-z0-9]*)") ) -// Jenkins defines Jenkins API +// Jenkins defines Jenkins API. type Jenkins interface { GenerateToken(userName, tokenName string) (*UserToken, error) Info() (*gojenkins.ExecutorResponse, error) @@ -62,7 +62,7 @@ type jenkins struct { gojenkins.Jenkins } -// JenkinsAPIConnectionSettings is struct that handle information about Jenkins API connection +// JenkinsAPIConnectionSettings is struct that handle information about Jenkins API connection. type JenkinsAPIConnectionSettings struct { Hostname string Port int @@ -86,7 +86,7 @@ func (t *setBearerToken) RoundTrip(r *http.Request) (*http.Response, error) { return t.transport().RoundTrip(r) } -// CreateOrUpdateJob creates or updates a job from config +// CreateOrUpdateJob creates or updates a job from config. func (jenkins *jenkins) CreateOrUpdateJob(config, jobName string) (job *gojenkins.Job, created bool, err error) { // create or update job, err = jenkins.GetJob(jobName) @@ -102,7 +102,7 @@ func (jenkins *jenkins) CreateOrUpdateJob(config, jobName string) (job *gojenkin return job, false, errors.WithStack(err) } -// BuildJenkinsAPIUrl returns Jenkins API URL +// BuildJenkinsAPIUrl returns Jenkins API URL. func (j JenkinsAPIConnectionSettings) BuildJenkinsAPIUrl(serviceName string, serviceNamespace string, servicePort int32, serviceNodePort int32) string { if j.Hostname == "" && j.Port == 0 { return fmt.Sprintf("http://%s.%s:%d", serviceName, serviceNamespace, servicePort) @@ -115,7 +115,7 @@ func (j JenkinsAPIConnectionSettings) BuildJenkinsAPIUrl(serviceName string, ser return fmt.Sprintf("http://%s:%d", j.Hostname, j.Port) } -// Validate validates jenkins API connection settings +// Validate validates jenkins API connection settings. func (j JenkinsAPIConnectionSettings) Validate() error { if j.Port > 0 && j.UseNodePort { return errors.New("can't use service port and nodePort both. Please use port or nodePort") @@ -132,12 +132,12 @@ func (j JenkinsAPIConnectionSettings) Validate() error { return nil } -// NewUserAndPasswordAuthorization creates Jenkins API client with user and password authorization +// NewUserAndPasswordAuthorization creates Jenkins API client with user and password authorization. func NewUserAndPasswordAuthorization(url, userName, passwordOrToken string) (Jenkins, error) { return newClient(url, userName, passwordOrToken) } -// NewBearerTokenAuthorization creates Jenkins API client with bearer token authorization +// NewBearerTokenAuthorization creates Jenkins API client with bearer token authorization. func NewBearerTokenAuthorization(url, token string) (Jenkins, error) { return newClient(url, "", token) } @@ -194,10 +194,11 @@ func isNotFoundError(err error) bool { func (jenkins *jenkins) GetNodeSecret(name string) (string, error) { var content string - _, err := jenkins.Requester.GetXML(fmt.Sprintf("/computer/%s/slave-agent.jnlp", name), &content, nil) + r, err := jenkins.Requester.GetXML(fmt.Sprintf("/computer/%s/slave-agent.jnlp", name), &content, nil) if err != nil { return "", errors.WithStack(err) } + defer r.Body.Close() match := regex.FindStringSubmatch(content) if match == nil { diff --git a/pkg/controller/jenkins/client/mockgen.go b/pkg/controller/jenkins/client/mockgen.go index 404584df6..fca9c5c04 100644 --- a/pkg/controller/jenkins/client/mockgen.go +++ b/pkg/controller/jenkins/client/mockgen.go @@ -5,9 +5,10 @@ package client import ( + "reflect" + "github.com/bndr/gojenkins" "github.com/golang/mock/gomock" - "reflect" ) // MockJenkins is a mock of Jenkins interface diff --git a/pkg/controller/jenkins/client/script.go b/pkg/controller/jenkins/client/script.go index c00f6d873..c9a2f6ad3 100644 --- a/pkg/controller/jenkins/client/script.go +++ b/pkg/controller/jenkins/client/script.go @@ -48,6 +48,7 @@ func (jenkins *jenkins) executeScript(script string, verifier string) (string, e if err != nil { return "", errors.Wrapf(err, "couldn't execute groovy script, logs '%s'", output) } + defer r.Body.Close() if r.StatusCode != http.StatusOK { return output, errors.Errorf("invalid status code '%d', logs '%s'", r.StatusCode, output) diff --git a/pkg/controller/jenkins/client/script_test.go b/pkg/controller/jenkins/client/script_test.go index 1a8092c51..a5ce89a43 100644 --- a/pkg/controller/jenkins/client/script_test.go +++ b/pkg/controller/jenkins/client/script_test.go @@ -11,6 +11,8 @@ import ( "github.com/stretchr/testify/assert" ) +const script = "some groovy code" + func Test_ExecuteScript(t *testing.T) { verifier := "verifier-text" t.Run("logs have verifier text", func(t *testing.T) { @@ -34,7 +36,6 @@ func Test_ExecuteScript(t *testing.T) { BasicAuth: &gojenkins.BasicAuth{Username: "unused", Password: "unused"}, } - script := "some groovy code" logs, err := jenkinsClient.executeScript(script, verifier) assert.NoError(t, err, logs) }) @@ -60,7 +61,6 @@ func Test_ExecuteScript(t *testing.T) { BasicAuth: &gojenkins.BasicAuth{Username: "unused", Password: "unused"}, } - script := "some groovy code" logs, err := jenkinsClient.executeScript(script, verifier) assert.EqualError(t, err, "script execution failed", logs) assert.Equal(t, response, logs) @@ -82,7 +82,6 @@ func Test_ExecuteScript(t *testing.T) { BasicAuth: &gojenkins.BasicAuth{Username: "unused", Password: "unused"}, } - script := "some groovy code" logs, err := jenkinsClient.executeScript(script, verifier) assert.EqualError(t, err, "invalid status code '500', logs ''", logs) }) diff --git a/pkg/controller/jenkins/client/token.go b/pkg/controller/jenkins/client/token.go index 77018eb88..6cca2e3b4 100644 --- a/pkg/controller/jenkins/client/token.go +++ b/pkg/controller/jenkins/client/token.go @@ -35,10 +35,10 @@ func (jenkins *jenkins) GenerateToken(userName, tokenName string) (*UserToken, e endpoint := token.base data := map[string]string{"newTokenName": tokenName} r, err := jenkins.Requester.Post(endpoint, nil, token.raw, data) - if err != nil { return nil, errors.Wrap(err, "couldn't generate API token") } + defer r.Body.Close() if r.StatusCode == http.StatusOK { if token.raw.Status == "ok" { diff --git a/pkg/controller/jenkins/configuration/backuprestore/backuprestore.go b/pkg/controller/jenkins/configuration/backuprestore/backuprestore.go index fc2973144..d9bc1602a 100644 --- a/pkg/controller/jenkins/configuration/backuprestore/backuprestore.go +++ b/pkg/controller/jenkins/configuration/backuprestore/backuprestore.go @@ -200,7 +200,7 @@ func triggerBackup(ticker *time.Ticker, k8sClient k8s.Client, logger logr.Logger logger.V(log.VWarn).Info(fmt.Sprintf("backup trigger, error when fetching CR: %s", err)) } if jenkins.Status.LastBackup == jenkins.Status.PendingBackup { - jenkins.Status.PendingBackup = jenkins.Status.PendingBackup + 1 + jenkins.Status.PendingBackup++ err = k8sClient.Update(context.TODO(), jenkins) if err != nil { logger.V(log.VWarn).Info(fmt.Sprintf("backup trigger, error when updating CR: %s", err)) diff --git a/pkg/controller/jenkins/configuration/base/container.go b/pkg/controller/jenkins/configuration/base/container.go index c8601eb80..7ca65856a 100644 --- a/pkg/controller/jenkins/configuration/base/container.go +++ b/pkg/controller/jenkins/configuration/base/container.go @@ -10,7 +10,7 @@ import ( func (r *ReconcileJenkinsBaseConfiguration) compareContainers(expected corev1.Container, actual corev1.Container) (messages []string, verbose []string) { if !reflect.DeepEqual(expected.Args, actual.Args) { messages = append(messages, "Arguments have changed") - verbose = append(messages, fmt.Sprintf("Arguments have changed to '%+v' in container '%s'", expected.Args, expected.Name)) + verbose = append(verbose, fmt.Sprintf("Arguments have changed to '%+v' in container '%s'", expected.Args, expected.Name)) } if !reflect.DeepEqual(expected.Command, actual.Command) { messages = append(messages, "Command has changed") diff --git a/pkg/controller/jenkins/configuration/base/pod.go b/pkg/controller/jenkins/configuration/base/pod.go index 2be5ab2cd..b00d89c04 100644 --- a/pkg/controller/jenkins/configuration/base/pod.go +++ b/pkg/controller/jenkins/configuration/base/pod.go @@ -194,7 +194,7 @@ func (r *ReconcileJenkinsBaseConfiguration) ensureJenkinsMasterPod(meta metav1.O } if r.Configuration.Jenkins.Spec.Backup.MakeBackupBeforePodDeletion && !r.Configuration.Jenkins.Status.BackupDoneBeforePodDeletion { if r.Configuration.Jenkins.Status.LastBackup == r.Configuration.Jenkins.Status.PendingBackup { - r.Configuration.Jenkins.Status.PendingBackup = r.Configuration.Jenkins.Status.PendingBackup + 1 + r.Configuration.Jenkins.Status.PendingBackup++ } if err = backupAndRestore.Backup(true); err != nil { return reconcile.Result{}, err diff --git a/pkg/controller/jenkins/configuration/base/reconcile_test.go b/pkg/controller/jenkins/configuration/base/reconcile_test.go index 08955e3af..52f3ecbe0 100644 --- a/pkg/controller/jenkins/configuration/base/reconcile_test.go +++ b/pkg/controller/jenkins/configuration/base/reconcile_test.go @@ -4,13 +4,13 @@ import ( "context" "testing" + "github.com/bndr/gojenkins" + "github.com/golang/mock/gomock" "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/jenkinsci/kubernetes-operator/pkg/log" - "github.com/bndr/gojenkins" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" @@ -21,7 +21,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/fake" ) - func TestCompareContainerVolumeMounts(t *testing.T) { t.Run("happy with service account", func(t *testing.T) { expectedContainer := corev1.Container{ diff --git a/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go b/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go index a9e088ec7..b5ab9f9d3 100644 --- a/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go +++ b/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go @@ -172,12 +172,12 @@ GlobalConfiguration.all().get(GlobalJobDslSecurityConfiguration.class).useScript GlobalConfiguration.all().get(GlobalJobDslSecurityConfiguration.class).save() ` -// GetBaseConfigurationConfigMapName returns name of Kubernetes config map used to base configuration +// GetBaseConfigurationConfigMapName returns name of Kubernetes config map used to base configuration. func GetBaseConfigurationConfigMapName(jenkins *v1alpha2.Jenkins) string { return fmt.Sprintf("%s-base-configuration-%s", constants.OperatorName, jenkins.ObjectMeta.Name) } -// NewBaseConfigurationConfigMap builds Kubernetes config map used to base configuration +// NewBaseConfigurationConfigMap builds Kubernetes config map used to base configuration. func NewBaseConfigurationConfigMap(meta metav1.ObjectMeta, jenkins *v1alpha2.Jenkins) (*corev1.ConfigMap, error) { meta.Name = GetBaseConfigurationConfigMapName(jenkins) jenkinsServiceFQDN, err := GetJenkinsHTTPServiceFQDN(jenkins) diff --git a/pkg/controller/jenkins/configuration/base/resources/rbac.go b/pkg/controller/jenkins/configuration/base/resources/rbac.go index bfce2eb9e..88a968485 100644 --- a/pkg/controller/jenkins/configuration/base/resources/rbac.go +++ b/pkg/controller/jenkins/configuration/base/resources/rbac.go @@ -1,7 +1,7 @@ package resources import ( - "k8s.io/api/rbac/v1" + v1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/controller/jenkins/configuration/base/resources/route.go b/pkg/controller/jenkins/configuration/base/resources/route.go index 369113a6d..e52992796 100644 --- a/pkg/controller/jenkins/configuration/base/resources/route.go +++ b/pkg/controller/jenkins/configuration/base/resources/route.go @@ -11,26 +11,27 @@ import ( //RouteKind the kind name for route const RouteKind = "Route" -var isRouteAPIAvailable = false -var routeAPIChecked = false + +var isRouteAPIAvailable = false +var routeAPIChecked = false // UpdateRoute returns new route matching the service -func UpdateRoute(actual routev1.Route,jenkins *v1alpha2.Jenkins) routev1.Route { +func UpdateRoute(actual routev1.Route, jenkins *v1alpha2.Jenkins) routev1.Route { actualTargetService := actual.Spec.To serviceName := GetJenkinsHTTPServiceName(jenkins) - if( actualTargetService.Name != serviceName ) { + if actualTargetService.Name != serviceName { actual.Spec.To.Name = serviceName } port := jenkins.Spec.Service.Port - if( actual.Spec.Port.TargetPort.IntVal != port){ + if actual.Spec.Port.TargetPort.IntVal != port { actual.Spec.Port.TargetPort = intstr.FromInt(int(port)) } return actual } //IsRouteAPIAvailable tells if the Route API is installed and discoverable -func IsRouteAPIAvailable(clientSet *kubernetes.Clientset) (bool) { - if (routeAPIChecked){ +func IsRouteAPIAvailable(clientSet *kubernetes.Clientset) bool { + if routeAPIChecked { return isRouteAPIAvailable } gv := schema.GroupVersion{ diff --git a/pkg/controller/jenkins/configuration/base/resources/service.go b/pkg/controller/jenkins/configuration/base/resources/service.go index 71cbec293..6cd7667f2 100644 --- a/pkg/controller/jenkins/configuration/base/resources/service.go +++ b/pkg/controller/jenkins/configuration/base/resources/service.go @@ -2,6 +2,7 @@ package resources import ( "fmt" + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/constants" "github.com/operator-framework/operator-sdk/pkg/k8sutil" @@ -12,6 +13,7 @@ import ( "net" "strings" ) + //ServiceKind the kind name for Service const ServiceKind = "Service" diff --git a/pkg/controller/jenkins/configuration/base/resources/service_account.go b/pkg/controller/jenkins/configuration/base/resources/service_account.go index c6d0b9e10..1c75c458b 100644 --- a/pkg/controller/jenkins/configuration/base/resources/service_account.go +++ b/pkg/controller/jenkins/configuration/base/resources/service_account.go @@ -1,7 +1,7 @@ package resources import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/controller/jenkins/configuration/base/route.go b/pkg/controller/jenkins/configuration/base/route.go index fa0a956af..f3d5f3444 100644 --- a/pkg/controller/jenkins/configuration/base/route.go +++ b/pkg/controller/jenkins/configuration/base/route.go @@ -3,6 +3,7 @@ package base import ( "context" "fmt" + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "k8s.io/apimachinery/pkg/util/intstr" @@ -15,7 +16,7 @@ import ( ) // createRoute takes the ServiceName and Creates the Route based on it -func (r *ReconcileJenkinsBaseConfiguration) createRoute(meta metav1.ObjectMeta, serviceName string, config *v1alpha2.Jenkins) error{ +func (r *ReconcileJenkinsBaseConfiguration) createRoute(meta metav1.ObjectMeta, serviceName string, config *v1alpha2.Jenkins) error { route := routev1.Route{} name := fmt.Sprintf("%s-%s", config.ObjectMeta.Name, config.ObjectMeta.Namespace) err := r.Client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: meta.Namespace}, &route) diff --git a/pkg/controller/jenkins/configuration/base/validate_test.go b/pkg/controller/jenkins/configuration/base/validate_test.go index 48ea53c0e..7fd85531b 100644 --- a/pkg/controller/jenkins/configuration/base/validate_test.go +++ b/pkg/controller/jenkins/configuration/base/validate_test.go @@ -21,6 +21,8 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log/zap" ) +const defaultNamespace = "default" + func TestValidatePlugins(t *testing.T) { log.SetupLogger(true) baseReconcileLoop := New(configuration.Configuration{}, log.Log, client.JenkinsAPIConnectionSettings{}) @@ -557,7 +559,6 @@ func TestValidateContainerVolumeMounts(t *testing.T) { } func TestValidateConfigMapVolume(t *testing.T) { - namespace := "default" t.Run("optional", func(t *testing.T) { optional := true volume := corev1.Volume{ @@ -580,8 +581,8 @@ func TestValidateConfigMapVolume(t *testing.T) { }) t.Run("happy, required", func(t *testing.T) { optional := false - configMap := corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: "configmap-name"}} - jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: namespace}} + configMap := corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace, Name: "configmap-name"}} + jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace}} volume := corev1.Volume{ Name: "volume-name", VolumeSource: corev1.VolumeSource{ @@ -608,8 +609,8 @@ func TestValidateConfigMapVolume(t *testing.T) { }) t.Run("missing configmap", func(t *testing.T) { optional := false - configMap := corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: "configmap-name"}} - jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: namespace}} + configMap := corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace, Name: "configmap-name"}} + jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace}} volume := corev1.Volume{ Name: "volume-name", VolumeSource: corev1.VolumeSource{ @@ -636,7 +637,6 @@ func TestValidateConfigMapVolume(t *testing.T) { } func TestValidateSecretVolume(t *testing.T) { - namespace := "default" t.Run("optional", func(t *testing.T) { optional := true volume := corev1.Volume{ @@ -659,8 +659,8 @@ func TestValidateSecretVolume(t *testing.T) { }) t.Run("happy, required", func(t *testing.T) { optional := false - secret := corev1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: "secret-name"}} - jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: namespace}} + secret := corev1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace, Name: "secret-name"}} + jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace}} volume := corev1.Volume{ Name: "volume-name", VolumeSource: corev1.VolumeSource{ @@ -685,8 +685,8 @@ func TestValidateSecretVolume(t *testing.T) { }) t.Run("missing secret", func(t *testing.T) { optional := false - secret := corev1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: "secret-name"}} - jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: namespace}} + secret := corev1.Secret{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace, Name: "secret-name"}} + jenkins := &v1alpha2.Jenkins{ObjectMeta: metav1.ObjectMeta{Namespace: defaultNamespace}} volume := corev1.Volume{ Name: "volume-name", VolumeSource: corev1.VolumeSource{ @@ -710,12 +710,11 @@ func TestValidateSecretVolume(t *testing.T) { } func TestValidateCustomization(t *testing.T) { - namespace := "default" secretName := "secretName" configMapName := "configmap-name" jenkins := &v1alpha2.Jenkins{ ObjectMeta: metav1.ObjectMeta{ - Namespace: namespace, + Namespace: defaultNamespace, }, } t.Run("empty", func(t *testing.T) { @@ -739,7 +738,7 @@ func TestValidateCustomization(t *testing.T) { secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, - Namespace: namespace, + Namespace: defaultNamespace, }, } fakeClient := fake.NewFakeClient() @@ -764,13 +763,13 @@ func TestValidateCustomization(t *testing.T) { configMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: configMapName, - Namespace: namespace, + Namespace: defaultNamespace, }, } secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, - Namespace: namespace, + Namespace: defaultNamespace, }, } fakeClient := fake.NewFakeClient() @@ -797,7 +796,7 @@ func TestValidateCustomization(t *testing.T) { configMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: configMapName, - Namespace: namespace, + Namespace: defaultNamespace, }, } fakeClient := fake.NewFakeClient() @@ -822,7 +821,7 @@ func TestValidateCustomization(t *testing.T) { secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, - Namespace: namespace, + Namespace: defaultNamespace, }, } fakeClient := fake.NewFakeClient() diff --git a/pkg/controller/jenkins/configuration/configuration.go b/pkg/controller/jenkins/configuration/configuration.go index 1cd7cc65f..26b9c70a8 100644 --- a/pkg/controller/jenkins/configuration/configuration.go +++ b/pkg/controller/jenkins/configuration/configuration.go @@ -7,10 +7,10 @@ import ( "time" "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" + jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/notifications/event" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/notifications/reason" - jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" stackerr "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -166,7 +166,7 @@ func (c *Configuration) GetJenkinsMasterContainer() *v1alpha2.Container { // GetJenkinsClient gets jenkins client from a configuration func (c *Configuration) GetJenkinsClient() (jenkinsclient.Jenkins, error) { - switch c.Jenkins.Spec.JenkinsAPISettings.AuthorizationStrategy { + switch c.Jenkins.Spec.JenkinsAPISettings.AuthorizationStrategy { case v1alpha2.ServiceAccountAuthorizationStrategy: return c.GetJenkinsClientFromServiceAccount() case v1alpha2.CreateUserAuthorizationStrategy: @@ -189,7 +189,7 @@ func (c *Configuration) getJenkinsAPIUrl() (string, error) { } jenkinsURL := c.JenkinsAPIConnectionSettings.BuildJenkinsAPIUrl(service.Name, service.Namespace, service.Spec.Ports[0].Port, service.Spec.Ports[0].NodePort) if prefix, ok := GetJenkinsOpts(*c.Jenkins)["prefix"]; ok { - jenkinsURL = jenkinsURL + prefix + jenkinsURL += prefix } return jenkinsURL, nil } @@ -289,4 +289,4 @@ func GetJenkinsOpts(jenkins v1alpha2.Jenkins) map[string]string { } } return nil -} \ No newline at end of file +} diff --git a/pkg/controller/jenkins/configuration/configuration_test.go b/pkg/controller/jenkins/configuration/configuration_test.go index f8ab50738..1f2527ae0 100644 --- a/pkg/controller/jenkins/configuration/configuration_test.go +++ b/pkg/controller/jenkins/configuration/configuration_test.go @@ -2,7 +2,7 @@ package configuration import ( "testing" - + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" diff --git a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go index f4e81f7a4..7e678c40d 100644 --- a/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go +++ b/pkg/controller/jenkins/configuration/user/seedjobs/seedjobs_test.go @@ -2,9 +2,10 @@ package seedjobs import ( "context" - "k8s.io/apimachinery/pkg/api/errors" "testing" + "k8s.io/apimachinery/pkg/api/errors" + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration" @@ -24,6 +25,8 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log/zap" ) +const agentSecret = "test-secret" + func jenkinsCustomResource() *v1alpha2.Jenkins { return &v1alpha2.Jenkins{ ObjectMeta: metav1.ObjectMeta{ @@ -81,7 +84,6 @@ func TestEnsureSeedJobs(t *testing.T) { err = fakeClient.Create(ctx, jenkins) assert.NoError(t, err) - agentSecret := "test-secret" testNode := &gojenkins.Node{ Raw: &gojenkins.NodeResponse{ DisplayName: AgentName, @@ -123,7 +125,6 @@ func TestEnsureSeedJobs(t *testing.T) { ctx := context.TODO() defer ctrl.Finish() - agentSecret := "test-secret" jenkins := jenkinsCustomResource() jenkins.Spec.SeedJobs = []v1alpha2.SeedJob{} @@ -174,7 +175,6 @@ func TestCreateAgent(t *testing.T) { ctx := context.TODO() defer ctrl.Finish() - agentSecret := "test-secret" jenkins := jenkinsCustomResource() jenkinsClient := jenkinsclient.NewMockJenkins(ctrl) diff --git a/pkg/controller/jenkins/configuration/user/seedjobs/validate.go b/pkg/controller/jenkins/configuration/user/seedjobs/validate.go index c3b39dcce..30d501e0f 100644 --- a/pkg/controller/jenkins/configuration/user/seedjobs/validate.go +++ b/pkg/controller/jenkins/configuration/user/seedjobs/validate.go @@ -10,7 +10,7 @@ import ( "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" stackerr "github.com/pkg/errors" "github.com/robfig/cron" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" ) diff --git a/pkg/controller/jenkins/groovy/groovy_test.go b/pkg/controller/jenkins/groovy/groovy_test.go index b98ed34e6..043a308e0 100644 --- a/pkg/controller/jenkins/groovy/groovy_test.go +++ b/pkg/controller/jenkins/groovy/groovy_test.go @@ -20,9 +20,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/fake" ) +const configurationType = "test-conf-type" + func TestGroovy_EnsureSingle(t *testing.T) { log.SetupLogger(true) - configurationType := "test-conf-type" emptyCustomization := v1alpha2.Customization{} hash := "hash" groovyScript := "groovy-script" @@ -246,7 +247,6 @@ func TestGroovy_EnsureSingle(t *testing.T) { assert.Equal(t, thirdGroovyScriptHash, jenkins.Status.AppliedGroovyScripts[2].Hash) assert.Equal(t, source, jenkins.Status.AppliedGroovyScripts[2].Source) assert.Equal(t, thirdGroovyScriptName, jenkins.Status.AppliedGroovyScripts[2].Name) - }) t.Run("execute two groovy scripts with same names in two config maps", func(t *testing.T) { jenkins := &v1alpha2.Jenkins{ @@ -349,7 +349,6 @@ func TestGroovy_EnsureSingle(t *testing.T) { func TestGroovy_Ensure(t *testing.T) { log.SetupLogger(true) - configurationType := "test-conf-type" groovyScript := "groovy-script" groovyScriptName := "groovy-script-name.groovy" ctx := context.TODO() @@ -615,7 +614,6 @@ func TestGroovy_Ensure(t *testing.T) { func TestGroovy_isGroovyScriptAlreadyApplied(t *testing.T) { log.SetupLogger(true) emptyCustomization := v1alpha2.Customization{} - configurationType := "test-conf-type" t.Run("found", func(t *testing.T) { jenkins := &v1alpha2.Jenkins{ diff --git a/pkg/controller/jenkins/jenkins_controller.go b/pkg/controller/jenkins/jenkins_controller.go index 528aa8bcd..b852d015b 100644 --- a/pkg/controller/jenkins/jenkins_controller.go +++ b/pkg/controller/jenkins/jenkins_controller.go @@ -51,7 +51,7 @@ func Add(mgr manager.Manager, jenkinsAPIConnectionSettings jenkinsclient.Jenkins return add(mgr, reconciler) } -// newReconciler returns a new reconcile.Reconciler +// newReconciler returns a new reconcile.Reconciler. func newReconciler(mgr manager.Manager, jenkinsAPIConnectionSettings jenkinsclient.JenkinsAPIConnectionSettings, clientSet kubernetes.Clientset, config rest.Config, notificationEvents *chan event.Event) reconcile.Reconciler { return &ReconcileJenkins{ client: mgr.GetClient(), @@ -63,7 +63,7 @@ func newReconciler(mgr manager.Manager, jenkinsAPIConnectionSettings jenkinsclie } } -// add adds a new Controller to mgr with r as the reconcile.Reconciler +// add adds a new Controller to mgr with r as the reconcile.Reconciler. func add(mgr manager.Manager, r reconcile.Reconciler) error { // Create a new controller c, err := controller.New("jenkins-controller", mgr, controller.Options{Reconciler: r}) @@ -111,7 +111,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error { var _ reconcile.Reconciler = &ReconcileJenkins{} -// ReconcileJenkins reconciles a Jenkins object +// ReconcileJenkins reconciles a Jenkins object. type ReconcileJenkins struct { client client.Client scheme *runtime.Scheme @@ -121,7 +121,7 @@ type ReconcileJenkins struct { notificationEvents *chan event.Event } -// Reconcile it's a main reconciliation loop which maintain desired state based on Jenkins.Spec +// Reconcile it's a main reconciliation loop which maintain desired state based on Jenkins.Spec. func (r *ReconcileJenkins) Reconcile(request reconcile.Request) (reconcile.Result, error) { reconcileFailLimit := uint64(10) logger := r.buildLogger(request.Name) @@ -167,10 +167,8 @@ func (r *ReconcileJenkins) Reconcile(request reconcile.Request) (reconcile.Resul if log.Debug { logger.V(log.VWarn).Info(fmt.Sprintf("Reconcile loop failed: %+v", err)) - } else { - if err.Error() != fmt.Sprintf("Operation cannot be fulfilled on jenkins.jenkins.io \"%s\": the object has been modified; please apply your changes to the latest version and try again", request.Name) { - logger.V(log.VWarn).Info(fmt.Sprintf("Reconcile loop failed: %s", err)) - } + } else if err.Error() != fmt.Sprintf("Operation cannot be fulfilled on jenkins.jenkins.io \"%s\": the object has been modified; please apply your changes to the latest version and try again", request.Name) { + logger.V(log.VWarn).Info(fmt.Sprintf("Reconcile loop failed: %s", err)) } if groovyErr, ok := err.(*jenkinsclient.GroovyScriptExecutionFailed); ok { @@ -227,12 +225,12 @@ func (r *ReconcileJenkins) reconcile(request reconcile.Request, logger logr.Logg } config := configuration.Configuration{ - Client: r.client, - ClientSet: r.clientSet, - Notifications: r.notificationEvents, - Jenkins: jenkins, - Scheme: r.scheme, - Config: &r.config, + Client: r.client, + ClientSet: r.clientSet, + Notifications: r.notificationEvents, + Jenkins: jenkins, + Scheme: r.scheme, + Config: &r.config, JenkinsAPIConnectionSettings: r.jenkinsAPIConnectionSettings, } diff --git a/pkg/controller/jenkins/notifications/event/event.go b/pkg/controller/jenkins/notifications/event/event.go index 36af5013f..637e667ac 100644 --- a/pkg/controller/jenkins/notifications/event/event.go +++ b/pkg/controller/jenkins/notifications/event/event.go @@ -8,13 +8,13 @@ import ( // Phase defines the context where notification has been generated: base or user. type Phase string -// StatusColor is useful for better UX +// StatusColor is useful for better UX. type StatusColor string -// LoggingLevel is type for selecting different logging levels +// LoggingLevel is type for selecting different logging levels. type LoggingLevel string -// Event contains event details which will be sent as a notification +// Event contains event details which will be sent as a notification. type Event struct { Jenkins v1alpha2.Jenkins Phase Phase diff --git a/pkg/controller/jenkins/notifications/provider/provider.go b/pkg/controller/jenkins/notifications/provider/provider.go index b509e0b76..356062b32 100644 --- a/pkg/controller/jenkins/notifications/provider/provider.go +++ b/pkg/controller/jenkins/notifications/provider/provider.go @@ -30,11 +30,12 @@ const ( // NotificationTitle converts NotificationLevel enum to string func NotificationTitle(event event.Event) string { - if event.Level == v1alpha2.NotificationLevelInfo { + switch event.Level { + case v1alpha2.NotificationLevelInfo: return InfoTitleText - } else if event.Level == v1alpha2.NotificationLevelWarning { + case v1alpha2.NotificationLevelWarning: return WarnTitleText - } else { + default: return "" } } diff --git a/pkg/controller/jenkins/notifications/reason/reason.go b/pkg/controller/jenkins/notifications/reason/reason.go index 3992ee5c5..1f188f25d 100644 --- a/pkg/controller/jenkins/notifications/reason/reason.go +++ b/pkg/controller/jenkins/notifications/reason/reason.go @@ -11,66 +11,66 @@ const ( HumanSource Source = "human" ) -// Reason is interface that let us know why operator sent notification +// Reason is interface that let us know why operator sent notification. type Reason interface { Short() []string Verbose() []string HasMessages() bool } -// Undefined is base or untraceable reason +// Undefined is base or untraceable reason. type Undefined struct { source Source short []string verbose []string } -// PodRestart defines the reason why Jenkins master pod restarted +// PodRestart defines the reason why Jenkins master pod restarted. type PodRestart struct { Undefined } -// PodCreation informs that pod is being created +// PodCreation informs that pod is being created. type PodCreation struct { Undefined } -// ReconcileLoopFailed defines the reason why the reconcile loop failed +// ReconcileLoopFailed defines the reason why the reconcile loop failed. type ReconcileLoopFailed struct { Undefined } -// GroovyScriptExecutionFailed defines the reason why the groovy script execution failed +// GroovyScriptExecutionFailed defines the reason why the groovy script execution failed. type GroovyScriptExecutionFailed struct { Undefined } -// BaseConfigurationFailed defines the reason why base configuration phase failed +// BaseConfigurationFailed defines the reason why base configuration phase failed. type BaseConfigurationFailed struct { Undefined } -// BaseConfigurationComplete informs that base configuration is valid and complete +// BaseConfigurationComplete informs that base configuration is valid and complete. type BaseConfigurationComplete struct { Undefined } -// UserConfigurationFailed defines the reason why user configuration phase failed +// UserConfigurationFailed defines the reason why user configuration phase failed. type UserConfigurationFailed struct { Undefined } -// UserConfigurationComplete informs that user configuration is valid and complete +// UserConfigurationComplete informs that user configuration is valid and complete. type UserConfigurationComplete struct { Undefined } -// NewUndefined returns new instance of Undefined +// NewUndefined returns new instance of Undefined. func NewUndefined(source Source, short []string, verbose ...string) *Undefined { return &Undefined{source: source, short: short, verbose: checkIfVerboseEmpty(short, verbose)} } -// NewPodRestart returns new instance of PodRestart +// NewPodRestart returns new instance of PodRestart. func NewPodRestart(source Source, short []string, verbose ...string) *PodRestart { restartPodMessage := fmt.Sprintf("Jenkins master pod restarted by %s:", source) if len(short) == 1 { @@ -94,7 +94,7 @@ func NewPodRestart(source Source, short []string, verbose ...string) *PodRestart } } -// NewPodCreation returns new instance of PodCreation +// NewPodCreation returns new instance of PodCreation. func NewPodCreation(source Source, short []string, verbose ...string) *PodCreation { return &PodCreation{ Undefined{ @@ -105,7 +105,7 @@ func NewPodCreation(source Source, short []string, verbose ...string) *PodCreati } } -// NewReconcileLoopFailed returns new instance of ReconcileLoopFailed +// NewReconcileLoopFailed returns new instance of ReconcileLoopFailed. func NewReconcileLoopFailed(source Source, short []string, verbose ...string) *ReconcileLoopFailed { return &ReconcileLoopFailed{ Undefined{ @@ -116,7 +116,7 @@ func NewReconcileLoopFailed(source Source, short []string, verbose ...string) *R } } -// NewGroovyScriptExecutionFailed returns new instance of GroovyScriptExecutionFailed +// NewGroovyScriptExecutionFailed returns new instance of GroovyScriptExecutionFailed. func NewGroovyScriptExecutionFailed(source Source, short []string, verbose ...string) *GroovyScriptExecutionFailed { return &GroovyScriptExecutionFailed{ Undefined{ @@ -127,7 +127,7 @@ func NewGroovyScriptExecutionFailed(source Source, short []string, verbose ...st } } -// NewBaseConfigurationFailed returns new instance of BaseConfigurationFailed +// NewBaseConfigurationFailed returns new instance of BaseConfigurationFailed. func NewBaseConfigurationFailed(source Source, short []string, verbose ...string) *BaseConfigurationFailed { return &BaseConfigurationFailed{ Undefined{ @@ -138,7 +138,7 @@ func NewBaseConfigurationFailed(source Source, short []string, verbose ...string } } -// NewBaseConfigurationComplete returns new instance of BaseConfigurationComplete +// NewBaseConfigurationComplete returns new instance of BaseConfigurationComplete. func NewBaseConfigurationComplete(source Source, short []string, verbose ...string) *BaseConfigurationComplete { return &BaseConfigurationComplete{ Undefined{ @@ -149,7 +149,7 @@ func NewBaseConfigurationComplete(source Source, short []string, verbose ...stri } } -// NewUserConfigurationFailed returns new instance of UserConfigurationFailed +// NewUserConfigurationFailed returns new instance of UserConfigurationFailed. func NewUserConfigurationFailed(source Source, short []string, verbose ...string) *UserConfigurationFailed { return &UserConfigurationFailed{ Undefined{ @@ -160,7 +160,7 @@ func NewUserConfigurationFailed(source Source, short []string, verbose ...string } } -// NewUserConfigurationComplete returns new instance of UserConfigurationComplete +// NewUserConfigurationComplete returns new instance of UserConfigurationComplete. func NewUserConfigurationComplete(source Source, short []string, verbose ...string) *UserConfigurationComplete { return &UserConfigurationComplete{ Undefined{ @@ -171,20 +171,20 @@ func NewUserConfigurationComplete(source Source, short []string, verbose ...stri } } -// Source is enum type that informs us what triggered notification +// Source is enum type that informs us what triggered notification. type Source string -// Short is list of reasons +// Short is list of reasons. func (p Undefined) Short() []string { return p.short } -// Verbose is list of reasons with details +// Verbose is list of reasons with details. func (p Undefined) Verbose() []string { return p.verbose } -// HasMessages checks if there is any message +// HasMessages checks if there is any message. func (p Undefined) HasMessages() bool { return len(p.short) > 0 || len(p.verbose) > 0 } diff --git a/pkg/controller/jenkins/notifications/reason/reason_test.go b/pkg/controller/jenkins/notifications/reason/reason_test.go index e92b7d524..6c81bc716 100644 --- a/pkg/controller/jenkins/notifications/reason/reason_test.go +++ b/pkg/controller/jenkins/notifications/reason/reason_test.go @@ -59,7 +59,6 @@ func TestUndefined_HasMessages(t *testing.T) { podRestart := NewUndefined(KubernetesSource, []string{}, []string{}...) assert.False(t, podRestart.HasMessages()) }) - } func TestPodRestartPrepend(t *testing.T) { diff --git a/pkg/controller/jenkins/notifications/sender.go b/pkg/controller/jenkins/notifications/sender.go index 45985960c..6707c2b50 100644 --- a/pkg/controller/jenkins/notifications/sender.go +++ b/pkg/controller/jenkins/notifications/sender.go @@ -19,12 +19,12 @@ import ( k8sclient "sigs.k8s.io/controller-runtime/pkg/client" ) -// Provider is the communication service handler +// Provider is the communication service handler. type Provider interface { Send(event event.Event) error } -// Listen listens for incoming events and send it as notifications +// Listen listens for incoming events and send it as notifications. func Listen(events chan event.Event, k8sEvent k8sevent.Recorder, k8sClient k8sclient.Client) { httpClient := http.Client{} for e := range events { @@ -44,16 +44,16 @@ func Listen(events chan event.Event, k8sEvent k8sevent.Recorder, k8sClient k8scl for _, notificationConfig := range e.Jenkins.Spec.Notifications { var err error var provider Provider - - if notificationConfig.Slack != nil { + switch { + case notificationConfig.Slack != nil: provider = slack.New(k8sClient, notificationConfig, httpClient) - } else if notificationConfig.Teams != nil { + case notificationConfig.Teams != nil: provider = msteams.New(k8sClient, notificationConfig, httpClient) - } else if notificationConfig.Mailgun != nil { + case notificationConfig.Mailgun != nil: provider = mailgun.New(k8sClient, notificationConfig) - } else if notificationConfig.SMTP != nil { + case notificationConfig.SMTP != nil: provider = smtp.New(k8sClient, notificationConfig) - } else { + default: logger.V(log.VWarn).Info(fmt.Sprintf("Unknown notification service `%+v`", notificationConfig)) continue } diff --git a/pkg/controller/jenkins/notifications/slack/slack.go b/pkg/controller/jenkins/notifications/slack/slack.go index 797af9219..93797f6c1 100644 --- a/pkg/controller/jenkins/notifications/slack/slack.go +++ b/pkg/controller/jenkins/notifications/slack/slack.go @@ -23,25 +23,25 @@ const ( defaultColor = "#c8c8c8" ) -// Slack is a Slack notification service +// Slack is a Slack notification service. type Slack struct { httpClient http.Client k8sClient k8sclient.Client config v1alpha2.Notification } -// New returns instance of Slack +// New returns instance of Slack. func New(k8sClient k8sclient.Client, config v1alpha2.Notification, httpClient http.Client) *Slack { return &Slack{k8sClient: k8sClient, config: config, httpClient: httpClient} } -// Message is representation of json message +// Message is representation of json message. type Message struct { Text string `json:"text"` Attachments []Attachment `json:"attachments"` } -// Attachment is representation of json attachment +// Attachment is representation of json attachment. type Attachment struct { Fallback string `json:"fallback"` Color event.StatusColor `json:"color"` @@ -117,7 +117,7 @@ func (s Slack) generateMessage(e event.Event) Message { return sm } -// Send is function for sending directly to API +// Send is function for sending directly to API. func (s Slack) Send(e event.Event) error { secret := &corev1.Secret{} selector := s.config.Slack.WebHookURLSecretKeySelector diff --git a/pkg/controller/jenkins/notifications/smtp/smtp.go b/pkg/controller/jenkins/notifications/smtp/smtp.go index a7d94b459..fbc7e4ebc 100644 --- a/pkg/controller/jenkins/notifications/smtp/smtp.go +++ b/pkg/controller/jenkins/notifications/smtp/smtp.go @@ -47,13 +47,13 @@ const ( ` ) -// SMTP is Simple Mail Transport Protocol used for sending emails +// SMTP is Simple Mail Transport Protocol used for sending emails. type SMTP struct { k8sClient k8sclient.Client config v1alpha2.Notification } -// New returns instance of SMTP +// New returns instance of SMTP. func New(k8sClient k8sclient.Client, config v1alpha2.Notification) *SMTP { return &SMTP{k8sClient: k8sClient, config: config} } @@ -83,7 +83,7 @@ func (s SMTP) generateMessage(e event.Event) *gomail.Message { return message } -// Send is function for sending notification by SMTP server +// Send is function for sending notification by SMTP server. func (s SMTP) Send(e event.Event) error { usernameSecret := &corev1.Secret{} passwordSecret := &corev1.Secret{} diff --git a/pkg/controller/jenkins/notifications/smtp/smtp_test.go b/pkg/controller/jenkins/notifications/smtp/smtp_test.go index aa9906a0f..6f4302d4d 100644 --- a/pkg/controller/jenkins/notifications/smtp/smtp_test.go +++ b/pkg/controller/jenkins/notifications/smtp/smtp_test.go @@ -37,6 +37,8 @@ const ( fromHeader = "From" toHeader = "To" subjectHeader = "Subject" + + nilConst = "nil" ) var ( @@ -106,11 +108,12 @@ func (s *testSession) Data(r io.Reader) error { } for i := range headers { - if headers[i][1] == fromHeader && headers[i][2] != testFrom { + switch { + case headers[i][1] == fromHeader && headers[i][2] != testFrom: return fmt.Errorf("`From` header is not equal: '%s', expected '%s'", headers[i][2], testFrom) - } else if headers[i][1] == toHeader && headers[i][2] != testTo { + case headers[i][1] == toHeader && headers[i][2] != testTo: return fmt.Errorf("`To` header is not equal: '%s', expected '%s'", headers[i][2], testTo) - } else if headers[i][1] == subjectHeader && headers[i][2] != testSubject { + case headers[i][1] == subjectHeader && headers[i][2] != testSubject: return fmt.Errorf("`Subject` header is not equal: '%s', expected '%s'", headers[i][2], testSubject) } } @@ -242,13 +245,13 @@ func TestGenerateMessage(t *testing.T) { }) t.Run("with nils", func(t *testing.T) { - crName := "nil" + crName := nilConst phase := event.PhaseBase level := v1alpha2.NotificationLevelInfo - res := reason.NewUndefined(reason.KubernetesSource, []string{"nil"}, []string{"nil"}...) + res := reason.NewUndefined(reason.KubernetesSource, []string{nilConst}, []string{nilConst}...) - from := "nil" - to := "nil" + from := nilConst + to := nilConst e := event.Event{ Jenkins: v1alpha2.Jenkins{ diff --git a/pkg/controller/jenkins/plugins/base_plugins.go b/pkg/controller/jenkins/plugins/base_plugins.go index 4d6090f66..89414321f 100644 --- a/pkg/controller/jenkins/plugins/base_plugins.go +++ b/pkg/controller/jenkins/plugins/base_plugins.go @@ -10,7 +10,7 @@ const ( workflowJobPlugin = "workflow-job:2.38" ) -// basePluginsList contains plugins to install by operator +// basePluginsList contains plugins to install by operator. var basePluginsList = []Plugin{ Must(New(kubernetesPlugin)), Must(New(workflowJobPlugin)), @@ -21,7 +21,7 @@ var basePluginsList = []Plugin{ Must(New(kubernetesCredentialsProviderPlugin)), } -// BasePlugins returns list of plugins to install by operator +// BasePlugins returns list of plugins to install by operator. func BasePlugins() []Plugin { return basePluginsList } diff --git a/pkg/controller/jenkins/plugins/plugin.go b/pkg/controller/jenkins/plugins/plugin.go index aa95d0238..2288dcd18 100644 --- a/pkg/controller/jenkins/plugins/plugin.go +++ b/pkg/controller/jenkins/plugins/plugin.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" ) -// Plugin represents jenkins plugin +// Plugin represents jenkins plugin. type Plugin struct { Name string `json:"name"` Version string `json:"version"` @@ -29,7 +29,7 @@ var ( DownloadURLPattern = regexp.MustCompile(`https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)`) ) -// New creates plugin from string, for example "name-of-plugin:0.0.1" +// New creates plugin from string, for example "name-of-plugin:0.0.1". func New(nameWithVersion string) (*Plugin, error) { val := strings.SplitN(nameWithVersion, ":", 2) if val == nil || len(val) != 2 { @@ -48,7 +48,7 @@ func New(nameWithVersion string) (*Plugin, error) { }, nil } -// NewPlugin creates plugin from name and version, for example "name-of-plugin:0.0.1" +// NewPlugin creates plugin from name and version, for example "name-of-plugin:0.0.1". func NewPlugin(name, version, downloadURL string) (*Plugin, error) { if err := validatePlugin(name, version, downloadURL); err != nil { return nil, err @@ -76,7 +76,7 @@ func validatePlugin(name, version, downloadURL string) error { return nil } -// Must returns plugin from pointer and throws panic when error is set +// Must returns plugin from pointer and throws panic when error is set. func Must(plugin *Plugin, err error) Plugin { if err != nil { panic(err) @@ -85,7 +85,7 @@ func Must(plugin *Plugin, err error) Plugin { return *plugin } -// VerifyDependencies checks if all plugins have compatible versions +// VerifyDependencies checks if all plugins have compatible versions. func VerifyDependencies(values ...map[Plugin][]Plugin) []string { var messages []string // key - plugin name, value array of versions diff --git a/pkg/event/event.go b/pkg/event/event.go index 138dde138..ca0a9e0a5 100644 --- a/pkg/event/event.go +++ b/pkg/event/event.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/pkg/errors" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" diff --git a/pkg/log/log.go b/pkg/log/log.go index f8b2abfb3..96940b12d 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -9,10 +9,10 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" ) -// Log represents global logger +// Log represents global logger. var Log = logf.Log.WithName("controller-jenkins") -// Debug indicates that debug level is set +// Debug indicates that debug level is set. var Debug bool const ( @@ -43,7 +43,7 @@ func fatalIfErr(err error, f func(format string, v ...interface{})) { } } -// SetupLogger setups global logger +// SetupLogger setups global logger. func SetupLogger(debug bool) { Debug = debug logf.SetLogger(zapLogger(debug)) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 8bc9cbcc0..70ec7b52d 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -22,13 +22,15 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const e2e = "e2e" + func TestConfiguration(t *testing.T) { t.Parallel() namespace, ctx := setupTest(t) defer showLogsAndCleanup(t, ctx) - jenkinsCRName := "e2e" + jenkinsCRName := e2e numberOfExecutors := 6 numberOfExecutorsEnvName := "NUMBER_OF_EXECUTORS" systemMessage := "Configuration as Code integration works!!!" @@ -207,7 +209,7 @@ unclassified: func createDefaultLimitsForContainersInNamespace(t *testing.T, namespace string) { limitRange := &corev1.LimitRange{ ObjectMeta: metav1.ObjectMeta{ - Name: "e2e", + Name: e2e, Namespace: namespace, }, Spec: corev1.LimitRangeSpec{ diff --git a/test/e2e/seedjobs_test.go b/test/e2e/seedjobs_test.go index e4dfbc23e..be48926e6 100644 --- a/test/e2e/seedjobs_test.go +++ b/test/e2e/seedjobs_test.go @@ -76,7 +76,7 @@ func loadSeedJobsConfig(t *testing.T) seedJobsConfig { assert.NoError(t, err) var result seedJobsConfig - err = json.Unmarshal([]byte(byteValue), &result) + err = json.Unmarshal(byteValue, &result) assert.NoError(t, err) assert.NotEmpty(t, result.SeedJobs) return result @@ -95,7 +95,7 @@ func createKubernetesCredentialsProviderSecret(t *testing.T, namespace string, c "jenkins.io/credentials-description": "credentials from Kubernetes " + config.ID, }, Labels: map[string]string{ - seedjobs.JenkinsCredentialTypeLabelName: string(config.CredentialID), + seedjobs.JenkinsCredentialTypeLabelName: config.CredentialID, }, }, StringData: map[string]string{ diff --git a/version/version.go b/version/version.go index 7222dc9c2..004979775 100644 --- a/version/version.go +++ b/version/version.go @@ -3,5 +3,5 @@ package version // Version indicates which version of the binary is running. var Version string -// GitCommit indicates which git hash the binary was built off of +// GitCommit indicates which git hash the binary was built off of. var GitCommit string