diff --git a/go.mod b/go.mod index a21f3d61..7f6ac720 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/go-ole/go-ole v1.2.4 // indirect github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129 github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect + github.com/google/go-cmp v0.5.2 // indirect github.com/google/uuid v1.1.1 github.com/hashicorp/go-version v1.2.1-0.20190424083514-192140e6f3e6 github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c @@ -27,7 +28,13 @@ require ( github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc // indirect go.mongodb.org/mongo-driver v1.3.4 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 + golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect + golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect + golang.org/x/text v0.3.3 // indirect + golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/ini.v1 v1.61.0 // indirect gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect + mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6 // indirect ) diff --git a/go.sum b/go.sum index 6baa03d3..b88b54d9 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -129,6 +130,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -194,6 +198,7 @@ github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY 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= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -287,6 +292,7 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.13.0 h1:vJlpe9wPgDRM1Z+7Wj3zUUjY1nr6/1jNKyl7llliccg= github.com/prometheus/common v0.13.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -298,6 +304,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= @@ -310,6 +317,7 @@ github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -341,6 +349,8 @@ github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHM github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc h1:vIp1tjhVogU0yBy7w96P027ewvNPeH6gzuNcoc+NReU= github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= @@ -363,6 +373,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -372,6 +383,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -389,6 +402,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -399,6 +413,9 @@ golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -421,9 +438,13 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -444,10 +465,18 @@ golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6 h1:qKpj8TpV+LEhel7H/fR788J+KvhWZ3o3V6N2fU/iuLU= +golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6 h1:rbvTkL9AkFts1cgI78+gG6Yu1pwaqX6hjSJAatB78E4= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -472,10 +501,12 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -483,6 +514,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.61.0 h1:LBCdW4FmFYL4s/vDZD1RQYX7oAR6IjujCYgMdbHBR10= gopkg.in/ini.v1 v1.61.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -492,6 +524,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= @@ -500,5 +533,7 @@ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/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.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6 h1:z+/YqapuV7VZPvBb3GYmuEJbA88M3PFUxaHilHYVCpQ= +mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/src/go/Makefile b/src/go/Makefile index 57064f2e..8d95b880 100644 --- a/src/go/Makefile +++ b/src/go/Makefile @@ -138,8 +138,8 @@ test: ## Run tests @./runtests.sh format: ## Format source code. - gofmt -w -s $(FILES) - goimports -local github.com/percona/pmm-managed -l -w $(FILES) + gofumpt -w -s $(FILES) + gofumports -local github.com/percona/pmm-managed -l -w $(FILES) vet: ## Run vet on Go code @echo ">> vetting code" diff --git a/src/go/lib/config/config.go b/src/go/lib/config/config.go index 0c35c1c0..820fc892 100644 --- a/src/go/lib/config/config.go +++ b/src/go/lib/config/config.go @@ -75,10 +75,8 @@ func DefaultConfigFiles(toolName string) ([]string, error) { } func DefaultConfig(toolname string) *Config { - files, _ := DefaultConfigFiles(toolname) return NewConfig(files...) - } func NewConfig(files ...string) *Config { @@ -94,7 +92,6 @@ func NewConfig(files ...string) *Config { } func read(filename string, opts map[string]interface{}) error { - f, err := os.Open(filename) if err != nil { return err @@ -135,7 +132,7 @@ func read(filename string, opts map[string]interface{}) error { } if f == float64(int64(f)) { - opts[key] = int64(f) //int64 + opts[key] = int64(f) // int64 continue } diff --git a/src/go/lib/config/config_test.go b/src/go/lib/config/config_test.go index 2bc7133c..abbf5a54 100644 --- a/src/go/lib/config/config_test.go +++ b/src/go/lib/config/config_test.go @@ -11,7 +11,6 @@ import ( ) func TestReadConfig(t *testing.T) { - rootPath, err := tutil.RootPath() if err != nil { t.Errorf("cannot get root path: %s", err) @@ -69,7 +68,6 @@ func TestReadConfig(t *testing.T) { } func TestOverrideConfig(t *testing.T) { - rootPath, err := tutil.RootPath() if err != nil { t.Errorf("cannot get root path: %s", err) @@ -131,7 +129,6 @@ func TestOverrideConfig(t *testing.T) { } func TestDefaultFiles(t *testing.T) { - user, _ := user.Current() toolname := "pt-testing" @@ -150,5 +147,4 @@ func TestDefaultFiles(t *testing.T) { if !reflect.DeepEqual(got, want) { t.Errorf("got %#v\nwant: %#v\n", got, want) } - } diff --git a/src/go/lib/pginfo/pginfo.go b/src/go/lib/pginfo/pginfo.go index 1c42813c..29239155 100644 --- a/src/go/lib/pginfo/pginfo.go +++ b/src/go/lib/pginfo/pginfo.go @@ -5,8 +5,8 @@ import ( "regexp" "time" - "github.com/percona/percona-toolkit/src/go/pt-pg-summary/models" "github.com/hashicorp/go-version" + "github.com/percona/percona-toolkit/src/go/pt-pg-summary/models" "github.com/pkg/errors" "github.com/shirou/gopsutil/process" "github.com/sirupsen/logrus" diff --git a/src/go/lib/tutil/util.go b/src/go/lib/tutil/util.go index 03098189..3ef8d8ef 100644 --- a/src/go/lib/tutil/util.go +++ b/src/go/lib/tutil/util.go @@ -108,17 +108,15 @@ func LoadBson(filename string, destination interface{}) error { } func WriteJson(filename string, data interface{}) error { - buf, err := json.MarshalIndent(data, "", " ") if err != nil { return err } - err = ioutil.WriteFile(filename, buf, 0777) + err = ioutil.WriteFile(filename, buf, 0o777) if err != nil { return err } return nil - } func ShouldUpdateSamples() bool { diff --git a/src/go/lib/versioncheck/version_check_test.go b/src/go/lib/versioncheck/version_check_test.go index e4f0da13..0d449df0 100644 --- a/src/go/lib/versioncheck/version_check_test.go +++ b/src/go/lib/versioncheck/version_check_test.go @@ -12,7 +12,6 @@ import ( ) func TestCheckUpdates(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, _ := ioutil.ReadAll(r.Body) m := strings.Split(string(body), ";") @@ -39,11 +38,9 @@ func TestCheckUpdates(t *testing.T) { if msg == "" { t.Error("got empty response") } - } func TestEmptyResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "") })) @@ -57,5 +54,4 @@ func TestEmptyResponse(t *testing.T) { if msg != "" { t.Error("response should return error due to empty body") } - } diff --git a/src/go/mongolib/profiler/profiler.go b/src/go/mongolib/profiler/profiler.go index 89db9892..3fe25206 100644 --- a/src/go/mongolib/profiler/profiler.go +++ b/src/go/mongolib/profiler/profiler.go @@ -11,10 +11,8 @@ import ( "go.mongodb.org/mongo-driver/mongo" ) -var ( - // DocsBufferSize is the buffer size to store documents from the MongoDB profiler - DocsBufferSize = 100 -) +// DocsBufferSize is the buffer size to store documents from the MongoDB profiler +var DocsBufferSize = 100 // Profiler interface type Profiler interface { diff --git a/src/go/mongolib/proto/oplog.go b/src/go/mongolib/proto/oplog.go index b35c7687..7931d628 100644 --- a/src/go/mongolib/proto/oplog.go +++ b/src/go/mongolib/proto/oplog.go @@ -34,9 +34,11 @@ type OpLogs []OplogInfo func (s OpLogs) Len() int { return len(s) } + func (s OpLogs) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + func (s OpLogs) Less(i, j int) bool { return s[i].TimeDiffHours < s[j].TimeDiffHours } diff --git a/src/go/mongolib/proto/replconfig.go b/src/go/mongolib/proto/replconfig.go index 58ab7058..9710f561 100644 --- a/src/go/mongolib/proto/replconfig.go +++ b/src/go/mongolib/proto/replconfig.go @@ -4,8 +4,11 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -type ReplicaSetConfigTags map[string]string -type GetLastErrorModes map[string]*ReplicaSetConfigTags +type ( + ReplicaSetConfigTags map[string]string + + GetLastErrorModes map[string]*ReplicaSetConfigTags +) // https://docs.mongodb.com/v3.2/reference/command/getLastError/#dbcmd.getLastError type GetLastErrorDefaults struct { diff --git a/src/go/mongolib/util/util_test.go b/src/go/mongolib/util/util_test.go index 2ab4058c..c8d62b3d 100644 --- a/src/go/mongolib/util/util_test.go +++ b/src/go/mongolib/util/util_test.go @@ -239,7 +239,6 @@ func TestReplicasetConfig(t *testing.T) { Message: "not running with --replSet", Labels: []string(nil), Name: "NoReplicationEnabled", - Wrapped: error(nil), }, }, { @@ -251,7 +250,6 @@ func TestReplicasetConfig(t *testing.T) { Message: "no such cmd: replSetGetConfig", Labels: []string(nil), Name: "CommandNotFound", - Wrapped: error(nil), }, }, { @@ -272,9 +270,11 @@ func TestReplicasetConfig(t *testing.T) { rs, err := ReplicasetConfig(ctx, client) assert.Equal(t, tc.wantError, err, fmt.Sprintf("%v", tc.port)) + if tc.wantError != nil { continue } + assert.Equal(t, tc.wantID, rs.Config.ID) assert.Equal(t, tc.wantConfigServer, rs.Config.ConfigServer) assert.NotEmpty(t, rs.Config.Settings.ReplicaSetID.Hex()) diff --git a/src/go/pt-mongodb-query-digest/main.go b/src/go/pt-mongodb-query-digest/main.go index 09dbcf87..fa2d1e73 100644 --- a/src/go/pt-mongodb-query-digest/main.go +++ b/src/go/pt-mongodb-query-digest/main.go @@ -70,7 +70,6 @@ type report struct { } func main() { - opts, err := getOptions() if err != nil { log.Errorf("error processing command line arguments: %s", err) @@ -193,7 +192,6 @@ func main() { } fmt.Println(string(out)) - } func formatResults(rep report, outputFormat string) ([]byte, error) { @@ -368,7 +366,6 @@ func getHeaders(opts *cliOptions) []string { } func getQueryTemplate() string { - t := ` # Query {{.Rank}}: {{printf "% 0.2f" .QPS}} QPS, ID {{.ID}} # Ratio {{Format .Ratio 7.2}} (docs scanned/returned) @@ -522,7 +519,6 @@ func sortQueries(queries []stats.QueryStats, orderby []string) []stats.QueryStat OrderedBy(sortFuncs...).Sort(queries) return queries - } func isProfilerEnabled(ctx context.Context, clientOptions *options.ClientOptions) (bool, error) { diff --git a/src/go/pt-mongodb-query-digest/main_test.go b/src/go/pt-mongodb-query-digest/main_test.go index 3c69317b..18b0cd4d 100644 --- a/src/go/pt-mongodb-query-digest/main_test.go +++ b/src/go/pt-mongodb-query-digest/main_test.go @@ -1,6 +1,6 @@ package main -//TODO: Rewrite tests to use the new sandbox +// TODO: Rewrite tests to use the new sandbox // const ( // samples = "/src/go/tests/" diff --git a/src/go/pt-mongodb-summary/main.go b/src/go/pt-mongodb-summary/main.go index 1c443d66..64d62df3 100644 --- a/src/go/pt-mongodb-summary/main.go +++ b/src/go/pt-mongodb-summary/main.go @@ -3,11 +3,16 @@ package main import ( "bytes" "context" + "crypto/tls" + "crypto/x509" "encoding/json" "fmt" "html/template" + "io/ioutil" "net" "os" + "os/user" + "path/filepath" "strings" "time" @@ -39,18 +44,23 @@ const ( DefaultOutputFormat = "text" typeMongos = "mongos" - // Exit Codes + // Exit Codes. cannotFormatResults = 1 cannotParseCommandLineParameters = 2 cannotGetHostInfo = 3 - cannotGetReplicasetMembers = 4 + cannotGetClientOptions = 4 + cannotConnectToMongoDB = 5 ) +//nolint:gochecknoglobals var ( - Build string = "2020-04-23" // nolint - GoVersion string = "1.14.1" // nolint + Build string = "2020-04-23" + GoVersion string = "1.14.1" Version string = "3.2.0" Commit string + + defaultConnectionTimeout = 3 * time.Second + directConnection = true ) type TimedStats struct { @@ -69,6 +79,7 @@ type opCounters struct { Command TimedStats SampleRate time.Duration } + type hostInfo struct { Hostname string HostOsType string @@ -164,14 +175,11 @@ func main() { opts, err := parseFlags() if err != nil { log.Errorf("cannot get parameters: %s", err.Error()) + os.Exit(cannotParseCommandLineParameters) } - if opts == nil && err == nil { - return - } - if opts.Help { - getopt.Usage() + if opts == nil && err == nil { return } @@ -187,6 +195,7 @@ func main() { fmt.Printf("Version %s\n", Version) fmt.Printf("Build: %s using %s\n", Build, GoVersion) fmt.Printf("Commit: %s\n", Commit) + return } @@ -201,34 +210,46 @@ func main() { } ctx := context.Background() - clientOptions := getClientOptions(opts) + clientOptions, err := getClientOptions(opts) + if err != nil { + log.Error(err) + + os.Exit(cannotGetClientOptions) + } + client, err := mongo.NewClient(clientOptions) if err != nil { - log.Fatalf("Cannot get a MongoDB client: %s", err) + log.Errorf("Cannot get a MongoDB client: %s", err) + + os.Exit(cannotConnectToMongoDB) } + if err := client.Connect(ctx); err != nil { - log.Fatalf("Cannot connect to MongoDB: %s", err) + log.Errorf("Cannot connect to MongoDB: %s", err) + os.Exit(cannotConnectToMongoDB) } + defer client.Disconnect(ctx) // nolint hostnames, err := util.GetHostnames(ctx, client) if err != nil && errors.Is(err, util.ShardingNotEnabledError) { log.Errorf("Cannot get hostnames: %s", err) } + log.Debugf("hostnames: %v", hostnames) ci := &collectedInfo{} ci.HostInfo, err = getHostInfo(ctx, client) if err != nil { - message := fmt.Sprintf("Cannot get host info for %q: %s", opts.Host, err.Error()) - log.Errorf(message) - os.Exit(cannotGetHostInfo) + log.Errorf("Cannot get host info for %q: %s", opts.Host, err) + os.Exit(cannotGetHostInfo) //nolint:gocritic } if ci.ReplicaMembers, err = util.GetReplicasetMembers(ctx, clientOptions); err != nil { log.Warnf("[Error] cannot get replicaset members: %v\n", err) } + log.Debugf("replicaMembers:\n%+v\n", ci.ReplicaMembers) if opts.RunningOpsSamples > 0 && opts.RunningOpsInterval > 0 { @@ -274,9 +295,10 @@ func main() { out, err := formatResults(ci, opts.OutputFormat) if err != nil { - log.Errorf("Cannot format the results: %s", err.Error()) + log.Errorf("Cannot format the results: %s", err) os.Exit(cannotFormatResults) } + fmt.Println(string(out)) } @@ -287,8 +309,9 @@ func formatResults(ci *collectedInfo, format string) ([]byte, error) { case "json": b, err := json.MarshalIndent(ci, "", " ") if err != nil { - return nil, fmt.Errorf("[Error] Cannot convert results to json: %s", err.Error()) + return nil, errors.Wrap(err, "Cannot convert results to json") } + buf = bytes.NewBuffer(b) default: buf = new(bytes.Buffer) @@ -338,6 +361,7 @@ func getHostInfo(ctx context.Context, client *mongo.Client) (*hostInfo, error) { hi := proto.HostInfo{} if err := client.Database("admin").RunCommand(ctx, primitive.M{"hostInfo": 1}).Decode(&hi); err != nil { log.Debugf("run('hostInfo') error: %s", err) + return nil, errors.Wrap(err, "GetHostInfo.hostInfo") } @@ -393,12 +417,15 @@ func countMongodProcesses() (int, error) { if err != nil { return 0, err } + count := 0 + for _, pid := range pids { p, err := process.NewProcess(pid) if err != nil { continue } + if name, _ := p.Name(); name == "mongod" || name == typeMongos { count++ } @@ -440,6 +467,7 @@ func getClusterwideInfo(ctx context.Context, client *mongo.Client) (*clusterwide if collStats.Sharded { cwi.ShardedDataSize += collStats.Size cwi.ShardedColsCount++ + continue } @@ -464,11 +492,14 @@ func sizeAndUnit(size int64) (float64, string) { unit := []string{"bytes", "KB", "MB", "GB", "TB"} idx := 0 newSize := float64(size) + for newSize > 1024 { newSize /= 1024 idx++ } + newSize = float64(int64(newSize*100)) / 100 + return newSize, unit[idx] } @@ -486,7 +517,10 @@ func getSecuritySettings(ctx context.Context, client *mongo.Client, ver string) } cmdOpts := proto.CommandLineOptions{} - err = client.Database("admin").RunCommand(ctx, primitive.D{{"getCmdLineOpts", 1}, {"recordStats", 1}}).Decode(&cmdOpts) + err = client.Database("admin").RunCommand(ctx, primitive.D{ + {Key: "getCmdLineOpts", Value: 1}, + {Key: "recordStats", Value: 1}, + }).Decode(&cmdOpts) if err != nil { return nil, errors.Wrap(err, "cannot get command line options") } @@ -503,7 +537,7 @@ func getSecuritySettings(ctx context.Context, client *mongo.Client, ver string) s.BindIP = cmdOpts.Parsed.Net.BindIP s.Port = cmdOpts.Parsed.Net.Port - if cmdOpts.Parsed.Net.BindIP == "" { + if cmdOpts.Parsed.Net.BindIP == "" { //nolint:nestif if prior26 { s.WarningMsgs = append(s.WarningMsgs, "WARNING: You might be insecure. There is no IP binding") } @@ -586,7 +620,11 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int, // count + 1 because we need 1st reading to stablish a base to measure variation for i := 0; i < count+1; i++ { <-ticker.C - err := client.Database("admin").RunCommand(ctx, primitive.D{{"serverStatus", 1}, {"recordStats", 1}}).Decode(&ss) + + err := client.Database("admin").RunCommand(ctx, primitive.D{ + {Key: "serverStatus", Value: 1}, + {Key: "recordStats", Value: 1}, + }).Decode(&ss) if err != nil { return nil, err } @@ -598,6 +636,7 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int, prevOpCount.Insert.Total = ss.Opcounters.Insert prevOpCount.Query.Total = ss.Opcounters.Query prevOpCount.Update.Total = ss.Opcounters.Update + continue } @@ -631,57 +670,63 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int, } // Insert -------------------------------------- - if delta.Opcounters.Insert > oc.Insert.Max { + switch { + case delta.Opcounters.Insert > oc.Insert.Max: oc.Insert.Max = delta.Opcounters.Insert - } - if delta.Opcounters.Insert < oc.Insert.Min { + case delta.Opcounters.Insert < oc.Insert.Min: oc.Insert.Min = delta.Opcounters.Insert } + oc.Insert.Total += delta.Opcounters.Insert // Query --------------------------------------- - if delta.Opcounters.Query > oc.Query.Max { + switch { + case delta.Opcounters.Query > oc.Query.Max: oc.Query.Max = delta.Opcounters.Query - } - if delta.Opcounters.Query < oc.Query.Min { + case delta.Opcounters.Query < oc.Query.Min: oc.Query.Min = delta.Opcounters.Query } + oc.Query.Total += delta.Opcounters.Query // Command ------------------------------------- - if delta.Opcounters.Command > oc.Command.Max { + switch { + case delta.Opcounters.Command > oc.Command.Max: oc.Command.Max = delta.Opcounters.Command - } - if delta.Opcounters.Command < oc.Command.Min { + case delta.Opcounters.Command < oc.Command.Min: oc.Command.Min = delta.Opcounters.Command } + oc.Command.Total += delta.Opcounters.Command // Update -------------------------------------- - if delta.Opcounters.Update > oc.Update.Max { + switch { + case delta.Opcounters.Update > oc.Update.Max: oc.Update.Max = delta.Opcounters.Update - } - if delta.Opcounters.Update < oc.Update.Min { + case delta.Opcounters.Update < oc.Update.Min: oc.Update.Min = delta.Opcounters.Update } + oc.Update.Total += delta.Opcounters.Update // Delete -------------------------------------- - if delta.Opcounters.Delete > oc.Delete.Max { + switch { + case delta.Opcounters.Delete > oc.Delete.Max: oc.Delete.Max = delta.Opcounters.Delete - } - if delta.Opcounters.Delete < oc.Delete.Min { + case delta.Opcounters.Delete < oc.Delete.Min: oc.Delete.Min = delta.Opcounters.Delete } + oc.Delete.Total += delta.Opcounters.Delete // GetMore ------------------------------------- - if delta.Opcounters.GetMore > oc.GetMore.Max { + switch { + case delta.Opcounters.GetMore > oc.GetMore.Max: oc.GetMore.Max = delta.Opcounters.GetMore - } - if delta.Opcounters.GetMore < oc.GetMore.Min { + case delta.Opcounters.GetMore < oc.GetMore.Min: oc.GetMore.Min = delta.Opcounters.GetMore } + oc.GetMore.Total += delta.Opcounters.GetMore prevOpCount.Insert.Total = ss.Opcounters.Insert @@ -690,8 +735,8 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int, prevOpCount.Update.Total = ss.Opcounters.Update prevOpCount.Delete.Total = ss.Opcounters.Delete prevOpCount.GetMore.Total = ss.Opcounters.GetMore - } + ticker.Stop() oc.Insert.Avg = oc.Insert.Total @@ -707,11 +752,12 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int, } func getProcInfo(pid int32, templateData *procInfo) error { - //proc, err := process.NewProcess(templateData.ServerStatus.Pid) + // proc, err := process.NewProcess(templateData.ServerStatus.Pid) proc, err := process.NewProcess(pid) if err != nil { - return fmt.Errorf("cannot get process %d", pid) + return errors.New(fmt.Sprintf("cannot get process %d", pid)) } + ct, err := proc.CreateTime() if err != nil { return err @@ -742,6 +788,7 @@ func GetBalancerStats(ctx context.Context, client *mongo.Client) (*proto.Balance event := item.Id.Event note := item.Id.Note count := item.Count + switch event { case "moveChunk.to", "moveChunk.from", "moveChunk.commit": if note == "success" || note == "" { @@ -760,7 +807,7 @@ func GetBalancerStats(ctx context.Context, client *mongo.Client) (*proto.Balance } func GetShardingChangelogStatus(ctx context.Context, client *mongo.Client) (*proto.ShardingChangelogStats, error) { - var qresults []proto.ShardingChangelogSummary + qresults := []proto.ShardingChangelogSummary{} coll := client.Database("config").Collection("changelog") match := primitive.M{"time": primitive.M{"$gt": time.Now().Add(-240 * time.Hour)}} group := primitive.M{"_id": primitive.M{"event": "$what", "note": "$details.note"}, "count": primitive.M{"$sum": 1}} @@ -776,6 +823,7 @@ func GetShardingChangelogStatus(ctx context.Context, client *mongo.Client) (*pro if err := cursor.Decode(&res); err != nil { return nil, errors.Wrap(err, "cannot decode GetShardingChangelogStatus") } + qresults = append(qresults, res) } @@ -796,6 +844,7 @@ func isPrivateNetwork(ip string) (bool, error) { if err != nil { return false, err } + addr := net.ParseIP(ip) if cidrnet.Contains(addr) { return true, nil @@ -803,7 +852,6 @@ func isPrivateNetwork(ip string) (bool, error) { } return false, nil - } func externalIP() (string, error) { @@ -811,17 +859,21 @@ func externalIP() (string, error) { if err != nil { return "", err } + for _, iface := range ifaces { if iface.Flags&net.FlagUp == 0 { continue // interface down } + if iface.Flags&net.FlagLoopback != 0 { continue // loopback interface } + addrs, err := iface.Addrs() if err != nil { return "", err } + for _, addr := range addrs { var ip net.IP switch v := addr.(type) { @@ -830,9 +882,11 @@ func externalIP() (string, error) { case *net.IPAddr: ip = v.IP } + if ip == nil || ip.IsLoopback() { continue } + ip = ip.To4() if ip == nil { continue // not an ipv4 address @@ -840,6 +894,7 @@ func externalIP() (string, error) { return ip.String(), nil } } + return "", errors.New("are you connected to the network?") } @@ -880,8 +935,8 @@ func parseFlags() (*cliOptions, error) { gop.StringVarLong(&opts.SSLPEMKeyFile, "sslPEMKeyFile", 0, "SSL client PEM file used for authentication") gop.SetParameters("host[:port]") - gop.Parse(os.Args) + if gop.NArgs() > 0 { opts.Host = gop.Arg(0) gop.Parse(gop.Args()) @@ -889,19 +944,25 @@ func parseFlags() (*cliOptions, error) { if gop.IsSet("password") && opts.Password == "" { print("Password: ") + pass, err := gopass.GetPasswd() if err != nil { return opts, err } + opts.Password = string(pass) } + if !strings.HasPrefix(opts.Host, "mongodb://") { opts.Host = "mongodb://" + opts.Host } + if opts.Help { gop.PrintUsage(os.Stdout) + return nil, nil } + if opts.OutputFormat != "json" && opts.OutputFormat != "text" { log.Infof("Invalid output format '%s'. Using text format", opts.OutputFormat) } @@ -920,27 +981,93 @@ func getChunksCount(ctx context.Context, client *mongo.Client) ([]proto.ChunksBy if err != nil { return nil, err } + for cursor.Next(ctx) { res := proto.ChunksByCollection{} if err := cursor.Decode(&res); err != nil { return nil, errors.Wrap(err, "cannot decode chunks aggregation") } + result = append(result, res) } + return result, nil } -func getClientOptions(opts *cliOptions) *options.ClientOptions { +func getClientOptions(opts *cliOptions) (*options.ClientOptions, error) { clientOptions := options.Client().ApplyURI(opts.Host) + + clientOptions.ServerSelectionTimeout = &defaultConnectionTimeout + clientOptions.Direct = &directConnection credential := options.Credential{} if opts.User != "" { credential.Username = opts.User clientOptions.SetAuth(credential) } + if opts.Password != "" { credential.Password = opts.Password credential.PasswordSet = true clientOptions.SetAuth(credential) } - return clientOptions + + if opts.SSLPEMKeyFile != "" || opts.SSLCAFile != "" { + tlsConfig, err := getTLSConfig(opts.SSLPEMKeyFile, opts.SSLCAFile) + if err != nil { + return nil, errors.Wrap(err, "cannot read SSL certificate files") + } + + clientOptions.TLSConfig = tlsConfig + } + + return clientOptions, nil +} + +func getTLSConfig(sslPEMKeyFile, sslCAFile string) (*tls.Config, error) { + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS10, + InsecureSkipVerify: true, + } + + roots := x509.NewCertPool() + + if sslPEMKeyFile != "" { + crt, err := ioutil.ReadFile(filepath.Clean(expandHome(sslPEMKeyFile))) + if err != nil { + return nil, err + } + + cert, err := tls.X509KeyPair(crt, crt) + if err != nil { + log.Fatal(err) + } + + tlsConfig.Certificates = []tls.Certificate{cert} + } + + if sslCAFile != "" { + ca, err := ioutil.ReadFile(filepath.Clean(expandHome(sslCAFile))) + if err != nil { + return nil, err + } + + roots.AppendCertsFromPEM(ca) + tlsConfig.RootCAs = roots + } + + return tlsConfig, nil +} + +func expandHome(path string) string { + usr, _ := user.Current() + dir := usr.HomeDir + + switch { + case path == "~": + path = dir + case strings.HasPrefix(path, "~/"): + path = filepath.Join(dir, path[2:]) + } + + return path } diff --git a/src/go/pt-mongodb-summary/main_test.go b/src/go/pt-mongodb-summary/main_test.go index cb3cf3dd..0b1af407 100644 --- a/src/go/pt-mongodb-summary/main_test.go +++ b/src/go/pt-mongodb-summary/main_test.go @@ -99,8 +99,8 @@ func TestClusterWideInfo(t *testing.T) { } }) } - } + func addToCounters(ss proto.ServerStatus, increment int64) proto.ServerStatus { ss.Opcounters.Command += increment ss.Opcounters.Delete += increment diff --git a/src/go/pt-mongodb-summary/oplog/oplog.go b/src/go/pt-mongodb-summary/oplog/oplog.go index 1f276d46..f8807c50 100644 --- a/src/go/pt-mongodb-summary/oplog/oplog.go +++ b/src/go/pt-mongodb-summary/oplog/oplog.go @@ -85,7 +85,6 @@ func GetOplogInfo(ctx context.Context, hostnames []string, co *options.ClientOpt sort.Sort(results) return results, nil - } func getOplogCollection(ctx context.Context, client *mongo.Client) (string, error) { diff --git a/src/go/pt-pg-summary/main.go b/src/go/pt-pg-summary/main.go index 7d21b59c..4666a66c 100644 --- a/src/go/pt-pg-summary/main.go +++ b/src/go/pt-pg-summary/main.go @@ -31,6 +31,7 @@ type connOpts struct { Password string DisableSSL bool } + type cliOptions struct { app *kingpin.Application connOpts connOpts @@ -110,7 +111,6 @@ func main() { if err := masterTmpl.ExecuteTemplate(os.Stdout, "report", info); err != nil { log.Fatal(err) } - } func connect(dsn string) (*sql.DB, error) { @@ -131,29 +131,29 @@ func funcsMap() template.FuncMap { if len(s) < size { return s } - return s[:size]+"..." + return s[:size] + "..." + }, + "convertnullstring": func(s sql.NullString) string { + if s.Valid { + return s.String + } else { + return "" + } + }, + "convertnullint64": func(s sql.NullInt64) int64 { + if s.Valid { + return s.Int64 + } else { + return 0 + } + }, + "convertnullfloat64": func(s sql.NullFloat64) float64 { + if s.Valid { + return s.Float64 + } else { + return 0.0 + } }, - "convertnullstring": func(s sql.NullString) string { - if s.Valid { - return s.String - } else { - return "" - } - }, - "convertnullint64": func(s sql.NullInt64) int64 { - if s.Valid { - return s.Int64 - } else { - return 0 - } - }, - "convertnullfloat64": func(s sql.NullFloat64) float64 { - if s.Valid { - return s.Float64 - } else { - return 0.0 - } - }, } } diff --git a/src/go/pt-pg-summary/main_test.go b/src/go/pt-pg-summary/main_test.go index c2e89265..6afabbc7 100644 --- a/src/go/pt-pg-summary/main_test.go +++ b/src/go/pt-pg-summary/main_test.go @@ -5,8 +5,8 @@ import ( "os" "testing" - "github.com/percona/percona-toolkit/src/go/pt-pg-summary/internal/tu" "github.com/percona/percona-toolkit/src/go/lib/pginfo" + "github.com/percona/percona-toolkit/src/go/pt-pg-summary/internal/tu" "github.com/sirupsen/logrus" ) @@ -37,7 +37,7 @@ func TestConnection(t *testing.T) { // use an "external" IP to simulate a remote host tests := append(tests, Test{"remote_host", tu.PG9DockerIP, tu.DefaultPGPort, tu.Username, tu.Password}) // use IPV6 for PostgreSQL 9 - //tests := append(tests, Test{"IPV6", tu.IPv6Host, tu.IPv6PG9Port, tu.Username, tu.Password}) + // tests := append(tests, Test{"IPV6", tu.IPv6Host, tu.IPv6PG9Port, tu.Username, tu.Password}) for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { @@ -48,16 +48,15 @@ func TestConnection(t *testing.T) { } }) } - } func TestNewWithLogger(t *testing.T) { - for _, test := range tests { + for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s", test.host, test.port, test.username, test.password, "postgres") - db, err := connect(dsn); + db, err := connect(dsn) if err != nil { t.Errorf("Cannot connect to the db using %q: %s", dsn, err) } @@ -65,21 +64,20 @@ func TestNewWithLogger(t *testing.T) { t.Errorf("Cannot run NewWithLogger using %q: %s", dsn, err) } }) - } + } } - func TestCollectGlobalInfo(t *testing.T) { - for _, test := range tests { + for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s", test.host, test.port, test.username, test.password, "postgres") - db, err := connect(dsn); + db, err := connect(dsn) if err != nil { t.Errorf("Cannot connect to the db using %q: %s", dsn, err) } - info, err := pginfo.NewWithLogger(db, nil, 30, logger); + info, err := pginfo.NewWithLogger(db, nil, 30, logger) if err != nil { t.Errorf("Cannot run NewWithLogger using %q: %s", dsn, err) } @@ -92,27 +90,27 @@ func TestCollectGlobalInfo(t *testing.T) { t.Errorf("Cannot collect global information using %q", dsn) } }) - } + } } func TestCollectPerDatabaseInfo(t *testing.T) { - for _, test := range tests { + for _, test := range tests { test := test t.Run(test.name, func(t *testing.T) { dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s", test.host, test.port, test.username, test.password, "postgres") - db, err := connect(dsn); + db, err := connect(dsn) if err != nil { t.Errorf("Cannot connect to the db using %q: %s", dsn, err) } - info, err := pginfo.NewWithLogger(db, nil, 30, logger); + info, err := pginfo.NewWithLogger(db, nil, 30, logger) if err != nil { t.Errorf("Cannot run New using %q: %s", dsn, err) } for _, dbName := range info.DatabaseNames() { dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s", test.host, test.port, test.username, test.password, dbName) - conn, err := connect(dsn); + conn, err := connect(dsn) if err != nil { t.Errorf("Cannot connect to the %s database using %q: %s", dbName, dsn, err) } @@ -122,5 +120,5 @@ func TestCollectPerDatabaseInfo(t *testing.T) { conn.Close() } }) - } + } } diff --git a/src/go/pt-pg-summary/models/alldatabases.xo.go b/src/go/pt-pg-summary/models/alldatabases.xo.go index 9069ef8c..ba5c37fc 100644 --- a/src/go/pt-pg-summary/models/alldatabases.xo.go +++ b/src/go/pt-pg-summary/models/alldatabases.xo.go @@ -13,7 +13,7 @@ func GetAllDatabases(db XODB) ([]*AllDatabases, error) { var err error // sql query - var sqlstr = `SELECT datname ` + + sqlstr := `SELECT datname ` + `FROM pg_database ` + `WHERE datistemplate = false` diff --git a/src/go/pt-pg-summary/models/clusterinfo.xo.go b/src/go/pt-pg-summary/models/clusterinfo.xo.go index bfe6a3a9..6a5d6e2b 100644 --- a/src/go/pt-pg-summary/models/clusterinfo.xo.go +++ b/src/go/pt-pg-summary/models/clusterinfo.xo.go @@ -24,7 +24,7 @@ func GetClusterInfos(db XODB) ([]*ClusterInfo, error) { var err error // sql query - var sqlstr = `SELECT usename, now() AS "Time", ` + + sqlstr := `SELECT usename, now() AS "Time", ` + `client_addr, ` + `client_hostname, ` + `version() AS version, ` + diff --git a/src/go/pt-pg-summary/models/connectedclients.xo.go b/src/go/pt-pg-summary/models/connectedclients.xo.go index 9bed44a0..8be319d6 100644 --- a/src/go/pt-pg-summary/models/connectedclients.xo.go +++ b/src/go/pt-pg-summary/models/connectedclients.xo.go @@ -20,7 +20,7 @@ func GetConnectedClients(db XODB) ([]*ConnectedClients, error) { var err error // sql query - var sqlstr = `SELECT usename, ` + + sqlstr := `SELECT usename, ` + `CASE WHEN client_hostname IS NULL THEN client_addr::text ELSE client_hostname END AS client, ` + `state, count(*) ` + `FROM pg_stat_activity ` + diff --git a/src/go/pt-pg-summary/models/connections.xo.go b/src/go/pt-pg-summary/models/connections.xo.go index c7e56c44..4a49a59a 100644 --- a/src/go/pt-pg-summary/models/connections.xo.go +++ b/src/go/pt-pg-summary/models/connections.xo.go @@ -14,7 +14,7 @@ func GetConnections(db XODB) ([]*Connections, error) { var err error // sql query - var sqlstr = `SELECT state, count(*) ` + + sqlstr := `SELECT state, count(*) ` + `FROM pg_stat_activity ` + `GROUP BY 1` diff --git a/src/go/pt-pg-summary/models/counters.xo.go b/src/go/pt-pg-summary/models/counters.xo.go index 72a2950e..791b65d4 100644 --- a/src/go/pt-pg-summary/models/counters.xo.go +++ b/src/go/pt-pg-summary/models/counters.xo.go @@ -27,7 +27,7 @@ func GetCounters(db XODB) ([]*Counters, error) { var err error // sql query - var sqlstr = `SELECT COALESCE(datname, '') datname, numbackends, xact_commit, xact_rollback, ` + + sqlstr := `SELECT COALESCE(datname, '') datname, numbackends, xact_commit, xact_rollback, ` + `blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted, ` + `tup_updated, tup_deleted, conflicts, temp_files, ` + `temp_bytes, deadlocks ` + diff --git a/src/go/pt-pg-summary/models/databases.xo.go b/src/go/pt-pg-summary/models/databases.xo.go index 1a27e991..3409fa46 100644 --- a/src/go/pt-pg-summary/models/databases.xo.go +++ b/src/go/pt-pg-summary/models/databases.xo.go @@ -14,7 +14,7 @@ func GetDatabases(db XODB) ([]*Databases, error) { var err error // sql query - var sqlstr = `SELECT datname, pg_size_pretty(pg_database_size(datname)) ` + + sqlstr := `SELECT datname, pg_size_pretty(pg_database_size(datname)) ` + `FROM pg_stat_database ` + `WHERE datid <> 0` diff --git a/src/go/pt-pg-summary/models/databasewaitevents.xo.go b/src/go/pt-pg-summary/models/databasewaitevents.xo.go index 601a0716..97e06e52 100644 --- a/src/go/pt-pg-summary/models/databasewaitevents.xo.go +++ b/src/go/pt-pg-summary/models/databasewaitevents.xo.go @@ -22,7 +22,7 @@ func GetDatabaseWaitEvents(db XODB) ([]*DatabaseWaitEvents, error) { var err error // sql query - var sqlstr = `SELECT c.relname, c.relkind, d.wait_event_type, d.wait_event, b.datname, count(*) ` + + sqlstr := `SELECT c.relname, c.relkind, d.wait_event_type, d.wait_event, b.datname, count(*) ` + `FROM pg_locks a ` + `JOIN pg_stat_database b ON a.database=b.datid ` + `JOIN pg_class c ON a.relation=c.oid ` + diff --git a/src/go/pt-pg-summary/models/portanddatadir.xo.go b/src/go/pt-pg-summary/models/portanddatadir.xo.go index 38621132..970fe373 100644 --- a/src/go/pt-pg-summary/models/portanddatadir.xo.go +++ b/src/go/pt-pg-summary/models/portanddatadir.xo.go @@ -14,7 +14,7 @@ func GetPortAndDatadir(db XODB) (*PortAndDatadir, error) { var err error // sql query - var sqlstr = `SELECT name, ` + + sqlstr := `SELECT name, ` + `setting ` + `FROM pg_settings ` + `WHERE name IN ('port','data_directory')` diff --git a/src/go/pt-pg-summary/models/slavehosts10.xo.go b/src/go/pt-pg-summary/models/slavehosts10.xo.go index 9d3dd379..1363b995 100644 --- a/src/go/pt-pg-summary/models/slavehosts10.xo.go +++ b/src/go/pt-pg-summary/models/slavehosts10.xo.go @@ -20,7 +20,7 @@ func GetSlaveHosts10s(db XODB) ([]*SlaveHosts10, error) { var err error // sql query - var sqlstr = `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_lsn - replay_lsn) * 255 * 16 ^ 6 ) AS byte_lag ` + + sqlstr := `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_lsn - replay_lsn) * 255 * 16 ^ 6 ) AS byte_lag ` + `FROM ( SELECT application_name, client_addr, client_hostname, state, ` + `('x' || lpad(split_part(sent_lsn::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS sent_lsn, ` + `('x' || lpad(split_part(replay_lsn::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS replay_lsn, ` + diff --git a/src/go/pt-pg-summary/models/slavehosts96.xo.go b/src/go/pt-pg-summary/models/slavehosts96.xo.go index 83e6fcee..14fed04b 100644 --- a/src/go/pt-pg-summary/models/slavehosts96.xo.go +++ b/src/go/pt-pg-summary/models/slavehosts96.xo.go @@ -20,7 +20,7 @@ func GetSlaveHosts96s(db XODB) ([]*SlaveHosts96, error) { var err error // sql query - var sqlstr = `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_xlog - replay_xlog) * 255 * 16 ^ 6 ) AS byte_lag ` + + sqlstr := `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_xlog - replay_xlog) * 255 * 16 ^ 6 ) AS byte_lag ` + `FROM ( SELECT application_name, client_addr, client_hostname, state, ` + `('x' || lpad(split_part(sent_location::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS sent_xlog, ` + `('x' || lpad(split_part(replay_location::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS replay_xlog, ` + diff --git a/src/go/pt-pg-summary/models/tableaccess.xo.go b/src/go/pt-pg-summary/models/tableaccess.xo.go index 87ca7338..45b4ac4b 100644 --- a/src/go/pt-pg-summary/models/tableaccess.xo.go +++ b/src/go/pt-pg-summary/models/tableaccess.xo.go @@ -20,7 +20,7 @@ func GetTableAccesses(db XODB) ([]*TableAccess, error) { var err error // sql query - var sqlstr = `SELECT c.relname, c.relkind, b.datname datname, count(*) FROM pg_locks a ` + + sqlstr := `SELECT c.relname, c.relkind, b.datname datname, count(*) FROM pg_locks a ` + `JOIN pg_stat_database b ` + `ON a.database=b.datid ` + `JOIN pg_class c ` + diff --git a/src/go/pt-pg-summary/models/tablecachehitratio.xo.go b/src/go/pt-pg-summary/models/tablecachehitratio.xo.go index 4eb624a5..b833ac9f 100644 --- a/src/go/pt-pg-summary/models/tablecachehitratio.xo.go +++ b/src/go/pt-pg-summary/models/tablecachehitratio.xo.go @@ -18,7 +18,7 @@ func GetTableCacheHitRatio(db XODB) (*TableCacheHitRatio, error) { var err error // sql query - var sqlstr = `SELECT 'cache hit rate' AS name, ` + + sqlstr := `SELECT 'cache hit rate' AS name, ` + `CASE WHEN (sum(heap_blks_read) + sum(idx_blks_hit)) > 0 ` + `THEN ` + `sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) ` + diff --git a/src/go/pt-pg-summary/models/tablespaces.xo.go b/src/go/pt-pg-summary/models/tablespaces.xo.go index 1553677a..945ac1ae 100644 --- a/src/go/pt-pg-summary/models/tablespaces.xo.go +++ b/src/go/pt-pg-summary/models/tablespaces.xo.go @@ -15,7 +15,7 @@ func GetTablespaces(db XODB) ([]*Tablespaces, error) { var err error // sql query - var sqlstr = `SELECT spcname AS Name, ` + + sqlstr := `SELECT spcname AS Name, ` + `pg_catalog.pg_get_userbyid(spcowner) AS Owner, ` + `pg_catalog.pg_tablespace_location(oid) AS Location ` + `FROM pg_catalog.pg_tablespace ` + diff --git a/src/go/pt-pg-summary/templates/templates.go b/src/go/pt-pg-summary/templates/templates.go index ee5a291f..350320ed 100644 --- a/src/go/pt-pg-summary/templates/templates.go +++ b/src/go/pt-pg-summary/templates/templates.go @@ -57,7 +57,7 @@ var TPL = `{{define "report"}} +----------------------+----------------------+----------------------------------------------------+ {{ end -}} {{/* end define */}} ` + - `{{- define "slaves_and_log_none" -}} + `{{- define "slaves_and_log_none" -}} ##### --- Slave and the lag with Master --- #### There are no slave hosts {{ end -}} {{/* end define */}} diff --git a/src/go/pt-secure-collect/encrypt.go b/src/go/pt-secure-collect/encrypt.go index 83278325..07c834de 100644 --- a/src/go/pt-secure-collect/encrypt.go +++ b/src/go/pt-secure-collect/encrypt.go @@ -50,7 +50,7 @@ func encrypt(infile, outfile string, pass [32]byte) error { var iv [aes.BlockSize]byte stream := cipher.NewOFB(block, iv[:]) - outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600) if err != nil { return errors.Wrapf(err, "Cannot create output file %q", outfile) } @@ -81,7 +81,7 @@ func decrypt(infile, outfile string, pass [32]byte) error { var iv [aes.BlockSize]byte stream := cipher.NewOFB(block, iv[:]) - outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600) if err != nil { return errors.Wrapf(err, "Cannot open %q for writing", outfile) } diff --git a/src/go/pt-secure-collect/main_test.go b/src/go/pt-secure-collect/main_test.go index 02501056..77de95cf 100644 --- a/src/go/pt-secure-collect/main_test.go +++ b/src/go/pt-secure-collect/main_test.go @@ -32,11 +32,9 @@ func TestProcessCliParams(t *testing.T) { t.Errorf("Test #%d expected error, have nil", i) } if !reflect.DeepEqual(opts, test.WantOpts) { - } } } func TestCollect(t *testing.T) { - }