diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..61634d5a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +--- +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e886a0e1..76221b8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,17 +1,15 @@ name: K9s Checks on: - push: + workflow_dispatch: + push: branches: - master - tags: - rc* - pull_request: branches: - master - jobs: build: runs-on: ubuntu-20.04 diff --git a/change_logs/release_v0.24.3.md b/change_logs/release_v0.24.3.md index c85c73a3..3b743d9a 100644 --- a/change_logs/release_v0.24.3.md +++ b/change_logs/release_v0.24.3.md @@ -26,23 +26,38 @@ I would like to extend a `Big Thank You` to the following generous K9s friends f ## Maintenance Release! -o Updated Kubernetes to v0.20.2 +o Update Kubernetes to v0.20.5 -## A Note About Alpha! +## There are some that call me... Alpha! -As you may know, we've just launched [K9sAlpha](https://k9salpha.io). As a thank you to supporters of K9s, all the good folks past/present that have contributed to the project either via PRs or sponsorships are eligible for a free P2 K9sAlpha license. Please reach out to me directly with your machine user name ie `whoami` and I will send you a license key. +K9s is still and will remain an open source software. As such it is free and we will continue to maintain this repo! + +That said in order to support our efforts, we've recently launched [K9sAlpha](https://k9salpha.io) which is a freemium version of K9s. K9sAlpha unlocks additional features and enhancement. + +If you would like to support us, you can either join our github sponsors or purchase a K9sAlpha license. If you are an active member of our github sponsorship program, you are eligible for a free K9sAlpha license. Please reach out for your shoe-phone and contact us for your personalized license key. --- +## Resolved Issues + +* [Issue #1038](https://github.com/derailed/k9s/issues/1038) Release Cronjob API +* [Issue #1035](https://github.com/derailed/k9s/issues/1035) Update Ingress API Group +* [Issue #1028](https://github.com/derailed/k9s/issues/1028) Go compile +* [Issue #1024](https://github.com/derailed/k9s/issues/1024) Add Pod Readiness/Nominated cols +* [Issue #1013](https://github.com/derailed/k9s/issues/1013) Panic string negative repeat count +* [Issue #1005](https://github.com/derailed/k9s/issues/1005) No x86_64 binaries +* [Issue #735](https://github.com/derailed/k9s/issues/735) Shell into windows containers + ## Resolved PRs * [PR #1022](https://github.com/derailed/k9s/pull/1022) Update release -* [PR #1012](https://github.com/derailed/k9s/pull/1012) fix typo for cluster based skins +* [PR #1012](https://github.com/derailed/k9s/pull/1012) Fix typo for cluster based skins * [PR #1009](https://github.com/derailed/k9s/pull/1009) Add webi installer info * [PR #1004](https://github.com/derailed/k9s/pull/1004) Correction CronJob ApiVersion -* [PR #952](https://github.com/derailed/k9s/pull/952) Add ArgoCD views +* [PR #1026](https://github.com/derailed/k9s/pull/1026) Add option to hide logo +* [PR #997](https://github.com/derailed/k9s/pull/997) Shell into windows containers --- diff --git a/cmd/root.go b/cmd/root.go index e01f5688..87e875cc 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,7 +1,6 @@ package cmd import ( - "flag" "fmt" "runtime/debug" @@ -13,7 +12,6 @@ import ( "github.com/rs/zerolog/log" "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/klog" ) const ( @@ -41,24 +39,6 @@ func init() { rootCmd.AddCommand(versionCmd(), infoCmd()) initK9sFlags() initK8sFlags() - - var flags flag.FlagSet - klog.InitFlags(&flags) - if err := flags.Set("logtostderr", "false"); err != nil { - panic(err) - } - if err := flags.Set("alsologtostderr", "false"); err != nil { - panic(err) - } - if err := flags.Set("stderrthreshold", "fatal"); err != nil { - panic(err) - } - if err := flags.Set("v", "0"); err != nil { - panic(err) - } - if err := flags.Set("log_file", config.K9sLogs); err != nil { - panic(err) - } } // Execute root command @@ -108,6 +88,7 @@ func loadConfiguration() *config.Config { } k9sCfg.K9s.OverrideHeadless(*k9sFlags.Headless) + k9sCfg.K9s.OverrideLogoless(*k9sFlags.Logoless) k9sCfg.K9s.OverrideCrumbsless(*k9sFlags.Crumbsless) k9sCfg.K9s.OverrideReadOnly(*k9sFlags.ReadOnly) k9sCfg.K9s.OverrideWrite(*k9sFlags.Write) @@ -180,6 +161,12 @@ func initK9sFlags() { false, "Turn K9s header off", ) + rootCmd.Flags().BoolVar( + k9sFlags.Logoless, + "logoless", + false, + "Turn K9s logo off", + ) rootCmd.Flags().BoolVar( k9sFlags.Crumbsless, "crumbsless", diff --git a/go.mod b/go.mod index 2ee525ce..335f8a88 100644 --- a/go.mod +++ b/go.mod @@ -5,77 +5,43 @@ go 1.16 replace ( github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d github.com/docker/docker => github.com/moby/moby v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible - k8s.io/api => k8s.io/api v0.20.2 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.2 - k8s.io/apimachinery => k8s.io/apimachinery v0.20.2 - k8s.io/apiserver => k8s.io/apiserver v0.20.2 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.2 - k8s.io/client-go => k8s.io/client-go v0.20.2 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.2 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.2 - k8s.io/code-generator => k8s.io/code-generator v0.20.2 - k8s.io/component-base => k8s.io/component-base v0.20.2 - k8s.io/cri-api => k8s.io/cri-api v0.20.2 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.2 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.2 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.2 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.2 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.2 - k8s.io/kubectl => k8s.io/kubectl v0.20.2 - k8s.io/kubelet => k8s.io/kubelet v0.20.2 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.2 - k8s.io/metrics => k8s.io/metrics v0.20.2 - k8s.io/sample-apiserver => k8s.ios/sample-apiserver v0.20.2 ) -replace github.com/argoproj/argo-cd => github.com/argoproj/argo-cd v1.5.5 - require ( - github.com/atotto/clipboard v0.1.2 + github.com/atotto/clipboard v0.1.4 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.1.0 github.com/derailed/popeye v0.9.0 - github.com/derailed/tview v0.4.9 + github.com/derailed/tview v0.4.10 github.com/drone/envsubst v1.0.2 // indirect github.com/emicklei/go-restful v2.15.0+incompatible // indirect github.com/fatih/color v1.10.0 github.com/fsnotify/fsnotify v1.4.9 github.com/fvbommel/sortorder v1.0.2 - github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591 + github.com/gdamore/tcell/v2 v2.2.0 github.com/ghodss/yaml v1.0.0 - github.com/go-openapi/spec v0.20.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/googleapis/gnostic v0.5.4 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-runewidth v0.0.9 + github.com/mattn/go-runewidth v0.0.10 github.com/openfaas/faas v0.0.0-20200207215241-6afae214e3ec github.com/openfaas/faas-cli v0.0.0-20200124160744-30b7cec9634c github.com/openfaas/faas-provider v0.15.0 - github.com/petergtz/pegomock v2.7.0+incompatible + github.com/petergtz/pegomock v2.9.0+incompatible github.com/rakyll/hey v0.1.4 - github.com/robfig/cron v1.2.0 // indirect github.com/rs/zerolog v1.20.0 github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sahilm/fuzzy v0.1.0 github.com/spf13/cobra v1.1.3 github.com/stretchr/testify v1.7.0 - golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect golang.org/x/text v0.3.5 - google.golang.org/grpc v1.29.1 // indirect gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - helm.sh/helm/v3 v3.5.3 - k8s.io/api v0.20.2 - k8s.io/apimachinery v0.20.2 - k8s.io/cli-runtime v0.20.2 - k8s.io/client-go v0.20.2 + helm.sh/helm/v3 v3.5.2 + k8s.io/api v0.20.5 + k8s.io/apimachinery v0.20.5 + k8s.io/cli-runtime v0.20.5 + k8s.io/client-go v0.20.5 k8s.io/klog v1.0.0 - k8s.io/klog/v2 v2.8.0 // indirect - k8s.io/kube-openapi v0.0.0-20210305164622-f622666832c1 // indirect - k8s.io/kubectl v0.20.2 - k8s.io/metrics v0.20.2 - sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect + k8s.io/klog/v2 v2.4.0 // indirect + k8s.io/kubectl v0.20.5 + k8s.io/metrics v0.20.5 sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index 816f7aad..b6622d2b 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,7 @@ github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvou github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= @@ -104,8 +105,8 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= -github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +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-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -147,7 +148,6 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= @@ -192,8 +192,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xb github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/derailed/popeye v0.9.0 h1:0zP4BAzo94RUjrUkzgF962v0zL9B3xyopd7kU7tMxuc= github.com/derailed/popeye v0.9.0/go.mod h1:g3hudQlbEEChCA7U44fA+utTM9xQpD4pINUMQaiq5Gs= -github.com/derailed/tview v0.4.9 h1:E3vZNtYPS1gv3zQcNi+KpA4alKR/qRfhW3CJH64zYd4= -github.com/derailed/tview v0.4.9/go.mod h1:FrWq4XTQjisx2NIl9n3j6OD6NL03HxUYeVvZwSy1JYE= +github.com/derailed/tview v0.4.10 h1:/4qviOQq3XADLQU2mbBIur7jUxouAsB3I+XZujOTSIY= +github.com/derailed/tview v0.4.10/go.mod h1:FrWq4XTQjisx2NIl9n3j6OD6NL03HxUYeVvZwSy1JYE= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 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= @@ -227,13 +227,10 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7fo github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.15.0+incompatible h1:8KpYO/Xl/ZudZs5RNOEhWMBY4hmzlZhhRd9cu+jrZP4= -github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= @@ -260,8 +257,8 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo github.com/gdamore/tcell v1.1.2 h1:Afe8cU6SECC06UmvaJ55Jr3Eh0tz/ywLjqWYqjGZp3s= github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell/v2 v2.0.0/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= -github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591 h1:0WWUDZ1oxq7NxVyGo8M3KI5jbkiwNAdZFFzAdC68up4= -github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= +github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= +github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -276,24 +273,20 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 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-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= @@ -317,6 +310,7 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/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 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -333,6 +327,7 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -378,9 +373,11 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.4 h1:ynbQIWjLw7iv6HAFdixb30U7Uvcmx+f4KlLJpmhkTK0= -github.com/googleapis/gnostic v0.5.4/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= +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/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -402,7 +399,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -439,12 +435,11 @@ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= @@ -462,10 +457,6 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -475,9 +466,11 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -503,6 +496,7 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -521,8 +515,8 @@ github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mN github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.12.0 h1:u/x3mp++qUxvYfulZ4HKOvVO0JWhk7HtE8lWhbGz/Do= @@ -531,9 +525,6 @@ 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/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= -github.com/minio/minio-go/v7 v7.0.2/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -574,8 +565,6 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -620,13 +609,12 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/petergtz/pegomock v2.7.0+incompatible h1:42rJ5wIOBAg9OGdkLaPW9PlF/RtqDc5aGl6PcTCXl3o= -github.com/petergtz/pegomock v2.7.0+incompatible/go.mod h1:nuBLWZpVyv/fLo56qTwt/AUau7jgouO1h7bEvZCq82o= +github.com/petergtz/pegomock v2.9.0+incompatible h1:BKfb5XfkJfehe5T+O1xD4Zm26Sb9dnRj7tHxLYwUPiI= +github.com/petergtz/pegomock v2.9.0+incompatible/go.mod h1:nuBLWZpVyv/fLo56qTwt/AUau7jgouO1h7bEvZCq82o= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -683,10 +671,7 @@ github.com/rivo/tview v0.0.0-20191018115645-bacbf5155bc1/go.mod h1:+rKjP5+h9HMwW github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= -github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= 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.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -746,7 +731,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -777,7 +761,6 @@ 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/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= @@ -812,16 +795,17 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= 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-20181203042331-505ab145d0a9/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= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -857,6 +841,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -880,7 +865,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -889,11 +873,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -906,9 +887,9 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -919,7 +900,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190221075227-b4e8571b14e0/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= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -959,8 +939,9 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -993,7 +974,6 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1020,8 +1000,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1067,7 +1045,6 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1080,12 +1057,10 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1114,28 +1089,22 @@ gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= 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= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 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/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= 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.2/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= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= @@ -1145,8 +1114,8 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.5.3 h1:enz8LWLYKjaUAbHYm6dE7oORVsEpsSkGdjEADF50iCI= -helm.sh/helm/v3 v3.5.3/go.mod h1:Tv6yZjudrwek+Jhm0DSjZgM1zzPhkhd7avb7tc3lIwU= +helm.sh/helm/v3 v3.5.2 h1:Us7qDuUuPYDJhkCo5tVVjfZmC7JlNnEmiqCJHAZVEj0= +helm.sh/helm/v3 v3.5.2/go.mod h1:7+CqT745B1Sy/4dzhzbbY9U08pGnJfrJXBkoEEFj18c= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1154,38 +1123,63 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.2 h1:y/HR22XDZY3pniu9hIFDLpUCPq2w5eQ6aV/VFQ7uJMw= +k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= +k8s.io/api v0.20.5 h1:zsMTffV0Le2EiI0aKvlTHEnXGxk1HiqGRhJcCPiI7JI= +k8s.io/api v0.20.5/go.mod h1:FQjAceXnVaWDeov2YUWhOb6Yt+5UjErkp6UO3nczO1Y= k8s.io/apiextensions-apiserver v0.20.2 h1:rfrMWQ87lhd8EzQWRnbQ4gXrniL/yTRBgYH1x1+BLlo= k8s.io/apiextensions-apiserver v0.20.2/go.mod h1:F6TXp389Xntt+LUq3vw6HFOLttPa0V8821ogLGwb6Zs= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.5 h1:wO/FxMVRn223rAKxnBbwCyuN96bS9MFTIvP0e/V7cps= +k8s.io/apimachinery v0.20.5/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.20.2 h1:lGno2t3gcZnLtzsKH4oG0xA9/4GTiBzMO1DGp+K+Bak= k8s.io/apiserver v0.20.2/go.mod h1:2nKd93WyMhZx4Hp3RfgH2K5PhwyTrprrkWYnI7id7jA= -k8s.io/cli-runtime v0.20.2 h1:W0/FHdbApnl9oB7xdG643c/Zaf7TZT+43I+zKxwqvhU= +k8s.io/cli-runtime v0.18.8/go.mod h1:7EzWiDbS9PFd0hamHHVoCY4GrokSTPSL32MA4rzIu0M= +k8s.io/cli-runtime v0.20.1/go.mod h1:6wkMM16ZXTi7Ow3JLYPe10bS+XBnIkL6V9dmEz0mbuY= k8s.io/cli-runtime v0.20.2/go.mod h1:FjH6uIZZZP3XmwrXWeeYCbgxcrD6YXxoAykBaWH0VdM= -k8s.io/client-go v0.20.2 h1:uuf+iIAbfnCSw8IGAv/Rg0giM+2bOzHLOsbbrwrdhNQ= +k8s.io/cli-runtime v0.20.5 h1:VIT1Y6ty6TsZaKXiyqH94U+7vR0pUpBQ1UCrTNoS+UU= +k8s.io/cli-runtime v0.20.5/go.mod h1:ihjPeQWDk7NGVIkNEvpwxA3gJvqtU+LtkDj11TvyXn4= +k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= +k8s.io/client-go v0.20.5 h1:dJGtYUvFrFGjQ+GjXEIby0gZWdlAOc0xJBJqY3VyDxA= +k8s.io/client-go v0.20.5/go.mod h1:Ee5OOMMYvlH8FCZhDsacjMlCBwetbGZETwo1OA+e6Zw= +k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/code-generator v0.20.2/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= -k8s.io/component-base v0.20.2 h1:LMmu5I0pLtwjpp5009KLuMGFqSc2S2isGw8t1hpYKLE= +k8s.io/code-generator v0.20.5/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= -k8s.io/component-helpers v0.20.2/go.mod h1:qeM6iAWGqIr+WE8n2QW2OK9XkpZkPNTxAoEv9jl40/I= +k8s.io/component-base v0.20.5 h1:8BZQKLJGhWrxtB7kIOEejKDtAKr1HOYvB0PZNeTyLS0= +k8s.io/component-base v0.20.5/go.mod h1:l0isoBLGyQKwRoTWbPHR6jNDd3/VqQD43cNlsjddGng= +k8s.io/component-helpers v0.20.1/go.mod h1:Q8trCj1zyLNdeur6pD2QvsF8d/nWVfK71YjN5+qVXy4= +k8s.io/component-helpers v0.20.5/go.mod h1:AzTdoPj6YAN2SUfhBX/FUUU3ntfFuse03q/VMLovEsE= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= 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 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210305164622-f622666832c1 h1:bKbnE878105Y2291CtM1YO9XIQJe/QsG2SRx6vxQmDI= -k8s.io/kube-openapi v0.0.0-20210305164622-f622666832c1/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kubectl v0.20.2 h1:mXExF6N4eQUYmlfXJmfWIheCBLF6/n4VnwQKbQki5iE= -k8s.io/kubectl v0.20.2/go.mod h1:/bchZw5fZWaGZxaRxxfDQKej/aDEtj/Tf9YSS4Jl0es= -k8s.io/metrics v0.20.2 h1:o32EchiH4ukpUg86VLLAgkE9a9Ke0lijkzYxE+wSSRk= -k8s.io/metrics v0.20.2/go.mod h1:yTck5nl5wt/lIeLcU6g0b8/AKJf2girwe0PQiaM4Mwk= +k8s.io/kubectl v0.20.1/go.mod h1:2bE0JLYTRDVKDiTREFsjLAx4R2GvUtL/mGYFXfFFMzY= +k8s.io/kubectl v0.20.5 h1:/wndy8hw5TsL8G8KWPDJrtPKS8D34uSdWS0BMRmtzWs= +k8s.io/kubectl v0.20.5/go.mod h1:mlNQgyV18D4XFt5BmfSkrxQNS+arT2pXDQxxnH5lMiw= +k8s.io/metrics v0.18.8/go.mod h1:j7JzZdiyhLP2BsJm/Fzjs+j5Lb1Y7TySjhPWqBPwRXA= +k8s.io/metrics v0.20.1/go.mod h1:JhpBE/fad3yRGsgEpiZz5FQQM5wJ18OTLkD7Tv40c0s= +k8s.io/metrics v0.20.5 h1:cQaav6lMGpYJPnS6G9jTCVmv531JVX1xEVv7WGUgNyM= +k8s.io/metrics v0.20.5/go.mod h1:vsptOayjKWKWHvWR1vFQY++vxydzaEo/2+JC7kSDKPU= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -1194,9 +1188,10 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/internal/config/alias.go b/internal/config/alias.go index 5fc25bbc..3ace928e 100644 --- a/internal/config/alias.go +++ b/internal/config/alias.go @@ -84,6 +84,11 @@ func (a *Aliases) Define(gvr string, aliases ...string) { a.mx.Lock() defer a.mx.Unlock() + // BOZO!! Could not get full events struct using this api group?? + if gvr == "events.k8s.io/v1/events" || gvr == "extensions/v1beta1" { + return + } + for _, alias := range aliases { if _, ok := a.Alias[alias]; ok { continue diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 600f8293..9a97f852 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -264,6 +264,7 @@ var expectedConfig = `k9s: maxConnRetry: 5 enableMouse: false headless: false + logoless: false crumbsless: false readOnly: true noIcons: false @@ -347,6 +348,7 @@ var resetConfig = `k9s: maxConnRetry: 5 enableMouse: false headless: false + logoless: false crumbsless: false readOnly: false noIcons: false diff --git a/internal/config/flags.go b/internal/config/flags.go index df776907..6fb05bc8 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -16,6 +16,7 @@ type Flags struct { RefreshRate *int LogLevel *string Headless *bool + Logoless *bool Command *string AllNamespaces *bool ReadOnly *bool @@ -29,6 +30,7 @@ func NewFlags() *Flags { RefreshRate: intPtr(DefaultRefreshRate), LogLevel: strPtr(DefaultLogLevel), Headless: boolPtr(false), + Logoless: boolPtr(false), Command: strPtr(DefaultCommand), AllNamespaces: boolPtr(false), ReadOnly: boolPtr(false), diff --git a/internal/config/k9s.go b/internal/config/k9s.go index 366af326..9a04d3a4 100644 --- a/internal/config/k9s.go +++ b/internal/config/k9s.go @@ -15,6 +15,7 @@ type K9s struct { MaxConnRetry int `yaml:"maxConnRetry"` EnableMouse bool `yaml:"enableMouse"` Headless bool `yaml:"headless"` + Logoless bool `yaml:"logoless"` Crumbsless bool `yaml:"crumbsless"` ReadOnly bool `yaml:"readOnly"` NoIcons bool `yaml:"noIcons"` @@ -25,6 +26,7 @@ type K9s struct { Thresholds Threshold `yaml:"thresholds"` manualRefreshRate int manualHeadless *bool + manualLogoless *bool manualCrumbsless *bool manualReadOnly *bool manualCommand *string @@ -51,7 +53,12 @@ func (k *K9s) OverrideHeadless(b bool) { k.manualHeadless = &b } -// OverrideCrumbsless set the headlessness manually. +// OverrideLogoless set the logolessness manually. +func (k *K9s) OverrideLogoless(b bool) { + k.manualLogoless = &b +} + +// OverrideCrumbsless set the crumbslessness manually. func (k *K9s) OverrideCrumbsless(b bool) { k.manualCrumbsless = &b } @@ -86,6 +93,16 @@ func (k *K9s) IsHeadless() bool { return h } +// IsLogoless returns logoless setting. +func (k *K9s) IsLogoless() bool { + h := k.Logoless + if k.manualLogoless != nil && *k.manualLogoless { + h = *k.manualLogoless + } + + return h +} + // IsCrumbsless returns crumbsless setting. func (k *K9s) IsCrumbsless() bool { h := k.Crumbsless diff --git a/internal/dao/crd.go b/internal/dao/crd.go index 27aaff93..0474d8d8 100644 --- a/internal/dao/crd.go +++ b/internal/dao/crd.go @@ -26,6 +26,6 @@ func (c *CustomResourceDefinition) List(ctx context.Context, _ string) ([]runtim labelSel = sel.AsSelector() } - const gvr = "apiextensions.k8s.io/v1beta1/customresourcedefinitions" + const gvr = "apiextensions.k8s.io/v1/customresourcedefinitions" return c.Factory.List(gvr, "-", false, labelSel) } diff --git a/internal/dao/cronjob.go b/internal/dao/cronjob.go index 8a84d7f7..d922cc43 100644 --- a/internal/dao/cronjob.go +++ b/internal/dao/cronjob.go @@ -16,7 +16,11 @@ import ( "k8s.io/apimachinery/pkg/util/rand" ) -const maxJobNameSize = 42 +const ( + maxJobNameSize = 42 + cronJobGVR = "batch/v1beta1/cronjobs" + jobGVR = "batch/v1/jobs" +) var ( _ Accessor = (*CronJob)(nil) @@ -31,7 +35,7 @@ type CronJob struct { // Run a CronJob. func (c *CronJob) Run(path string) error { ns, _ := client.Namespaced(path) - auth, err := c.Client().CanI(ns, "batch/v1/jobs", []string{client.GetVerb, client.CreateVerb}) + auth, err := c.Client().CanI(ns, jobGVR, []string{client.GetVerb, client.CreateVerb}) if err != nil { return err } @@ -39,7 +43,7 @@ func (c *CronJob) Run(path string) error { return fmt.Errorf("user is not authorized to run jobs") } - o, err := c.Factory.Get("batch/v1beta1/cronjobs", path, true, labels.Everything()) + o, err := c.Factory.Get(cronJobGVR, path, true, labels.Everything()) if err != nil { return err } @@ -107,6 +111,44 @@ func (c *CronJob) ScanSA(ctx context.Context, fqn string, wait bool) (Refs, erro return refs, nil } +// Suspend toggles suspend/resume on a CronJob. +func (c *CronJob) ToggleSuspend(ctx context.Context, path string) error { + ns, _ := client.Namespaced(path) + + auth, err := c.Client().CanI(cronJobGVR, ns, []string{client.GetVerb, client.UpdateVerb}) + if err != nil { + return err + } + if !auth { + return fmt.Errorf("user is not authorized to run jobs") + } + + o, err := c.Get(ctx, path) + if err != nil { + return err + } + var cj batchv1beta1.CronJob + err = runtime.DefaultUnstructuredConverter.FromUnstructured(o.(*unstructured.Unstructured).Object, &cj) + if err != nil { + return errors.New("expecting CronJob resource") + } + + dial, err := c.Client().Dial() + if err != nil { + return err + } + if cj.Spec.Suspend != nil { + current := !*cj.Spec.Suspend + cj.Spec.Suspend = ¤t + } else { + true := true + cj.Spec.Suspend = &true + } + _, err = dial.BatchV1beta1().CronJobs(ns).Update(ctx, &cj, metav1.UpdateOptions{}) + + return err +} + // 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) diff --git a/internal/dao/registry.go b/internal/dao/registry.go index 4742c819..6092c785 100644 --- a/internal/dao/registry.go +++ b/internal/dao/registry.go @@ -33,25 +33,25 @@ func NewMeta() *Meta { // Customize here for non resource types or types with metrics or logs. func AccessorFor(f Factory, gvr client.GVR) (Accessor, error) { m := Accessors{ - client.NewGVR("contexts"): &Context{}, - client.NewGVR("containers"): &Container{}, - client.NewGVR("screendumps"): &ScreenDump{}, - client.NewGVR("benchmarks"): &Benchmark{}, - client.NewGVR("portforwards"): &PortForward{}, - client.NewGVR("v1/services"): &Service{}, - client.NewGVR("v1/pods"): &Pod{}, - client.NewGVR("v1/nodes"): &Node{}, - client.NewGVR("apps/v1/deployments"): &Deployment{}, - client.NewGVR("apps/v1/daemonsets"): &DaemonSet{}, - client.NewGVR("extensions/v1beta1/daemonsets"): &DaemonSet{}, - client.NewGVR("apps/v1/statefulsets"): &StatefulSet{}, - client.NewGVR("batch/v1beta1/cronjobs"): &CronJob{}, - client.NewGVR("batch/v1/jobs"): &Job{}, - client.NewGVR("openfaas"): &OpenFaas{}, - client.NewGVR("popeye"): &Popeye{}, - client.NewGVR("sanitizer"): &Popeye{}, - client.NewGVR("helm"): &Helm{}, - client.NewGVR("dir"): &Dir{}, + client.NewGVR("contexts"): &Context{}, + client.NewGVR("containers"): &Container{}, + client.NewGVR("screendumps"): &ScreenDump{}, + client.NewGVR("benchmarks"): &Benchmark{}, + client.NewGVR("portforwards"): &PortForward{}, + client.NewGVR("v1/services"): &Service{}, + client.NewGVR("v1/pods"): &Pod{}, + client.NewGVR("v1/nodes"): &Node{}, + client.NewGVR("apps/v1/deployments"): &Deployment{}, + client.NewGVR("apps/v1/daemonsets"): &DaemonSet{}, + client.NewGVR("apps/v1/daemonsets"): &DaemonSet{}, + client.NewGVR("apps/v1/statefulsets"): &StatefulSet{}, + client.NewGVR("batch/v1beta1/cronjobs"): &CronJob{}, + client.NewGVR("batch/v1/jobs"): &Job{}, + client.NewGVR("openfaas"): &OpenFaas{}, + client.NewGVR("popeye"): &Popeye{}, + client.NewGVR("sanitizer"): &Popeye{}, + client.NewGVR("helm"): &Helm{}, + client.NewGVR("dir"): &Dir{}, } r, ok := m[gvr] @@ -298,6 +298,9 @@ func loadPreferred(f Factory, m ResourceMetas) error { for _, r := range rr { for _, res := range r.APIResources { gvr := client.FromGVAndR(r.GroupVersion, res.Name) + if isDeprecated(gvr) { + continue + } res.Group, res.Version = gvr.G(), gvr.V() if res.SingularName == "" { res.SingularName = strings.ToLower(res.Kind) @@ -309,8 +312,17 @@ func loadPreferred(f Factory, m ResourceMetas) error { return nil } +var deprecatedGVRs = map[client.GVR]struct{}{ + client.NewGVR("extensions/v1beta1/ingresses"): {}, +} + +func isDeprecated(gvr client.GVR) bool { + _, ok := deprecatedGVRs[gvr] + return ok +} + func loadCRDs(f Factory, m ResourceMetas) { - const crdGVR = "apiextensions.k8s.io/v1beta1/customresourcedefinitions" + const crdGVR = "apiextensions.k8s.io/v1/customresourcedefinitions" oo, err := f.List(crdGVR, client.ClusterScope, false, labels.Everything()) if err != nil { log.Warn().Err(err).Msgf("Fail CRDs load") @@ -347,7 +359,10 @@ func extractMeta(o runtime.Object) (metav1.APIResource, []error) { m.Name, errs = extractStr(meta, "name", errs) m.Group, errs = extractStr(spec, "group", errs) - m.Version, errs = extractStr(spec, "version", errs) + versions, errs := extractSlice(spec, "versions", errs) + if len(versions) > 0 { + m.Version = versions[0] + } var scope string scope, errs = extractStr(spec, "scope", errs) @@ -383,11 +398,20 @@ func extractSlice(m map[string]interface{}, n string, errs []error) ([]string, [ return s, append(errs, fmt.Errorf("failed to extract slice %s -- %#v", n, m)) } - ss := make([]string, len(ii)) - for i, name := range ii { - ss[i], ok = name.(string) - if !ok { - return ss, append(errs, fmt.Errorf("expecting string shortnames")) + ss := make([]string, 0, len(ii)) + for _, name := range ii { + switch o := name.(type) { + case string: + ss = append(ss, o) + case map[string]interface{}: + s, ok := o["name"].(string) + if ok { + ss = append(ss, s) + } else { + errs = append(errs, fmt.Errorf("unable to find key %q in map", n)) + } + default: + errs = append(errs, fmt.Errorf("unknown field type %t for key %q", o, n)) } } diff --git a/internal/dao/testdata/dr.json b/internal/dao/testdata/dr.json index f9ffbef0..2821f889 100644 --- a/internal/dao/testdata/dr.json +++ b/internal/dao/testdata/dr.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "helm.sh/resource-policy": "keep", - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{\"helm.sh/resource-policy\":\"keep\"},\"labels\":{\"app\":\"istio-pilot\",\"chart\":\"istio\",\"heritage\":\"Tiller\",\"release\":\"istio\"},\"name\":\"destinationrules.networking.istio.io\"},\"spec\":{\"additionalPrinterColumns\":[{\"JSONPath\":\".spec.host\",\"description\":\"The name of a service from the service registry\",\"name\":\"Host\",\"type\":\"string\"},{\"JSONPath\":\".metadata.creationTimestamp\",\"description\":\"CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\\n\\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata\",\"name\":\"Age\",\"type\":\"date\"}],\"group\":\"networking.istio.io\",\"names\":{\"categories\":[\"istio-io\",\"networking-istio-io\"],\"kind\":\"DestinationRule\",\"listKind\":\"DestinationRuleList\",\"plural\":\"destinationrules\",\"shortNames\":[\"dr\"],\"singular\":\"destinationrule\"},\"scope\":\"Namespaced\",\"version\":\"v1alpha3\"}}\n" + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apiextensions.k8s.io/v1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{\"helm.sh/resource-policy\":\"keep\"},\"labels\":{\"app\":\"istio-pilot\",\"chart\":\"istio\",\"heritage\":\"Tiller\",\"release\":\"istio\"},\"name\":\"destinationrules.networking.istio.io\"},\"spec\":{\"additionalPrinterColumns\":[{\"JSONPath\":\".spec.host\",\"description\":\"The name of a service from the service registry\",\"name\":\"Host\",\"type\":\"string\"},{\"JSONPath\":\".metadata.creationTimestamp\",\"description\":\"CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\\n\\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata\",\"name\":\"Age\",\"type\":\"date\"}],\"group\":\"networking.istio.io\",\"names\":{\"categories\":[\"istio-io\",\"networking-istio-io\"],\"kind\":\"DestinationRule\",\"listKind\":\"DestinationRuleList\",\"plural\":\"destinationrules\",\"shortNames\":[\"dr\"],\"singular\":\"destinationrule\"},\"scope\":\"Namespaced\",\"version\":\"v1alpha3\"}}\n" }, "creationTimestamp": "2019-12-30T16:13:02Z", "generation": 1, diff --git a/internal/model/registry.go b/internal/model/registry.go index 6871252e..72808c3c 100644 --- a/internal/model/registry.go +++ b/internal/model/registry.go @@ -18,13 +18,13 @@ var Registry = map[string]ResourceMeta{ DAO: &dao.Dir{}, Renderer: &render.Dir{}, }, + "pulses": { + DAO: &dao.Pulse{}, + }, "helm": { DAO: &dao.Helm{}, Renderer: &render.Helm{}, }, - "pulses": { - DAO: &dao.Pulse{}, - }, "openfaas": { DAO: &dao.OpenFaas{}, Renderer: &render.OpenFaas{}, @@ -135,15 +135,6 @@ var Registry = map[string]ResourceMeta{ }, // Extensions... - "extensions/v1beta1/daemonsets": { - Renderer: &render.DaemonSet{}, - }, - "extensions/v1beta1/ingresses": { - Renderer: &render.Ingress{}, - }, - "extensions/v1beta1/networkpolicies": { - Renderer: &render.NetworkPolicy{}, - }, "networking.k8s.io/v1/networkpolicies": { Renderer: &render.NetworkPolicy{}, }, @@ -176,9 +167,6 @@ var Registry = map[string]ResourceMeta{ "apiextensions.k8s.io/v1/customresourcedefinitions": { Renderer: &render.CustomResourceDefinition{}, }, - "apiextensions.k8s.io/v1beta1/customresourcedefinitions": { - Renderer: &render.CustomResourceDefinition{}, - }, // Storage... "storage.k8s.io/v1/storageclasses": { @@ -204,14 +192,4 @@ var Registry = map[string]ResourceMeta{ "rbac.authorization.k8s.io/v1/rolebindings": { Renderer: &render.RoleBinding{}, }, - - // ArgoCD... - "argoproj.io/v1alpha1/applications": { - Renderer: &render.Application{}, - TreeRenderer: &xray.Application{}, - }, - "argoproj.io/v1alpha1/appprojects": { - Renderer: &render.AppProject{}, - TreeRenderer: &xray.AppProject{}, - }, } diff --git a/internal/model/table_int_test.go b/internal/model/table_int_test.go index af891d88..e405471b 100644 --- a/internal/model/table_int_test.go +++ b/internal/model/table_int_test.go @@ -33,7 +33,7 @@ func TestTableReconcile(t *testing.T) { err := ta.reconcile(ctx) assert.Nil(t, err) data := ta.Peek() - assert.Equal(t, 20, len(data.Header)) + assert.Equal(t, 22, len(data.Header)) assert.Equal(t, 1, len(data.RowEvents)) assert.Equal(t, client.NamespaceAll, data.Namespace) } @@ -106,7 +106,7 @@ func TestTableHydrate(t *testing.T) { assert.Nil(t, hydrate("blee", oo, rr, render.Pod{})) assert.Equal(t, 1, len(rr)) - assert.Equal(t, 20, len(rr[0].Fields)) + assert.Equal(t, 22, len(rr[0].Fields)) } func TestTableGenericHydrate(t *testing.T) { diff --git a/internal/model/table_test.go b/internal/model/table_test.go index a6074ff4..b1e017f2 100644 --- a/internal/model/table_test.go +++ b/internal/model/table_test.go @@ -33,7 +33,7 @@ func TestTableRefresh(t *testing.T) { ctx = context.WithValue(ctx, internal.KeyWithMetrics, false) ta.Refresh(ctx) data := ta.Peek() - assert.Equal(t, 20, len(data.Header)) + assert.Equal(t, 22, len(data.Header)) assert.Equal(t, 1, len(data.RowEvents)) assert.Equal(t, client.NamespaceAll, data.Namespace) assert.Equal(t, 1, l.count) diff --git a/internal/render/application.go b/internal/render/application.go deleted file mode 100644 index 9e37523b..00000000 --- a/internal/render/application.go +++ /dev/null @@ -1,66 +0,0 @@ -package render - -import ( - "fmt" - "strings" - - "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" - "github.com/derailed/k9s/internal/client" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" -) - -// Application renders an ArgoCD Application to screen. -type Application struct{} - -// ColorerFunc colors a resource row. -func (Application) ColorerFunc() ColorerFunc { - return DefaultColorer -} - -// Header returns a header row. -func (Application) Header(ns string) Header { - return Header{ - HeaderColumn{Name: "NAME"}, - HeaderColumn{Name: "SYNC STATUS"}, - HeaderColumn{Name: "HEALTH STATUS"}, - HeaderColumn{Name: "SYNC POLICY"}, - HeaderColumn{Name: "REVISION"}, - HeaderColumn{Name: "AGE", Time: true, Decorator: AgeDecorator}, - } -} - -// Render renders a K8s resource to screen. -func (Application) Render(o interface{}, ns string, r *Row) error { - raw, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Expected Application, but got %T", o) - } - var app v1alpha1.Application - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &app) - if err != nil { - return err - } - - r.ID = client.MetaFQN(app.ObjectMeta) - var syncPolicies []string - syncPolicy := app.Spec.SyncPolicy - if syncPolicy != nil { - if syncPolicy.Automated.SelfHeal { - syncPolicies = append(syncPolicies, "selfHeal") - } - if syncPolicy.Automated.Prune { - syncPolicies = append(syncPolicies, "prune") - } - } - r.Fields = Fields{ - app.Name, - string(app.Status.Sync.Status), - string(app.Status.Health.Status), - strings.Join(syncPolicies, ","), - string(app.Status.Sync.Revision), - toAge(app.ObjectMeta.CreationTimestamp), - } - - return nil -} diff --git a/internal/render/appproject.go b/internal/render/appproject.go deleted file mode 100644 index 81b59d7e..00000000 --- a/internal/render/appproject.go +++ /dev/null @@ -1,47 +0,0 @@ -package render - -import ( - "fmt" - - "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" - "github.com/derailed/k9s/internal/client" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" -) - -// AppProject renders an ArgoCD App Project to screen. -type AppProject struct{} - -// ColorerFunc colors a resource row. -func (AppProject) ColorerFunc() ColorerFunc { - return DefaultColorer -} - -// Header returns a header row. -func (AppProject) Header(ns string) Header { - return Header{ - HeaderColumn{Name: "NAME"}, - HeaderColumn{Name: "AGE", Time: true, Decorator: AgeDecorator}, - } -} - -// Render renders a K8s resource to screen. -func (AppProject) Render(o interface{}, ns string, r *Row) error { - raw, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Expected AppProject, but got %T", o) - } - var app v1alpha1.AppProject - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &app) - if err != nil { - return err - } - - r.ID = client.MetaFQN(app.ObjectMeta) - r.Fields = Fields{ - app.Name, - toAge(app.ObjectMeta.CreationTimestamp), - } - - return nil -} diff --git a/internal/render/ing.go b/internal/render/ing.go index a7d9c30c..5826e06c 100644 --- a/internal/render/ing.go +++ b/internal/render/ing.go @@ -6,7 +6,7 @@ import ( "github.com/derailed/k9s/internal/client" v1 "k8s.io/api/core/v1" - "k8s.io/api/extensions/v1beta1" + netv1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" ) @@ -39,7 +39,7 @@ func (i Ingress) Render(o interface{}, ns string, r *Row) error { if !ok { return fmt.Errorf("Expected Ingress, but got %T", o) } - var ing v1beta1.Ingress + var ing netv1.Ingress err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &ing) if err != nil { return err @@ -77,7 +77,7 @@ func toAddress(lbs v1.LoadBalancerStatus) string { return strings.Join(res, ",") } -func toTLSPorts(tls []v1beta1.IngressTLS) string { +func toTLSPorts(tls []netv1.IngressTLS) string { if len(tls) != 0 { return "80, 443" } @@ -85,7 +85,7 @@ func toTLSPorts(tls []v1beta1.IngressTLS) string { return "80" } -func toHosts(rr []v1beta1.IngressRule) string { +func toHosts(rr []netv1.IngressRule) string { hh := make([]string, 0, len(rr)) for _, r := range rr { if r.Host == "" { diff --git a/internal/render/np.go b/internal/render/np.go index c1569412..b355574b 100644 --- a/internal/render/np.go +++ b/internal/render/np.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/derailed/k9s/internal/client" - v1beta1 "k8s.io/api/extensions/v1beta1" + netv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -42,7 +42,7 @@ func (n NetworkPolicy) Render(o interface{}, ns string, r *Row) error { if !ok { return fmt.Errorf("Expected NetworkPolicy, but got %T", o) } - var np v1beta1.NetworkPolicy + var np netv1.NetworkPolicy err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &np) if err != nil { return err @@ -71,7 +71,7 @@ func (n NetworkPolicy) Render(o interface{}, ns string, r *Row) error { // Helpers... -func ingress(ii []v1beta1.NetworkPolicyIngressRule) (string, string, string) { +func ingress(ii []netv1.NetworkPolicyIngressRule) (string, string, string) { var ports, sels, blocks []string for _, i := range ii { if p := portsToStr(i.Ports); p != "" { @@ -88,7 +88,7 @@ func ingress(ii []v1beta1.NetworkPolicyIngressRule) (string, string, string) { return strings.Join(ports, ","), strings.Join(sels, ","), strings.Join(blocks, ",") } -func egress(ee []v1beta1.NetworkPolicyEgressRule) (string, string, string) { +func egress(ee []netv1.NetworkPolicyEgressRule) (string, string, string) { var ports, sels, blocks []string for _, e := range ee { if p := portsToStr(e.Ports); p != "" { @@ -105,7 +105,7 @@ func egress(ee []v1beta1.NetworkPolicyEgressRule) (string, string, string) { return strings.Join(ports, ","), strings.Join(sels, ","), strings.Join(blocks, ",") } -func portsToStr(pp []v1beta1.NetworkPolicyPort) string { +func portsToStr(pp []netv1.NetworkPolicyPort) string { ports := make([]string, 0, len(pp)) for _, p := range pp { proto, port := NAValue, NAValue @@ -120,7 +120,7 @@ func portsToStr(pp []v1beta1.NetworkPolicyPort) string { return strings.Join(ports, ",") } -func peersToStr(pp []v1beta1.NetworkPolicyPeer) (string, string) { +func peersToStr(pp []netv1.NetworkPolicyPeer) (string, string) { sels := make([]string, 0, len(pp)) ips := make([]string, 0, len(pp)) for _, p := range pp { @@ -138,7 +138,7 @@ func peersToStr(pp []v1beta1.NetworkPolicyPeer) (string, string) { return strings.Join(sels, ","), strings.Join(ips, ",") } -func renderBlock(b *v1beta1.IPBlock) string { +func renderBlock(b *netv1.IPBlock) string { s := b.CIDR if len(b.Except) == 0 { @@ -155,7 +155,7 @@ func renderBlock(b *v1beta1.IPBlock) string { return s + "[" + strings.Join(b.Except, ",") + "]" } -func renderPeer(i v1beta1.NetworkPolicyPeer) string { +func renderPeer(i netv1.NetworkPolicyPeer) string { var s string if i.PodSelector != nil { diff --git a/internal/render/pod.go b/internal/render/pod.go index 0ec57dd6..4647b052 100644 --- a/internal/render/pod.go +++ b/internal/render/pod.go @@ -76,6 +76,8 @@ func (Pod) Header(ns string) Header { HeaderColumn{Name: "QOS", Wide: true}, HeaderColumn{Name: "LABELS", Wide: true}, HeaderColumn{Name: "VALID", Wide: true}, + HeaderColumn{Name: "NOMINATED NODE", Wide: true}, + HeaderColumn{Name: "READINESS GATES", Wide: true}, HeaderColumn{Name: "AGE", Time: true, Decorator: AgeDecorator}, } } @@ -118,6 +120,8 @@ func (p Pod) Render(o interface{}, ns string, row *Row) error { p.mapQOS(po.Status.QOSClass), mapToStr(po.Labels), asStatus(p.diagnose(phase, cr, len(ss))), + asNominated(po.Status.NominatedNodeName), + asReadinessGate(po.Spec.ReadinessGates), toAge(po.ObjectMeta.CreationTimestamp), } @@ -138,6 +142,24 @@ func (p Pod) diagnose(phase string, cr, ct int) error { // ---------------------------------------------------------------------------- // Helpers... +func asNominated(n string) string { + if n == "" { + return MissingValue + } + return n +} + +func asReadinessGate(gg []v1.PodReadinessGate) string { + if len(gg) == 0 { + return MissingValue + } + ss := make([]string, 0, len(gg)) + for _, g := range gg { + ss = append(ss, string(g.ConditionType)) + } + return strings.Join(ss, ",") +} + // PodWithMetrics represents a pod and its metrics. type PodWithMetrics struct { Raw *unstructured.Unstructured diff --git a/internal/render/testdata/crd.json b/internal/render/testdata/crd.json index 2f0db2b1..1416b60f 100644 --- a/internal/render/testdata/crd.json +++ b/internal/render/testdata/crd.json @@ -1,10 +1,10 @@ { - "apiVersion": "apiextensions.k8s.io/v1beta1", + "apiVersion": "apiextensions.k8s.io/v1", "kind": "CustomResourceDefinition", "metadata": { "annotations": { "helm.sh/hook": "crd-install", - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{\"helm.sh/hook\":\"crd-install\"},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"mixer\",\"istio\":\"mixer-adapter\",\"k8s-app\":\"istio\",\"package\":\"adapter\"},\"name\":\"adapters.config.istio.io\",\"namespace\":\"\"},\"spec\":{\"group\":\"config.istio.io\",\"names\":{\"categories\":[\"istio-io\",\"policy-istio-io\"],\"kind\":\"adapter\",\"plural\":\"adapters\",\"singular\":\"adapter\"},\"scope\":\"Namespaced\",\"version\":\"v1alpha2\"}}\n" + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apiextensions.k8s.io/v1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{\"helm.sh/hook\":\"crd-install\"},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"mixer\",\"istio\":\"mixer-adapter\",\"k8s-app\":\"istio\",\"package\":\"adapter\"},\"name\":\"adapters.config.istio.io\",\"namespace\":\"\"},\"spec\":{\"group\":\"config.istio.io\",\"names\":{\"categories\":[\"istio-io\",\"policy-istio-io\"],\"kind\":\"adapter\",\"plural\":\"adapters\",\"singular\":\"adapter\"},\"scope\":\"Namespaced\",\"version\":\"v1alpha2\"}}\n" }, "creationTimestamp": "2019-02-05T22:04:29Z", "generation": 1, @@ -17,7 +17,7 @@ }, "name": "adapters.config.istio.io", "resourceVersion": "37115599", - "selfLink": "/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/adapters.config.istio.io", + "selfLink": "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/adapters.config.istio.io", "uid": "029b8c3e-2992-11e9-81cd-42010a80005b" }, "spec": { diff --git a/internal/render/testdata/dp.json b/internal/render/testdata/dp.json index f28f88b2..b773f592 100644 --- a/internal/render/testdata/dp.json +++ b/internal/render/testdata/dp.json @@ -1,5 +1,5 @@ { - "apiVersion": "extensions/v1beta1", + "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "annotations": { @@ -14,7 +14,7 @@ "name": "icx-db", "namespace": "icx", "resourceVersion": "37116271", - "selfLink": "/apis/extensions/v1beta1/namespaces/icx/deployments/icx-db", + "selfLink": "/apis/apps/v1/namespaces/icx/deployments/icx-db", "uid": "6f6143bc-a5f3-11e9-990f-42010a800218" }, "spec": { diff --git a/internal/render/testdata/ds.json b/internal/render/testdata/ds.json index d8dd6c9b..9d4ea598 100644 --- a/internal/render/testdata/ds.json +++ b/internal/render/testdata/ds.json @@ -1,9 +1,9 @@ { - "apiVersion": "extensions/v1beta1", + "apiVersion": "apps/v1", "kind": "DaemonSet", "metadata": { "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"extensions/v1beta1\",\"kind\":\"DaemonSet\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"k8s-app\":\"fluentd-gcp\",\"kubernetes.io/cluster-service\":\"true\",\"version\":\"v3.2.0\"},\"name\":\"fluentd-gcp-v3.2.0\",\"namespace\":\"kube-system\"},\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"scheduler.alpha.kubernetes.io/critical-pod\":\"\"},\"labels\":{\"k8s-app\":\"fluentd-gcp\",\"kubernetes.io/cluster-service\":\"true\",\"version\":\"v3.2.0\"}},\"spec\":{\"containers\":[{\"env\":[{\"name\":\"NODE_NAME\",\"valueFrom\":{\"fieldRef\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.nodeName\"}}},{\"name\":\"STACKDRIVER_METADATA_AGENT_URL\",\"value\":\"http://$(NODE_NAME):8799\"}],\"image\":\"gcr.io/stackdriver-agents/stackdriver-logging-agent:0.6-1.6.0-1\",\"livenessProbe\":{\"exec\":{\"command\":[\"/bin/sh\",\"-c\",\"LIVENESS_THRESHOLD_SECONDS=${LIVENESS_THRESHOLD_SECONDS:-300}; STUCK_THRESHOLD_SECONDS=${LIVENESS_THRESHOLD_SECONDS:-900}; if [ ! -e /var/log/fluentd-buffers ]; then\\n exit 1;\\nfi; touch -d \\\"${STUCK_THRESHOLD_SECONDS} seconds ago\\\" /tmp/marker-stuck; if [[ -z \\\"$(find /var/log/fluentd-buffers -type f -newer /tmp/marker-stuck -print -quit)\\\" ]]; then\\n rm -rf /var/log/fluentd-buffers;\\n exit 1;\\nfi; touch -d \\\"${LIVENESS_THRESHOLD_SECONDS} seconds ago\\\" /tmp/marker-liveness; if [[ -z \\\"$(find /var/log/fluentd-buffers -type f -newer /tmp/marker-liveness -print -quit)\\\" ]]; then\\n exit 1;\\nfi;\\n\"]},\"initialDelaySeconds\":600,\"periodSeconds\":60},\"name\":\"fluentd-gcp\",\"volumeMounts\":[{\"mountPath\":\"/var/log\",\"name\":\"varlog\"},{\"mountPath\":\"/var/lib/docker/containers\",\"name\":\"varlibdockercontainers\",\"readOnly\":true},{\"mountPath\":\"/etc/google-fluentd/config.d\",\"name\":\"config-volume\"}]},{\"command\":[\"/monitor\",\"--stackdriver-prefix=container.googleapis.com/internal/addons\",\"--api-override=https://monitoring.googleapis.com/\",\"--source=fluentd:http://localhost:24231?whitelisted=stackdriver_successful_requests_count,stackdriver_failed_requests_count,stackdriver_ingested_entries_count,stackdriver_dropped_entries_count\",\"--pod-id=$(POD_NAME)\",\"--namespace-id=$(POD_NAMESPACE)\"],\"env\":[{\"name\":\"POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}},{\"name\":\"POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}}],\"image\":\"k8s.gcr.io/prometheus-to-sd:v0.3.1\",\"name\":\"prometheus-to-sd-exporter\"}],\"dnsPolicy\":\"Default\",\"hostNetwork\":true,\"nodeSelector\":{\"beta.kubernetes.io/fluentd-ds-ready\":\"true\"},\"priorityClassName\":\"system-node-critical\",\"serviceAccountName\":\"fluentd-gcp\",\"terminationGracePeriodSeconds\":60,\"tolerations\":[{\"effect\":\"NoExecute\",\"operator\":\"Exists\"},{\"effect\":\"NoSchedule\",\"operator\":\"Exists\"}],\"volumes\":[{\"hostPath\":{\"path\":\"/var/log\"},\"name\":\"varlog\"},{\"hostPath\":{\"path\":\"/var/lib/docker/containers\"},\"name\":\"varlibdockercontainers\"},{\"configMap\":{\"name\":\"fluentd-gcp-config-old-v1.2.5\"},\"name\":\"config-volume\"}]}},\"updateStrategy\":{\"type\":\"RollingUpdate\"}}}\n" + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"DaemonSet\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"k8s-app\":\"fluentd-gcp\",\"kubernetes.io/cluster-service\":\"true\",\"version\":\"v3.2.0\"},\"name\":\"fluentd-gcp-v3.2.0\",\"namespace\":\"kube-system\"},\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"scheduler.alpha.kubernetes.io/critical-pod\":\"\"},\"labels\":{\"k8s-app\":\"fluentd-gcp\",\"kubernetes.io/cluster-service\":\"true\",\"version\":\"v3.2.0\"}},\"spec\":{\"containers\":[{\"env\":[{\"name\":\"NODE_NAME\",\"valueFrom\":{\"fieldRef\":{\"apiVersion\":\"v1\",\"fieldPath\":\"spec.nodeName\"}}},{\"name\":\"STACKDRIVER_METADATA_AGENT_URL\",\"value\":\"http://$(NODE_NAME):8799\"}],\"image\":\"gcr.io/stackdriver-agents/stackdriver-logging-agent:0.6-1.6.0-1\",\"livenessProbe\":{\"exec\":{\"command\":[\"/bin/sh\",\"-c\",\"LIVENESS_THRESHOLD_SECONDS=${LIVENESS_THRESHOLD_SECONDS:-300}; STUCK_THRESHOLD_SECONDS=${LIVENESS_THRESHOLD_SECONDS:-900}; if [ ! -e /var/log/fluentd-buffers ]; then\\n exit 1;\\nfi; touch -d \\\"${STUCK_THRESHOLD_SECONDS} seconds ago\\\" /tmp/marker-stuck; if [[ -z \\\"$(find /var/log/fluentd-buffers -type f -newer /tmp/marker-stuck -print -quit)\\\" ]]; then\\n rm -rf /var/log/fluentd-buffers;\\n exit 1;\\nfi; touch -d \\\"${LIVENESS_THRESHOLD_SECONDS} seconds ago\\\" /tmp/marker-liveness; if [[ -z \\\"$(find /var/log/fluentd-buffers -type f -newer /tmp/marker-liveness -print -quit)\\\" ]]; then\\n exit 1;\\nfi;\\n\"]},\"initialDelaySeconds\":600,\"periodSeconds\":60},\"name\":\"fluentd-gcp\",\"volumeMounts\":[{\"mountPath\":\"/var/log\",\"name\":\"varlog\"},{\"mountPath\":\"/var/lib/docker/containers\",\"name\":\"varlibdockercontainers\",\"readOnly\":true},{\"mountPath\":\"/etc/google-fluentd/config.d\",\"name\":\"config-volume\"}]},{\"command\":[\"/monitor\",\"--stackdriver-prefix=container.googleapis.com/internal/addons\",\"--api-override=https://monitoring.googleapis.com/\",\"--source=fluentd:http://localhost:24231?whitelisted=stackdriver_successful_requests_count,stackdriver_failed_requests_count,stackdriver_ingested_entries_count,stackdriver_dropped_entries_count\",\"--pod-id=$(POD_NAME)\",\"--namespace-id=$(POD_NAMESPACE)\"],\"env\":[{\"name\":\"POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}},{\"name\":\"POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}}],\"image\":\"k8s.gcr.io/prometheus-to-sd:v0.3.1\",\"name\":\"prometheus-to-sd-exporter\"}],\"dnsPolicy\":\"Default\",\"hostNetwork\":true,\"nodeSelector\":{\"beta.kubernetes.io/fluentd-ds-ready\":\"true\"},\"priorityClassName\":\"system-node-critical\",\"serviceAccountName\":\"fluentd-gcp\",\"terminationGracePeriodSeconds\":60,\"tolerations\":[{\"effect\":\"NoExecute\",\"operator\":\"Exists\"},{\"effect\":\"NoSchedule\",\"operator\":\"Exists\"}],\"volumes\":[{\"hostPath\":{\"path\":\"/var/log\"},\"name\":\"varlog\"},{\"hostPath\":{\"path\":\"/var/lib/docker/containers\"},\"name\":\"varlibdockercontainers\"},{\"configMap\":{\"name\":\"fluentd-gcp-config-old-v1.2.5\"},\"name\":\"config-volume\"}]}},\"updateStrategy\":{\"type\":\"RollingUpdate\"}}}\n" }, "creationTimestamp": "2019-04-12T23:35:36Z", "generation": 2, @@ -16,7 +16,7 @@ "name": "fluentd-gcp-v3.2.0", "namespace": "kube-system", "resourceVersion": "34805583", - "selfLink": "/apis/extensions/v1beta1/namespaces/kube-system/daemonsets/fluentd-gcp-v3.2.0", + "selfLink": "/apis/apps/v1/namespaces/kube-system/daemonsets/fluentd-gcp-v3.2.0", "uid": "ac95611f-5d7b-11e9-af05-42010a800018" }, "spec": { diff --git a/internal/render/testdata/ing.json b/internal/render/testdata/ing.json index 37f1610a..04a2201e 100644 --- a/internal/render/testdata/ing.json +++ b/internal/render/testdata/ing.json @@ -1,12 +1,12 @@ { - "apiVersion": "extensions/v1beta1", + "apiVersion": "networking.k8s.io/v1", "kind": "Ingress", "metadata": { "labels": { "role": "ingress" }, "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"extensions/v1beta1\",\"kind\":\"Ingress\",\"metadata\":{\"annotations\":{\"nginx.ingress.kubernetes.io/rewrite-target\":\"/\"},\"name\":\"test-ingress\",\"namespace\":\"default\"},\"spec\":{\"rules\":[{\"http\":{\"paths\":[{\"backend\":{\"serviceName\":\"test\",\"servicePort\":80},\"path\":\"/testpath\"}]}}]}}\n", + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"networking.k8s.io/v1\",\"kind\":\"Ingress\",\"metadata\":{\"annotations\":{\"nginx.ingress.kubernetes.io/rewrite-target\":\"/\"},\"name\":\"test-ingress\",\"namespace\":\"default\"},\"spec\":{\"rules\":[{\"http\":{\"paths\":[{\"backend\":{\"serviceName\":\"test\",\"servicePort\":80},\"path\":\"/testpath\"}]}}]}}\n", "nginx.ingress.kubernetes.io/rewrite-target": "/" }, "creationTimestamp": "2019-08-30T20:53:52Z", @@ -14,7 +14,7 @@ "name": "test-ingress", "namespace": "default", "resourceVersion": "49801063", - "selfLink": "/apis/extensions/v1beta1/namespaces/default/ingresses/test-ingress", + "selfLink": "/apis/networking.k8s.io/v1/namespaces/default/ingresses/test-ingress", "uid": "45e44c1d-cb68-11e9-990f-42010a800218" }, "spec": { diff --git a/internal/render/testdata/np.json b/internal/render/testdata/np.json index 44138e40..386dde3c 100644 --- a/internal/render/testdata/np.json +++ b/internal/render/testdata/np.json @@ -1,5 +1,5 @@ { - "apiVersion": "extensions/v1beta1", + "apiVersion": "networking.k8s.io/v1", "kind": "NetworkPolicy", "metadata": { "annotations": { @@ -10,7 +10,7 @@ "name": "fred", "namespace": "default", "resourceVersion": "48999995", - "selfLink": "/apis/extensions/v1beta1/namespaces/default/networkpolicies/fred", + "selfLink": "/apis/networking.k8s.io/v1/namespaces/default/networkpolicies/fred", "uid": "e4aada4d-c8fd-11e9-990f-42010a800218" }, "spec": { diff --git a/internal/render/testdata/rs.json b/internal/render/testdata/rs.json index 4819a187..8bc7dd2e 100644 --- a/internal/render/testdata/rs.json +++ b/internal/render/testdata/rs.json @@ -1,5 +1,5 @@ { - "apiVersion": "extensions/v1beta1", + "apiVersion": "networking.k8s.io/v1", "kind": "ReplicaSet", "metadata": { "annotations": { @@ -26,7 +26,7 @@ } ], "resourceVersion": "37116270", - "selfLink": "/apis/extensions/v1beta1/namespaces/icx/replicasets/icx-db-7d4b578979", + "selfLink": "/apis/networking.k8s.io/v1/namespaces/icx/replicasets/icx-db-7d4b578979", "uid": "6f637a60-a5f3-11e9-990f-42010a800218" }, "spec": { diff --git a/internal/view/app.go b/internal/view/app.go index 8220287f..b988aa40 100644 --- a/internal/view/app.go +++ b/internal/view/app.go @@ -48,6 +48,7 @@ type App struct { filterHistory *model.History conRetry int32 showHeader bool + showLogo bool showCrumbs bool } @@ -135,7 +136,7 @@ func (a *App) layout(ctx context.Context) { a.Main.AddPage("main", main, true, false) a.Main.AddPage("splash", ui.NewSplash(a.Styles, a.version), true, true) - a.toggleHeader(!a.Config.K9s.IsHeadless()) + a.toggleHeader(!a.Config.K9s.IsHeadless(), !a.Config.K9s.IsLogoless()) } func (a *App) initSignals() { @@ -197,8 +198,9 @@ func (a *App) ActiveView() model.Component { return a.Content.GetPrimitive("main").(model.Component) } -func (a *App) toggleHeader(flag bool) { - a.showHeader = flag +func (a *App) toggleHeader(header, logo bool) { + a.showHeader = header + a.showLogo = logo flex, ok := a.Main.GetPrimitive("main").(*tview.Flex) if !ok { log.Fatal().Msg("Expecting valid flex view") @@ -245,7 +247,10 @@ func (a *App) buildHeader() tview.Primitive { } header.AddItem(a.clusterInfo(), clWidth, 1, false) header.AddItem(a.Menu(), 0, 1, false) - header.AddItem(a.Logo(), 26, 1, false) + + if a.showLogo { + header.AddItem(a.Logo(), 26, 1, false) + } return header } @@ -524,7 +529,7 @@ func (a *App) toggleHeaderCmd(evt *tcell.EventKey) *tcell.EventKey { a.QueueUpdateDraw(func() { a.showHeader = !a.showHeader - a.toggleHeader(a.showHeader) + a.toggleHeader(a.showHeader, a.showLogo) }) return nil diff --git a/internal/view/command.go b/internal/view/command.go index dd05e245..06c6e2a8 100644 --- a/internal/view/command.go +++ b/internal/view/command.go @@ -69,8 +69,6 @@ func allowedXRay(gvr client.GVR) bool { "apps/v1/daemonsets", "apps/v1/statefulsets", "apps/v1/replicasets", - "argoproj.io/v1alpha1/applications", - "argoproj.io/v1alpha1/appprojects", } for _, g := range gg { if g == gvr.String() { diff --git a/internal/view/cow.go b/internal/view/cow.go index 0fa06c5d..6d33108f 100644 --- a/internal/view/cow.go +++ b/internal/view/cow.go @@ -58,15 +58,21 @@ func (c *Cow) talk() { if len(says) == 0 { says = "Nothing to report here. Please move along..." } - c.SetText(cowTalk(says)) + x, _, w, _ := c.GetRect() + c.SetText(cowTalk(says, (x+w)/2)) } -func cowTalk(says string) string { +func cowTalk(says string, w int) string { + msg := fmt.Sprintf("[red::]< [::b]Ruroh? %s[::-] >", says) buff := make([]string, 0, len(cow)+3) + buff = append(buff, "[red::] "+strings.Repeat("─", len(says)+8)) + buff = append(buff, msg) buff = append(buff, " "+strings.Repeat("─", len(says)+8)) - buff = append(buff, fmt.Sprintf("< [red::b]Ruroh? %s[-::-] >", says)) - buff = append(buff, " "+strings.Repeat("─", len(says)+8)) - spacer := strings.Repeat(" ", len(says)/2-8) + rCount := w/2 - 8 + if rCount < 0 { + rCount = w / 2 + } + spacer := strings.Repeat(" ", rCount) for _, s := range cow { buff = append(buff, "[red::b]"+spacer+s) } diff --git a/internal/view/cronjob.go b/internal/view/cronjob.go index 94bdf668..341e51f5 100644 --- a/internal/view/cronjob.go +++ b/internal/view/cronjob.go @@ -3,12 +3,15 @@ package view import ( "context" "fmt" + "strings" "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/render" "github.com/derailed/k9s/internal/ui" + "github.com/derailed/k9s/internal/ui/dialog" + "github.com/derailed/tview" "github.com/gdamore/tcell/v2" "github.com/rs/zerolog/log" batchv1beta1 "k8s.io/api/batch/v1beta1" @@ -17,6 +20,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +const suspendDialogKey = "suspend" + // CronJob represents a cronjob viewer. type CronJob struct { ResourceViewer @@ -63,31 +68,125 @@ func jobCtx(path, uid string) ContextFunc { func (c *CronJob) bindKeys(aa ui.KeyActions) { aa.Add(ui.KeyActions{ - tcell.KeyCtrlT: ui.NewKeyAction("Trigger", c.trigger, true), + ui.KeyT: ui.NewKeyAction("Trigger", c.triggerCmd, true), + ui.KeyS: ui.NewKeyAction("Suspend/Resume", c.toggleSuspendCmd, true), }) } -func (c *CronJob) trigger(evt *tcell.EventKey) *tcell.EventKey { +func (c *CronJob) triggerCmd(evt *tcell.EventKey) *tcell.EventKey { + fqn := c.GetTable().GetSelectedItem() + if fqn == "" { + return evt + } + + msg := fmt.Sprintf("Trigger Cronjob %s?", fqn) + dialog.ShowConfirm(c.App().Styles.Dialog(), c.App().Content.Pages, "Confirm Job Trigger", msg, func() { + res, err := dao.AccessorFor(c.App().factory, c.GVR()) + if err != nil { + c.App().Flash().Err(fmt.Errorf("no accessor for %q", c.GVR())) + return + } + runner, ok := res.(dao.Runnable) + if !ok { + c.App().Flash().Err(fmt.Errorf("expecting a jobrunner resource for %q", c.GVR())) + return + } + + if err := runner.Run(fqn); err != nil { + c.App().Flash().Errf("Cronjob trigger failed %v", err) + return + } + c.App().Flash().Infof("Triggering Job %s %s", c.GVR(), fqn) + }, func() {}) + + return nil +} + +func (c *CronJob) toggleSuspendCmd(evt *tcell.EventKey) *tcell.EventKey { sel := c.GetTable().GetSelectedItem() if sel == "" { return evt } + c.Stop() + defer c.Start() + c.showSuspendDialog(sel) + + return nil +} + +func (c *CronJob) showSuspendDialog(sel string) { + cell := c.GetTable().GetCell(c.GetTable().GetSelectedRowIndex(), c.GetTable().NameColIndex()+2) + if cell == nil { + c.App().Flash().Errf("Unable to assert current status") + return + } + suspended := strings.TrimSpace(cell.Text) == "true" + title := "Suspend" + if suspended { + title = "Resume" + } + + confirm := tview.NewModalForm(fmt.Sprintf("<%s>", title), c.makeSuspendForm(sel, !suspended)) + confirm.SetText(fmt.Sprintf("%s CronJob %s?", title, sel)) + confirm.SetDoneFunc(func(int, string) { + c.dismissDialog() + }) + c.App().Content.AddPage(suspendDialogKey, confirm, false, false) + c.App().Content.ShowPage(suspendDialogKey) +} + +func (c *CronJob) makeSuspendForm(sel string, suspend bool) *tview.Form { + f := c.makeStyledForm() + action := "suspend" + if !suspend { + action = "resume" + } + + f.AddButton("Cancel", func() { + c.dismissDialog() + }) + f.AddButton("OK", func() { + defer c.dismissDialog() + + ctx, cancel := context.WithTimeout(context.Background(), c.App().Conn().Config().CallTimeout()) + defer cancel() + if err := c.toggleSuspend(ctx, sel); err != nil { + log.Error().Err(err).Msgf("CronJOb %s %s failed", sel, action) + c.App().Flash().Err(err) + } else { + c.App().Flash().Infof("CronJOb %s %s successfully", sel, action) + } + }) + + return f +} + +func (c *CronJob) toggleSuspend(ctx context.Context, path string) error { res, err := dao.AccessorFor(c.App().factory, c.GVR()) if err != nil { return nil } - runner, ok := res.(dao.Runnable) + cronJob, ok := res.(*dao.CronJob) if !ok { - c.App().Flash().Err(fmt.Errorf("expecting a jobrunner resource for %q", c.GVR())) - return nil + return fmt.Errorf("expecting a scalable resource for %q", c.GVR()) } - if err := runner.Run(sel); err != nil { - c.App().Flash().Errf("Cronjob trigger failed %v", err) - return evt - } - c.App().Flash().Infof("Triggering Job %s %s", c.GVR(), sel) - - return nil + return cronJob.ToggleSuspend(ctx, path) +} + +func (c *CronJob) makeStyledForm() *tview.Form { + f := tview.NewForm() + f.SetItemPadding(0) + f.SetButtonsAlign(tview.AlignCenter). + SetButtonBackgroundColor(tview.Styles.PrimitiveBackgroundColor). + SetButtonTextColor(tview.Styles.PrimaryTextColor). + SetLabelColor(tcell.ColorAqua). + SetFieldTextColor(tcell.ColorOrange) + + return f +} + +func (c *CronJob) dismissDialog() { + c.App().Content.RemovePage(suspendDialogKey) } diff --git a/internal/view/live_view.go b/internal/view/live_view.go index aad97544..ae5ad4ab 100644 --- a/internal/view/live_view.go +++ b/internal/view/live_view.go @@ -82,7 +82,8 @@ func (v *LiveView) Init(_ context.Context) error { // ResourceFailed notifies when their is an issue. func (v *LiveView) ResourceFailed(err error) { v.text.SetTextAlign(tview.AlignCenter) - v.text.SetText(cowTalk(err.Error())) + x, _, w, _ := v.GetRect() + v.text.SetText(cowTalk(err.Error(), x+w)) } // ResourceChanged notifies when the filter changes. diff --git a/internal/view/ns.go b/internal/view/ns.go index f623c864..e815183c 100644 --- a/internal/view/ns.go +++ b/internal/view/ns.go @@ -36,7 +36,8 @@ func NewNamespace(gvr client.GVR) ResourceViewer { func (n *Namespace) bindKeys(aa ui.KeyActions) { aa.Add(ui.KeyActions{ - ui.KeyU: ui.NewKeyAction("Use", n.useNsCmd, true), + ui.KeyU: ui.NewKeyAction("Use", n.useNsCmd, true), + ui.KeyShiftS: ui.NewKeyAction("Sort Status", n.GetTable().SortColCmd(statusCol, true), false), }) } diff --git a/internal/view/ns_test.go b/internal/view/ns_test.go index a78b829a..093e2e57 100644 --- a/internal/view/ns_test.go +++ b/internal/view/ns_test.go @@ -13,5 +13,5 @@ func TestNSCleanser(t *testing.T) { assert.Nil(t, ns.Init(makeCtx())) assert.Equal(t, "Namespaces", ns.Name()) - assert.Equal(t, 6, len(ns.Hints())) + assert.Equal(t, 7, len(ns.Hints())) } diff --git a/internal/view/pod.go b/internal/view/pod.go index cc994505..1fd08cea 100644 --- a/internal/view/pod.go +++ b/internal/view/pod.go @@ -20,6 +20,13 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +const ( + windowsOS = "windows" + powerShell = "powershell" + osBetaSelector = "beta.kubernetes.io/os" + osSelector = "kubernetes.io/os" +) + // Pod represents a pod viewer. type Pod struct { ResourceViewer @@ -241,11 +248,15 @@ func resumeShellIn(a *App, c model.Component, path, co string) { shellIn(a, path, co) } -func shellIn(a *App, path, co string) { - args := computeShellArgs(path, co, a.Conn().Config().Flags().KubeConfig) +func shellIn(a *App, fqn, co string) { + os, err := getPodOS(a.factory, fqn) + if err != nil { + log.Warn().Err(err).Msgf("os detect failed") + } + args := computeShellArgs(fqn, co, a.Conn().Config().Flags().KubeConfig, os) c := color.New(color.BgGreen).Add(color.FgBlack).Add(color.Bold) - if !runK(a, shellOpts{clear: true, banner: c.Sprintf(bannerFmt, path, co), args: args}) { + if !runK(a, shellOpts{clear: true, banner: c.Sprintf(bannerFmt, fqn, co), args: args}) { a.Flash().Err(errors.New("Shell exec failed")) } } @@ -291,8 +302,11 @@ func attachIn(a *App, path, co string) { } } -func computeShellArgs(path, co string, kcfg *string) []string { +func computeShellArgs(path, co string, kcfg *string, os string) []string { args := buildShellArgs("exec", path, co, kcfg) + if os == windowsOS { + return append(args, "--", powerShell) + } return append(args, "--", "sh", "-c", shellCheck) } @@ -360,6 +374,22 @@ func podIsRunning(f dao.Factory, path string) bool { return re.Phase(po) == render.Running } +func getPodOS(f dao.Factory, fqn string) (string, error) { + po, err := fetchPod(f, fqn) + if err != nil { + return "", err + } + if os, ok := po.Spec.NodeSelector[osBetaSelector]; ok { + return os, nil + } + os, ok := po.Spec.NodeSelector[osSelector] + if !ok { + return "", fmt.Errorf("no os information available") + } + + return os, nil +} + func resourceSorters(t *Table) ui.KeyActions { return ui.KeyActions{ ui.KeyShiftC: ui.NewKeyAction("Sort CPU", t.SortColCmd(cpuCol, false), false), diff --git a/internal/view/pod_int_test.go b/internal/view/pod_int_test.go index 53de43ec..e359924b 100644 --- a/internal/view/pod_int_test.go +++ b/internal/view/pod_int_test.go @@ -9,43 +9,97 @@ import ( func TestComputeShellArgs(t *testing.T) { config, empty := "coolConfig", "" + _ = config uu := map[string]struct { - path, co string - cfg *string - e string + fqn, co, os string + cfg *string + e string }{ "config": { "fred/blee", "c1", + "darwin", &config, "exec -it -n fred blee --kubeconfig coolConfig -c c1 -- sh -c " + shellCheck, }, - "noconfig": { + "no-config": { "fred/blee", "c1", + "linux", nil, "exec -it -n fred blee -c c1 -- sh -c " + shellCheck, }, - "emptyConfig": { - "fred/blee", - "c1", - &empty, - "exec -it -n fred blee -c c1 -- sh -c " + shellCheck, - }, - "singleContainer": { + "empty-config": { "fred/blee", "", + "", &empty, "exec -it -n fred blee -- sh -c " + shellCheck, }, + "single-container": { + "fred/blee", + "", + "linux", + &empty, + "exec -it -n fred blee -- sh -c " + shellCheck, + }, + "windows": { + "fred/blee", + "c1", + windowsOS, + &empty, + "exec -it -n fred blee -c c1 -- powershell", + }, } for k := range uu { u := uu[k] t.Run(k, func(t *testing.T) { - args := computeShellArgs(u.path, u.co, u.cfg) - + args := computeShellArgs(u.fqn, u.co, u.cfg, u.os) assert.Equal(t, u.e, strings.Join(args, " ")) }) } } + +// func TestComputeShellArgs(t *testing.T) { +// config, empty := "coolConfig", "" +// uu := map[string]struct { +// path, co string +// cfg *string +// e string +// }{ +// "config": { +// "fred/blee", +// "c1", +// &config, +// "exec -it -n fred blee --kubeconfig coolConfig -c c1 -- sh -c " + shellCheck, +// }, +// "noconfig": { +// "fred/blee", +// "c1", +// nil, +// "exec -it -n fred blee -c c1 -- sh -c " + shellCheck, +// }, +// "emptyConfig": { +// "fred/blee", +// "c1", +// &empty, +// "exec -it -n fred blee -c c1 -- sh -c " + shellCheck, +// }, +// "singleContainer": { +// "fred/blee", +// "", +// &empty, +// "exec -it -n fred blee -- sh -c " + shellCheck, +// }, +// } + +// for k := range uu { +// u := uu[k] +// t.Run(k, func(t *testing.T) { +// args := computeShellArgs(u.path, u.co, u.cfg) + +// assert.Equal(t, u.e, strings.Join(args, " ")) +// }) +// } +// } diff --git a/internal/view/registrar.go b/internal/view/registrar.go index 539ce953..1a4543fa 100644 --- a/internal/view/registrar.go +++ b/internal/view/registrar.go @@ -105,7 +105,7 @@ func appsViewers(vv MetaViewers) { vv[client.NewGVR("apps/v1/daemonsets")] = MetaViewer{ viewerFn: NewDaemonSet, } - vv[client.NewGVR("extensions/v1beta1/daemonsets")] = MetaViewer{ + vv[client.NewGVR("apps/v1/daemonsets")] = MetaViewer{ viewerFn: NewDaemonSet, } } @@ -147,7 +147,7 @@ func extViewers(vv MetaViewers) { vv[client.NewGVR("apiextensions.k8s.io/v1/customresourcedefinitions")] = MetaViewer{ enterFn: showCRD, } - vv[client.NewGVR("apiextensions.k8s.io/v1beta1/customresourcedefinitions")] = MetaViewer{ + vv[client.NewGVR("apiextensions.k8s.io/v1/customresourcedefinitions")] = MetaViewer{ enterFn: showCRD, } } diff --git a/internal/xray/application.go b/internal/xray/application.go deleted file mode 100644 index df97f466..00000000 --- a/internal/xray/application.go +++ /dev/null @@ -1,99 +0,0 @@ -package xray - -import ( - "context" - "fmt" - "strings" - - v1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" - "github.com/derailed/k9s/internal" - "github.com/derailed/k9s/internal/client" - "github.com/derailed/k9s/internal/dao" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// Application represents an xray renderer. -type Application struct{} - -// Render renders an xray node. -func (a *Application) Render(ctx context.Context, ns string, o interface{}) error { - raw, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Expected Unstructured, but got %T", o) - } - - var app v1alpha1.Application - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &app) - if err != nil { - return err - } - - parent, ok := ctx.Value(KeyParent).(*TreeNode) - if !ok { - return fmt.Errorf("Expecting a TreeNode but got %T", ctx.Value(KeyParent)) - } - - root := NewTreeNode("argoproj.io/v1alpha1/applications", client.FQN(app.Namespace, app.Name)) - ctx = context.WithValue(ctx, KeyParent, root) - - f, ok := ctx.Value(internal.KeyFactory).(dao.Factory) - if !ok { - return fmt.Errorf("Expecting a factory but got %T", ctx.Value(internal.KeyFactory)) - } - for _, res := range app.Status.Resources { - gvr := gvkToGvr(res.GroupVersionKind()) - switch gvr.String() { - case "apps/v1/deployments": - var dp Deployment - if d, err := f.Get("apps/v1/deployments", fmt.Sprintf("%s/%s", res.Namespace, res.Name), false, labels.Everything()); err == nil { - if err := dp.Render(ctx, app.Namespace, d); err != nil { - return err - } - } - - case "v1/services": - var svc Service - if d, err := f.Get("v1/services", fmt.Sprintf("%s/%s", res.Namespace, res.Name), false, labels.Everything()); err == nil { - if err := svc.Render(ctx, app.Namespace, d); err != nil { - return err - } - } - - default: - var ar ApplicationResource - if err := ar.Render(ctx, app.Namespace, res); err != nil { - return err - } - } - /* - if meta, ok := model.Registry[gvr.String()]; ok { - if meta.TreeRenderer != nil { - if err := meta.TreeRenderer.Render(ctx, app.Namespace, res); err != nil { - return err - } - } - } - */ - } - - gvr, nsID := "v1/namespaces", client.FQN(client.ClusterScope, app.Namespace) - nsn := parent.Find(gvr, nsID) - if nsn == nil { - nsn = NewTreeNode(gvr, nsID) - parent.Add(nsn) - } - nsn.Add(root) - - return nil -} - -func gvkToGvr(gvk schema.GroupVersionKind) client.GVR { - gvr := fmt.Sprintf("%s/%ss", gvk.Version, strings.ToLower(gvk.Kind)) - if gvk.Group != "" { - gvr = fmt.Sprintf("%s/%s", gvk.Group, gvr) - } - return client.NewGVR(gvr) -} diff --git a/internal/xray/application_res.go b/internal/xray/application_res.go deleted file mode 100644 index a82bf1aa..00000000 --- a/internal/xray/application_res.go +++ /dev/null @@ -1,39 +0,0 @@ -package xray - -import ( - "context" - "fmt" - - v1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" - "github.com/derailed/k9s/internal/client" -) - -// ApplicationResource represents an xray renderer. -type ApplicationResource struct{} - -// Render renders an xray node. -func (a *ApplicationResource) Render(ctx context.Context, ns string, res v1alpha1.ResourceStatus) error { - parent, ok := ctx.Value(KeyParent).(*TreeNode) - if !ok { - return fmt.Errorf("Expecting a TreeNode but got %T", ctx.Value(KeyParent)) - } - - gvr := gvkToGvr(res.GroupVersionKind()) - - root := NewTreeNode(gvr.String(), client.FQN(res.Namespace, res.Name)) - ctx = context.WithValue(ctx, KeyParent, root) - - if res.Namespace == "" { - parent.Add(root) - } else { - gvr, nsID := "v1/namespaces", client.FQN(client.ClusterScope, res.Namespace) - nsn := parent.Find(gvr, nsID) - if nsn == nil { - nsn = NewTreeNode(gvr, nsID) - parent.Add(nsn) - } - nsn.Add(root) - } - - return nil -} diff --git a/internal/xray/appproject.go b/internal/xray/appproject.go deleted file mode 100644 index 570a9004..00000000 --- a/internal/xray/appproject.go +++ /dev/null @@ -1,77 +0,0 @@ -package xray - -import ( - "context" - "fmt" - - v1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" - "github.com/derailed/k9s/internal" - "github.com/derailed/k9s/internal/client" - "github.com/derailed/k9s/internal/dao" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" -) - -// AppProject represents an xray renderer. -type AppProject struct{} - -// Render renders an xray node. -func (a *AppProject) Render(ctx context.Context, ns string, o interface{}) error { - raw, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Expected Unstructured, but got %T", o) - } - - var proj v1alpha1.AppProject - err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &proj) - if err != nil { - return err - } - - parent, ok := ctx.Value(KeyParent).(*TreeNode) - if !ok { - return fmt.Errorf("Expecting a TreeNode but got %T", ctx.Value(KeyParent)) - } - - root := NewTreeNode("argoproj.io/v1alpha1/appprojects", client.FQN(proj.Namespace, proj.Name)) - ctx = context.WithValue(ctx, KeyParent, root) - - f, ok := ctx.Value(internal.KeyFactory).(dao.Factory) - if !ok { - return fmt.Errorf("Expecting a factory but got %T", ctx.Value(internal.KeyFactory)) - } - - oo, err := f.List("argoproj.io/v1alpha1/applications", "", false, labels.Everything()) - if err != nil { - return err - } - for _, o := range oo { - a, ok := o.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("expecting *Unstructured but got %T", o) - } - var aa v1alpha1.Application - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(a.Object, &aa); err != nil { - return err - } - if aa.Spec.Project != proj.Name { - continue - } - var app Application - if err := app.Render(ctx, proj.Namespace, a); err != nil { - return err - } - - } - - gvr, nsID := "v1/namespaces", client.FQN(client.ClusterScope, proj.Namespace) - nsn := parent.Find(gvr, nsID) - if nsn == nil { - nsn = NewTreeNode(gvr, nsID) - parent.Add(nsn) - } - nsn.Add(root) - - return nil -} diff --git a/internal/xray/tree_node.go b/internal/xray/tree_node.go index 2d382618..b3b34ded 100644 --- a/internal/xray/tree_node.go +++ b/internal/xray/tree_node.go @@ -490,12 +490,6 @@ func toEmoji(gvr string) string { return "🏷 " case "policy/v1beta1/podsecuritypolicies": return "👮‍♂️" - case "apiextensions.k8s.io/v1/customresourcedefinitions": - return "📔" - case "argoproj.io/v1alpha1/applications": - return "🏠" - case "argoproj.io/v1alpha1/appprojects": - return "🏘" case "containers": return "🐳" case "report": diff --git a/main.go b/main.go index 69ab6697..9da315f8 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "os" "github.com/derailed/k9s/cmd" @@ -8,12 +9,33 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/klog/v2" ) func init() { config.EnsurePath(config.K9sLogs, config.DefaultDirMod) } +func init() { + klog.InitFlags(nil) + + if err := flag.Set("logtostderr", "false"); err != nil { + panic(err) + } + if err := flag.Set("alsologtostderr", "false"); err != nil { + panic(err) + } + if err := flag.Set("stderrthreshold", "fatal"); err != nil { + panic(err) + } + if err := flag.Set("v", "0"); err != nil { + panic(err) + } + if err := flag.Set("log_file", config.K9sLogs); err != nil { + panic(err) + } +} + func main() { mod := os.O_CREATE | os.O_APPEND | os.O_WRONLY file, err := os.OpenFile(config.K9sLogs, mod, config.DefaultFileMod)