From 56c898fcb0f4a1c428b9e9017c7c34f60e8501bc Mon Sep 17 00:00:00 2001 From: Aleksei Romanenko Date: Thu, 7 Jul 2022 09:25:59 -0500 Subject: [PATCH 1/3] Fix #1636: can't switch context with --kubeconfig flag (#1638) Co-authored-by: Aleksei Romanenko --- internal/client/config.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/client/config.go b/internal/client/config.go index e14a6b7e..7fa43218 100644 --- a/internal/client/config.go +++ b/internal/client/config.go @@ -75,6 +75,7 @@ func (c *Config) SwitchContext(name string) error { flags := genericclioptions.NewConfigFlags(UsePersistentConfig) flags.Context = &name flags.Timeout = c.flags.Timeout + flags.KubeConfig = c.flags.KubeConfig c.flags = flags return nil From d9629dd5374fde5914447646e7a2ca58a7837d0a Mon Sep 17 00:00:00 2001 From: Aleksei Romanenko <478249+slimus@users.noreply.github.com> Date: Sat, 16 Jul 2022 09:35:50 -0500 Subject: [PATCH 2/3] Fix PF and RS colors (#1656) Co-authored-by: Aleksei Romanenko --- internal/config/styles.go | 4 ++-- internal/view/pf.go | 7 +++++-- internal/view/rs.go | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/config/styles.go b/internal/config/styles.go index 4a856e39..71f0ad69 100644 --- a/internal/config/styles.go +++ b/internal/config/styles.go @@ -265,7 +265,7 @@ func newStyle() Style { func newDialog() Dialog { return Dialog{ - FgColor: "cadetBlue", + FgColor: "cadetblue", BgColor: "black", ButtonBgColor: "darkslateblue", ButtonFgColor: "black", @@ -278,7 +278,7 @@ func newDialog() Dialog { func newPrompt() Prompt { return Prompt{ - FgColor: "cadetBlue", + FgColor: "cadetblue", BgColor: "black", SuggestColor: "dodgerblue", } diff --git a/internal/view/pf.go b/internal/view/pf.go index 12f1299c..51bd12ad 100644 --- a/internal/view/pf.go +++ b/internal/view/pf.go @@ -158,7 +158,7 @@ func (p *PortForward) deleteCmd(evt *tcell.EventKey) *tcell.EventKey { return nil } } - showModal(p.App().Content.Pages, msg, func() { + showModal(p.App(), msg, func() { for _, s := range selections { var pf dao.PortForward pf.Init(p.App().factory, client.NewGVR("portforwards")) @@ -187,9 +187,12 @@ func pfToHuman(s string) (string, error) { return fmt.Sprintf("%s::%s %s->%s", mm[2], mm[3], mm[4], mm[5]), nil } -func showModal(p *ui.Pages, msg string, ok func()) { +func showModal(a *App, msg string, ok func()) { + p := a.Content.Pages + styles := a.Styles.Dialog() m := tview.NewModal(). AddButtons([]string{"Cancel", "OK"}). + SetButtonBackgroundColor(styles.ButtonBgColor.Color()). SetTextColor(tcell.ColorFuchsia). SetText(msg). SetDoneFunc(func(_ int, b string) { diff --git a/internal/view/rs.go b/internal/view/rs.go index f410cb88..726f6f3c 100644 --- a/internal/view/rs.go +++ b/internal/view/rs.go @@ -79,8 +79,10 @@ func (r *ReplicaSet) dismissModal() { } func (r *ReplicaSet) showModal(msg string, done func(int, string)) { + styles := r.App().Styles.Dialog() confirm := tview.NewModal(). AddButtons([]string{"Cancel", "OK"}). + SetButtonBackgroundColor(styles.ButtonBgColor.Color()). SetTextColor(tcell.ColorFuchsia). SetText(msg). SetDoneFunc(done) From b6feb10388dcf345b47cef16558c2c99606719da Mon Sep 17 00:00:00 2001 From: Fernand Galiana Date: Sun, 17 Jul 2022 09:28:59 -0600 Subject: [PATCH 3/3] K9s/rel v0.26.0 (#1660) * additional tests + cleanup * release v0.26.0 --- Makefile | 2 +- change_logs/release_v0.26.0.md | 45 +++++ go.mod | 32 +++- go.sum | 176 ++++++++++++++++++- internal/dao/container.go | 4 +- internal/dao/context.go | 4 +- internal/dao/crd.go | 2 +- internal/dao/cronjob.go | 6 +- internal/dao/dp.go | 6 +- internal/dao/ds.go | 8 +- internal/dao/helm.go | 14 +- internal/dao/hpa.go | 48 ------ internal/dao/job.go | 6 +- internal/dao/node.go | 8 +- internal/dao/non_resource.go | 14 +- internal/dao/pod.go | 6 +- internal/dao/popeye.go | 2 +- internal/dao/port_forward.go | 4 +- internal/dao/rbac.go | 14 +- internal/dao/rbac_policy.go | 4 +- internal/dao/resource.go | 4 +- internal/dao/sts.go | 8 +- internal/dao/svc.go | 2 +- internal/model/cmd_buff.go | 134 ++++++++++----- internal/model/fish_buff_test.go | 2 +- internal/model/registry.go | 14 -- internal/model/table.go | 10 +- internal/model/table_test.go | 2 +- internal/render/cr.go | 2 +- internal/render/crb.go | 2 +- internal/render/crd.go | 36 ++-- internal/render/crd_test.go | 2 +- internal/render/cronjob.go | 2 +- internal/render/dp.go | 2 +- internal/render/ds.go | 2 +- internal/render/ep.go | 2 +- internal/render/hpa.go | 264 ----------------------------- internal/render/hpa_test.go | 17 -- internal/render/ing.go | 2 +- internal/render/job.go | 2 +- internal/render/node.go | 2 +- internal/render/np.go | 2 +- internal/render/ns.go | 2 +- internal/render/pdb.go | 2 +- internal/render/pod.go | 2 +- internal/render/pv.go | 2 +- internal/render/pvc.go | 2 +- internal/render/ro.go | 2 +- internal/render/rob.go | 2 +- internal/render/rs.go | 2 +- internal/render/sa.go | 2 +- internal/render/sc.go | 2 +- internal/render/sts.go | 2 +- internal/render/svc.go | 2 +- internal/render/table_data.go | 99 ++++++----- internal/render/table_data_test.go | 42 +++-- internal/ui/table.go | 12 +- internal/ui/table_helper.go | 13 +- internal/ui/table_test.go | 6 +- internal/ui/types.go | 2 +- internal/view/alias_test.go | 6 +- internal/view/browser.go | 2 +- internal/view/container.go | 9 +- internal/view/helpers.go | 2 +- internal/view/ns.go | 6 +- internal/view/pod.go | 5 +- internal/view/popeye.go | 4 +- internal/view/table_helper.go | 2 +- internal/view/table_int_test.go | 8 +- 69 files changed, 565 insertions(+), 597 deletions(-) create mode 100644 change_logs/release_v0.26.0.md delete mode 100644 internal/dao/hpa.go delete mode 100644 internal/render/hpa.go delete mode 100644 internal/render/hpa_test.go diff --git a/Makefile b/Makefile index 4435d51d..c255db3e 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ PACKAGE := github.com/derailed/$(NAME) GIT_REV ?= $(shell git rev-parse --short HEAD) SOURCE_DATE_EPOCH ?= $(shell date +%s) DATE ?= $(shell date -u -d @${SOURCE_DATE_EPOCH} +"%Y-%m-%dT%H:%M:%SZ") -VERSION ?= v0.25.21 +VERSION ?= v0.26.0 IMG_NAME := derailed/k9s IMAGE := ${IMG_NAME}:${VERSION} diff --git a/change_logs/release_v0.26.0.md b/change_logs/release_v0.26.0.md new file mode 100644 index 00000000..5594c84d --- /dev/null +++ b/change_logs/release_v0.26.0.md @@ -0,0 +1,45 @@ + + +# Release v0.26.0 + +## Notes + +Thank you to all that contributed with flushing out issues and enhancements for K9s! I'll try to mark some of these issues as fixed. But if you don't mind grab the latest rev and see if we're happier with some of the fixes! If you've filed an issue please help me verify and close. Your support, kindness and awesome suggestions to make K9s better are as ever very much noted and appreciated! Also big thanks to all that have allocated their own time to help others on both slack and on this repo!! + +If you feel K9s is helping your Kubernetes journey, please consider joining our [sponsorship program](https://github.com/sponsors/derailed) and/or make some noise on social! [@kitesurfer](https://twitter.com/kitesurfer) + +On Slack? Please join us [K9slackers](https://join.slack.com/t/k9sers/shared_invite/enQtOTA5MDEyNzI5MTU0LWQ1ZGI3MzliYzZhZWEyNzYxYzA3NjE0YTk1YmFmNzViZjIyNzhkZGI0MmJjYzhlNjdlMGJhYzE2ZGU1NjkyNTM) + +--- + +## ♫ Sounds Behind The Release ♭ + +* [Sugar Water - Cibo Matto](https://www.youtube.com/watch?v=EN9auBn6Jys) +* [Midnight To Stevens - The Clash](https://www.youtube.com/watch?v=9suQJthS6to) +* [Cool & Proper - Natty Nation](https://www.youtube.com/watch?v=9q337zn7bpI) + +--- + +## Maintenance Release + +Please join me in giving a big THANK YOU and ATTA BOY!! to [Aleksei Romanenko](https://github.com/slimus) for allocating his personal time in helping out his fellow K9ser's with issues, PRs and slack!! + +Also in the last drop, I'd updated k8s API's to the latest which caused some `disturbance in the farce!` and hosed AWS cluster connections in the same swop ;( Please see [Issue#119](https://github.com/derailed/k9s/issues/1619) for `a` resolve... I did not catch it early enough hence the release bump on this drop. My bad!! + +--- + +## Resolved Issues + +* [Issue #1655](https://github.com/derailed/k9s/issues/1655) Text not appearing in context windows +* [Issue #1654](https://github.com/derailed/k9s/issues/1654) K9s crash on m1 with index out of range [0] with length 0 +* [Issue #1652](https://github.com/derailed/k9s/issues/1652) HPA with custom metrics has "Target% column showing "unknown/unknown" +* [Issue #1639](https://github.com/derailed/k9s/issues/1639) Helm releases view broken after interacting with 0.25.21 + +## Resolved PR + +* [PR #1656](https://github.com/derailed/k9s/pull/156) Fix PF and RS dialog colors +* [PR #163](https://github.com/derailed/k9s/pull/1636) Fix #1636: can't switch context with --kubeconfig flag + +--- + + © 2021 Imhotep Software LLC. All materials licensed under [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0) diff --git a/go.mod b/go.mod index bcf40445..1aadd473 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,34 @@ module github.com/derailed/k9s go 1.18 -replace github.com/gdamore/tcell/v2 => github.com/derailed/tcell/v2 v2.3.1-rc.2 +replace ( + github.com/gdamore/tcell/v2 => github.com/derailed/tcell/v2 v2.3.1-rc.2 + k8s.io/api => k8s.io/api v0.24.2 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.2 + k8s.io/apimachinery => k8s.io/apimachinery v0.24.2 + k8s.io/apiserver => k8s.io/apiserver v0.24.2 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.2 + k8s.io/client-go => k8s.io/client-go v0.24.2 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.2 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.2 + k8s.io/code-generator => k8s.io/code-generator v0.24.2 + k8s.io/component-base => k8s.io/component-base v0.24.2 + k8s.io/component-helpers => k8s.io/component-helpers v0.24.2 + k8s.io/controller-manager => k8s.io/controller-manager v0.24.2 + k8s.io/cri-api => k8s.io/cri-api v0.24.2 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.2 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.2 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.2 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.2 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.2 + k8s.io/kubectl => k8s.io/kubectl v0.24.2 + k8s.io/kubelet => k8s.io/kubelet v0.24.2 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.2 + k8s.io/metrics => k8s.io/metrics v0.24.2 + k8s.io/mount-utils => k8s.io/mount-utils v0.24.2 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.2 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.2 +) require ( github.com/adrg/xdg v0.4.0 @@ -33,6 +60,7 @@ require ( k8s.io/client-go v0.24.2 k8s.io/klog/v2 v2.70.0 k8s.io/kubectl v0.24.2 + k8s.io/kubernetes v1.24.2 k8s.io/metrics v0.24.2 sigs.k8s.io/yaml v1.3.0 ) @@ -55,7 +83,7 @@ require ( github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect - github.com/aws/aws-sdk-go v1.35.21 // indirect + github.com/aws/aws-sdk-go v1.38.49 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect diff --git a/go.sum b/go.sum index cd67af76..23c6ae99 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -46,6 +48,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v55.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= @@ -60,6 +64,8 @@ github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8K github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= @@ -69,6 +75,8 @@ github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/GoogleCloudPlatform/k8s-cloud-provider v1.16.1-0.20210702024009-ea6160c1d0e3/go.mod h1:8XasY4ymP2V/tn2OOV9ZadmiTE1FIB/h3W+yNlPttKw= +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 h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= @@ -82,7 +90,10 @@ github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmy github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= +github.com/Microsoft/hcsshim v0.8.22/go.mod h1:91uVCVzvX2QD16sMCenoxxXo6L1wJnLMX2PSufFMtF0= github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= @@ -94,6 +105,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 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= @@ -102,6 +114,7 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -111,8 +124,10 @@ github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0 github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-sdk-go v1.35.21 h1:6cMeHzcca+0uweOpUonDYv4DsPp9Qa9PTMYxH+VqDkY= -github.com/aws/aws-sdk-go v1.35.21/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +github.com/aws/aws-sdk-go v1.38.49 h1:E31vxjCe6a5I+mJLmUGaZobiWmg9KdWaud9IfceYeYQ= +github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -122,7 +137,9 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= @@ -140,10 +157,14 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -155,17 +176,35 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.12/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0= github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= +github.com/coredns/corefile-migration v1.0.14/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -183,19 +222,18 @@ github.com/derailed/popeye v0.10.1 h1:+lyLDGUyKANfMiSHV8X1pHD1HhcxEXCa8ple0ZvyRq github.com/derailed/popeye v0.10.1/go.mod h1:ChD8GPNvgsgjLG5fQBZIxm3VOhFrqd10Xn8IxfuGn4w= github.com/derailed/tcell/v2 v2.3.1-rc.2 h1:9TmZB/IwL3MA1Jf4pC4rfMaPTcVYIN62IwE7X7A9emU= github.com/derailed/tcell/v2 v2.3.1-rc.2/go.mod h1:wegJ+SscH+jPjEQIAV/dI/grLTRm5R4IE2M479NDSL0= -github.com/derailed/tview v0.6.6 h1:hNqBewhRTYRgfLp1p5KGw0DFdbGMS68iocBSmGGNg4s= -github.com/derailed/tview v0.6.6/go.mod h1:A1LXWlbx/YDMXr3GVTy+IgclAkBssJpw/FiZ7aqUgzU= -github.com/derailed/tview v0.7.0 h1:xKdhWvyWWXau8gWgQmFEaflooPwxaX0wFpfsoBxEnos= -github.com/derailed/tview v0.7.0/go.mod h1:zH4i4fRLbUKOuqQwdcMefak2YyAjUj9bmKsiKTMf9gg= github.com/derailed/tview v0.7.1 h1:kV8nPWUpftbduH1hlPXqA/09iyyP9ZH6nSfZF9m+d8U= github.com/derailed/tview v0.7.1/go.mod h1:zH4i4fRLbUKOuqQwdcMefak2YyAjUj9bmKsiKTMf9gg= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w= github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= @@ -224,6 +262,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -236,8 +275,11 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= @@ -278,6 +320,7 @@ github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -291,8 +334,11 @@ github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XE github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= 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/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -301,6 +347,7 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -343,6 +390,7 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cadvisor v0.44.1/go.mod h1:GQ9KQfz0iNHQk3D6ftzJWK4TXabfIgM10Oy3FkR+Gzg= github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= @@ -394,10 +442,14 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= @@ -428,6 +480,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/heketi/heketi v10.3.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= @@ -440,6 +494,7 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -462,6 +517,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -471,6 +527,7 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -493,12 +550,15 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= 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/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -534,6 +594,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -552,11 +614,14 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.0 h1:gUDhXQx58YNrpHlK4nSL+7y2pxFZkUcXqzFDKWdC0Oo= +github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -566,13 +631,16 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= @@ -596,8 +664,15 @@ github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -642,6 +717,7 @@ github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuI github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -649,11 +725,14 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/rakyll/hey v0.1.4 h1:hhc8GIqHN4+rPFZvkM9lkCQGi7da0sINM83xxpFkbPA= github.com/rakyll/hey v0.1.4/go.mod h1:nAOTOo+L52KB9SZq/M6J18kxjto4yVtXQDjU2HgjUPI= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -665,6 +744,7 @@ github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY= github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= +github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -673,18 +753,21 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= @@ -696,6 +779,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= @@ -706,9 +790,11 @@ github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzu github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/storageos/go-api v2.2.0+incompatible/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= @@ -722,8 +808,17 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -733,6 +828,7 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -789,6 +885,7 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -803,9 +900,14 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -813,6 +915,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20210220032938-85be41e4509f/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -829,12 +933,15 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -853,6 +960,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -879,6 +987,7 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -904,6 +1013,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -929,6 +1039,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -936,23 +1047,29 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -966,6 +1083,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -978,9 +1096,11 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -992,10 +1112,12 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1024,9 +1146,11 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-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-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-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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1051,6 +1175,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1091,6 +1216,12 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T 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= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1113,6 +1244,7 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -1143,6 +1275,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1173,6 +1306,7 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1195,6 +1329,7 @@ google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+Sgr google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1244,6 +1379,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= 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/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1253,6 +1389,7 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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= @@ -1291,31 +1428,56 @@ k8s.io/cli-runtime v0.24.2 h1:KxY6tSgPGsahA6c1/dmR3uF5jOxXPx2QQY6C5ZrLmtE= k8s.io/cli-runtime v0.24.2/go.mod h1:1LIhKL2RblkhfG4v5lZEt7FtgFG5mVb8wqv5lE9m5qY= k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/cloud-provider v0.24.2/go.mod h1:a7jyWjizk+IKbcIf8+mX2cj3NvpRv9ZyGdXDyb8UEkI= +k8s.io/cluster-bootstrap v0.24.2/go.mod h1:eIHV338K03vBm3u/ROZiNXxWJ4AJRoTR9PEUhcTvYkg= k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= k8s.io/component-helpers v0.24.2/go.mod h1:TRQPBQKfmqkmV6c0HAmUs8cXVNYYYLsXy4zu8eODi9g= +k8s.io/controller-manager v0.24.2/go.mod h1:hpwCof4KxP4vrw/M5QiVxU6Zmmggmr1keGXtjGHF+vc= +k8s.io/cri-api v0.24.2/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig= +k8s.io/csi-translation-lib v0.24.2/go.mod h1:pdHc2CYLViQYYsOqOp79hjKYi8J4NZ7vpiVzn1SqBrg= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.70.0 h1:GMmmjoFOrNepPN0ZeGCzvD2Gh5IKRwdFx8W5PBxVTQU= k8s.io/klog/v2 v2.70.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-aggregator v0.24.2/go.mod h1:Ju2jNDixn+vqeeKEBfjfpc204bO1pbdXX0N9knCxeMQ= +k8s.io/kube-controller-manager v0.24.2/go.mod h1:KDE0yqiEvxYiO0WRpPA4rVx8AcK1vsWydUF37AJ9lTI= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-proxy v0.24.2/go.mod h1:bozS2ufl/Ns6s40Ue34eV7rqyLVygi5usSmCgW7rFU8= +k8s.io/kube-scheduler v0.24.2/go.mod h1:DRa+aeXKSYUUOHHIc/9EcaO9+FW5FydaOfPSvaSW5Ko= k8s.io/kubectl v0.24.2 h1:+RfQVhth8akUmIc2Ge8krMl/pt66V7210ka3RE/p0J4= k8s.io/kubectl v0.24.2/go.mod h1:+HIFJc0bA6Tzu5O/YcuUt45APAxnNL8LeMuXwoiGsPg= +k8s.io/kubelet v0.24.2/go.mod h1:Xm9DkWQjwOs+uGOUIIGIPMvvmenvj0lDVOErvIKOOt0= +k8s.io/kubernetes v1.24.2 h1:AyjtHzSysliKR04Km91njmk2yaKmOa3ZISQZCIGUnVI= +k8s.io/kubernetes v1.24.2/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0= +k8s.io/legacy-cloud-providers v0.24.2/go.mod h1:sgkasgIP2ZOew8fzoOq0mQLVXJ4AmB57IUbFUjzPWEo= k8s.io/metrics v0.24.2 h1:3lgEq973VGPWAEaT9VI/p0XmI0R5kJgb/r9Ufr5fz8k= k8s.io/metrics v0.24.2/go.mod h1:5NWURxZ6Lz5gj8TFU83+vdWIVASx7W8lwPpHYCqopMo= +k8s.io/mount-utils v0.24.2/go.mod h1:XrSqB3a2e8sq+aU+rlbcBtQ3EgcuDk5RP9ZsGxjoDrI= +k8s.io/pod-security-admission v0.24.2/go.mod h1:znnuDHWWWvh/tpbYYPwTsd4y//qHi3cOX+wGxET/mMI= +k8s.io/sample-apiserver v0.24.2/go.mod h1:mf8qgDdu450wqpCJOkSAmoTgU4PIMAcfa5uTBwmJekE= +k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg= oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= diff --git a/internal/dao/container.go b/internal/dao/container.go index 12d32f3a..216d40ee 100644 --- a/internal/dao/container.go +++ b/internal/dao/container.go @@ -71,7 +71,7 @@ func makeContainerRes(co v1.Container, po *v1.Pod, cmx *mv1beta1.ContainerMetric Status: getContainerStatus(co.Name, po.Status), MX: cmx, IsInit: isInit, - Age: po.ObjectMeta.CreationTimestamp, + Age: po.GetCreationTimestamp(), } } @@ -91,7 +91,7 @@ func getContainerStatus(co string, status v1.PodStatus) *v1.ContainerStatus { } func (c *Container) fetchPod(fqn string) (*v1.Pod, error) { - o, err := c.Factory.Get("v1/pods", fqn, true, labels.Everything()) + o, err := c.GetFactory().Get("v1/pods", fqn, true, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/context.go b/internal/dao/context.go index 3bdd0bb5..62ac939d 100644 --- a/internal/dao/context.go +++ b/internal/dao/context.go @@ -20,7 +20,7 @@ type Context struct { } func (c *Context) config() *client.Config { - return c.Factory.Client().Config() + return c.GetFactory().Client().Config() } // Get a Context. @@ -57,5 +57,5 @@ func (c *Context) MustCurrentContextName() string { // Switch to another context. func (c *Context) Switch(ctx string) error { - return c.Factory.Client().SwitchContext(ctx) + return c.GetFactory().Client().SwitchContext(ctx) } diff --git a/internal/dao/crd.go b/internal/dao/crd.go index 0474d8d8..516ca87b 100644 --- a/internal/dao/crd.go +++ b/internal/dao/crd.go @@ -27,5 +27,5 @@ func (c *CustomResourceDefinition) List(ctx context.Context, _ string) ([]runtim } const gvr = "apiextensions.k8s.io/v1/customresourcedefinitions" - return c.Factory.List(gvr, "-", false, labelSel) + return c.GetFactory().List(gvr, "-", false, labelSel) } diff --git a/internal/dao/cronjob.go b/internal/dao/cronjob.go index 7c9c2bc9..9d84e09a 100644 --- a/internal/dao/cronjob.go +++ b/internal/dao/cronjob.go @@ -42,7 +42,7 @@ func (c *CronJob) Run(path string) error { return fmt.Errorf("user is not authorized to run jobs") } - o, err := c.Factory.Get(cronJobGVR, path, true, labels.Everything()) + o, err := c.GetFactory().Get(cronJobGVR, path, true, labels.Everything()) if err != nil { return err } @@ -87,7 +87,7 @@ func (c *CronJob) Run(path string) error { // ScanSA scans for serviceaccount refs. func (c *CronJob) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := c.Factory.List(c.GVR(), ns, wait, labels.Everything()) + oo, err := c.GetFactory().List(c.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -145,7 +145,7 @@ func (c *CronJob) ToggleSuspend(ctx context.Context, path string) error { // Scan scans for cluster resource refs. func (c *CronJob) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := c.Factory.List(c.GVR(), ns, wait, labels.Everything()) + oo, err := c.GetFactory().List(c.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/dp.go b/internal/dao/dp.go index e07b7ffc..106a5851 100644 --- a/internal/dao/dp.go +++ b/internal/dao/dp.go @@ -66,7 +66,7 @@ func (d *Deployment) Scale(ctx context.Context, path string, replicas int32) err // Restart a Deployment rollout. func (d *Deployment) Restart(ctx context.Context, path string) error { - o, err := d.Factory.Get("apps/v1/deployments", path, true, labels.Everything()) + o, err := d.GetFactory().Get("apps/v1/deployments", path, true, labels.Everything()) if err != nil { return err } @@ -155,7 +155,7 @@ func (*Deployment) Load(f Factory, fqn string) (*appsv1.Deployment, error) { // ScanSA scans for serviceaccount refs. func (d *Deployment) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := d.Factory.List(d.GVR(), ns, wait, labels.Everything()) + oo, err := d.GetFactory().List(d.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -181,7 +181,7 @@ func (d *Deployment) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, e // Scan scans for resource references. func (d *Deployment) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := d.Factory.List(d.GVR(), ns, wait, labels.Everything()) + oo, err := d.GetFactory().List(d.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/ds.go b/internal/dao/ds.go index aee85d34..90757fe2 100644 --- a/internal/dao/ds.go +++ b/internal/dao/ds.go @@ -43,7 +43,7 @@ func (d *DaemonSet) IsHappy(ds appsv1.DaemonSet) bool { // Restart a DaemonSet rollout. func (d *DaemonSet) Restart(ctx context.Context, path string) error { - o, err := d.Factory.Get("apps/v1/daemonsets", path, true, labels.Everything()) + o, err := d.GetFactory().Get("apps/v1/daemonsets", path, true, labels.Everything()) if err != nil { return err } @@ -158,7 +158,7 @@ func (d *DaemonSet) Pod(fqn string) (string, error) { // GetInstance returns a daemonset instance. func (d *DaemonSet) GetInstance(fqn string) (*appsv1.DaemonSet, error) { - o, err := d.Factory.Get(d.gvr.String(), fqn, true, labels.Everything()) + o, err := d.GetFactory().Get(d.gvr.String(), fqn, true, labels.Everything()) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (d *DaemonSet) GetInstance(fqn string) (*appsv1.DaemonSet, error) { // ScanSA scans for serviceaccount refs. func (d *DaemonSet) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := d.Factory.List(d.GVR(), ns, wait, labels.Everything()) + oo, err := d.GetFactory().List(d.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -201,7 +201,7 @@ func (d *DaemonSet) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, er // Scan scans for cluster refs. func (d *DaemonSet) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := d.Factory.List(d.GVR(), ns, wait, labels.Everything()) + oo, err := d.GetFactory().List(d.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/helm.go b/internal/dao/helm.go index e4c07dd2..8d5a11b2 100644 --- a/internal/dao/helm.go +++ b/internal/dao/helm.go @@ -23,8 +23,6 @@ var ( // Helm represents a helm chart. type Helm struct { NonResource - cfg *action.Configuration - ns string } // List returns a collection of resources. @@ -130,14 +128,10 @@ func (h *Helm) Delete(path string, _ *metav1.DeletionPropagation, force bool) er // EnsureHelmConfig return a new configuration. func (h *Helm) EnsureHelmConfig(ns string) (*action.Configuration, error) { - if h.cfg != nil && h.ns == ns { - return h.cfg, nil - } - h.cfg = new(action.Configuration) - if err := h.cfg.Init(h.Client().Config().Flags(), ns, os.Getenv("HELM_DRIVER"), helmLogger); err != nil { - return nil, err - } - return h.cfg, nil + cfg := new(action.Configuration) + err := cfg.Init(h.Client().Config().Flags(), ns, os.Getenv("HELM_DRIVER"), helmLogger) + + return cfg, err } func helmLogger(s string, args ...interface{}) { diff --git a/internal/dao/hpa.go b/internal/dao/hpa.go deleted file mode 100644 index 1c2d278d..00000000 --- a/internal/dao/hpa.go +++ /dev/null @@ -1,48 +0,0 @@ -package dao - -import ( - "context" - - "github.com/derailed/k9s/internal" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" -) - -var ( - _ Accessor = (*HorizontalPodAutoscaler)(nil) - _ Nuker = (*HorizontalPodAutoscaler)(nil) -) - -// HorizontalPodAutoscaler represents a HPA resource model. -type HorizontalPodAutoscaler struct { - Resource -} - -// List returns a collection of nodes. -func (h *HorizontalPodAutoscaler) List(ctx context.Context, ns string) ([]runtime.Object, error) { - strLabel, ok := ctx.Value(internal.KeyLabels).(string) - lsel := labels.Everything() - if sel, err := labels.ConvertSelectorToLabelsMap(strLabel); ok && err == nil { - lsel = sel.AsSelector() - } - - rev, err := h.Factory.Client().ServerVersion() - if err != nil { - return nil, err - } - - gvr := "autoscaling/v1/horizontalpodautoscalers" - if rev.Minor >= "23" { - gvr = "autoscaling/v2/horizontalpodautoscalers" - } - - return h.list(gvr, ns, lsel) -} - -func (h *HorizontalPodAutoscaler) list(gvr, ns string, sel labels.Selector) ([]runtime.Object, error) { - oo, err := h.Factory.List(gvr, ns, true, sel) - if err != nil { - return nil, err - } - return oo, nil -} diff --git a/internal/dao/job.go b/internal/dao/job.go index db0a2080..09a8c2a8 100644 --- a/internal/dao/job.go +++ b/internal/dao/job.go @@ -58,7 +58,7 @@ func (j *Job) List(ctx context.Context, ns string) ([]runtime.Object, error) { // TailLogs tail logs for all pods represented by this Job. func (j *Job) TailLogs(ctx context.Context, opts *LogOptions) ([]LogChan, error) { - o, err := j.Factory.Get(j.gvr.String(), opts.Path, true, labels.Everything()) + o, err := j.GetFactory().Get(j.gvr.String(), opts.Path, true, labels.Everything()) if err != nil { return nil, err } @@ -79,7 +79,7 @@ func (j *Job) TailLogs(ctx context.Context, opts *LogOptions) ([]LogChan, error) // ScanSA scans for serviceaccount refs. func (j *Job) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := j.Factory.List(j.GVR(), ns, wait, labels.Everything()) + oo, err := j.GetFactory().List(j.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -105,7 +105,7 @@ func (j *Job) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { // Scan scans for resource references. func (j *Job) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := j.Factory.List(j.GVR(), ns, wait, labels.Everything()) + oo, err := j.GetFactory().List(j.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/node.go b/internal/dao/node.go index c5aa456e..d1035633 100644 --- a/internal/dao/node.go +++ b/internal/dao/node.go @@ -52,7 +52,7 @@ func (n *Node) ToggleCordon(path string, cordon bool) error { } return fmt.Errorf("node is already uncordoned") } - dial, err := n.Factory.Client().Dial() + dial, err := n.GetFactory().Client().Dial() if err != nil { return err } @@ -84,7 +84,7 @@ func (o DrainOptions) toDrainHelper(k kubernetes.Interface, w io.Writer) drain.H func (n *Node) Drain(path string, opts DrainOptions, w io.Writer) error { _ = n.ToggleCordon(path, true) - dial, err := n.Factory.Client().Dial() + dial, err := n.GetFactory().Client().Dial() if err != nil { return err } @@ -170,7 +170,7 @@ func (n *Node) List(ctx context.Context, ns string) ([]runtime.Object, error) { // CountPods counts the pods scheduled on a given node. func (n *Node) CountPods(nodeName string) (int, error) { var count int - oo, err := n.Factory.List("v1/pods", client.AllNamespaces, false, labels.Everything()) + oo, err := n.GetFactory().List("v1/pods", client.AllNamespaces, false, labels.Everything()) if err != nil { return 0, err } @@ -194,7 +194,7 @@ func (n *Node) CountPods(nodeName string) (int, error) { // GetPods returns all pods running on given node. func (n *Node) GetPods(nodeName string) ([]*v1.Pod, error) { - oo, err := n.Factory.List("v1/pods", client.AllNamespaces, false, labels.Everything()) + oo, err := n.GetFactory().List("v1/pods", client.AllNamespaces, false, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/non_resource.go b/internal/dao/non_resource.go index d7842467..96cf94b7 100644 --- a/internal/dao/non_resource.go +++ b/internal/dao/non_resource.go @@ -20,14 +20,24 @@ type NonResource struct { // Init initializes the resource. func (n *NonResource) Init(f Factory, gvr client.GVR) { n.mx.Lock() - defer n.mx.Unlock() - n.Factory, n.gvr = f, gvr + { + n.Factory, n.gvr = f, gvr + } + n.mx.Unlock() +} + +func (n *NonResource) GetFactory() Factory { + n.mx.RLock() + defer n.mx.RUnlock() + + return n.Factory } // GVR returns a gvr. func (n *NonResource) GVR() string { n.mx.RLock() defer n.mx.RUnlock() + return n.gvr.String() } diff --git a/internal/dao/pod.go b/internal/dao/pod.go index fa0bc23a..2237383c 100644 --- a/internal/dao/pod.go +++ b/internal/dao/pod.go @@ -163,7 +163,7 @@ func (p *Pod) Pod(fqn string) (string, error) { // GetInstance returns a pod instance. func (p *Pod) GetInstance(fqn string) (*v1.Pod, error) { - o, err := p.Factory.Get(p.gvr.String(), fqn, true, labels.Everything()) + o, err := p.GetFactory().Get(p.gvr.String(), fqn, true, labels.Everything()) if err != nil { return nil, err } @@ -226,7 +226,7 @@ func (p *Pod) TailLogs(ctx context.Context, opts *LogOptions) ([]LogChan, error) // ScanSA scans for ServiceAccount refs. func (p *Pod) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := p.Factory.List(p.GVR(), ns, wait, labels.Everything()) + oo, err := p.GetFactory().List(p.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -256,7 +256,7 @@ func (p *Pod) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { // Scan scans for cluster resource refs. func (p *Pod) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := p.Factory.List(p.GVR(), ns, wait, labels.Everything()) + oo, err := p.GetFactory().List(p.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/popeye.go b/internal/dao/popeye.go index 5046253d..7dab2be6 100644 --- a/internal/dao/popeye.go +++ b/internal/dao/popeye.go @@ -66,7 +66,7 @@ func (p *Popeye) List(ctx context.Context, ns string) ([]runtime.Object, error) flags.ActiveNamespace = &ns } spinach := filepath.Join(cfg.K9sHome(), "spinach.yml") - if c, err := p.Factory.Client().Config().CurrentContextName(); err == nil { + if c, err := p.GetFactory().Client().Config().CurrentContextName(); err == nil { spinach = filepath.Join(cfg.K9sHome(), fmt.Sprintf("%s_spinach.yml", c)) } if _, err := os.Stat(spinach); err == nil { diff --git a/internal/dao/port_forward.go b/internal/dao/port_forward.go index cd9b0221..f6f14298 100644 --- a/internal/dao/port_forward.go +++ b/internal/dao/port_forward.go @@ -27,7 +27,7 @@ type PortForward struct { // Delete a portforward. func (p *PortForward) Delete(path string, _ *metav1.DeletionPropagation, force bool) error { - p.Factory.DeleteForwarder(path) + p.GetFactory().DeleteForwarder(path) return nil } @@ -45,7 +45,7 @@ func (p *PortForward) List(ctx context.Context, _ string) ([]runtime.Object, err log.Warn().Msgf("No custom benchmark config file found") } - ff, cc := p.Factory.Forwarders(), config.Benchmarks.Containers + ff, cc := p.GetFactory().Forwarders(), config.Benchmarks.Containers oo := make([]runtime.Object, 0, len(ff)) for k, f := range ff { if !strings.HasPrefix(k, path) { diff --git a/internal/dao/rbac.go b/internal/dao/rbac.go index f4b3a825..540204a9 100644 --- a/internal/dao/rbac.go +++ b/internal/dao/rbac.go @@ -58,7 +58,7 @@ func (r *Rbac) List(ctx context.Context, ns string) ([]runtime.Object, error) { } func (r *Rbac) loadClusterRoleBinding(path string) ([]runtime.Object, error) { - o, err := r.Factory.Get(crbGVR, path, true, labels.Everything()) + o, err := r.GetFactory().Get(crbGVR, path, true, labels.Everything()) if err != nil { return nil, err } @@ -69,7 +69,7 @@ func (r *Rbac) loadClusterRoleBinding(path string) ([]runtime.Object, error) { return nil, err } - crbo, err := r.Factory.Get(crGVR, client.FQN("-", crb.RoleRef.Name), true, labels.Everything()) + crbo, err := r.GetFactory().Get(crGVR, client.FQN("-", crb.RoleRef.Name), true, labels.Everything()) if err != nil { return nil, err } @@ -83,7 +83,7 @@ func (r *Rbac) loadClusterRoleBinding(path string) ([]runtime.Object, error) { } func (r *Rbac) loadRoleBinding(path string) ([]runtime.Object, error) { - o, err := r.Factory.Get(rbGVR, path, true, labels.Everything()) + o, err := r.GetFactory().Get(rbGVR, path, true, labels.Everything()) if err != nil { return nil, err } @@ -94,7 +94,7 @@ func (r *Rbac) loadRoleBinding(path string) ([]runtime.Object, error) { } if rb.RoleRef.Kind == "ClusterRole" { - o, e := r.Factory.Get(crGVR, client.FQN("-", rb.RoleRef.Name), true, labels.Everything()) + o, e := r.GetFactory().Get(crGVR, client.FQN("-", rb.RoleRef.Name), true, labels.Everything()) if e != nil { return nil, e } @@ -106,7 +106,7 @@ func (r *Rbac) loadRoleBinding(path string) ([]runtime.Object, error) { return asRuntimeObjects(parseRules(client.ClusterScope, "-", cr.Rules)), nil } - ro, err := r.Factory.Get(rGVR, client.FQN(rb.Namespace, rb.RoleRef.Name), true, labels.Everything()) + ro, err := r.GetFactory().Get(rGVR, client.FQN(rb.Namespace, rb.RoleRef.Name), true, labels.Everything()) if err != nil { return nil, err } @@ -121,7 +121,7 @@ func (r *Rbac) loadRoleBinding(path string) ([]runtime.Object, error) { func (r *Rbac) loadClusterRole(path string) ([]runtime.Object, error) { log.Debug().Msgf("LOAD-CR %q", path) - o, err := r.Factory.Get(crGVR, path, true, labels.Everything()) + o, err := r.GetFactory().Get(crGVR, path, true, labels.Everything()) if err != nil { return nil, err } @@ -136,7 +136,7 @@ func (r *Rbac) loadClusterRole(path string) ([]runtime.Object, error) { } func (r *Rbac) loadRole(path string) ([]runtime.Object, error) { - o, err := r.Factory.Get(rGVR, path, true, labels.Everything()) + o, err := r.GetFactory().Get(rGVR, path, true, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/rbac_policy.go b/internal/dao/rbac_policy.go index c0b8b3e2..0da170d0 100644 --- a/internal/dao/rbac_policy.go +++ b/internal/dao/rbac_policy.go @@ -174,7 +174,7 @@ func (p *Policy) fetchRoleBindingSubjects(kind, name string) ([]string, error) { func (p *Policy) fetchClusterRoles() ([]rbacv1.ClusterRole, error) { const gvr = "rbac.authorization.k8s.io/v1/clusterroles" - oo, err := p.Factory.List(gvr, client.ClusterScope, false, labels.Everything()) + oo, err := p.GetFactory().List(gvr, client.ClusterScope, false, labels.Everything()) if err != nil { return nil, err } @@ -194,7 +194,7 @@ func (p *Policy) fetchClusterRoles() ([]rbacv1.ClusterRole, error) { func (p *Policy) fetchRoles() ([]rbacv1.Role, error) { const gvr = "rbac.authorization.k8s.io/v1/roles" - oo, err := p.Factory.List(gvr, client.AllNamespaces, false, labels.Everything()) + oo, err := p.GetFactory().List(gvr, client.AllNamespaces, false, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/resource.go b/internal/dao/resource.go index 400df09c..18ea4188 100644 --- a/internal/dao/resource.go +++ b/internal/dao/resource.go @@ -30,12 +30,12 @@ func (r *Resource) List(ctx context.Context, ns string) ([]runtime.Object, error } } - return r.Factory.List(r.gvr.String(), ns, false, lsel) + return r.GetFactory().List(r.gvr.String(), ns, false, lsel) } // Get returns a resource instance if found, else an error. func (r *Resource) Get(_ context.Context, path string) (runtime.Object, error) { - return r.Factory.Get(r.gvr.String(), path, true, labels.Everything()) + return r.GetFactory().Get(r.gvr.String(), path, true, labels.Everything()) } // ToYAML returns a resource yaml. diff --git a/internal/dao/sts.go b/internal/dao/sts.go index c7b469b7..958ab9c3 100644 --- a/internal/dao/sts.go +++ b/internal/dao/sts.go @@ -67,7 +67,7 @@ func (s *StatefulSet) Scale(ctx context.Context, path string, replicas int32) er // Restart a StatefulSet rollout. func (s *StatefulSet) Restart(ctx context.Context, path string) error { - o, err := s.Factory.Get("apps/v1/statefulsets", path, true, labels.Everything()) + o, err := s.GetFactory().Get("apps/v1/statefulsets", path, true, labels.Everything()) if err != nil { return err } @@ -155,7 +155,7 @@ func (s *StatefulSet) Pod(fqn string) (string, error) { } func (s *StatefulSet) getStatefulSet(fqn string) (*appsv1.StatefulSet, error) { - o, err := s.Factory.Get(s.gvr.String(), fqn, true, labels.Everything()) + o, err := s.GetFactory().Get(s.gvr.String(), fqn, true, labels.Everything()) if err != nil { return nil, err } @@ -172,7 +172,7 @@ func (s *StatefulSet) getStatefulSet(fqn string) (*appsv1.StatefulSet, error) { // ScanSA scans for serviceaccount refs. func (s *StatefulSet) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := s.Factory.List(s.GVR(), ns, wait, labels.Everything()) + oo, err := s.GetFactory().List(s.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } @@ -198,7 +198,7 @@ func (s *StatefulSet) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, // Scan scans for cluster resource refs. func (s *StatefulSet) Scan(ctx context.Context, gvr, fqn string, wait bool) (Refs, error) { ns, n := client.Namespaced(fqn) - oo, err := s.Factory.List(s.GVR(), ns, wait, labels.Everything()) + oo, err := s.GetFactory().List(s.GVR(), ns, wait, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/dao/svc.go b/internal/dao/svc.go index 85d8eb56..55023c43 100644 --- a/internal/dao/svc.go +++ b/internal/dao/svc.go @@ -48,7 +48,7 @@ func (s *Service) Pod(fqn string) (string, error) { // GetInstance returns a service instance. func (s *Service) GetInstance(fqn string) (*v1.Service, error) { - o, err := s.Factory.Get(s.gvr.String(), fqn, true, labels.Everything()) + o, err := s.GetFactory().Get(s.gvr.String(), fqn, true, labels.Everything()) if err != nil { return nil, err } diff --git a/internal/model/cmd_buff.go b/internal/model/cmd_buff.go index c1fe0ee7..06b59d00 100644 --- a/internal/model/cmd_buff.go +++ b/internal/model/cmd_buff.go @@ -58,93 +58,140 @@ func NewCmdBuff(key rune, kind BufferKind) *CmdBuff { // InCmdMode checks if a command exists and the buffer is active. func (c *CmdBuff) InCmdMode() bool { + c.mx.RLock() + defer c.mx.RUnlock() + return c.active || len(c.buff) > 0 } // IsActive checks if command buffer is active. func (c *CmdBuff) IsActive() bool { + c.mx.RLock() + defer c.mx.RUnlock() + return c.active } // SetActive toggles cmd buffer active state. func (c *CmdBuff) SetActive(b bool) { - c.active = b + c.mx.Lock() + { + c.active = b + } + c.mx.Unlock() + c.fireActive(c.active) } // GetText returns the current text. func (c *CmdBuff) GetText() string { + c.mx.RLock() + defer c.mx.RUnlock() + return string(c.buff) } +// GetKind returns the buffer kind. +func (c *CmdBuff) GetKind() BufferKind { + c.mx.RLock() + defer c.mx.RUnlock() + + return c.kind +} + // GetSuggestion returns the current suggestion. func (c *CmdBuff) GetSuggestion() string { + c.mx.RLock() + defer c.mx.RUnlock() + return c.suggestion } +func (c *CmdBuff) hasCancel() bool { + c.mx.RLock() + defer c.mx.RUnlock() + + return c.cancel != nil +} + +func (c *CmdBuff) setCancel(f context.CancelFunc) { + c.mx.Lock() + { + c.cancel = f + } + c.mx.Unlock() +} + +func (c *CmdBuff) resetCancel() { + c.mx.Lock() + { + c.cancel = nil + } + c.mx.Unlock() +} + // SetText initializes the buffer with a command. func (c *CmdBuff) SetText(text, suggestion string) { - c.buff, c.suggestion = []rune(text), suggestion - c.fireBufferCompleted() + c.mx.Lock() + { + c.buff, c.suggestion = []rune(text), suggestion + } + c.mx.Unlock() + c.fireBufferCompleted(c.GetText(), c.GetSuggestion()) } // Add adds a new character to the buffer. func (c *CmdBuff) Add(r rune) { c.mx.Lock() - defer c.mx.Unlock() - c.buff = append(c.buff, r) - c.fireBufferChanged() - if c.cancel != nil { + { + c.buff = append(c.buff, r) + } + c.mx.Unlock() + c.fireBufferChanged(c.GetText(), c.GetSuggestion()) + if c.hasCancel() { return } - ctx := context.Background() - ctx, c.cancel = context.WithTimeout(ctx, keyEntryDelay) + ctx, cancel := context.WithTimeout(context.Background(), keyEntryDelay) + c.setCancel(cancel) go func() { <-ctx.Done() - c.mx.Lock() - { - c.fireBufferCompleted() - c.cancel = nil - } - c.mx.Unlock() + c.fireBufferCompleted(c.GetText(), c.GetSuggestion()) + c.resetCancel() }() } // Delete removes the last character from the buffer. func (c *CmdBuff) Delete() { - c.mx.Lock() - defer c.mx.Unlock() if c.Empty() { return } - c.buff = c.buff[:len(c.buff)-1] - c.fireBufferChanged() - if c.cancel != nil { + c.SetText(string(c.buff[:len(c.buff)-1]), "") + c.fireBufferChanged(c.GetText(), c.GetSuggestion()) + if c.hasCancel() { return } - ctx := context.Background() - ctx, c.cancel = context.WithTimeout(ctx, 800*time.Millisecond) + ctx, cancel := context.WithTimeout(context.Background(), 800*time.Millisecond) + c.setCancel(cancel) go func() { <-ctx.Done() - c.mx.Lock() - { - c.fireBufferCompleted() - c.cancel = nil - } - c.mx.Unlock() + c.fireBufferCompleted(c.GetText(), c.GetSuggestion()) + c.resetCancel() }() } // ClearText clears out command buffer. func (c *CmdBuff) ClearText(fire bool) { c.mx.Lock() - defer c.mx.Unlock() - c.buff = make([]rune, 0, maxBuff) + { + c.buff, c.suggestion = c.buff[:0], "" + } + c.mx.Unlock() + if fire { - c.fireBufferCompleted() + c.fireBufferCompleted(c.GetText(), c.GetSuggestion()) } } @@ -152,11 +199,14 @@ func (c *CmdBuff) ClearText(fire bool) { func (c *CmdBuff) Reset() { c.ClearText(true) c.SetActive(false) - c.fireBufferCompleted() + c.fireBufferCompleted(c.GetText(), c.GetSuggestion()) } // Empty returns true if no cmd, false otherwise. func (c *CmdBuff) Empty() bool { + c.mx.RLock() + defer c.mx.RUnlock() + return len(c.buff) == 0 } @@ -166,8 +216,10 @@ func (c *CmdBuff) Empty() bool { // AddListener registers a cmd buffer listener. func (c *CmdBuff) AddListener(w BuffWatcher) { c.mx.Lock() - defer c.mx.Unlock() - c.listeners = append(c.listeners, w) + { + c.listeners = append(c.listeners, w) + } + c.mx.Unlock() } // RemoveListener removes a listener. @@ -182,29 +234,27 @@ func (c *CmdBuff) RemoveListener(l BuffWatcher) { break } } - if victim == -1 { return } + c.listeners = append(c.listeners[:victim], c.listeners[victim+1:]...) } -func (c *CmdBuff) fireBufferCompleted() { - text := c.GetText() +func (c *CmdBuff) fireBufferCompleted(t, s string) { for _, l := range c.listeners { - l.BufferCompleted(text, c.suggestion) + l.BufferCompleted(t, s) } } -func (c *CmdBuff) fireBufferChanged() { - text := c.GetText() +func (c *CmdBuff) fireBufferChanged(t, s string) { for _, l := range c.listeners { - l.BufferChanged(text, c.suggestion) + l.BufferChanged(t, s) } } func (c *CmdBuff) fireActive(b bool) { for _, l := range c.listeners { - l.BufferActive(b, c.kind) + l.BufferActive(b, c.GetKind()) } } diff --git a/internal/model/fish_buff_test.go b/internal/model/fish_buff_test.go index 6fc55eb3..7fcde498 100644 --- a/internal/model/fish_buff_test.go +++ b/internal/model/fish_buff_test.go @@ -50,7 +50,7 @@ func TestFishDelete(t *testing.T) { f.SetActive(true) assert.Equal(t, 2, m.changeCount) - assert.Equal(t, 1, m.suggCount) + assert.Equal(t, 3, m.suggCount) assert.True(t, m.active) assert.Equal(t, "blee", m.suggestion) diff --git a/internal/model/registry.go b/internal/model/registry.go index 13ef5b91..94dc886e 100644 --- a/internal/model/registry.go +++ b/internal/model/registry.go @@ -151,20 +151,6 @@ var Registry = map[string]ResourceMeta{ Renderer: &render.Job{}, }, - // Autoscaling... - "autoscaling/v1/horizontalpodautoscalers": { - DAO: &dao.HorizontalPodAutoscaler{}, - Renderer: &render.HorizontalPodAutoscaler{}, - }, - "autoscaling/v2beta1/horizontalpodautoscalers": { - DAO: &dao.HorizontalPodAutoscaler{}, - Renderer: &render.HorizontalPodAutoscaler{}, - }, - "autoscaling/v2beta2/horizontalpodautoscalers": { - DAO: &dao.HorizontalPodAutoscaler{}, - Renderer: &render.HorizontalPodAutoscaler{}, - }, - // CRDs... "apiextensions.k8s.io/v1/customresourcedefinitions": { Renderer: &render.CustomResourceDefinition{}, diff --git a/internal/model/table.go b/internal/model/table.go index 1574cc37..ab4a8f39 100644 --- a/internal/model/table.go +++ b/internal/model/table.go @@ -23,7 +23,7 @@ const initRefreshRate = 300 * time.Millisecond // TableListener represents a table model listener. type TableListener interface { // TableDataChanged notifies the model data changed. - TableDataChanged(render.TableData) + TableDataChanged(*render.TableData) // TableLoadFailed notifies the load failed. TableLoadFailed(error) @@ -153,16 +153,16 @@ func (t *Table) ClusterWide() bool { // Empty returns true if no model data. func (t *Table) Empty() bool { - return len(t.data.RowEvents) == 0 + return t.data.Empty() } // Count returns the row count. func (t *Table) Count() int { - return len(t.data.RowEvents) + return t.data.Count() } // Peek returns model data. -func (t *Table) Peek() render.TableData { +func (t *Table) Peek() *render.TableData { t.mx.RLock() defer t.mx.RUnlock() @@ -278,7 +278,7 @@ func (t *Table) reconcile(ctx context.Context) error { return nil } -func (t *Table) fireTableChanged(data render.TableData) { +func (t *Table) fireTableChanged(data *render.TableData) { t.mx.RLock() defer t.mx.RUnlock() diff --git a/internal/model/table_test.go b/internal/model/table_test.go index 08d31f44..f791a618 100644 --- a/internal/model/table_test.go +++ b/internal/model/table_test.go @@ -72,7 +72,7 @@ type tableListener struct { count, errs int } -func (l *tableListener) TableDataChanged(render.TableData) { +func (l *tableListener) TableDataChanged(*render.TableData) { l.count++ } diff --git a/internal/render/cr.go b/internal/render/cr.go index ceb9dfb1..c115d2e5 100644 --- a/internal/render/cr.go +++ b/internal/render/cr.go @@ -39,7 +39,7 @@ func (ClusterRole) Render(o interface{}, ns string, r *Row) error { r.Fields = Fields{ cr.Name, mapToStr(cr.Labels), - toAge(cr.ObjectMeta.CreationTimestamp), + toAge(cr.GetCreationTimestamp()), } return nil diff --git a/internal/render/crb.go b/internal/render/crb.go index 81767992..89873e98 100644 --- a/internal/render/crb.go +++ b/internal/render/crb.go @@ -47,7 +47,7 @@ func (ClusterRoleBinding) Render(o interface{}, ns string, r *Row) error { kind, ss, mapToStr(crb.Labels), - toAge(crb.ObjectMeta.CreationTimestamp), + toAge(crb.GetCreationTimestamp()), } return nil diff --git a/internal/render/crd.go b/internal/render/crd.go index 342b8b00..dedae809 100644 --- a/internal/render/crd.go +++ b/internal/render/crd.go @@ -2,12 +2,13 @@ package render import ( "fmt" - "time" + "path" "github.com/derailed/k9s/internal/client" "github.com/rs/zerolog/log" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" ) // CustomResourceDefinition renders a K8s CustomResourceDefinition to screen. @@ -26,25 +27,34 @@ func (CustomResourceDefinition) Header(string) Header { // Render renders a K8s resource to screen. func (CustomResourceDefinition) Render(o interface{}, ns string, r *Row) error { - crd, ok := o.(*unstructured.Unstructured) + raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("Expected CustomResourceDefinition, but got %T", o) } - meta, ok := crd.Object["metadata"].(map[string]interface{}) - if !ok { - return fmt.Errorf("expecting an interface map but got %T", crd.Object["metadata"]) - } - t, err := time.Parse(time.RFC3339, extractMetaField(meta, "creationTimestamp")) + var crd v1.CustomResourceDefinition + err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &crd) if err != nil { - log.Error().Err(err).Msgf("Fields timestamp %v", err) + return err } - r.ID = client.FQN(client.ClusterScope, extractMetaField(meta, "name")) + var version string + for _, v := range crd.Spec.Versions { + if v.Served && !v.Deprecated { + version = v.Name + break + } + } + if version == "" { + return fmt.Errorf("unable to assert resource version") + } + id := path.Join(crd.Spec.Group, version, crd.Spec.Names.Plural) + + r.ID = client.FQN(client.ClusterScope, id) r.Fields = Fields{ - extractMetaField(meta, "name"), - mapToIfc(meta["labels"]), - toAge(metav1.Time{Time: t}), + crd.GetName(), + mapToIfc(crd.GetLabels()), + toAge(crd.GetCreationTimestamp()), } return nil diff --git a/internal/render/crd_test.go b/internal/render/crd_test.go index 96dcd085..f2a87804 100644 --- a/internal/render/crd_test.go +++ b/internal/render/crd_test.go @@ -12,6 +12,6 @@ func TestCustomResourceDefinitionRender(t *testing.T) { r := render.NewRow(2) c.Render(load(t, "crd"), "", &r) - assert.Equal(t, "-/adapters.config.istio.io", r.ID) + assert.Equal(t, "-/config.istio.io/v1alpha2/adapters", r.ID) assert.Equal(t, render.Fields{"adapters.config.istio.io"}, r.Fields[:1]) } diff --git a/internal/render/cronjob.go b/internal/render/cronjob.go index 25075bfc..aac6f0fd 100644 --- a/internal/render/cronjob.go +++ b/internal/render/cronjob.go @@ -65,7 +65,7 @@ func (c CronJob) Render(o interface{}, ns string, r *Row) error { podImageNames(cj.Spec.JobTemplate.Spec.Template.Spec, true), mapToStr(cj.Labels), "", - toAge(cj.ObjectMeta.CreationTimestamp), + toAge(cj.GetCreationTimestamp()), } return nil diff --git a/internal/render/dp.go b/internal/render/dp.go index b7b6f34f..88841df5 100644 --- a/internal/render/dp.go +++ b/internal/render/dp.go @@ -57,7 +57,7 @@ func (d Deployment) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(int(dp.Status.AvailableReplicas)), mapToStr(dp.Labels), asStatus(d.diagnose(dp.Status.Replicas, dp.Status.AvailableReplicas)), - toAge(dp.ObjectMeta.CreationTimestamp), + toAge(dp.GetCreationTimestamp()), } return nil diff --git a/internal/render/ds.go b/internal/render/ds.go index 07e4df05..80a3bff2 100644 --- a/internal/render/ds.go +++ b/internal/render/ds.go @@ -55,7 +55,7 @@ func (d DaemonSet) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(int(ds.Status.NumberAvailable)), mapToStr(ds.Labels), asStatus(d.diagnose(ds.Status.DesiredNumberScheduled, ds.Status.NumberReady)), - toAge(ds.ObjectMeta.CreationTimestamp), + toAge(ds.GetCreationTimestamp()), } return nil diff --git a/internal/render/ep.go b/internal/render/ep.go index 719f3933..bb8c23c1 100644 --- a/internal/render/ep.go +++ b/internal/render/ep.go @@ -44,7 +44,7 @@ func (e Endpoints) Render(o interface{}, ns string, r *Row) error { ep.Namespace, ep.Name, missing(toEPs(ep.Subsets)), - toAge(ep.ObjectMeta.CreationTimestamp), + toAge(ep.GetCreationTimestamp()), } return nil diff --git a/internal/render/hpa.go b/internal/render/hpa.go deleted file mode 100644 index ffa3878d..00000000 --- a/internal/render/hpa.go +++ /dev/null @@ -1,264 +0,0 @@ -package render - -import ( - "fmt" - "strconv" - "strings" - - "github.com/derailed/k9s/internal/client" - "github.com/derailed/tview" - autoscalingv1 "k8s.io/api/autoscaling/v1" - autoscalingv2 "k8s.io/api/autoscaling/v2" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" -) - -// HorizontalPodAutoscaler renders a K8s HorizontalPodAutoscaler to screen. -type HorizontalPodAutoscaler struct { - Base -} - -// Header returns a header row. -func (HorizontalPodAutoscaler) Header(ns string) Header { - return Header{ - HeaderColumn{Name: "NAMESPACE"}, - HeaderColumn{Name: "NAME"}, - HeaderColumn{Name: "REFERENCE"}, - HeaderColumn{Name: "TARGETS%"}, - HeaderColumn{Name: "MINPODS", Align: tview.AlignRight}, - HeaderColumn{Name: "MAXPODS", Align: tview.AlignRight}, - HeaderColumn{Name: "REPLICAS", Align: tview.AlignRight}, - HeaderColumn{Name: "VALID", Wide: true}, - HeaderColumn{Name: "AGE", Time: true}, - } -} - -// Render renders a K8s resource to screen. -func (h HorizontalPodAutoscaler) Render(o interface{}, ns string, r *Row) error { - raw, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Expected HorizontalPodAutoscaler, but got %T", o) - } - - v := raw.Object["apiVersion"] - - switch v { - case "autoscaling/v1": - return h.renderV1(raw, ns, r) - case "autoscaling/v2": - return h.renderV2(raw, ns, r) - default: - return fmt.Errorf("Unhandled HPA version %q", v) - } -} - -func (h HorizontalPodAutoscaler) renderV1(raw *unstructured.Unstructured, _ string, r *Row) error { - var hpa autoscalingv1.HorizontalPodAutoscaler - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &hpa) - if err != nil { - return err - } - - r.ID = client.MetaFQN(hpa.ObjectMeta) - r.Fields = Fields{ - hpa.Namespace, - hpa.ObjectMeta.Name, - hpa.Spec.ScaleTargetRef.Name, - toMetricsV1(hpa.Spec, hpa.Status), - strconv.Itoa(int(*hpa.Spec.MinReplicas)), - strconv.Itoa(int(hpa.Spec.MaxReplicas)), - strconv.Itoa(int(hpa.Status.CurrentReplicas)), - "", - toAge(hpa.ObjectMeta.CreationTimestamp), - } - - return nil -} - -func (h HorizontalPodAutoscaler) renderV2(raw *unstructured.Unstructured, _ string, r *Row) error { - var hpa autoscalingv2.HorizontalPodAutoscaler - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &hpa) - if err != nil { - return err - } - - r.ID = client.MetaFQN(hpa.ObjectMeta) - r.Fields = Fields{ - hpa.Namespace, - hpa.ObjectMeta.Name, - hpa.Spec.ScaleTargetRef.Name, - toMetricsV2(hpa.Spec.Metrics, hpa.Status.CurrentMetrics), - strconv.Itoa(int(*hpa.Spec.MinReplicas)), - strconv.Itoa(int(hpa.Spec.MaxReplicas)), - strconv.Itoa(int(hpa.Status.CurrentReplicas)), - "", - toAge(hpa.ObjectMeta.CreationTimestamp), - } - - return nil -} - -// ---------------------------------------------------------------------------- -// Helpers... - -func toMetricsV1(spec autoscalingv1.HorizontalPodAutoscalerSpec, status autoscalingv1.HorizontalPodAutoscalerStatus) string { - current, target := "", "" - if status.CurrentCPUUtilizationPercentage != nil { - current = strconv.Itoa(int(*status.CurrentCPUUtilizationPercentage)) + "%" - } - if spec.TargetCPUUtilizationPercentage != nil { - target = strconv.Itoa(int(*spec.TargetCPUUtilizationPercentage)) - } - return current + "/" + target + "%" -} - -func toMetricsV2(specs []autoscalingv2.MetricSpec, statuses []autoscalingv2.MetricStatus) string { - if len(specs) == 0 { - return MissingValue - } - - list, max, more, count := []string{}, 2, false, 0 - for i, spec := range specs { - current := "" - - // nolint:exhaustive - switch spec.Type { - case autoscalingv2.ExternalMetricSourceType: - list = append(list, externalMetricsV2(i, spec, statuses)) - case autoscalingv2.PodsMetricSourceType: - if len(statuses) > i && statuses[i].Pods != nil { - current = statuses[i].Pods.Current.AverageValue.String() - } - list = append(list, current+"/"+spec.Pods.Target.AverageValue.String()) - case autoscalingv2.ObjectMetricSourceType: - if len(statuses) > i && statuses[i].Object != nil { - current = statuses[i].Object.Current.Value.String() - } - list = append(list, current+"/"+spec.Object.Target.Value.String()) - case autoscalingv2.ResourceMetricSourceType: - list = append(list, resourceMetricsV2(i, spec, statuses)) - default: - list = append(list, "") - } - count++ - } - - if count > max { - list, more = list[:max], true - } - - ret := strings.Join(list, ", ") - if more { - return ret + " + " + strconv.Itoa(count-max) + "more..." - } - - return ret -} - -func checkHPAType(i int, spec autoscalingv2.MetricSpec, statuses []autoscalingv2.MetricStatus) string { - current := "" - - // nolint:exhaustive - switch spec.Type { - case autoscalingv2.ExternalMetricSourceType: - return externalMetricsV2(i, spec, statuses) - case autoscalingv2.PodsMetricSourceType: - if len(statuses) > i && statuses[i].Pods != nil { - current = statuses[i].Pods.Current.AverageValue.String() - } - return current + "/" + spec.Pods.Target.AverageValue.String() - case autoscalingv2.ObjectMetricSourceType: - if len(statuses) > i && statuses[i].Object != nil { - current = statuses[i].Object.Current.Value.String() - } - return current + "/" + spec.Object.Target.Value.String() - case autoscalingv2.ResourceMetricSourceType: - return resourceMetricsV2(i, spec, statuses) - } - - return "" -} - -func externalMetricsV2(i int, spec autoscalingv2.MetricSpec, statuses []autoscalingv2.MetricStatus) string { - current := "" - - if spec.External.Target.AverageValue != nil { - if len(statuses) > i && statuses[i].External != nil && statuses[i].External.Current.AverageValue != nil { - current = statuses[i].External.Current.AverageValue.String() - } - return current + "/" + spec.External.Target.AverageValue.String() + " (avg)" - } - if len(statuses) > i && statuses[i].External != nil { - current = statuses[i].External.Current.Value.String() - } - - return current + "/" + spec.External.Target.Value.String() -} - -func resourceMetricsV2(i int, spec autoscalingv2.MetricSpec, statuses []autoscalingv2.MetricStatus) string { - current := "" - - if spec.Resource.Target.AverageValue != nil { - if len(statuses) > i && statuses[i].Resource != nil { - current = statuses[i].Resource.Current.AverageValue.String() - } - return current + "/" + spec.Resource.Target.AverageValue.String() - } - - if len(statuses) > i && statuses[i].Resource != nil && statuses[i].Resource.Current.AverageUtilization != nil { - current = IntToStr(int(*statuses[i].Resource.Current.AverageUtilization)) - } - - target := "" - if spec.Resource.Target.AverageUtilization != nil { - target = IntToStr(int(*spec.Resource.Target.AverageUtilization)) - } - - return current + "/" + target -} - -// func externalMetricsV2b1(i int, spec autoscalingv2beta1.MetricSpec, statuses []autoscalingv2beta1.MetricStatus) string { -// current := "" -// if spec.External.TargetAverageValue != nil { -// if len(statuses) > i && statuses[i].External != nil && statuses[i].External.CurrentAverageValue != nil { -// current = statuses[i].External.CurrentAverageValue.String() -// } -// return current + "/" + spec.External.TargetAverageValue.String() + " (avg)" -// } -// if len(statuses) > i && statuses[i].External != nil { -// current = statuses[i].External.CurrentValue.String() -// } - -// return current + "/" + spec.External.TargetValue.String() -// } - -// func resourceMetricsV2b1(i int, spec autoscalingv2beta1.MetricSpec, statuses []autoscalingv2beta1.MetricStatus) string { -// current := "" - -// if status := checkTargetMetricsV2b1(i, spec, statuses); status != "" { -// return status -// } - -// if len(statuses) > i && statuses[i].Resource != nil && statuses[i].Resource.CurrentAverageUtilization != nil { -// current = IntToStr(int(*statuses[i].Resource.CurrentAverageUtilization)) -// } - -// target := "" -// if spec.Resource.TargetAverageUtilization != nil { -// target = IntToStr(int(*spec.Resource.TargetAverageUtilization)) -// } - -// return current + "/" + target -// } - -// func checkTargetMetricsV2b1(i int, spec autoscalingv2beta1.MetricSpec, statuses []autoscalingv2beta1.MetricStatus) string { -// if spec.Resource.TargetAverageValue == nil { -// return "" -// } - -// var current string -// if len(statuses) > i && statuses[i].Resource != nil { -// current = statuses[i].Resource.CurrentAverageValue.String() -// } -// return current + "/" + spec.Resource.TargetAverageValue.String() -// } diff --git a/internal/render/hpa_test.go b/internal/render/hpa_test.go deleted file mode 100644 index 9bad78cb..00000000 --- a/internal/render/hpa_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package render_test - -import ( - "testing" - - "github.com/derailed/k9s/internal/render" - "github.com/stretchr/testify/assert" -) - -func TestHorizontalPodAutoscalerRender(t *testing.T) { - c := render.HorizontalPodAutoscaler{} - r := render.NewRow(7) - c.Render(load(t, "hpa"), "", &r) - - assert.Equal(t, "default/nginx", r.ID) - assert.Equal(t, render.Fields{"default", "nginx", "nginx", "/10%", "1", "10"}, r.Fields[:6]) -} diff --git a/internal/render/ing.go b/internal/render/ing.go index 54e1a1c8..ea76de54 100644 --- a/internal/render/ing.go +++ b/internal/render/ing.go @@ -54,7 +54,7 @@ func (i Ingress) Render(o interface{}, ns string, r *Row) error { toAddress(ing.Status.LoadBalancer), toTLSPorts(ing.Spec.TLS), mapToStr(ing.Labels), - toAge(ing.ObjectMeta.CreationTimestamp), + toAge(ing.GetCreationTimestamp()), } return nil diff --git a/internal/render/job.go b/internal/render/job.go index 041d9cff..a8e4e5b1 100644 --- a/internal/render/job.go +++ b/internal/render/job.go @@ -60,7 +60,7 @@ func (j Job) Render(o interface{}, ns string, r *Row) error { cc, ii, asStatus(j.diagnose(ready, job.Status.CompletionTime)), - toAge(job.ObjectMeta.CreationTimestamp), + toAge(job.GetCreationTimestamp()), } return nil diff --git a/internal/render/node.go b/internal/render/node.go index 4202d82c..b5331a6f 100644 --- a/internal/render/node.go +++ b/internal/render/node.go @@ -95,7 +95,7 @@ func (n Node) Render(o interface{}, ns string, r *Row) error { toMi(a.mem), mapToStr(no.Labels), asStatus(n.diagnose(statuses)), - toAge(no.ObjectMeta.CreationTimestamp), + toAge(no.GetCreationTimestamp()), } return nil diff --git a/internal/render/np.go b/internal/render/np.go index a05c7bce..9275a217 100644 --- a/internal/render/np.go +++ b/internal/render/np.go @@ -60,7 +60,7 @@ func (n NetworkPolicy) Render(o interface{}, ns string, r *Row) error { eb, mapToStr(np.Labels), "", - toAge(np.ObjectMeta.CreationTimestamp), + toAge(np.GetCreationTimestamp()), } return nil diff --git a/internal/render/ns.go b/internal/render/ns.go index 119aab1d..4569e452 100644 --- a/internal/render/ns.go +++ b/internal/render/ns.go @@ -66,7 +66,7 @@ func (n Namespace) Render(o interface{}, _ string, r *Row) error { string(ns.Status.Phase), mapToStr(ns.Labels), asStatus(n.diagnose(ns.Status.Phase)), - toAge(ns.ObjectMeta.CreationTimestamp), + toAge(ns.GetCreationTimestamp()), } return nil diff --git a/internal/render/pdb.go b/internal/render/pdb.go index 1bc11946..71a306bd 100644 --- a/internal/render/pdb.go +++ b/internal/render/pdb.go @@ -58,7 +58,7 @@ func (p PodDisruptionBudget) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(int(pdb.Status.ExpectedPods)), mapToStr(pdb.Labels), asStatus(p.diagnose(pdb.Spec.MinAvailable, pdb.Status.CurrentHealthy)), - toAge(pdb.ObjectMeta.CreationTimestamp), + toAge(pdb.GetCreationTimestamp()), } return nil diff --git a/internal/render/pod.go b/internal/render/pod.go index 5d152ad7..1c144664 100644 --- a/internal/render/pod.go +++ b/internal/render/pod.go @@ -124,7 +124,7 @@ func (p Pod) Render(o interface{}, ns string, row *Row) error { asStatus(p.diagnose(phase, cr, len(ss))), asNominated(po.Status.NominatedNodeName), asReadinessGate(po), - toAge(po.ObjectMeta.CreationTimestamp), + toAge(po.GetCreationTimestamp()), } return nil diff --git a/internal/render/pv.go b/internal/render/pv.go index da1e6f2f..c8908d2e 100644 --- a/internal/render/pv.go +++ b/internal/render/pv.go @@ -101,7 +101,7 @@ func (p PersistentVolume) Render(o interface{}, ns string, r *Row) error { p.volumeMode(pv.Spec.VolumeMode), mapToStr(pv.Labels), asStatus(p.diagnose(phase)), - toAge(pv.ObjectMeta.CreationTimestamp), + toAge(pv.GetCreationTimestamp()), } return nil diff --git a/internal/render/pvc.go b/internal/render/pvc.go index fe5f32f8..809ae1c6 100644 --- a/internal/render/pvc.go +++ b/internal/render/pvc.go @@ -72,7 +72,7 @@ func (p PersistentVolumeClaim) Render(o interface{}, ns string, r *Row) error { class, mapToStr(pvc.Labels), asStatus(p.diagnose(string(phase))), - toAge(pvc.ObjectMeta.CreationTimestamp), + toAge(pvc.GetCreationTimestamp()), } return nil diff --git a/internal/render/ro.go b/internal/render/ro.go index 8ceeb3ff..c1ce340f 100644 --- a/internal/render/ro.go +++ b/internal/render/ro.go @@ -50,7 +50,7 @@ func (r Role) Render(o interface{}, ns string, row *Row) error { ro.Name, mapToStr(ro.Labels), "", - toAge(ro.ObjectMeta.CreationTimestamp), + toAge(ro.GetCreationTimestamp()), ) return nil diff --git a/internal/render/rob.go b/internal/render/rob.go index 1512dd90..9c9f6f8d 100644 --- a/internal/render/rob.go +++ b/internal/render/rob.go @@ -59,7 +59,7 @@ func (r RoleBinding) Render(o interface{}, ns string, row *Row) error { ss, mapToStr(rb.Labels), "", - toAge(rb.ObjectMeta.CreationTimestamp), + toAge(rb.GetCreationTimestamp()), ) return nil diff --git a/internal/render/rs.go b/internal/render/rs.go index dc860e98..b5eb1a38 100644 --- a/internal/render/rs.go +++ b/internal/render/rs.go @@ -56,7 +56,7 @@ func (r ReplicaSet) Render(o interface{}, ns string, row *Row) error { strconv.Itoa(int(rs.Status.ReadyReplicas)), mapToStr(rs.Labels), asStatus(r.diagnose(rs)), - toAge(rs.ObjectMeta.CreationTimestamp), + toAge(rs.GetCreationTimestamp()), } return nil diff --git a/internal/render/sa.go b/internal/render/sa.go index dfb8b37c..ac728cb1 100644 --- a/internal/render/sa.go +++ b/internal/render/sa.go @@ -46,7 +46,7 @@ func (s ServiceAccount) Render(o interface{}, ns string, r *Row) error { strconv.Itoa(len(sa.Secrets)), mapToStr(sa.Labels), "", - toAge(sa.ObjectMeta.CreationTimestamp), + toAge(sa.GetCreationTimestamp()), } return nil diff --git a/internal/render/sc.go b/internal/render/sc.go index 1d41c725..dc6de66c 100644 --- a/internal/render/sc.go +++ b/internal/render/sc.go @@ -43,7 +43,7 @@ func (StorageClass) Render(o interface{}, ns string, r *Row) error { string(sc.Provisioner), mapToStr(sc.Labels), "", - toAge(sc.ObjectMeta.CreationTimestamp), + toAge(sc.GetCreationTimestamp()), } return nil diff --git a/internal/render/sts.go b/internal/render/sts.go index d425277f..58b8f2ba 100644 --- a/internal/render/sts.go +++ b/internal/render/sts.go @@ -54,7 +54,7 @@ func (s StatefulSet) Render(o interface{}, ns string, r *Row) error { podImageNames(sts.Spec.Template.Spec, true), mapToStr(sts.Labels), asStatus(s.diagnose(sts.Status.Replicas, sts.Status.ReadyReplicas)), - toAge(sts.ObjectMeta.CreationTimestamp), + toAge(sts.GetCreationTimestamp()), } return nil diff --git a/internal/render/svc.go b/internal/render/svc.go index 648043ca..6c72d361 100644 --- a/internal/render/svc.go +++ b/internal/render/svc.go @@ -56,7 +56,7 @@ func (s Service) Render(o interface{}, ns string, r *Row) error { ToPorts(svc.Spec.Ports), mapToStr(svc.Labels), asStatus(s.diagnose()), - toAge(svc.ObjectMeta.CreationTimestamp), + toAge(svc.GetCreationTimestamp()), } return nil diff --git a/internal/render/table_data.go b/internal/render/table_data.go index 44e87bc7..c3f3b12b 100644 --- a/internal/render/table_data.go +++ b/internal/render/table_data.go @@ -1,6 +1,8 @@ package render import ( + "sync" + "github.com/derailed/k9s/internal/client" ) @@ -9,6 +11,7 @@ type TableData struct { Header Header RowEvents RowEvents Namespace string + mx sync.RWMutex } // NewTableData returns a new table. @@ -16,13 +19,29 @@ func NewTableData() *TableData { return &TableData{} } +// Empty checks if there are no entries. +func (t *TableData) Empty() bool { + t.mx.RLock() + defer t.mx.RUnlock() + + return len(t.RowEvents) == 0 +} + +// Count returns the number of entries. +func (t *TableData) Count() int { + t.mx.RLock() + defer t.mx.RUnlock() + + return len(t.RowEvents) +} + // IndexOfHeader return the index of the header. func (t *TableData) IndexOfHeader(h string) int { return t.Header.IndexOf(h, false) } // Labelize prints out specific label columns. -func (t *TableData) Labelize(labels []string) TableData { +func (t *TableData) Labelize(labels []string) *TableData { labelCol := t.Header.IndexOf("LABELS", true) cols := []int{0, 1} if client.IsNamespaced(t.Namespace) { @@ -34,11 +53,11 @@ func (t *TableData) Labelize(labels []string) TableData { } data.RowEvents = t.RowEvents.Labelize(cols, labelCol, labels) - return data + return &data } // Customize returns a new model with customized column layout. -func (t *TableData) Customize(cols []string, wide bool) TableData { +func (t *TableData) Customize(cols []string, wide bool) *TableData { res := TableData{ Namespace: t.Namespace, Header: t.Header.Customize(cols, wide), @@ -46,7 +65,7 @@ func (t *TableData) Customize(cols []string, wide bool) TableData { ids := t.Header.MapIndices(cols, wide) res.RowEvents = t.RowEvents.Customize(ids) - return res + return &res } // Clear clears out the entire table. @@ -55,8 +74,8 @@ func (t *TableData) Clear() { } // Clone returns a copy of the table. -func (t *TableData) Clone() TableData { - return TableData{ +func (t *TableData) Clone() *TableData { + return &TableData{ Header: t.Header.Clone(), RowEvents: t.RowEvents.Clone(), Namespace: t.Namespace, @@ -70,28 +89,31 @@ func (t *TableData) SetHeader(ns string, h Header) { // Update computes row deltas and update the table data. func (t *TableData) Update(rows Rows) { - empty := len(t.RowEvents) == 0 + empty := t.Empty() kk := make(map[string]struct{}, len(rows)) - var blankDelta DeltaRow - for _, row := range rows { - kk[row.ID] = struct{}{} - if empty { - t.RowEvents = append(t.RowEvents, NewRowEvent(EventAdd, row)) - continue - } - - if index, ok := t.RowEvents.FindIndex(row.ID); ok { - delta := NewDeltaRow(t.RowEvents[index].Row, row, t.Header) - if delta.IsBlank() { - t.RowEvents[index].Kind, t.RowEvents[index].Deltas = EventUnchanged, blankDelta - t.RowEvents[index].Row = row - } else { - t.RowEvents[index] = NewRowEventWithDeltas(row, delta) + t.mx.Lock() + { + var blankDelta DeltaRow + for _, row := range rows { + kk[row.ID] = struct{}{} + if empty { + t.RowEvents = append(t.RowEvents, NewRowEvent(EventAdd, row)) + continue } - continue + if index, ok := t.RowEvents.FindIndex(row.ID); ok { + delta := NewDeltaRow(t.RowEvents[index].Row, row, t.Header) + if delta.IsBlank() { + t.RowEvents[index].Kind, t.RowEvents[index].Deltas = EventUnchanged, blankDelta + t.RowEvents[index].Row = row + } else { + t.RowEvents[index] = NewRowEventWithDeltas(row, delta) + } + continue + } + t.RowEvents = append(t.RowEvents, NewRowEvent(EventAdd, row)) } - t.RowEvents = append(t.RowEvents, NewRowEvent(EventAdd, row)) } + t.mx.Unlock() if !empty { t.Delete(kk) @@ -100,27 +122,26 @@ func (t *TableData) Update(rows Rows) { // Delete removes items in cache that are no longer valid. func (t *TableData) Delete(newKeys map[string]struct{}) { - var victims []string - for _, re := range t.RowEvents { - if _, ok := newKeys[re.Row.ID]; !ok { - victims = append(victims, re.Row.ID) + t.mx.Lock() + { + var victims []string + for _, re := range t.RowEvents { + if _, ok := newKeys[re.Row.ID]; !ok { + victims = append(victims, re.Row.ID) + } + } + for _, id := range victims { + t.RowEvents = t.RowEvents.Delete(id) } } - - for _, id := range victims { - t.RowEvents = t.RowEvents.Delete(id) - } + t.mx.Unlock() } // Diff checks if two tables are equal. -func (t *TableData) Diff(table TableData) bool { - if t.Namespace != table.Namespace { +func (t *TableData) Diff(t2 *TableData) bool { + if t2 == nil || t.Namespace != t2.Namespace || t.Header.Diff(t2.Header) { return true } - if t.Header.Diff(table.Header) { - return true - } - - return t.RowEvents.Diff(table.RowEvents, t.Header.IndexOf("AGE", true)) + return t.RowEvents.Diff(t2.RowEvents, t.Header.IndexOf("AGE", true)) } diff --git a/internal/render/table_data_test.go b/internal/render/table_data_test.go index b563d71a..efa81fe0 100644 --- a/internal/render/table_data_test.go +++ b/internal/render/table_data_test.go @@ -9,13 +9,12 @@ import ( func TestTableDataCustomize(t *testing.T) { uu := map[string]struct { - t1 render.TableData - cols []string - wide bool - e render.TableData + t1, e *render.TableData + cols []string + wide bool }{ "same": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -29,7 +28,7 @@ func TestTableDataCustomize(t *testing.T) { }, }, cols: []string{"A", "B", "C"}, - e: render.TableData{ + e: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -44,7 +43,7 @@ func TestTableDataCustomize(t *testing.T) { }, }, "wide-col": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -58,7 +57,7 @@ func TestTableDataCustomize(t *testing.T) { }, }, cols: []string{"A", "B", "C"}, - e: render.TableData{ + e: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -73,7 +72,7 @@ func TestTableDataCustomize(t *testing.T) { }, }, "wide": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -88,7 +87,7 @@ func TestTableDataCustomize(t *testing.T) { }, wide: true, cols: []string{"A", "C"}, - e: render.TableData{ + e: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -114,12 +113,11 @@ func TestTableDataCustomize(t *testing.T) { func TestTableDataDiff(t *testing.T) { uu := map[string]struct { - t1 render.TableData - t2 render.TableData - e bool + t1, t2 *render.TableData + e bool }{ "empty": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -135,7 +133,7 @@ func TestTableDataDiff(t *testing.T) { e: true, }, "same": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -148,7 +146,7 @@ func TestTableDataDiff(t *testing.T) { {Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}}, }, }, - t2: render.TableData{ + t2: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -163,7 +161,7 @@ func TestTableDataDiff(t *testing.T) { }, }, "ns-diff": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -176,7 +174,7 @@ func TestTableDataDiff(t *testing.T) { {Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}}, }, }, - t2: render.TableData{ + t2: &render.TableData{ Namespace: "blee", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -192,7 +190,7 @@ func TestTableDataDiff(t *testing.T) { e: true, }, "header-diff": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -205,7 +203,7 @@ func TestTableDataDiff(t *testing.T) { {Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}}, }, }, - t2: render.TableData{ + t2: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -221,7 +219,7 @@ func TestTableDataDiff(t *testing.T) { e: true, }, "row-diff": { - t1: render.TableData{ + t1: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, @@ -234,7 +232,7 @@ func TestTableDataDiff(t *testing.T) { {Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}}, }, }, - t2: render.TableData{ + t2: &render.TableData{ Namespace: "fred", Header: render.Header{ render.HeaderColumn{Name: "A"}, diff --git a/internal/ui/table.go b/internal/ui/table.go index ded01918..00ac7c96 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -21,7 +21,7 @@ type ( ColorerFunc func(ns string, evt render.RowEvent) tcell.Color // DecorateFunc represents a row decorator. - DecorateFunc func(render.TableData) render.TableData + DecorateFunc func(*render.TableData) // SelectedRowFunc a table selection callback. SelectedRowFunc func(r int) @@ -158,7 +158,7 @@ func (t *Table) ExtraHints() map[string]string { } // GetFilteredData fetch filtered tabular data. -func (t *Table) GetFilteredData() render.TableData { +func (t *Table) GetFilteredData() *render.TableData { return t.filtered(t.GetModel().Peek()) } @@ -178,17 +178,17 @@ func (t *Table) SetSortCol(name string, asc bool) { } // Update table content. -func (t *Table) Update(data render.TableData, hasMetrics bool) { +func (t *Table) Update(data *render.TableData, hasMetrics bool) { t.header = data.Header if t.decorateFn != nil { - data = t.decorateFn(data) + t.decorateFn(data) } t.hasMetrics = hasMetrics t.doUpdate(t.filtered(data)) t.UpdateTitle() } -func (t *Table) doUpdate(data render.TableData) { +func (t *Table) doUpdate(data *render.TableData) { if client.IsAllNamespaces(data.Namespace) { t.actions[KeyShiftP] = NewKeyAction("Sort Namespace", t.SortColCmd("NAMESPACE", true), false) } else { @@ -373,7 +373,7 @@ func (t *Table) AddHeaderCell(col int, h render.HeaderColumn) { t.SetCell(0, col, c) } -func (t *Table) filtered(data render.TableData) render.TableData { +func (t *Table) filtered(data *render.TableData) *render.TableData { filtered := data if t.toast { filtered = filterToast(data) diff --git a/internal/ui/table_helper.go b/internal/ui/table_helper.go index cb84df1f..21af967c 100644 --- a/internal/ui/table_helper.go +++ b/internal/ui/table_helper.go @@ -128,7 +128,7 @@ func formatCell(field string, padding int) string { return field } -func filterToast(data render.TableData) render.TableData { +func filterToast(data *render.TableData) *render.TableData { validX := data.Header.IndexOf("VALID", true) if validX == -1 { return data @@ -144,10 +144,11 @@ func filterToast(data render.TableData) render.TableData { toast.RowEvents = append(toast.RowEvents, re) } } - return toast + + return &toast } -func rxFilter(q string, inverse bool, data render.TableData) (render.TableData, error) { +func rxFilter(q string, inverse bool, data *render.TableData) (*render.TableData, error) { if inverse { q = q[1:] } @@ -178,10 +179,10 @@ func rxFilter(q string, inverse bool, data render.TableData) (render.TableData, } } - return filtered, nil + return &filtered, nil } -func fuzzyFilter(q string, data render.TableData) render.TableData { +func fuzzyFilter(q string, data *render.TableData) *render.TableData { q = strings.TrimSpace(q) ss := make([]string, 0, len(data.RowEvents)) for _, re := range data.RowEvents { @@ -198,5 +199,5 @@ func fuzzyFilter(q string, data render.TableData) render.TableData { filtered.RowEvents = append(filtered.RowEvents, data.RowEvents[m.Index]) } - return filtered + return &filtered } diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index ba7fe8e6..0ba5e161 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -67,7 +67,7 @@ func (t *mockModel) SetLabelFilter(string) {} func (t *mockModel) Empty() bool { return false } func (t *mockModel) Count() int { return 1 } func (t *mockModel) HasMetrics() bool { return true } -func (t *mockModel) Peek() render.TableData { return makeTableData() } +func (t *mockModel) Peek() *render.TableData { return makeTableData() } func (t *mockModel) Refresh(context.Context) error { return nil } func (t *mockModel) ClusterWide() bool { return false } func (t *mockModel) GetNamespace() string { return "blee" } @@ -94,7 +94,7 @@ func (t *mockModel) ToYAML(ctx context.Context, path string) (string, error) { func (t *mockModel) InNamespace(string) bool { return true } func (t *mockModel) SetRefreshRate(time.Duration) {} -func makeTableData() render.TableData { +func makeTableData() *render.TableData { t := render.NewTableData() t.Namespace = "" t.Header = render.Header{ @@ -117,7 +117,7 @@ func makeTableData() render.TableData { }, } - return *t + return t } func makeContext() context.Context { diff --git a/internal/ui/types.go b/internal/ui/types.go index 9c7db7c1..c8f747ef 100644 --- a/internal/ui/types.go +++ b/internal/ui/types.go @@ -60,7 +60,7 @@ type Tabular interface { Count() int // Peek returns current model data. - Peek() render.TableData + Peek() *render.TableData // Watch watches a given resource for changes. Watch(context.Context) error diff --git a/internal/view/alias_test.go b/internal/view/alias_test.go index 657de412..7cfd8fae 100644 --- a/internal/view/alias_test.go +++ b/internal/view/alias_test.go @@ -113,7 +113,7 @@ func (t *mockModel) SetLabelFilter(string) {} func (t *mockModel) Empty() bool { return false } func (t *mockModel) Count() int { return 1 } func (t *mockModel) HasMetrics() bool { return true } -func (t *mockModel) Peek() render.TableData { return makeTableData() } +func (t *mockModel) Peek() *render.TableData { return makeTableData() } func (t *mockModel) ClusterWide() bool { return false } func (t *mockModel) GetNamespace() string { return "blee" } func (t *mockModel) SetNamespace(string) {} @@ -141,8 +141,8 @@ func (t *mockModel) ToYAML(ctx context.Context, path string) (string, error) { func (t *mockModel) InNamespace(string) bool { return true } func (t *mockModel) SetRefreshRate(time.Duration) {} -func makeTableData() render.TableData { - return render.TableData{ +func makeTableData() *render.TableData { + return &render.TableData{ Namespace: client.ClusterScope, Header: render.Header{ render.HeaderColumn{Name: "RESOURCE"}, diff --git a/internal/view/browser.go b/internal/view/browser.go index dfbccbd7..08e7d403 100644 --- a/internal/view/browser.go +++ b/internal/view/browser.go @@ -222,7 +222,7 @@ func (b *Browser) Aliases() []string { // Model Protocol... // TableDataChanged notifies view new data is available. -func (b *Browser) TableDataChanged(data render.TableData) { +func (b *Browser) TableDataChanged(data *render.TableData) { var cancel context.CancelFunc b.mx.RLock() cancel = b.cancelFn diff --git a/internal/view/container.go b/internal/view/container.go index 7feb2c8e..8f9b1718 100644 --- a/internal/view/container.go +++ b/internal/view/container.go @@ -37,21 +37,18 @@ func NewContainer(gvr client.GVR) ResourceViewer { return &c } -func (c *Container) portForwardIndicator(data render.TableData) render.TableData { +func (c *Container) portForwardIndicator(data *render.TableData) { ff := c.App().factory.Forwarders() - col := data.IndexOfHeader("PF") for _, re := range data.RowEvents { if ff.IsContainerForwarded(c.GetTable().Path, re.Row.ID) { re.Row.Fields[col] = "[orange::b]Ⓕ" } } - - return data } -func (c *Container) decorateRows(data render.TableData) render.TableData { - return decorateCpuMemHeaderRows(c.App(), data) +func (c *Container) decorateRows(data *render.TableData) { + decorateCpuMemHeaderRows(c.App(), data) } // Name returns the component name. diff --git a/internal/view/helpers.go b/internal/view/helpers.go index 0518e1fa..a83ad8e8 100644 --- a/internal/view/helpers.go +++ b/internal/view/helpers.go @@ -179,7 +179,7 @@ func fqn(ns, n string) string { return ns + "/" + n } -func decorateCpuMemHeaderRows(app *App, data render.TableData) render.TableData { +func decorateCpuMemHeaderRows(app *App, data *render.TableData) *render.TableData { for colIndex, header := range data.Header { check := "" if header.Name == "%CPU/L" { diff --git a/internal/view/ns.go b/internal/view/ns.go index f547484e..544c2da3 100644 --- a/internal/view/ns.go +++ b/internal/view/ns.go @@ -71,9 +71,9 @@ func (n *Namespace) useNamespace(fqn string) { } } -func (n *Namespace) decorate(data render.TableData) render.TableData { +func (n *Namespace) decorate(data *render.TableData) { if n.App().Conn() == nil || len(data.RowEvents) == 0 { - return data + return } // checks if all ns is in the list if not add it. @@ -99,6 +99,4 @@ func (n *Namespace) decorate(data render.TableData) render.TableData { re.Kind = render.EventUnchanged } } - - return data } diff --git a/internal/view/pod.go b/internal/view/pod.go index d446a985..cef2a766 100644 --- a/internal/view/pod.go +++ b/internal/view/pod.go @@ -48,7 +48,7 @@ func NewPod(gvr client.GVR) ResourceViewer { return &p } -func (p *Pod) portForwardIndicator(data render.TableData) render.TableData { +func (p *Pod) portForwardIndicator(data *render.TableData) { ff := p.App().factory.Forwarders() col := data.IndexOfHeader("PF") @@ -57,8 +57,7 @@ func (p *Pod) portForwardIndicator(data render.TableData) render.TableData { re.Row.Fields[col] = "[orange::b]Ⓕ" } } - - return decorateCpuMemHeaderRows(p.App(), data) + decorateCpuMemHeaderRows(p.App(), data) } func (p *Pod) bindDangerousKeys(aa ui.KeyActions) { diff --git a/internal/view/popeye.go b/internal/view/popeye.go index d54676c2..c5ba739f 100644 --- a/internal/view/popeye.go +++ b/internal/view/popeye.go @@ -43,7 +43,7 @@ func (p *Popeye) Init(ctx context.Context) error { return nil } -func (p *Popeye) decorateRows(data render.TableData) render.TableData { +func (p *Popeye) decorateRows(data *render.TableData) { var sum int for _, re := range data.RowEvents { n, err := strconv.Atoi(re.Row.Fields[1]) @@ -58,8 +58,6 @@ func (p *Popeye) decorateRows(data render.TableData) render.TableData { letter = grade(score) } p.GetTable().Extras = fmt.Sprintf("Score %d -- %s", score, letter) - - return data } func (p *Popeye) bindKeys(aa ui.KeyActions) { diff --git a/internal/view/table_helper.go b/internal/view/table_helper.go index 450be0c7..a09075b1 100644 --- a/internal/view/table_helper.go +++ b/internal/view/table_helper.go @@ -38,7 +38,7 @@ func computeFilename(screenDumpDir, cluster, ns, title, path string) (string, er return strings.ToLower(filepath.Join(dir, fName)), nil } -func saveTable(screenDumpDir, cluster, title, path string, data render.TableData) (string, error) { +func saveTable(screenDumpDir, cluster, title, path string, data *render.TableData) (string, error) { ns := data.Namespace if client.IsClusterWide(ns) { ns = client.NamespaceAll diff --git a/internal/view/table_int_test.go b/internal/view/table_int_test.go index fc622a59..cfd2789f 100644 --- a/internal/view/table_int_test.go +++ b/internal/view/table_int_test.go @@ -58,7 +58,7 @@ func TestTableNew(t *testing.T) { } data.Namespace = "" - v.Update(*data, false) + v.Update(data, false) assert.Equal(t, 3, v.GetRowCount()) } @@ -127,7 +127,7 @@ func (t *mockTableModel) SetLabelFilter(string) {} func (t *mockTableModel) Empty() bool { return false } func (t *mockTableModel) Count() int { return 1 } func (t *mockTableModel) HasMetrics() bool { return true } -func (t *mockTableModel) Peek() render.TableData { return makeTableData() } +func (t *mockTableModel) Peek() *render.TableData { return makeTableData() } func (t *mockTableModel) Refresh(context.Context) error { return nil } func (t *mockTableModel) ClusterWide() bool { return false } func (t *mockTableModel) GetNamespace() string { return "blee" } @@ -155,7 +155,7 @@ func (t *mockTableModel) ToYAML(ctx context.Context, path string) (string, error func (t *mockTableModel) InNamespace(string) bool { return true } func (t *mockTableModel) SetRefreshRate(time.Duration) {} -func makeTableData() render.TableData { +func makeTableData() *render.TableData { t := render.NewTableData() t.Header = render.Header{ render.HeaderColumn{Name: "NAMESPACE"}, @@ -187,7 +187,7 @@ func makeTableData() render.TableData { }, } - return *t + return t } func makeContext() context.Context {