From 21d7945fb08cabd509344041cc10ee334cc43810 Mon Sep 17 00:00:00 2001 From: Ryker Reed Date: Fri, 24 Sep 2021 08:44:03 -0700 Subject: [PATCH 01/24] Update README.md Document CLI behavior change in response to CAPI bug --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index af1154c3082..59b5d4025f3 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,9 @@ Check out our [community contributed CLI plugins](https://plugins.cloudfoundry.o * .cfignore used in `cf push` must be in UTF-8 encoding for CLI to interpret correctly. ([issue #281](https://github.com/cloudfoundry/cli/issues/281#issuecomment-65315518)) * On Linux, when encountering message "bash: .cf: No such file or directory", ensure that you're using the [correct binary or installer for your architecture](https://askubuntu.com/questions/133389/no-such-file-or-directory-but-the-file-exists). * X-Cf-Warnings are printed through the `stdout`, if that's an inconvenience you could set `CF_RAISE_ERROR_ON_WARNINGS` and in that case warnings will be printed through the `stderr`. See [X-Cf-Warnings printed through stdout issue](https://github.com/cloudfoundry/cli/issues/2164) +* False negative message for user org creation. CLI v7.0 and CLI v7.1 non-admin users with the user-org-creation feature flag enabled will experience a failure when running cf create-org. The command will explicitly fail attempting to grant the user an org-manager role. However, it actually succeeds because the user would have an org-manager role granted to them via CAPI and therefore be able to access their org. This issue is resolved as of CLI v7.2. See [Inconsistent v2/v3 behavior around creating new orgs + assigning roles](https://github.com/cloudfoundry/cloud_controller_ng/issues/1879). +feature flag enabled will not succeed when running cf create-org. the behavior looks different between the v7.0-7.1 CLI and the v7.2 CLI. in v7.0/7.1, the command will explicitly fail attempting to grant the user an org-manager role. ## Filing Issues & Feature Requests First, update to the [latest cli](https://github.com/cloudfoundry/cli/releases) From 19278c3aed08aa3ce867c02467be7e453c5c1c56 Mon Sep 17 00:00:00 2001 From: Ryker Reed Date: Fri, 24 Sep 2021 08:44:36 -0700 Subject: [PATCH 02/24] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 59b5d4025f3..8d4d7874481 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,6 @@ Check out our [community contributed CLI plugins](https://plugins.cloudfoundry.o * X-Cf-Warnings are printed through the `stdout`, if that's an inconvenience you could set `CF_RAISE_ERROR_ON_WARNINGS` and in that case warnings will be printed through the `stderr`. See [X-Cf-Warnings printed through stdout issue](https://github.com/cloudfoundry/cli/issues/2164) * False negative message for user org creation. CLI v7.0 and CLI v7.1 non-admin users with the user-org-creation feature flag enabled will experience a failure when running cf create-org. The command will explicitly fail attempting to grant the user an org-manager role. However, it actually succeeds because the user would have an org-manager role granted to them via CAPI and therefore be able to access their org. This issue is resolved as of CLI v7.2. See [Inconsistent v2/v3 behavior around creating new orgs + assigning roles](https://github.com/cloudfoundry/cloud_controller_ng/issues/1879). -feature flag enabled will not succeed when running cf create-org. the behavior looks different between the v7.0-7.1 CLI and the v7.2 CLI. in v7.0/7.1, the command will explicitly fail attempting to grant the user an org-manager role. ## Filing Issues & Feature Requests First, update to the [latest cli](https://github.com/cloudfoundry/cli/releases) From b85b68e404b67054b154f2f0eb3cba4e2b545dff Mon Sep 17 00:00:00 2001 From: Brandon Potts Date: Wed, 13 Oct 2021 16:20:39 -0400 Subject: [PATCH 03/24] added a Docker section to the generate-release-notes script --- bin/generate-release-notes | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bin/generate-release-notes b/bin/generate-release-notes index 6ade44689b6..f1aad7ebcc5 100755 --- a/bin/generate-release-notes +++ b/bin/generate-release-notes @@ -20,6 +20,13 @@ Binaries - Mac OS X [64 bit](https://packages.cloudfoundry.org/stable?release=macosx64-binary&version=$VERSION&source=github-rel) (tgz) - Windows [64 bit](https://packages.cloudfoundry.org/stable?release=windows64-exe&version=$VERSION&source=github-rel) / [32 bit](https://packages.cloudfoundry.org/stable?release=windows32-exe&version=$VERSION&source=github-rel) (zip) + +Docker +-------- +\`\`\`shell +docker pull cloudfoundry/cli:$VERSION +\`\`\` + Change Log ---------- NOTES From 9159087f9a4cf942c63317d3819003c3aa979a90 Mon Sep 17 00:00:00 2001 From: Juan Diego Gonzalez Date: Wed, 13 Oct 2021 21:38:14 +0000 Subject: [PATCH 04/24] go mod tidy Co-authored-by: Juan Diego Gonzalez --- go.mod | 10 ---------- go.sum | 55 +------------------------------------------------------ 2 files changed, 1 insertion(+), 64 deletions(-) diff --git a/go.mod b/go.mod index f059b2303bd..d67598838c6 100644 --- a/go.mod +++ b/go.mod @@ -18,30 +18,21 @@ require ( code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 - github.com/akavel/rsrc v0.10.2 // indirect - github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77 // indirect github.com/blang/semver v3.5.1+incompatible github.com/bmatcuk/doublestar v1.3.1 // indirect github.com/charlievieth/fs v0.0.0-20170613215519-7dc373669fa1 // indirect github.com/cloudfoundry/bosh-cli v5.5.1+incompatible github.com/cloudfoundry/bosh-utils v0.0.0-20180315210917-c6a922e299b8 // indirect - github.com/cloudfoundry/noaa v2.1.1-0.20190110210640-5ce49363dfa6+incompatible // indirect - github.com/cloudfoundry/sonde-go v0.0.0-20171206171820-b33733203bb4 // indirect github.com/cppforlife/go-patch v0.1.0 // indirect github.com/cyphar/filepath-securejoin v0.2.1 github.com/docker/distribution v2.6.0-rc.1.0.20171109224904-e5b5e44386f7+incompatible github.com/docker/docker v1.4.2-0.20171120205147-9de84a78d76e // indirect - github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d // indirect - github.com/elazarl/goproxy/ext v0.0.0-20200809112317-0581fc3aee2d // indirect github.com/fatih/color v1.5.1-0.20170926111411-5df930a27be2 github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/gogo/protobuf v1.3.1 // indirect github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 - github.com/gorilla/websocket v1.2.1-0.20171201014301-b89020ee79b8 // indirect github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4 github.com/kr/pty v1.1.1 github.com/lunixbochs/vtclean v1.0.0 - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect github.com/mattn/go-colorable v0.1.0 github.com/mattn/go-isatty v0.0.3 // indirect github.com/mattn/go-runewidth v0.0.5-0.20181218000649-703b5e6b11ae @@ -52,7 +43,6 @@ require ( github.com/onsi/gomega v1.10.5 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/pkg/errors v0.9.1 - github.com/poy/eachers v0.0.0-20181020210610-23942921fe77 // indirect github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f github.com/sajari/fuzzy v1.0.0 github.com/sirupsen/logrus v1.2.0 diff --git a/go.sum b/go.sum index 1d6e3e51268..4bcafc592e3 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,6 @@ code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be h1:rnGRgbKlOPKb code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a h1:8rqv2w8xEceNwckcF5ONeRt0qBHlh5bnNfFnYTrZbxs= code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= -code.cloudfoundry.org/tlsconfig v0.0.0-20200131000646-bbe0f8da39b3 h1:2Qal+q+tw/DmDOoJBWwDCPE3lIJNj/1o7oMkkb2c5SI= -code.cloudfoundry.org/tlsconfig v0.0.0-20200131000646-bbe0f8da39b3/go.mod h1:eTbFJpyXRGuFVyg5+oaj9B2eIbIc+0/kZjH8ftbtdew= code.cloudfoundry.org/tlsconfig v0.0.0-20210615191307-5d92ef3894a7 h1:5N6M1WbWH3bknkX80Q/s7eEo5odqjixLAW79Zrrbqu0= code.cloudfoundry.org/tlsconfig v0.0.0-20210615191307-5d92ef3894a7/go.mod h1:CKI5CV+3MlfcohVSuU3FxXubFyC52lYJGMLnZ2ltvks= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= @@ -35,11 +33,7 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 h1:koK7z0nSsRiRiBWwa+E714Puh+DO+ZRdIyAXiXzL+lg= github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= -github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77 h1:afT88tB6u9JCKQZVAAaa9ICz/uGn5Uw9ekn6P22mYKM= -github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:bXvGk6IkT1Agy7qzJ+DjIw/SJ1AaB3AvAuMDVV+Vkoo= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmatcuk/doublestar v1.3.1 h1:rT8rxDPsavp9G+4ZULzqhhUSaI/OPsTZNG88Z3i0xvY= @@ -55,10 +49,6 @@ github.com/cloudfoundry/bosh-cli v5.5.1+incompatible h1:a4SP5/+ZlnfrMefIhklrw7Uk github.com/cloudfoundry/bosh-cli v5.5.1+incompatible/go.mod h1:rzIB+e1sn7wQL/TJ54bl/FemPKRhXby5BIMS3tLuWFM= github.com/cloudfoundry/bosh-utils v0.0.0-20180315210917-c6a922e299b8 h1:x6vZOZ7rlvGro4GKDg0DaQz2za8Q6GjhVoB7vH6BZ2I= github.com/cloudfoundry/bosh-utils v0.0.0-20180315210917-c6a922e299b8/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/noaa v2.1.1-0.20190110210640-5ce49363dfa6+incompatible h1:kXzOyUKUpx5VMNXKU5v8I1lGqcdU2DYYCYtBrfILmLI= -github.com/cloudfoundry/noaa v2.1.1-0.20190110210640-5ce49363dfa6+incompatible/go.mod h1:5LmacnptvxzrTvMfL9+EJhgkUfIgcwI61BVSTh47ECo= -github.com/cloudfoundry/sonde-go v0.0.0-20171206171820-b33733203bb4 h1:cWfya7mo/zbnwYVio6eWGsFJHqYw4/k/uhwIJ1eqRPI= -github.com/cloudfoundry/sonde-go v0.0.0-20171206171820-b33733203bb4/go.mod h1:GS0pCHd7onIsewbw8Ue9qa9pZPv2V88cUZDttK6KzgI= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/cppforlife/go-patch v0.1.0 h1:I0fT+gFTSW4xWwvaTaUUVjr9xxjNXJ4naGc01BeQjwY= github.com/cppforlife/go-patch v0.1.0/go.mod h1:67a7aIi94FHDZdoeGSJRRFDp66l9MhaAG1yGxpUoFD8= @@ -72,33 +62,20 @@ github.com/docker/distribution v2.6.0-rc.1.0.20171109224904-e5b5e44386f7+incompa github.com/docker/docker v1.4.2-0.20171120205147-9de84a78d76e h1:M+/1NNHE/mg+RUox/04+rZoahJVklPfs6xZFECVnxso= github.com/docker/docker v1.4.2-0.20171120205147-9de84a78d76e/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/drewolson/testflight v1.0.0/go.mod h1:t9oKuuEohRGLb80SWX+uxJHuhX98B7HnojqtW+Ryq30= -github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d h1:rtM8HsT3NG37YPjz8sYSbUSdElP9lUsQENYzJDZDUBE= -github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/elazarl/goproxy/ext v0.0.0-20200809112317-0581fc3aee2d h1:st1tmvy+4duoRj+RaeeJoECWCWM015fBtf/4aR+hhqk= -github.com/elazarl/goproxy/ext v0.0.0-20200809112317-0581fc3aee2d/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.5.1-0.20170926111411-5df930a27be2 h1:lSx4zNYRd54K1yU6E/Uak9R4GqTMt7L44QU8aT1W3Go= github.com/fatih/color v1.5.1-0.20170926111411-5df930a27be2/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.0 h1:NO5hkcB+srp1x6QmwvNZLeaOgbM8cmBTN32THzjvu2k= -github.com/fsnotify/fsnotify v1.5.0/go.mod h1:BX0DCEr5pT4jm2CnQdVP1lFV521fcCNcyEeNp4DQQDk= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -111,10 +88,7 @@ github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:od github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.2.1-0.20171201014301-b89020ee79b8 h1:bct7UIBzlnefiBVOokxvELF3E2rQcJwdMWQ0MKmu/nY= -github.com/gorilla/websocket v1.2.1-0.20171201014301-b89020ee79b8/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/grpc-gateway v1.14.0 h1:CI8J2kQ4VC2vS3lhVQa+5lMpwCyqyNCAWAPHGMGszQw= github.com/grpc-ecosystem/grpc-gateway v1.14.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= @@ -124,7 +98,6 @@ github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4 h1:xKkUL6QBojw github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -136,12 +109,9 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.0.0-20160504234017-7cafcd837844/go.mod h1:sjUstKUATFIcff4qlB53Kml0wQPtJVc/3fWrmuUmcfA= 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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= @@ -154,7 +124,6 @@ github.com/moby/moby v1.4.2-0.20171120205147-9de84a78d76e h1:6+Fs/ljqCOuJ4Ie4VUB github.com/moby/moby v1.4.2-0.20171120205147-9de84a78d76e/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -163,9 +132,7 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -180,17 +147,13 @@ github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7 github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pivotal-cf/brokerapi/v7 v7.2.0 h1:LL/OS3H2p+K30YG1ppB7Fr1YFQ669My00icLkxYqdwU= github.com/pivotal-cf/brokerapi/v7 v7.2.0/go.mod h1:5QRQ8vJmav91F+AvY5NA/QoDOq70XgBVxXKUK4N/cNE= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/poy/eachers v0.0.0-20181020210610-23942921fe77 h1:SNdqPRvRsVmYR0gKqFvrUKhFizPJ6yDiGQ++VAJIoDg= -github.com/poy/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:x1vqpbcMW9T/KRcQ4b48diSiSVtYgvwQ5xzDByEg4WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f h1:FQZgA673tRGrrXIP/OPMO69g81ow4XsKlN/DLH8pSic= github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= @@ -205,8 +168,8 @@ github.com/square/certstrap v1.2.0/go.mod h1:CUHqV+fxJW0Y5UQFnnbYwQ7bpKXO1AKbic9 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00 h1:mujcChM89zOHwgZBBNr5WZ77mBXP1yR+gLThGCYZgAg= github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= @@ -225,8 +188,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -235,7 +196,6 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -252,10 +212,8 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/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-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -280,8 +238,6 @@ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -289,24 +245,17 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -315,13 +264,11 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200609164405-eb789aa7ce50/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e h1:4nW4NLDYnU28ojHaHO8OVxFHk/aQ33U01a9cjED+pzE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From f35afe012e38f50875154cfd1370910336adb7fa Mon Sep 17 00:00:00 2001 From: Merric de Launey Date: Tue, 26 Oct 2021 23:37:53 +0000 Subject: [PATCH 05/24] Cf space-users now lists space supporters fixes #2219 [finishes #179982523] Authored-by: Merric de Launey --- command/v7/space_users_command.go | 1 + command/v7/space_users_command_test.go | 9 +++++++++ integration/v7/isolated/space_users_command_test.go | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/command/v7/space_users_command.go b/command/v7/space_users_command.go index 9ab01a0c8cc..255791cded4 100644 --- a/command/v7/space_users_command.go +++ b/command/v7/space_users_command.go @@ -58,6 +58,7 @@ func (cmd *SpaceUsersCommand) Execute(args []string) error { func (cmd SpaceUsersCommand) displaySpaceUsers(orgUsersByRoleType map[constant.RoleType][]resources.User) { cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceManagerRole], "SPACE MANAGER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceDeveloperRole], "SPACE DEVELOPER") + cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceSupporterRole], "SPACE SUPPORTER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceAuditorRole], "SPACE AUDITOR") } diff --git a/command/v7/space_users_command_test.go b/command/v7/space_users_command_test.go index 1d637378865..f3bb3d530ea 100644 --- a/command/v7/space_users_command_test.go +++ b/command/v7/space_users_command_test.go @@ -167,6 +167,11 @@ var _ = Describe("space-users Command", func() { PresentationName: "billing-manager", GUID: "spaceDeveloper-guid", } + spaceSupporter := resources.User{ + Origin: "uaa", + PresentationName: "fred", + GUID: "spaceSupporter-guid", + } spaceAuditor := resources.User{ Origin: "uaa", PresentationName: "org-auditor", @@ -176,6 +181,7 @@ var _ = Describe("space-users Command", func() { spaceUsersByRole := map[constant.RoleType][]resources.User{ constant.SpaceManagerRole: {uaaAdmin, ldapAdmin, abbyUser, client}, constant.SpaceDeveloperRole: {spaceDeveloper}, + constant.SpaceSupporterRole: {spaceSupporter}, constant.SpaceAuditorRole: {spaceAuditor}, } @@ -199,6 +205,9 @@ var _ = Describe("space-users Command", func() { Expect(testUI.Out).To(Say(`\nSPACE DEVELOPER`)) Expect(testUI.Out).To(Say(`\n billing-manager \(uaa\)`)) Expect(testUI.Out).To(Say(`\n`)) + Expect(testUI.Out).To(Say(`\nSPACE SUPPORTER`)) + Expect(testUI.Out).To(Say(`\n fred \(uaa\)`)) + Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`\nSPACE AUDITOR`)) Expect(testUI.Out).To(Say(`\n org-auditor \(uaa\)`)) diff --git a/integration/v7/isolated/space_users_command_test.go b/integration/v7/isolated/space_users_command_test.go index c81293d4428..9a2a6f85b96 100644 --- a/integration/v7/isolated/space_users_command_test.go +++ b/integration/v7/isolated/space_users_command_test.go @@ -45,12 +45,14 @@ var _ = Describe("space-users command", func() { var ( spaceManagerUser string spaceDeveloperUser string + spaceSupporterUser string spaceAuditorUser1 string ) BeforeEach(func() { spaceManagerUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceManager") spaceDeveloperUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceDeveloper") + spaceSupporterUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceSupporter") spaceAuditorUser1, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceAuditor") }) @@ -61,6 +63,8 @@ var _ = Describe("space-users command", func() { Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceManagerUser)) Eventually(session).Should(Say("SPACE DEVELOPER")) Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceDeveloperUser)) + Eventually(session).Should(Say("SPACE SUPPORTER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceSupporterUser)) Eventually(session).Should(Say("SPACE AUDITOR")) Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceAuditorUser1)) Eventually(session).Should(Exit(0)) From 950da16e784ae79de52216bac9d0ddb6cecc7320 Mon Sep 17 00:00:00 2001 From: Sarah Weinstein Date: Thu, 28 Oct 2021 22:31:50 +0000 Subject: [PATCH 06/24] Revert "Cf space-users now lists space supporters" This is breaking the pipieline because the tests run on a version of capi that does not support space supporters. [#179982523] This reverts commit f35afe012e38f50875154cfd1370910336adb7fa. --- command/v7/space_users_command.go | 1 - command/v7/space_users_command_test.go | 9 --------- integration/v7/isolated/space_users_command_test.go | 4 ---- 3 files changed, 14 deletions(-) diff --git a/command/v7/space_users_command.go b/command/v7/space_users_command.go index 255791cded4..9ab01a0c8cc 100644 --- a/command/v7/space_users_command.go +++ b/command/v7/space_users_command.go @@ -58,7 +58,6 @@ func (cmd *SpaceUsersCommand) Execute(args []string) error { func (cmd SpaceUsersCommand) displaySpaceUsers(orgUsersByRoleType map[constant.RoleType][]resources.User) { cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceManagerRole], "SPACE MANAGER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceDeveloperRole], "SPACE DEVELOPER") - cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceSupporterRole], "SPACE SUPPORTER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceAuditorRole], "SPACE AUDITOR") } diff --git a/command/v7/space_users_command_test.go b/command/v7/space_users_command_test.go index f3bb3d530ea..1d637378865 100644 --- a/command/v7/space_users_command_test.go +++ b/command/v7/space_users_command_test.go @@ -167,11 +167,6 @@ var _ = Describe("space-users Command", func() { PresentationName: "billing-manager", GUID: "spaceDeveloper-guid", } - spaceSupporter := resources.User{ - Origin: "uaa", - PresentationName: "fred", - GUID: "spaceSupporter-guid", - } spaceAuditor := resources.User{ Origin: "uaa", PresentationName: "org-auditor", @@ -181,7 +176,6 @@ var _ = Describe("space-users Command", func() { spaceUsersByRole := map[constant.RoleType][]resources.User{ constant.SpaceManagerRole: {uaaAdmin, ldapAdmin, abbyUser, client}, constant.SpaceDeveloperRole: {spaceDeveloper}, - constant.SpaceSupporterRole: {spaceSupporter}, constant.SpaceAuditorRole: {spaceAuditor}, } @@ -205,9 +199,6 @@ var _ = Describe("space-users Command", func() { Expect(testUI.Out).To(Say(`\nSPACE DEVELOPER`)) Expect(testUI.Out).To(Say(`\n billing-manager \(uaa\)`)) Expect(testUI.Out).To(Say(`\n`)) - Expect(testUI.Out).To(Say(`\nSPACE SUPPORTER`)) - Expect(testUI.Out).To(Say(`\n fred \(uaa\)`)) - Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`\nSPACE AUDITOR`)) Expect(testUI.Out).To(Say(`\n org-auditor \(uaa\)`)) diff --git a/integration/v7/isolated/space_users_command_test.go b/integration/v7/isolated/space_users_command_test.go index 9a2a6f85b96..c81293d4428 100644 --- a/integration/v7/isolated/space_users_command_test.go +++ b/integration/v7/isolated/space_users_command_test.go @@ -45,14 +45,12 @@ var _ = Describe("space-users command", func() { var ( spaceManagerUser string spaceDeveloperUser string - spaceSupporterUser string spaceAuditorUser1 string ) BeforeEach(func() { spaceManagerUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceManager") spaceDeveloperUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceDeveloper") - spaceSupporterUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceSupporter") spaceAuditorUser1, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceAuditor") }) @@ -63,8 +61,6 @@ var _ = Describe("space-users command", func() { Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceManagerUser)) Eventually(session).Should(Say("SPACE DEVELOPER")) Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceDeveloperUser)) - Eventually(session).Should(Say("SPACE SUPPORTER")) - Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceSupporterUser)) Eventually(session).Should(Say("SPACE AUDITOR")) Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceAuditorUser1)) Eventually(session).Should(Exit(0)) From 96d41376128f7f2a8235e13105a57d62f52677a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Tue, 9 Nov 2021 11:00:36 -0500 Subject: [PATCH 07/24] [Bugfix] CF security-groups returns 414 error (#2229) Implementing batcher in `cf security-group` command Co-authored-by: Sebastian Gil --- actor/v7action/security_group.go | 24 ++++++---- actor/v7action/security_group_test.go | 66 +++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/actor/v7action/security_group.go b/actor/v7action/security_group.go index 04f567003cc..73099a307ee 100644 --- a/actor/v7action/security_group.go +++ b/actor/v7action/security_group.go @@ -10,6 +10,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/batcher" "code.cloudfoundry.org/cli/util/lookuptable" ) @@ -323,16 +324,23 @@ func getSecurityGroupSpaces(actor Actor, stagingSpaceGUIDs []string, runningSpac associatedSpaceGuids = append(associatedSpaceGuids, stagingSpaceGUIDs...) var securityGroupSpaces []SecurityGroupSpace + var spaces []resources.Space + var includes ccv3.IncludedResources + if len(associatedSpaceGuids) > 0 { - spaces, includes, newWarnings, err := actor.CloudControllerClient.GetSpaces(ccv3.Query{ - Key: ccv3.GUIDFilter, - Values: associatedSpaceGuids, - }, ccv3.Query{ - Key: ccv3.Include, - Values: []string{"organization"}, + ccv3Warnings, err := batcher.RequestByGUID(associatedSpaceGuids, func(guids []string) (ccv3.Warnings, error) { + batchSpaces, batchIncludes, newWarnings, err := actor.CloudControllerClient.GetSpaces(ccv3.Query{ + Key: ccv3.GUIDFilter, + Values: guids, + }, ccv3.Query{ + Key: ccv3.Include, + Values: []string{"organization"}, + }) + spaces = append(spaces, batchSpaces...) + includes.Organizations = append(includes.Organizations, batchIncludes.Organizations...) + return newWarnings, err }) - - warnings = newWarnings + warnings = ccv3Warnings if err != nil { return securityGroupSpaces, warnings, err } diff --git a/actor/v7action/security_group_test.go b/actor/v7action/security_group_test.go index f17aba80d58..02aa8f691d6 100644 --- a/actor/v7action/security_group_test.go +++ b/actor/v7action/security_group_test.go @@ -14,6 +14,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/batcher" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -639,7 +640,72 @@ var _ = Describe("Security Group Actions", func() { Expect(executeErr).To(MatchError(expectedError)) }) }) + }) + When("there are many spaces associated", func() { + const batches = 10 + JustBeforeEach(func() { + securityGroupSummaries, _, _ = actor.GetSecurityGroups() + }) + BeforeEach(func() { + var ( + securityGroups []resources.SecurityGroup + manySpaces []resources.Space + manySpacesGUIDs []string + ) + + for i := 0; i < batcher.BatchSize*batches; i++ { + guid := fmt.Sprintf("some-space-guid-%d", i) + manySpaces = append(manySpaces, resources.Space{ + Name: fmt.Sprintf("some-space-%d", i), + GUID: guid, + Relationships: resources.Relationships{ + constant.RelationshipTypeOrganization: resources.Relationship{GUID: "org-guid-1"}, + }, + }) + manySpacesGUIDs = append(manySpacesGUIDs, guid) + } + + securityGroups = append(securityGroups, resources.SecurityGroup{ + GUID: "some-security-group-guid-1", + Name: "some-security-group-1", + Rules: []resources.Rule{{ + Destination: "127.0.0.1", + Description: &description, + Ports: &port, + Protocol: "tcp", + }}, + RunningGloballyEnabled: &trueVal, + StagingGloballyEnabled: &falseVal, + RunningSpaceGUIDs: manySpacesGUIDs, + }) + + for b := 0; b < batches; b++ { + fakeCloudControllerClient.GetSpacesReturns( + manySpaces[:batcher.BatchSize], + ccv3.IncludedResources{ + Organizations: []resources.Organization{{GUID: "some-org-guid"}}, + }, + ccv3.Warnings{"get-spaces-warnings"}, + nil, + ) + manySpaces = manySpaces[batcher.BatchSize:] + } + fakeCloudControllerClient.GetSecurityGroupsReturns( + securityGroups, + ccv3.Warnings{"get-spaces-warnings"}, + nil, + ) + }) + + It("makes mutiple calls to get spaces", func() { + Expect(len(securityGroupSummaries)).To(Equal(1)) + Expect(fakeCloudControllerClient.GetSpacesCallCount()).To(Equal(batches)) + Expect(fakeCloudControllerClient.GetSpacesArgsForCall(0)). + NotTo(Equal(fakeCloudControllerClient.GetSpacesArgsForCall(1))) + }) + }) + }) Describe("GetSecurityGroup", func() { From bbc9ee965e8d8f5e9f1b23072cee50d43112f8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Wed, 10 Nov 2021 15:51:24 -0500 Subject: [PATCH 08/24] [Feature] support HTTP/2 cf command (#2230) [reason] Renaming "protocol" column to "app-protocol" in the destination table of the cf route command Co-authored-by: Hector Calderon --- command/v7/route_command.go | 2 +- command/v7/route_command_test.go | 2 +- integration/v7/isolated/route_command_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/command/v7/route_command.go b/command/v7/route_command.go index 5c89398e8ff..86dbc69ba6b 100644 --- a/command/v7/route_command.go +++ b/command/v7/route_command.go @@ -116,7 +116,7 @@ func (cmd RouteCommand) displayDestinations(route resources.Route, appMap map[st cmd.UI.TranslateText("app"), cmd.UI.TranslateText("process"), cmd.UI.TranslateText("port"), - cmd.UI.TranslateText("protocol"), + cmd.UI.TranslateText("app-protocol"), }, } diff --git a/command/v7/route_command_test.go b/command/v7/route_command_test.go index 2d616beafb4..d209c055bac 100644 --- a/command/v7/route_command_test.go +++ b/command/v7/route_command_test.go @@ -220,7 +220,7 @@ var _ = Describe("route Command", func() { Expect(testUI.Out).To(Say(`protocol:\s+http`)) Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`Destinations:`)) - Expect(testUI.Out).To(Say(`\s+app\s+process\s+port\s+protocol`)) + Expect(testUI.Out).To(Say(`\s+app\s+process\s+port\s+app-protocol`)) Expect(testUI.Out).To(Say(`\s+app-name\s+web\s+8080\s+http1`)) Expect(testUI.Out).To(Say(`\s+other-app-name\s+web\s+1337\s+http2`)) diff --git a/integration/v7/isolated/route_command_test.go b/integration/v7/isolated/route_command_test.go index 4e8d109d2fc..85d50275c44 100644 --- a/integration/v7/isolated/route_command_test.go +++ b/integration/v7/isolated/route_command_test.go @@ -119,7 +119,7 @@ var _ = Describe("route command", func() { Eventually(session).Should(Say(`protocol:\s+http`)) Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`Destinations:`)) - Eventually(session).Should(Say(`\s+app\s+process\s+port\s+protocol`)) + Eventually(session).Should(Say(`\s+app\s+process\s+port\s+app-protocol`)) Eventually(session).Should(Exit(0)) }) @@ -167,7 +167,7 @@ var _ = Describe("route command", func() { Eventually(session).Should(Say(`protocol:\s+tcp`)) Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`Destinations:`)) - Eventually(session).Should(Say(`\s+app\s+process\s+port\s+protocol`)) + Eventually(session).Should(Say(`\s+app\s+process\s+port\s+app-protocol`)) Eventually(session).Should(Exit(0)) }) From c80d8c15c8afcb38534880ac439dfc26225ba3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Fri, 12 Nov 2021 14:45:50 -0500 Subject: [PATCH 09/24] [Feature] Rename flag to app-protocol in map-route (#2231) Currently the cli already has a flag named destination-protocol and in order to have consistency we need to rename it to app-protocol Co-authored-by: Hector Calderon --- command/v7/map_route_command.go | 20 ++++++++-------- command/v7/map_route_command_test.go | 24 +++++++++---------- .../v7/isolated/map_route_command_test.go | 10 ++++---- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/command/v7/map_route_command.go b/command/v7/map_route_command.go index 4224b40741c..fbeba5b12ed 100644 --- a/command/v7/map_route_command.go +++ b/command/v7/map_route_command.go @@ -8,11 +8,11 @@ import ( type MapRouteCommand struct { BaseCommand - RequiredArgs flag.AppDomain `positional-args:"yes"` - Hostname string `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"` - Path flag.V7RoutePath `long:"path" description:"Path for the HTTP route"` - Port int `long:"port" description:"Port for the TCP route (default: random port)"` - DestinationProtocol string `long:"destination-protocol" description:"[Beta flag, subject to change] Protocol for the route destination (default: http1). Only applied to HTTP routes"` + RequiredArgs flag.AppDomain `positional-args:"yes"` + Hostname string `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"` + Path flag.V7RoutePath `long:"path" description:"Path for the HTTP route"` + Port int `long:"port" description:"Port for the TCP route (default: random port)"` + AppProtocol string `long:"app-protocol" description:"[Beta flag, subject to change] Protocol for the route destination (default: http1). Only applied to HTTP routes"` relatedCommands interface{} `related_commands:"create-route, routes, unmap-route"` } @@ -20,7 +20,7 @@ type MapRouteCommand struct { func (cmd MapRouteCommand) Usage() string { return ` Map an HTTP route: - CF_NAME map-route APP_NAME DOMAIN [--hostname HOSTNAME] [--path PATH] [--destination-protocol PROTOCOL] + CF_NAME map-route APP_NAME DOMAIN [--hostname HOSTNAME] [--path PATH] [--app-protocol PROTOCOL] Map a TCP route: CF_NAME map-route APP_NAME DOMAIN [--port PORT]` @@ -31,7 +31,7 @@ func (cmd MapRouteCommand) Examples() string { CF_NAME map-route my-app example.com # example.com CF_NAME map-route my-app example.com --hostname myhost # myhost.example.com CF_NAME map-route my-app example.com --hostname myhost --path foo # myhost.example.com/foo -CF_NAME map-route my-app example.com --hostname myhost --destination-protocol http2 # myhost.example.com +CF_NAME map-route my-app example.com --hostname myhost --app-protocol http2 # myhost.example.com CF_NAME map-route my-app example.com --port 5000 # example.com:5000` } @@ -88,14 +88,14 @@ func (cmd MapRouteCommand) Execute(args []string) error { cmd.UI.DisplayOK() } - if cmd.DestinationProtocol != "" { + if cmd.AppProtocol != "" { cmd.UI.DisplayTextWithFlavor("Mapping route {{.URL}} to app {{.AppName}} with protocol {{.Protocol}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", map[string]interface{}{ "URL": route.URL, "AppName": cmd.RequiredArgs.App, "User": user.Name, "SpaceName": cmd.Config.TargetedSpace().Name, "OrgName": cmd.Config.TargetedOrganization().Name, - "Protocol": cmd.DestinationProtocol, + "Protocol": cmd.AppProtocol, }) } else { @@ -121,7 +121,7 @@ func (cmd MapRouteCommand) Execute(args []string) error { cmd.UI.DisplayOK() return nil } - warnings, err = cmd.Actor.MapRoute(route.GUID, app.GUID, cmd.DestinationProtocol) + warnings, err = cmd.Actor.MapRoute(route.GUID, app.GUID, cmd.AppProtocol) cmd.UI.DisplayWarnings(warnings) if err != nil { return err diff --git a/command/v7/map_route_command_test.go b/command/v7/map_route_command_test.go index 00e8154a7a8..6cef92a3f7f 100644 --- a/command/v7/map_route_command_test.go +++ b/command/v7/map_route_command_test.go @@ -53,10 +53,10 @@ var _ = Describe("map-route Command", func() { spaceGUID = "some-space-guid" cmd = MapRouteCommand{ - RequiredArgs: flag.AppDomain{App: appName, Domain: domain}, - Hostname: hostname, - Path: flag.V7RoutePath{Path: path}, - DestinationProtocol: "http2", + RequiredArgs: flag.AppDomain{App: appName, Domain: domain}, + Hostname: hostname, + Path: flag.V7RoutePath{Path: path}, + AppProtocol: "http2", BaseCommand: BaseCommand{ UI: testUI, Config: fakeConfig, @@ -372,10 +372,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) @@ -411,10 +411,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) }) @@ -534,10 +534,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) @@ -573,10 +573,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) }) diff --git a/integration/v7/isolated/map_route_command_test.go b/integration/v7/isolated/map_route_command_test.go index ea734b65fb9..3aaec9b04e5 100644 --- a/integration/v7/isolated/map_route_command_test.go +++ b/integration/v7/isolated/map_route_command_test.go @@ -29,7 +29,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`USAGE:`)) Eventually(session).Should(Say(`Map an HTTP route:\n`)) - Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--hostname HOSTNAME\] \[--path PATH\] \[--destination-protocol PROTOCOL\]\n`)) + Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--hostname HOSTNAME\] \[--path PATH\] \[--app-protocol PROTOCOL\]\n`)) Eventually(session).Should(Say(`Map a TCP route:\n`)) Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--port PORT]\n`)) Eventually(session).Should(Say(`\n`)) @@ -38,7 +38,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`cf map-route my-app example.com # example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost # myhost.example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --path foo # myhost.example.com/foo`)) - Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --destination-protocol http2 # myhost.example.com`)) + Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --app-protocol http2 # myhost.example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --port 5000 # example.com:5000`)) Eventually(session).Should(Say(`\n`)) @@ -46,7 +46,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`--hostname, -n\s+Hostname for the HTTP route \(required for shared domains\)`)) Eventually(session).Should(Say(`--path\s+Path for the HTTP route`)) Eventually(session).Should(Say(`--port\s+Port for the TCP route \(default: random port\)`)) - Eventually(session).Should(Say(`--destination-protocol\s+\[Beta flag, subject to change\] Protocol for the route destination \(default: http1\). Only applied to HTTP routes`)) + Eventually(session).Should(Say(`--app-protocol\s+\[Beta flag, subject to change\] Protocol for the route destination \(default: http1\). Only applied to HTTP routes`)) Eventually(session).Should(Say(`\n`)) @@ -133,7 +133,7 @@ var _ = Describe("map-route command", func() { }) It("maps the route to an app", func() { - session := helpers.CF("map-route", appName, domainName, "--hostname", route.Host, "--destination-protocol", "http2") + session := helpers.CF("map-route", appName, domainName, "--hostname", route.Host, "--app-protocol", "http2") Eventually(session).Should(Say(`Mapping route %s.%s to app %s with protocol http2 in org %s / space %s as %s\.\.\.`, hostName, domainName, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`OK`)) @@ -227,7 +227,7 @@ var _ = Describe("map-route command", func() { }) It("maps the route to an app", func() { - session := helpers.CF("map-route", appName, domainName, "--hostname", hostName, "--destination-protocol", "http2") + session := helpers.CF("map-route", appName, domainName, "--hostname", hostName, "--app-protocol", "http2") Eventually(session).Should(Say(`Creating route %s.%s for org %s / space %s as %s\.\.\.`, hostName, domainName, orgName, spaceName, userName)) Eventually(session).Should(Say(`OK`)) Eventually(session).Should(Say(`Mapping route %s.%s to app %s with protocol http2 in org %s / space %s as %s\.\.\.`, hostName, domainName, appName, orgName, spaceName, userName)) From a45d9af311355243e9ed695a5860d5adf2ebc59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Mon, 22 Nov 2021 17:30:51 -0500 Subject: [PATCH 10/24] [Feature] Add app-protocol to cf routes command output (#2234) Currently we do not show the app-protocol in the output of the cf routes command, so a new column must be added to the output. Also, the apps mapped to the route should be displayed in the apps column and must be separated with commas. Co-authored-by: Hector Calderon --- actor/v7action/route.go | 13 +++ actor/v7action/route_test.go | 20 ++++- command/v7/routes_command.go | 2 + command/v7/routes_command_test.go | 29 +++++-- integration/helpers/version.go | 6 +- .../v7/isolated/routes_command_test.go | 85 +++++++++++++++---- 6 files changed, 126 insertions(+), 29 deletions(-) diff --git a/actor/v7action/route.go b/actor/v7action/route.go index 14bde2bf456..d59c318c61f 100644 --- a/actor/v7action/route.go +++ b/actor/v7action/route.go @@ -20,6 +20,7 @@ import ( type RouteSummary struct { resources.Route AppNames []string + AppProtocols []string DomainName string SpaceName string ServiceInstanceName string @@ -275,13 +276,25 @@ func (actor Actor) GetRouteSummaries(routes []resources.Route) ([]RouteSummary, for _, route := range routes { var appNames []string + protocolSet := map[string]bool{} for _, destination := range route.Destinations { appNames = append(appNames, appNamesByGUID[destination.App.GUID]) + protocolSet[destination.Protocol] = true + } + + var appProtocols []string + if len(protocolSet) > 0 { + appProtocols = make([]string, 0, len(protocolSet)) + for key := range protocolSet { + appProtocols = append(appProtocols, key) + } + sort.Strings(appProtocols) } routeSummaries = append(routeSummaries, RouteSummary{ Route: route, AppNames: appNames, + AppProtocols: appProtocols, SpaceName: spaceNamesByGUID[route.SpaceGUID], DomainName: getDomainName(route.URL, route.Host, route.Path, route.Port), ServiceInstanceName: serviceInstanceNameByRouteGUID[route.GUID], diff --git a/actor/v7action/route_test.go b/actor/v7action/route_test.go index 01eafeca46a..064b1863761 100644 --- a/actor/v7action/route_test.go +++ b/actor/v7action/route_test.go @@ -677,6 +677,7 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: "app-guid-1", }, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -692,11 +693,13 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: "app-guid-1", }, + Protocol: "http2", }, { App: resources.RouteDestinationApp{ GUID: "app-guid-2", }, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -797,7 +800,8 @@ var _ = Describe("Route Actions", func() { GUID: "route-guid-1", Destinations: []resources.RouteDestination{ { - App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -807,6 +811,7 @@ var _ = Describe("Route Actions", func() { Port: 1, }, AppNames: []string{"app-name-1"}, + AppProtocols: []string{"http1"}, DomainName: "fake-url-1/fake-path-1", SpaceName: "fake-space-1", ServiceInstanceName: "foo", @@ -816,10 +821,12 @@ var _ = Describe("Route Actions", func() { GUID: "route-guid-2", Destinations: []resources.RouteDestination{ { - App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + Protocol: "http2", }, { - App: resources.RouteDestinationApp{GUID: "app-guid-2"}, + App: resources.RouteDestinationApp{GUID: "app-guid-2"}, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -829,6 +836,7 @@ var _ = Describe("Route Actions", func() { Port: 2, }, AppNames: []string{"app-name-1", "app-name-2"}, + AppProtocols: []string{"http1", "http2"}, DomainName: "fake-url-2/fake-path-2", SpaceName: "fake-space-1", ServiceInstanceName: "bar", @@ -928,6 +936,10 @@ var _ = Describe("Route Actions", func() { for i := 0; i < batcher.BatchSize*batches; i++ { port := i + 1000 + appProtocol := "http1" + if i%2 == 0 { + appProtocol = "http2" + } route := resources.Route{ GUID: fmt.Sprintf("route-guid-%d", i), Destinations: []resources.RouteDestination{ @@ -935,6 +947,7 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: fmt.Sprintf("fake-app-guid-%d", i), }, + Protocol: appProtocol, }, }, SpaceGUID: fmt.Sprintf("fake-space-guid-%d", i), @@ -968,6 +981,7 @@ var _ = Describe("Route Actions", func() { manyResults = append(manyResults, RouteSummary{ Route: route, + AppProtocols: []string{appProtocol}, AppNames: []string{fmt.Sprintf("fake-app-name-%d", i)}, DomainName: fmt.Sprintf("fake-url-%d/fake-path-%d", i, i), SpaceName: fmt.Sprintf("fake-space-name-%d", i), diff --git a/command/v7/routes_command.go b/command/v7/routes_command.go index e0c2fd8a0f4..4bbb3ac0120 100644 --- a/command/v7/routes_command.go +++ b/command/v7/routes_command.go @@ -82,6 +82,7 @@ func (cmd RoutesCommand) displayRoutesTable(routeSummaries []v7action.RouteSumma cmd.UI.TranslateText("port"), cmd.UI.TranslateText("path"), cmd.UI.TranslateText("protocol"), + cmd.UI.TranslateText("app-protocol"), cmd.UI.TranslateText("apps"), cmd.UI.TranslateText("service instance"), }, @@ -99,6 +100,7 @@ func (cmd RoutesCommand) displayRoutesTable(routeSummaries []v7action.RouteSumma port, routeSummary.Path, routeSummary.Protocol, + strings.Join(routeSummary.AppProtocols, ", "), strings.Join(routeSummary.AppNames, ", "), routeSummary.ServiceInstanceName, }) diff --git a/command/v7/routes_command_test.go b/command/v7/routes_command_test.go index 9b7699124f1..ad012886b60 100644 --- a/command/v7/routes_command_test.go +++ b/command/v7/routes_command_test.go @@ -29,7 +29,7 @@ var _ = Describe("routes Command", func() { binaryName string ) - const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance` + const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+app-protocol\s+apps\s+service instance` BeforeEach(func() { testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) @@ -144,10 +144,16 @@ var _ = Describe("routes Command", func() { Route: resources.Route{GUID: "route-guid-2", Host: "host-3", Path: "/path/2"}, }, { - DomainName: "domain3", - SpaceName: "space-3", - Route: resources.Route{GUID: "route-guid-3", Host: "host-1"}, + DomainName: "domain3", + SpaceName: "space-3", + Route: resources.Route{GUID: "route-guid-3", Host: "host-1", + Destinations: []resources.RouteDestination{ + {GUID: "app1-guid", Protocol: "http1"}, + {GUID: "app2-guid", Protocol: "http2"}, + }, + }, AppNames: []string{"app1", "app2"}, + AppProtocols: []string{"http1", "http2"}, ServiceInstanceName: "si-3", }, { @@ -156,6 +162,18 @@ var _ = Describe("routes Command", func() { Route: resources.Route{GUID: "route-guid-3", Port: 1024}, AppNames: []string{"app1", "app2"}, }, + { + DomainName: "domain4", + SpaceName: "space-3", + Route: resources.Route{GUID: "route-guid-3", Port: 1024, + Destinations: []resources.RouteDestination{ + {GUID: "app1-guid", Protocol: "http1"}, + {GUID: "app2-guid", Protocol: "http1"}, + }, + }, + AppNames: []string{"app1", "app2"}, + AppProtocols: []string{"http1"}, + }, } fakeActor.GetRouteSummariesReturns( @@ -174,8 +192,9 @@ var _ = Describe("routes Command", func() { Expect(testUI.Out).To(Say(tableHeaders)) Expect(testUI.Out).To(Say(`space-1\s+domain1\s+si-1\s+`)) Expect(testUI.Out).To(Say(`space-2\s+host-3\s+domain2\s+\/path\/2`)) - Expect(testUI.Out).To(Say(`space-3\s+host-1\s+domain3\s+app1, app2\s+si-3`)) + Expect(testUI.Out).To(Say(`space-3\s+host-1\s+domain3\s+http1, http2\s+app1, app2\s+si-3`)) Expect(testUI.Out).To(Say(`space-3\s+tcp\.domain\s+1024\s+app1, app2`)) + Expect(testUI.Out).To(Say(`space-3\s+domain4\s+1024\s+http1\s+app1, app2`)) }) }) diff --git a/integration/helpers/version.go b/integration/helpers/version.go index 57297bec1aa..bf9dd585711 100644 --- a/integration/helpers/version.go +++ b/integration/helpers/version.go @@ -87,11 +87,11 @@ func SkipIfUAAVersionAtLeast(version string) { } func matchMajorAPIVersion(minVersion string) string { - version := GetAPIVersionV2() if strings.HasPrefix(minVersion, "3") { - version = getAPIVersionV3() + return getAPIVersionV3() + } else { + return GetAPIVersionV2() } - return version } // GetAPIVersionV2 returns the V2 api version of the targeted API diff --git a/integration/v7/isolated/routes_command_test.go b/integration/v7/isolated/routes_command_test.go index fc2e70450c0..73813867368 100644 --- a/integration/v7/isolated/routes_command_test.go +++ b/integration/v7/isolated/routes_command_test.go @@ -1,6 +1,9 @@ package isolated import ( + "fmt" + + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" "code.cloudfoundry.org/cli/integration/helpers" @@ -11,6 +14,9 @@ import ( ) var _ = Describe("routes command", func() { + + appProtocolValue := "http1" + const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+app-protocol\s+apps\s+service instance` Context("Help", func() { It("appears in cf help -a", func() { session := helpers.CF("help", "-a") @@ -60,6 +66,10 @@ var _ = Describe("routes command", func() { helpers.SetupCF(orgName, spaceName) userName, _ = helpers.GetCredentials() + if !helpers.IsVersionMet(ccversion.MinVersionHTTP2RoutingV3) { + appProtocolValue = "" + } + }) AfterEach(func() { @@ -110,38 +120,77 @@ var _ = Describe("routes command", func() { It("lists all the routes", func() { session := helpers.CF("routes") Eventually(session).Should(Exit(0)) - Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Expect(session).To(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName2)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).To(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName2)) }) It("lists all the routes by label", func() { session := helpers.CF("routes", "--labels", "env in (prod)") Eventually(session).Should(Exit(0)) Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Expect(session).ToNot(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Expect(session).ToNot(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName2)) + Expect(session).To(Say(tableHeaders)) + Expect(session).ToNot(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).ToNot(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName2)) }) When("fetching routes by org", func() { It("lists all the routes in the org", func() { session := helpers.CF("routes", "--org-level") - Eventually(session).Should(Say(`Getting routes for org %s as %s\.\.\.`, orgName, userName)) - Eventually(session).Should(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Eventually(session).Should(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Eventually(session).Should(Say(`%s\s+route2\s+%s\s+\/dodo\s+http\s+%s\s+\n`, otherSpaceName, domainName, appName2)) Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s as %s\.\.\.`, orgName, userName)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).To(Say(`%s\s+route2\s+%s\s+\/dodo\s+http\s+%s\s+%s\s+\n`, otherSpaceName, domainName, appProtocolValue, appName2)) }) }) }) + When("http1 and http2 routes exist", func() { + var ( + domainName string + domain helpers.Domain + ) + + BeforeEach(func() { + helpers.SkipIfVersionLessThan(ccversion.MinVersionHTTP2RoutingV3) + domainName = helpers.NewDomainName() + + domain = helpers.NewDomain(orgName, domainName) + + appName1 = helpers.NewAppName() + Eventually(helpers.CF("create-app", appName1)).Should(Exit(0)) + appName2 = helpers.NewAppName() + Eventually(helpers.CF("create-app", appName2)).Should(Exit(0)) + + domain.CreatePrivate() + + Eventually(helpers.CF("map-route", appName1, domainName, "--hostname", "route1")).Should(Exit(0)) + Eventually(helpers.CF("map-route", appName2, domainName, "--hostname", "route2")).Should(Exit(0)) + Eventually(helpers.CF("map-route", appName2, domainName, "--hostname", "route1", "--app-protocol", "http2")).Should(Exit(0)) + + helpers.SetupCF(orgName, spaceName) + }) + + AfterEach(func() { + domain.Delete() + }) + + It("lists all the routes", func() { + session := helpers.CF("routes") + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+http1, http2\s+%s\s+\n`, spaceName, domainName, fmt.Sprintf("%s, %s", appName1, appName2))) + Expect(session).To(Say(`%s\s+route2\s+%s\s+http\s+http1\s+%s\s+\n`, spaceName, domainName, appName2)) + }) + }) + When("when shared tcp routes exist", func() { var ( domainName string @@ -174,7 +223,7 @@ var _ = Describe("routes command", func() { Eventually(session).Should(Exit(0)) Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps`)) + Expect(session).To(Say(tableHeaders)) Expect(session).To(Say(`%s\s+%s[^:]\s+%d\s+tcp`, spaceName, domainName, 1028)) }) }) @@ -182,9 +231,9 @@ var _ = Describe("routes command", func() { When("no routes exist", func() { It("outputs a message about no routes existing", func() { session := helpers.CF("routes") - Eventually(session).Should(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Eventually(session).Should(Say("No routes found")) Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) + Expect(session).To(Say("No routes found")) }) }) }) From de37cbef85ee1c8464d5ba626f00c9d2b8309179 Mon Sep 17 00:00:00 2001 From: Giuseppe Capizzi Date: Tue, 23 Nov 2021 22:05:35 +0100 Subject: [PATCH 11/24] Introduce CF-on-K8s support (#2233) * Detect CF-on-K8s in `cf api` * Unpin protobuf * Implement `cf login` for CF-on-K8s * Use the latest cloudfoundry/go-log-cache * Introduce a `ConnectionWrapper` for Kubernetes * Refactor the creation of the wrapped CC client * Support Kubernetes inline client certificates * Support Kubernetes client certificates of any kind * Test Kubernetes exec plugins * Support inline and filepath Kubernetes tokens * Clear the Kubernetes auth information in `cf api` * Clear the Kubernetes auth information in `cf api --unset` * Clear the Kubernetes auth information in `cf logout` * Use the real Kubernetes username when creating a space role * Use the real Kubernetes username everywhere Co-authored-by: Giuseppe Capizzi Co-authored-by: Danail Branekov Co-authored-by: Georgi Sabev Co-authored-by: Kieron Browne Co-authored-by: Mario Nitchev --- Makefile | 8 +- actor/sharedaction/actor.go | 13 +- actor/sharedaction/auth.go | 31 ++ actor/sharedaction/auth_test.go | 106 ++++ actor/sharedaction/config.go | 1 + actor/sharedaction/is_logged_in.go | 6 - actor/sharedaction/is_logged_in_test.go | 62 --- actor/sharedaction/log_cache_client.go | 2 +- actor/sharedaction/logging.go | 2 +- actor/sharedaction/logging_test.go | 2 +- .../sharedactionfakes/fake_config.go | 64 +++ .../fake_log_cache_client.go | 2 +- actor/v7action/actor.go | 17 + actor/v7action/auth.go | 40 +- actor/v7action/auth_test.go | 39 +- actor/v7action/cloud_controller_client.go | 1 + actor/v7action/config.go | 3 + actor/v7action/droplet_test.go | 4 +- actor/v7action/k8s_auth.go | 89 +++ actor/v7action/k8s_auth_test.go | 121 +++++ actor/v7action/label_test.go | 12 +- actor/v7action/logging_test.go | 2 +- actor/v7action/security_group_test.go | 1 - actor/v7action/space_test.go | 6 +- actor/v7action/stack_test.go | 1 - actor/v7action/target.go | 3 + actor/v7action/target_test.go | 30 +- actor/v7action/v7action_suite_test.go | 3 +- .../fake_cloud_controller_client.go | 74 +++ actor/v7action/v7actionfakes/fake_config.go | 171 ++++++ .../fake_kubernetes_config_getter.go | 107 ++++ .../v7action/v7actionfakes/fake_who_am_ier.go | 113 ++++ api/cloudcontroller/ccv3/info.go | 3 +- api/cloudcontroller/ccv3/info_test.go | 27 +- .../ccv3/internal/api_routes.go | 2 + api/cloudcontroller/ccv3/user.go | 11 + api/cloudcontroller/ccv3/user_test.go | 78 ++- .../wrapper/kubernetes_authentication.go | 151 ++++++ .../wrapper/kubernetes_authentication_test.go | 460 ++++++++++++++++ .../wrapper/uaa_authentication.go | 4 - .../wrapper/uaa_authentication_test.go | 16 - .../wrapper/wrapper_suite_test.go | 14 +- cf/configuration/coreconfig/config_data.go | 2 + command/commandfakes/fake_config.go | 501 +++++++++-------- command/commandfakes/fake_shared_actor.go | 42 +- command/config.go | 2 + .../not_supported_on_k8s_error.go | 19 + command/v7/actor.go | 2 + command/v7/add_network_policy_command.go | 2 +- command/v7/add_network_policy_command_test.go | 2 +- command/v7/allow_space_ssh_command.go | 6 +- command/v7/allow_space_ssh_command_test.go | 5 +- command/v7/api_command.go | 2 +- command/v7/api_command_test.go | 4 +- command/v7/app_command.go | 2 +- command/v7/app_command_test.go | 4 +- command/v7/apply_manifest_command.go | 2 +- command/v7/apply_manifest_command_test.go | 4 +- command/v7/apps_command.go | 2 +- command/v7/apps_command_test.go | 4 +- command/v7/bind_route_service_command.go | 2 +- command/v7/bind_route_service_command_test.go | 4 +- .../v7/bind_running_security_group_command.go | 2 +- ...ind_running_security_group_command_test.go | 4 +- command/v7/bind_security_group_command.go | 2 +- .../v7/bind_security_group_command_test.go | 4 +- command/v7/bind_service_command.go | 2 +- command/v7/bind_service_command_test.go | 4 +- .../v7/bind_staging_security_group_command.go | 2 +- ...ind_staging_security_group_command_test.go | 4 +- command/v7/buildpacks_command.go | 2 +- command/v7/buildpacks_command_test.go | 2 +- command/v7/cancel_deployment_command.go | 4 +- command/v7/cancel_deployment_command_test.go | 4 +- command/v7/check_route_command.go | 2 +- command/v7/check_route_command_test.go | 6 +- command/v7/copy_source_command.go | 2 +- command/v7/copy_source_command_test.go | 6 +- command/v7/create_app_command.go | 2 +- command/v7/create_app_command_test.go | 2 +- command/v7/create_app_manifest_command.go | 2 +- .../v7/create_app_manifest_command_test.go | 2 +- command/v7/create_buildpack_command.go | 2 +- command/v7/create_buildpack_command_test.go | 2 +- .../v7/create_isolation_segment_command.go | 2 +- .../create_isolation_segment_command_test.go | 2 +- command/v7/create_org_command.go | 2 +- command/v7/create_org_command_test.go | 2 +- command/v7/create_org_quota_command.go | 2 +- command/v7/create_org_quota_command_test.go | 2 +- command/v7/create_package_command.go | 6 +- command/v7/create_package_command_test.go | 2 +- command/v7/create_private_domain_command.go | 2 +- .../v7/create_private_domain_command_test.go | 2 +- command/v7/create_route_command.go | 2 +- command/v7/create_route_command_test.go | 2 +- command/v7/create_security_group_command.go | 2 +- .../v7/create_security_group_command_test.go | 2 +- command/v7/create_service_broker_command.go | 2 +- .../v7/create_service_broker_command_test.go | 4 +- command/v7/create_service_command.go | 2 +- command/v7/create_service_command_test.go | 4 +- command/v7/create_service_key_command.go | 2 +- command/v7/create_service_key_command_test.go | 4 +- command/v7/create_shared_domain_command.go | 2 +- .../v7/create_shared_domain_command_test.go | 2 +- command/v7/create_space_command.go | 6 +- command/v7/create_space_command_test.go | 2 +- command/v7/create_space_quota_command.go | 2 +- command/v7/create_space_quota_command_test.go | 2 +- .../create_user_provided_service_command.go | 2 +- ...eate_user_provided_service_command_test.go | 4 +- command/v7/delete_command.go | 2 +- command/v7/delete_command_test.go | 4 +- .../v7/delete_isolation_segment_command.go | 2 +- .../delete_isolation_segment_command_test.go | 2 +- command/v7/delete_org_command.go | 2 +- command/v7/delete_org_command_test.go | 4 +- command/v7/delete_org_quota_command.go | 2 +- command/v7/delete_org_quota_command_test.go | 2 +- command/v7/delete_orphaned_routes_command.go | 4 +- .../v7/delete_orphaned_routes_command_test.go | 5 +- command/v7/delete_private_domain_command.go | 2 +- .../v7/delete_private_domain_command_test.go | 4 +- command/v7/delete_route_command.go | 2 +- command/v7/delete_route_command_test.go | 4 +- command/v7/delete_security_group_command.go | 2 +- .../v7/delete_security_group_command_test.go | 4 +- .../v7/delete_service_broker_command_test.go | 2 +- command/v7/delete_service_command.go | 2 +- command/v7/delete_service_command_test.go | 4 +- command/v7/delete_service_key_command.go | 2 +- command/v7/delete_service_key_command_test.go | 4 +- command/v7/delete_shared_domain_command.go | 2 +- .../v7/delete_shared_domain_command_test.go | 4 +- command/v7/delete_space_command.go | 2 +- command/v7/delete_space_command_test.go | 4 +- command/v7/delete_space_quota_command.go | 2 +- command/v7/delete_space_quota_command_test.go | 2 +- command/v7/delete_user_command.go | 5 +- command/v7/delete_user_command_test.go | 8 +- command/v7/disable_feature_flag_command.go | 2 +- .../v7/disable_feature_flag_command_test.go | 2 +- command/v7/disable_org_isolation_command.go | 2 +- .../v7/disable_org_isolation_command_test.go | 4 +- command/v7/disable_service_access_command.go | 2 +- .../v7/disable_service_access_command_test.go | 2 +- command/v7/disable_ssh_command.go | 4 +- command/v7/disable_ssh_command_test.go | 4 +- command/v7/disallow_space_ssh_command.go | 6 +- command/v7/disallow_space_ssh_command_test.go | 5 +- command/v7/domains_command.go | 2 +- command/v7/domains_command_test.go | 2 +- command/v7/download_droplet_command.go | 2 +- command/v7/download_droplet_command_test.go | 2 +- command/v7/droplets_command.go | 2 +- command/v7/droplets_command_test.go | 4 +- command/v7/enable_feature_flag_command.go | 2 +- .../v7/enable_feature_flag_command_test.go | 2 +- command/v7/enable_org_isolation_command.go | 2 +- .../v7/enable_org_isolation_command_test.go | 2 +- command/v7/enable_service_access_command.go | 2 +- .../v7/enable_service_access_command_test.go | 2 +- command/v7/enable_ssh_command.go | 4 +- command/v7/enable_ssh_command_test.go | 4 +- command/v7/env_command.go | 2 +- command/v7/env_command_test.go | 4 +- command/v7/events_command.go | 2 +- command/v7/events_command_test.go | 4 +- command/v7/feature_flag_command.go | 2 +- command/v7/feature_flag_command_test.go | 2 +- command/v7/feature_flags_command.go | 2 +- command/v7/feature_flags_command_test.go | 2 +- command/v7/get_health_check_command.go | 2 +- command/v7/get_health_check_command_test.go | 4 +- command/v7/isolation_segments_command.go | 2 +- command/v7/isolation_segments_command_test.go | 2 +- command/v7/label_updater.go | 7 +- command/v7/label_updater_test.go | 65 +-- command/v7/labels_command.go | 4 +- command/v7/labels_command_test.go | 34 +- command/v7/login_command.go | 49 +- command/v7/login_command_test.go | 107 +++- command/v7/logout_command.go | 2 +- command/v7/logout_command_test.go | 6 +- command/v7/logs_command.go | 2 +- command/v7/logs_command_test.go | 2 +- command/v7/map_route_command.go | 2 +- command/v7/map_route_command_test.go | 4 +- command/v7/marketplace_command.go | 2 +- command/v7/marketplace_command_test.go | 8 +- command/v7/network_policies_command.go | 2 +- command/v7/network_policies_command_test.go | 41 +- command/v7/org_command.go | 2 +- command/v7/org_command_test.go | 6 +- command/v7/org_quota_command.go | 2 +- command/v7/org_quota_command_test.go | 4 +- command/v7/org_quotas_command.go | 2 +- command/v7/org_quotas_command_test.go | 4 +- command/v7/org_users_command.go | 2 +- command/v7/org_users_command_test.go | 4 +- command/v7/orgs_command.go | 2 +- command/v7/orgs_command_test.go | 4 +- command/v7/packages_command.go | 2 +- command/v7/packages_command_test.go | 4 +- command/v7/passwd_command.go | 2 +- command/v7/passwd_command_test.go | 4 +- command/v7/purge_service_instance_command.go | 2 +- .../v7/purge_service_instance_command_test.go | 4 +- command/v7/push_command.go | 2 +- command/v7/push_command_test.go | 10 +- command/v7/remove_network_policy_command.go | 2 +- .../v7/remove_network_policy_command_test.go | 2 +- command/v7/rename_command.go | 2 +- command/v7/rename_command_test.go | 4 +- command/v7/rename_org_command.go | 2 +- command/v7/rename_org_command_test.go | 6 +- command/v7/rename_service_broker_command.go | 2 +- .../v7/rename_service_broker_command_test.go | 4 +- command/v7/rename_service_command.go | 2 +- command/v7/rename_service_command_test.go | 4 +- command/v7/rename_space_command.go | 2 +- command/v7/rename_space_command_test.go | 6 +- ...t_org_default_isolation_segment_command.go | 2 +- ..._default_isolation_segment_command_test.go | 6 +- .../reset_space_isolation_segment_command.go | 2 +- ...et_space_isolation_segment_command_test.go | 2 +- command/v7/restage_command.go | 2 +- command/v7/restage_command_test.go | 4 +- command/v7/restart_app_instance_command.go | 2 +- .../v7/restart_app_instance_command_test.go | 4 +- command/v7/restart_command.go | 2 +- command/v7/restart_command_test.go | 4 +- command/v7/revisions_command.go | 2 +- command/v7/revisions_command_test.go | 4 +- command/v7/rollback_command.go | 2 +- command/v7/rollback_command_test.go | 4 +- command/v7/route_command.go | 2 +- command/v7/route_command_test.go | 6 +- command/v7/router_groups_command.go | 2 +- command/v7/router_groups_command_test.go | 2 +- command/v7/routes_command.go | 2 +- command/v7/routes_command_test.go | 2 +- command/v7/run_task_command.go | 2 +- command/v7/run_task_command_test.go | 4 +- ...ning_environment_variable_group_command.go | 2 +- ...environment_variable_group_command_test.go | 2 +- command/v7/running_security_groups_command.go | 2 +- .../running_security_groups_command_test.go | 4 +- command/v7/scale_command.go | 2 +- command/v7/scale_command_test.go | 4 +- command/v7/security_group_command.go | 2 +- command/v7/security_group_command_test.go | 4 +- command/v7/security_groups_command.go | 2 +- command/v7/security_groups_command_test.go | 4 +- command/v7/service_access_command.go | 2 +- command/v7/service_access_command_test.go | 6 +- command/v7/service_brokers_command.go | 2 +- command/v7/service_brokers_command_test.go | 4 +- command/v7/service_command.go | 2 +- command/v7/service_command_test.go | 2 +- command/v7/service_key_command.go | 2 +- command/v7/service_key_command_test.go | 4 +- command/v7/service_keys_command.go | 2 +- command/v7/service_keys_command_test.go | 4 +- command/v7/services_command.go | 2 +- command/v7/services_command_test.go | 4 +- command/v7/set_droplet_command.go | 2 +- command/v7/set_droplet_command_test.go | 6 +- command/v7/set_env_command.go | 2 +- command/v7/set_env_command_test.go | 4 +- command/v7/set_health_check_command.go | 2 +- command/v7/set_health_check_command_test.go | 4 +- ...t_org_default_isolation_segment_command.go | 2 +- ..._default_isolation_segment_command_test.go | 4 +- command/v7/set_org_quota_command.go | 4 +- command/v7/set_org_quota_command_test.go | 5 +- command/v7/set_org_role_command.go | 2 +- command/v7/set_org_role_command_test.go | 2 +- ...ning_environment_variable_group_command.go | 2 +- ...environment_variable_group_command_test.go | 2 +- .../v7/set_space_isolation_segment_command.go | 2 +- ...et_space_isolation_segment_command_test.go | 2 +- command/v7/set_space_quota_command.go | 4 +- command/v7/set_space_quota_command_test.go | 2 +- command/v7/set_space_role_command.go | 2 +- command/v7/set_space_role_command_test.go | 2 +- ...ging_environment_variable_group_command.go | 2 +- ...environment_variable_group_command_test.go | 2 +- command/v7/share_private_domain_command.go | 2 +- .../v7/share_private_domain_command_test.go | 4 +- command/v7/share_service_command.go | 2 +- command/v7/share_service_command_test.go | 4 +- command/v7/shared/app_stager.go | 3 +- command/v7/shared/app_stager_test.go | 8 +- command/v7/shared/new_clients.go | 41 +- command/v7/shared/new_clients_test.go | 5 +- command/v7/shared/package_displayer.go | 8 +- command/v7/space_command.go | 2 +- command/v7/space_command_test.go | 4 +- command/v7/space_quota_command.go | 2 +- command/v7/space_quota_command_test.go | 4 +- command/v7/space_quotas_command.go | 2 +- command/v7/space_quotas_command_test.go | 4 +- command/v7/space_users_command.go | 2 +- command/v7/space_users_command_test.go | 4 +- command/v7/spaces_command.go | 2 +- command/v7/spaces_command_test.go | 4 +- command/v7/ssh_enabled_command_test.go | 3 +- command/v7/stack_command.go | 2 +- command/v7/stack_command_test.go | 4 +- command/v7/stacks_command.go | 2 +- command/v7/stacks_command_test.go | 2 +- command/v7/stage_package_command.go | 2 +- command/v7/stage_package_command_test.go | 2 +- ...ging_environment_variable_group_command.go | 2 +- ...environment_variable_group_command_test.go | 2 +- command/v7/staging_security_groups_command.go | 2 +- .../staging_security_groups_command_test.go | 4 +- command/v7/start_command.go | 2 +- command/v7/start_command_test.go | 4 +- command/v7/stop_command.go | 2 +- command/v7/stop_command_test.go | 14 +- command/v7/target_command.go | 2 +- command/v7/target_command_test.go | 4 +- command/v7/tasks_command.go | 2 +- command/v7/tasks_command_test.go | 4 +- command/v7/terminate_task_command.go | 2 +- command/v7/terminate_task_command_test.go | 4 +- command/v7/unbind_route_service_command.go | 2 +- .../v7/unbind_route_service_command_test.go | 4 +- .../v7/unbind_running_group_command_test.go | 2 +- .../unbind_running_security_group_command.go | 2 +- command/v7/unbind_security_group.go | 2 +- command/v7/unbind_security_group_test.go | 4 +- command/v7/unbind_service_command.go | 2 +- command/v7/unbind_service_command_test.go | 4 +- .../unbind_staging_security_group_command.go | 2 +- ...ind_staging_security_group_command_test.go | 2 +- command/v7/unmap_route_command.go | 2 +- command/v7/unmap_route_command_test.go | 4 +- command/v7/unset_env_command.go | 2 +- command/v7/unset_env_command_test.go | 4 +- command/v7/unset_org_role_command.go | 2 +- command/v7/unset_org_role_command_test.go | 2 +- command/v7/unset_space_quota_command.go | 4 +- command/v7/unset_space_quota_command_test.go | 8 +- command/v7/unset_space_role_command.go | 2 +- command/v7/unset_space_role_command_test.go | 2 +- command/v7/unshare_private_domain_command.go | 2 +- .../v7/unshare_private_domain_command_test.go | 4 +- command/v7/unshare_service_command.go | 2 +- command/v7/unshare_service_command_test.go | 6 +- command/v7/update_buildpack_command.go | 2 +- command/v7/update_buildpack_command_test.go | 4 +- command/v7/update_org_quota_command.go | 2 +- command/v7/update_org_quota_command_test.go | 2 +- command/v7/update_security_group_command.go | 2 +- .../v7/update_security_group_command_test.go | 2 +- command/v7/update_service_broker_command.go | 2 +- .../v7/update_service_broker_command_test.go | 4 +- command/v7/update_service_command.go | 2 +- command/v7/update_service_command_test.go | 4 +- command/v7/update_space_quota_command.go | 2 +- command/v7/update_space_quota_command_test.go | 2 +- .../update_user_provided_service_command.go | 2 +- ...date_user_provided_service_command_test.go | 2 +- command/v7/upgrade_service_command.go | 2 +- command/v7/upgrade_service_command_test.go | 2 +- command/v7/v7fakes/fake_actor.go | 70 +++ command/v7/v7fakes/fake_set_label_actor.go | 70 +++ go.mod | 23 +- go.sum | 512 ++++++++++++++++-- integration/README.md | 3 +- integration/helpers/command.go | 6 +- integration/v7/isolated/api_command_test.go | 2 +- integration/v7/isolated/login_command_test.go | 2 +- .../v7/selfcontained/api_command_test.go | 99 ++++ .../create_space_command_test.go | 107 ++++ integration/v7/selfcontained/fake/cf_api.go | 68 +++ .../v7/selfcontained/kubernetes_auth_test.go | 106 ++++ .../v7/selfcontained/login_command_test.go | 165 ++++++ .../v7/selfcontained/logout_command_test.go | 29 + .../selfcontained/selfcontained_suite_test.go | 113 ++++ resources/user_resource.go | 5 + util/configv3/config.go | 13 + util/configv3/config_test.go | 23 +- .../configv3fakes/fake_user_config.go | 175 ++++++ util/configv3/default_user_config.go | 58 ++ util/configv3/default_user_config_test.go | 98 ++++ util/configv3/dynamic_user_config.go | 22 + util/configv3/dynamic_user_config_test.go | 137 +++++ util/configv3/json_config.go | 56 +- util/configv3/json_config_test.go | 133 ++--- util/configv3/k8s.go | 10 + util/configv3/k8s_test.go | 34 ++ util/configv3/kubernetes_user_config.go | 17 + util/configv3/kubernetes_user_config_test.go | 50 ++ util/configv3/load_config.go | 6 + 399 files changed, 4762 insertions(+), 1198 deletions(-) create mode 100644 actor/sharedaction/auth.go create mode 100644 actor/sharedaction/auth_test.go delete mode 100644 actor/sharedaction/is_logged_in.go delete mode 100644 actor/sharedaction/is_logged_in_test.go create mode 100644 actor/v7action/k8s_auth.go create mode 100644 actor/v7action/k8s_auth_test.go create mode 100644 actor/v7action/v7actionfakes/fake_kubernetes_config_getter.go create mode 100644 actor/v7action/v7actionfakes/fake_who_am_ier.go create mode 100644 api/cloudcontroller/wrapper/kubernetes_authentication.go create mode 100644 api/cloudcontroller/wrapper/kubernetes_authentication_test.go create mode 100644 command/translatableerror/not_supported_on_k8s_error.go create mode 100644 integration/v7/selfcontained/api_command_test.go create mode 100644 integration/v7/selfcontained/create_space_command_test.go create mode 100644 integration/v7/selfcontained/fake/cf_api.go create mode 100644 integration/v7/selfcontained/kubernetes_auth_test.go create mode 100644 integration/v7/selfcontained/login_command_test.go create mode 100644 integration/v7/selfcontained/logout_command_test.go create mode 100644 integration/v7/selfcontained/selfcontained_suite_test.go create mode 100644 util/configv3/configv3fakes/fake_user_config.go create mode 100644 util/configv3/default_user_config.go create mode 100644 util/configv3/default_user_config_test.go create mode 100644 util/configv3/dynamic_user_config.go create mode 100644 util/configv3/dynamic_user_config_test.go create mode 100644 util/configv3/k8s.go create mode 100644 util/configv3/k8s_test.go create mode 100644 util/configv3/kubernetes_user_config.go create mode 100644 util/configv3/kubernetes_user_config_test.go diff --git a/Makefile b/Makefile index dbb1521fe6c..195d9286aa3 100644 --- a/Makefile +++ b/Makefile @@ -130,11 +130,15 @@ ip: integration-push integration-push: build integration-cleanup ## Run all push-related integration tests $(ginkgo_int) -nodes $(NODES) integration/$(TARGET)/push -integration-tests: build integration-cleanup integration-isolated integration-push integration-global ## Run all isolated, push, and global integration tests +integration-selfcontained: build + $(ginkgo_int) -nodes $(NODES) integration/v7/selfcontained + +integration-tests: build integration-cleanup integration-isolated integration-push integration-global integration-selfcontained ## Run all isolated, push, selfcontained, and global integration tests + i: integration-tests-full integration-full-tests: integration-tests-full -integration-tests-full: build integration-cleanup integration-isolated integration-push integration-experimental integration-plugin integration-global ## Run all isolated, push, experimental, plugin, and global integration tests +integration-tests-full: build integration-cleanup integration-isolated integration-push integration-experimental integration-plugin integration-global integration-selfcontained ## Run all isolated, push, experimental, plugin, selfcontained, and global integration tests integration-tests-full-ci: integration-cleanup $(ginkgo_int) -nodes $(NODES) -flakeAttempts $(FLAKE_ATTEMPTS) \ diff --git a/actor/sharedaction/actor.go b/actor/sharedaction/actor.go index ade8cc2a817..11f7c31012b 100644 --- a/actor/sharedaction/actor.go +++ b/actor/sharedaction/actor.go @@ -2,14 +2,25 @@ // controller package sharedaction +type AuthActor interface { + IsLoggedIn() bool +} + // Actor handles all shared actions type Actor struct { Config Config + AuthActor } // NewActor returns an Actor with default settings func NewActor(config Config) *Actor { + var authActor AuthActor = NewDefaultAuthActor(config) + if config.IsCFOnK8s() { + authActor = NewK8sAuthActor(config) + } + return &Actor{ - Config: config, + AuthActor: authActor, + Config: config, } } diff --git a/actor/sharedaction/auth.go b/actor/sharedaction/auth.go new file mode 100644 index 00000000000..f7f5910d10a --- /dev/null +++ b/actor/sharedaction/auth.go @@ -0,0 +1,31 @@ +package sharedaction + +type DefaultAuthActor struct { + config Config +} + +func NewDefaultAuthActor(config Config) DefaultAuthActor { + return DefaultAuthActor{ + config: config, + } +} + +func (a DefaultAuthActor) IsLoggedIn() bool { + return a.config.AccessToken() != "" || a.config.RefreshToken() != "" +} + +type K8sAuthActor struct { + config Config +} + +func NewK8sAuthActor(config Config) K8sAuthActor { + return K8sAuthActor{ + config: config, + } +} + +func (a K8sAuthActor) IsLoggedIn() bool { + name, err := a.config.CurrentUserName() + + return err == nil && name != "" +} diff --git a/actor/sharedaction/auth_test.go b/actor/sharedaction/auth_test.go new file mode 100644 index 00000000000..9fbf5e65066 --- /dev/null +++ b/actor/sharedaction/auth_test.go @@ -0,0 +1,106 @@ +package sharedaction_test + +import ( + "errors" + + . "code.cloudfoundry.org/cli/actor/sharedaction" + "code.cloudfoundry.org/cli/actor/sharedaction/sharedactionfakes" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("AuthActor", func() { + var ( + actor *Actor + fakeConfig *sharedactionfakes.FakeConfig + ) + + BeforeEach(func() { + fakeConfig = new(sharedactionfakes.FakeConfig) + }) + + Context("Default CF on VMs", func() { + BeforeEach(func() { + actor = NewActor(fakeConfig) + }) + + When("only the access token is set", func() { + BeforeEach(func() { + fakeConfig.AccessTokenReturns("some-access-token") + }) + + It("returns true", func() { + Expect(actor.IsLoggedIn()).To(BeTrue()) + }) + }) + + When("only the refresh token is set", func() { + BeforeEach(func() { + fakeConfig.RefreshTokenReturns("some-refresh-token") + }) + + It("returns true", func() { + Expect(actor.IsLoggedIn()).To(BeTrue()) + }) + }) + + When("both access and refresh token are set", func() { + BeforeEach(func() { + fakeConfig.AccessTokenReturns("some-access-token") + fakeConfig.RefreshTokenReturns("some-refresh-token") + }) + + It("returns true", func() { + Expect(actor.IsLoggedIn()).To(BeTrue()) + }) + }) + + When("neither access nor refresh token are set", func() { + BeforeEach(func() { + fakeConfig.AccessTokenReturns("") + fakeConfig.RefreshTokenReturns("") + }) + + It("returns false", func() { + Expect(actor.IsLoggedIn()).To(BeFalse()) + }) + }) + }) + + Context("CF on K8s", func() { + BeforeEach(func() { + fakeConfig.IsCFOnK8sReturns(true) + actor = NewActor(fakeConfig) + }) + + When("the auth info is set", func() { + BeforeEach(func() { + fakeConfig.CurrentUserNameReturns("non-empty", nil) + }) + + It("returns true", func() { + Expect(actor.IsLoggedIn()).To(BeTrue()) + }) + }) + + When("the auth info is not set", func() { + BeforeEach(func() { + fakeConfig.CurrentUserNameReturns("", nil) + }) + + It("returns false", func() { + Expect(actor.IsLoggedIn()).To(BeFalse()) + }) + }) + + When("getting the current user name fails", func() { + BeforeEach(func() { + fakeConfig.CurrentUserNameReturns("", errors.New("boom!")) + }) + + It("returns false", func() { + Expect(actor.IsLoggedIn()).To(BeFalse()) + }) + }) + }) +}) diff --git a/actor/sharedaction/config.go b/actor/sharedaction/config.go index 217ed5054d6..32be6d2e2aa 100644 --- a/actor/sharedaction/config.go +++ b/actor/sharedaction/config.go @@ -9,6 +9,7 @@ type Config interface { CurrentUserName() (string, error) HasTargetedOrganization() bool HasTargetedSpace() bool + IsCFOnK8s() bool RefreshToken() string TargetedOrganizationName() string Verbose() (bool, []string) diff --git a/actor/sharedaction/is_logged_in.go b/actor/sharedaction/is_logged_in.go deleted file mode 100644 index e35b6736704..00000000000 --- a/actor/sharedaction/is_logged_in.go +++ /dev/null @@ -1,6 +0,0 @@ -package sharedaction - -// IsLoggedIn checks whether a user has authenticated with CF -func (actor Actor) IsLoggedIn() bool { - return actor.Config.AccessToken() != "" || actor.Config.RefreshToken() != "" -} diff --git a/actor/sharedaction/is_logged_in_test.go b/actor/sharedaction/is_logged_in_test.go deleted file mode 100644 index e81803937b5..00000000000 --- a/actor/sharedaction/is_logged_in_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package sharedaction_test - -import ( - . "code.cloudfoundry.org/cli/actor/sharedaction" - "code.cloudfoundry.org/cli/actor/sharedaction/sharedactionfakes" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("IsLoggedIn", func() { - var ( - actor *Actor - fakeConfig *sharedactionfakes.FakeConfig - ) - - BeforeEach(func() { - fakeConfig = new(sharedactionfakes.FakeConfig) - actor = NewActor(fakeConfig) - }) - - When("only the access token is set", func() { - BeforeEach(func() { - fakeConfig.AccessTokenReturns("some-access-token") - }) - - It("returns true", func() { - Expect(actor.IsLoggedIn()).To(BeTrue()) - }) - }) - - When("only the refresh token is set", func() { - BeforeEach(func() { - fakeConfig.RefreshTokenReturns("some-refresh-token") - }) - - It("returns true", func() { - Expect(actor.IsLoggedIn()).To(BeTrue()) - }) - }) - - When("both access and refresh token are set", func() { - BeforeEach(func() { - fakeConfig.AccessTokenReturns("some-access-token") - fakeConfig.RefreshTokenReturns("some-refresh-token") - }) - - It("returns true", func() { - Expect(actor.IsLoggedIn()).To(BeTrue()) - }) - }) - - When("neither access nor refresh token are set", func() { - BeforeEach(func() { - fakeConfig.AccessTokenReturns("") - fakeConfig.RefreshTokenReturns("") - }) - - It("returns false", func() { - Expect(actor.IsLoggedIn()).To(BeFalse()) - }) - }) -}) diff --git a/actor/sharedaction/log_cache_client.go b/actor/sharedaction/log_cache_client.go index b6658451f5a..ed3403a1051 100644 --- a/actor/sharedaction/log_cache_client.go +++ b/actor/sharedaction/log_cache_client.go @@ -5,7 +5,7 @@ import ( "time" logcache "code.cloudfoundry.org/go-log-cache" - "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" + "code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2" ) //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . LogCacheClient diff --git a/actor/sharedaction/logging.go b/actor/sharedaction/logging.go index a7e9f419da9..820767661ac 100644 --- a/actor/sharedaction/logging.go +++ b/actor/sharedaction/logging.go @@ -10,7 +10,7 @@ import ( logcache "code.cloudfoundry.org/go-log-cache" "code.cloudfoundry.org/go-log-cache/rpc/logcache_v1" - "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" + "code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2" "github.com/sirupsen/logrus" ) diff --git a/actor/sharedaction/logging_test.go b/actor/sharedaction/logging_test.go index 3263a2aec78..abbb94c1257 100644 --- a/actor/sharedaction/logging_test.go +++ b/actor/sharedaction/logging_test.go @@ -10,7 +10,7 @@ import ( "code.cloudfoundry.org/cli/actor/sharedaction" "code.cloudfoundry.org/cli/actor/sharedaction/sharedactionfakes" logcache "code.cloudfoundry.org/go-log-cache" - "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" + "code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) diff --git a/actor/sharedaction/sharedactionfakes/fake_config.go b/actor/sharedaction/sharedactionfakes/fake_config.go index a374545c5d1..9bad4b6fb7d 100644 --- a/actor/sharedaction/sharedactionfakes/fake_config.go +++ b/actor/sharedaction/sharedactionfakes/fake_config.go @@ -60,6 +60,16 @@ type FakeConfig struct { hasTargetedSpaceReturnsOnCall map[int]struct { result1 bool } + IsCFOnK8sStub func() bool + isCFOnK8sMutex sync.RWMutex + isCFOnK8sArgsForCall []struct { + } + isCFOnK8sReturns struct { + result1 bool + } + isCFOnK8sReturnsOnCall map[int]struct { + result1 bool + } RefreshTokenStub func() string refreshTokenMutex sync.RWMutex refreshTokenArgsForCall []struct { @@ -359,6 +369,58 @@ func (fake *FakeConfig) HasTargetedSpaceReturnsOnCall(i int, result1 bool) { }{result1} } +func (fake *FakeConfig) IsCFOnK8s() bool { + fake.isCFOnK8sMutex.Lock() + ret, specificReturn := fake.isCFOnK8sReturnsOnCall[len(fake.isCFOnK8sArgsForCall)] + fake.isCFOnK8sArgsForCall = append(fake.isCFOnK8sArgsForCall, struct { + }{}) + fake.recordInvocation("IsCFOnK8s", []interface{}{}) + fake.isCFOnK8sMutex.Unlock() + if fake.IsCFOnK8sStub != nil { + return fake.IsCFOnK8sStub() + } + if specificReturn { + return ret.result1 + } + fakeReturns := fake.isCFOnK8sReturns + return fakeReturns.result1 +} + +func (fake *FakeConfig) IsCFOnK8sCallCount() int { + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() + return len(fake.isCFOnK8sArgsForCall) +} + +func (fake *FakeConfig) IsCFOnK8sCalls(stub func() bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = stub +} + +func (fake *FakeConfig) IsCFOnK8sReturns(result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + fake.isCFOnK8sReturns = struct { + result1 bool + }{result1} +} + +func (fake *FakeConfig) IsCFOnK8sReturnsOnCall(i int, result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + if fake.isCFOnK8sReturnsOnCall == nil { + fake.isCFOnK8sReturnsOnCall = make(map[int]struct { + result1 bool + }) + } + fake.isCFOnK8sReturnsOnCall[i] = struct { + result1 bool + }{result1} +} + func (fake *FakeConfig) RefreshToken() string { fake.refreshTokenMutex.Lock() ret, specificReturn := fake.refreshTokenReturnsOnCall[len(fake.refreshTokenArgsForCall)] @@ -531,6 +593,8 @@ func (fake *FakeConfig) Invocations() map[string][][]interface{} { defer fake.hasTargetedOrganizationMutex.RUnlock() fake.hasTargetedSpaceMutex.RLock() defer fake.hasTargetedSpaceMutex.RUnlock() + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() fake.refreshTokenMutex.RLock() defer fake.refreshTokenMutex.RUnlock() fake.targetedOrganizationNameMutex.RLock() diff --git a/actor/sharedaction/sharedactionfakes/fake_log_cache_client.go b/actor/sharedaction/sharedactionfakes/fake_log_cache_client.go index 948037d8ca0..ac0cf83dfa7 100644 --- a/actor/sharedaction/sharedactionfakes/fake_log_cache_client.go +++ b/actor/sharedaction/sharedactionfakes/fake_log_cache_client.go @@ -8,7 +8,7 @@ import ( "code.cloudfoundry.org/cli/actor/sharedaction" client "code.cloudfoundry.org/go-log-cache" - "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" + "code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2" ) type FakeLogCacheClient struct { diff --git a/actor/v7action/actor.go b/actor/v7action/actor.go index 6a5cf533f0b..6fb6cbe0a35 100644 --- a/actor/v7action/actor.go +++ b/actor/v7action/actor.go @@ -2,6 +2,9 @@ package v7action import ( + "code.cloudfoundry.org/cli/api/uaa/constant" + "code.cloudfoundry.org/cli/cf/configuration/coreconfig" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/clock" ) @@ -16,6 +19,12 @@ const ( // Warnings is a list of warnings returned back from the cloud controller type Warnings []string +type AuthActor interface { + Authenticate(credentials map[string]string, origin string, grantType constant.GrantType) error + GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error) + GetCurrentUser() (configv3.User, error) +} + // Actor represents a V7 actor. type Actor struct { CloudControllerClient CloudControllerClient @@ -24,6 +33,8 @@ type Actor struct { UAAClient UAAClient RoutingClient RoutingClient Clock clock.Clock + + AuthActor } // NewActor returns a new V7 actor. @@ -35,6 +46,11 @@ func NewActor( routingClient RoutingClient, clk clock.Clock, ) *Actor { + authActor := NewDefaultAuthActor(config, uaaClient) + if config != nil && config.IsCFOnK8s() { + authActor = NewKubernetesAuthActor(config, NewDefaultKubernetesConfigGetter(), client) + } + return &Actor{ CloudControllerClient: client, Config: config, @@ -42,5 +58,6 @@ func NewActor( UAAClient: uaaClient, RoutingClient: routingClient, Clock: clk, + AuthActor: authActor, } } diff --git a/actor/v7action/auth.go b/actor/v7action/auth.go index 3acbb46adc4..c69d4836a90 100644 --- a/actor/v7action/auth.go +++ b/actor/v7action/auth.go @@ -9,38 +9,51 @@ import ( "code.cloudfoundry.org/cli/actor/actionerror" "code.cloudfoundry.org/cli/api/uaa/constant" "code.cloudfoundry.org/cli/cf/configuration/coreconfig" + "code.cloudfoundry.org/cli/util/configv3" ) -func (actor Actor) Authenticate(credentials map[string]string, origin string, grantType constant.GrantType) error { - if grantType == constant.GrantTypePassword && actor.Config.UAAGrantType() == string(constant.GrantTypeClientCredentials) { +type defaultAuthActor struct { + config Config + uaaClient UAAClient +} + +func NewDefaultAuthActor(config Config, uaaClient UAAClient) AuthActor { + return &defaultAuthActor{ + config: config, + uaaClient: uaaClient, + } +} + +func (actor defaultAuthActor) Authenticate(credentials map[string]string, origin string, grantType constant.GrantType) error { + if grantType == constant.GrantTypePassword && actor.config.UAAGrantType() == string(constant.GrantTypeClientCredentials) { return actionerror.PasswordGrantTypeLogoutRequiredError{} } - actor.Config.UnsetOrganizationAndSpaceInformation() - accessToken, refreshToken, err := actor.UAAClient.Authenticate(credentials, origin, grantType) + actor.config.UnsetOrganizationAndSpaceInformation() + accessToken, refreshToken, err := actor.uaaClient.Authenticate(credentials, origin, grantType) if err != nil { - actor.Config.SetTokenInformation("", "", "") + actor.config.SetTokenInformation("", "", "") return err } accessToken = fmt.Sprintf("bearer %s", accessToken) - actor.Config.SetTokenInformation(accessToken, refreshToken, "") + actor.config.SetTokenInformation(accessToken, refreshToken, "") if grantType == constant.GrantTypePassword { - actor.Config.SetUAAGrantType("") + actor.config.SetUAAGrantType("") } else { - actor.Config.SetUAAGrantType(string(grantType)) + actor.config.SetUAAGrantType(string(grantType)) } if grantType == constant.GrantTypeClientCredentials { - actor.Config.SetUAAClientCredentials(credentials["client_id"], "") + actor.config.SetUAAClientCredentials(credentials["client_id"], "") } return nil } -func (actor Actor) GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error) { - rawPrompts, err := actor.UAAClient.GetLoginPrompts() +func (actor defaultAuthActor) GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error) { + rawPrompts, err := actor.uaaClient.GetLoginPrompts() if err != nil { return nil, err } @@ -56,6 +69,10 @@ func (actor Actor) GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error) { return prompts, nil } +func (actor defaultAuthActor) GetCurrentUser() (configv3.User, error) { + return actor.config.CurrentUser() +} + // TODO: error check this in future stories func (actor Actor) RevokeAccessAndRefreshTokens() error { accessToken := actor.Config.AccessToken() @@ -75,7 +92,6 @@ func (actor Actor) isTokenRevocable(token string) bool { } jsonPayload, err := base64.RawURLEncoding.DecodeString(segments[1]) - if err != nil { return false } diff --git a/actor/v7action/auth_test.go b/actor/v7action/auth_test.go index 66f68058673..1949fe81838 100644 --- a/actor/v7action/auth_test.go +++ b/actor/v7action/auth_test.go @@ -7,24 +7,25 @@ import ( . "code.cloudfoundry.org/cli/actor/v7action" "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" "code.cloudfoundry.org/cli/api/uaa/constant" + "code.cloudfoundry.org/cli/util/configv3" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) -var _ = Describe("Auth Actions", func() { +var _ = Describe("Default Auth Actions", func() { var ( - actor *Actor - fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient - fakeUAAClient *v7actionfakes.FakeUAAClient - fakeConfig *v7actionfakes.FakeConfig - creds map[string]string + actor *Actor + fakeConfig *v7actionfakes.FakeConfig + fakeUAAClient *v7actionfakes.FakeUAAClient + creds map[string]string ) BeforeEach(func() { - fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) - fakeUAAClient = new(v7actionfakes.FakeUAAClient) fakeConfig = new(v7actionfakes.FakeConfig) - actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, fakeUAAClient, nil, nil) + fakeUAAClient = new(v7actionfakes.FakeUAAClient) + + fakeConfig.IsCFOnK8sReturns(false) + actor = NewActor(nil, fakeConfig, nil, fakeUAAClient, nil, nil) creds = map[string]string{ "client_id": "some-username", "client_secret": "some-password", @@ -172,7 +173,6 @@ var _ = Describe("Auth Actions", func() { }) When("the token is revokable", func() { - It("calls the UAA to revoke refresh and access tokens", func() { Expect(fakeUAAClient.RevokeCallCount()).To(Equal(2)) @@ -193,4 +193,23 @@ var _ = Describe("Auth Actions", func() { }) }) + Describe("Get Current User", func() { + var ( + user configv3.User + err error + ) + + JustBeforeEach(func() { + user, err = actor.GetCurrentUser() + }) + + BeforeEach(func() { + fakeConfig.CurrentUserReturns(configv3.User{Name: "jim"}, nil) + }) + + It("delegates to the injected config", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(user.Name).To(Equal("jim")) + }) + }) }) diff --git a/actor/v7action/cloud_controller_client.go b/actor/v7action/cloud_controller_client.go index 35ff47380d9..e7f87fab036 100644 --- a/actor/v7action/cloud_controller_client.go +++ b/actor/v7action/cloud_controller_client.go @@ -186,6 +186,7 @@ type CloudControllerClient interface { UploadBuildpack(buildpackGUID string, buildpackPath string, buildpack io.Reader, buildpackLength int64) (ccv3.JobURL, ccv3.Warnings, error) UploadDropletBits(dropletGUID string, dropletPath string, droplet io.Reader, dropletLength int64) (ccv3.JobURL, ccv3.Warnings, error) UploadPackage(pkg resources.Package, zipFilepath string) (resources.Package, ccv3.Warnings, error) + WhoAmI() (resources.K8sUser, ccv3.Warnings, error) servicePlanVisibilityClient } diff --git a/actor/v7action/config.go b/actor/v7action/config.go index b1eaafee9f2..8c4eb01020a 100644 --- a/actor/v7action/config.go +++ b/actor/v7action/config.go @@ -11,6 +11,7 @@ import ( type Config interface { AccessToken() string APIVersion() string + CurrentUser() (configv3.User, error) DialTimeout() time.Duration PollingInterval() time.Duration RefreshToken() string @@ -27,4 +28,6 @@ type Config interface { Target() string UAAGrantType() string UnsetOrganizationAndSpaceInformation() + SetKubernetesAuthInfo(authInfo string) + IsCFOnK8s() bool } diff --git a/actor/v7action/droplet_test.go b/actor/v7action/droplet_test.go index 72f0e78a577..f477c283623 100644 --- a/actor/v7action/droplet_test.go +++ b/actor/v7action/droplet_test.go @@ -600,7 +600,7 @@ var _ = Describe("Droplet Actions", func() { }) When("the upload returns an error", func() { - var uploadErr = errors.New("upload failed") + uploadErr := errors.New("upload failed") BeforeEach(func() { fakeCloudControllerClient.UploadDropletBitsReturns( @@ -617,7 +617,7 @@ var _ = Describe("Droplet Actions", func() { }) When("the upload job fails eventually", func() { - var jobErr = errors.New("job failed") + jobErr := errors.New("job failed") BeforeEach(func() { fakeCloudControllerClient.UploadDropletBitsReturns( diff --git a/actor/v7action/k8s_auth.go b/actor/v7action/k8s_auth.go new file mode 100644 index 00000000000..bbbfadb9059 --- /dev/null +++ b/actor/v7action/k8s_auth.go @@ -0,0 +1,89 @@ +package v7action + +import ( + "errors" + "fmt" + "sort" + + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" + "code.cloudfoundry.org/cli/api/uaa/constant" + "code.cloudfoundry.org/cli/cf/configuration/coreconfig" + "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" +) + +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . KubernetesConfigGetter + +type KubernetesConfigGetter interface { + Get() (*clientcmdapi.Config, error) +} + +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . WhoAmIer + +type WhoAmIer interface { + WhoAmI() (resources.K8sUser, ccv3.Warnings, error) +} + +type DefaultKubernetesConfigGetter struct{} + +func NewDefaultKubernetesConfigGetter() DefaultKubernetesConfigGetter { + return DefaultKubernetesConfigGetter{} +} + +func (c DefaultKubernetesConfigGetter) Get() (*clientcmdapi.Config, error) { + pathOpts := clientcmd.NewDefaultPathOptions() + return pathOpts.GetStartingConfig() +} + +type kubernetesAuthActor struct { + config Config + k8sConfigGetter KubernetesConfigGetter + whoAmIer WhoAmIer +} + +func NewKubernetesAuthActor(config Config, k8sConfigGetter KubernetesConfigGetter, whoAmIer WhoAmIer) AuthActor { + return &kubernetesAuthActor{ + config: config, + k8sConfigGetter: k8sConfigGetter, + whoAmIer: whoAmIer, + } +} + +func (actor kubernetesAuthActor) Authenticate(credentials map[string]string, origin string, grantType constant.GrantType) error { + actor.config.SetKubernetesAuthInfo(credentials["k8s-auth-info"]) + return nil +} + +func (actor kubernetesAuthActor) GetLoginPrompts() (map[string]coreconfig.AuthPrompt, error) { + conf, err := actor.k8sConfigGetter.Get() + if err != nil { + return nil, err + } + + if len(conf.AuthInfos) == 0 { + return nil, errors.New("no kubernetes authentication infos configured") + } + + var prompts []string + for authInfo := range conf.AuthInfos { + prompts = append(prompts, authInfo) + } + sort.Strings(prompts) + + return map[string]coreconfig.AuthPrompt{"k8s-auth-info": { + Type: coreconfig.AuthPromptTypeMenu, + Entries: prompts, + DisplayName: "Choose your Kubernetes authentication info", + }}, nil +} + +func (actor kubernetesAuthActor) GetCurrentUser() (configv3.User, error) { + user, _, err := actor.whoAmIer.WhoAmI() + if err != nil { + return configv3.User{}, fmt.Errorf("calling /whoami endpoint failed: %w", err) + } + + return configv3.User{Name: user.Name}, nil +} diff --git a/actor/v7action/k8s_auth_test.go b/actor/v7action/k8s_auth_test.go new file mode 100644 index 00000000000..91ee1c6edaf --- /dev/null +++ b/actor/v7action/k8s_auth_test.go @@ -0,0 +1,121 @@ +package v7action_test + +import ( + "errors" + + "code.cloudfoundry.org/cli/actor/v7action" + "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" + "code.cloudfoundry.org/cli/api/uaa/constant" + "code.cloudfoundry.org/cli/cf/configuration/coreconfig" + "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" +) + +var _ = Describe("KubernetesAuthActor", func() { + var ( + k8sAuthActor v7action.AuthActor + k8sConfigGetter *v7actionfakes.FakeKubernetesConfigGetter + whoAmIer *v7actionfakes.FakeWhoAmIer + config *v7actionfakes.FakeConfig + err error + ) + + BeforeEach(func() { + config = new(v7actionfakes.FakeConfig) + k8sConfigGetter = new(v7actionfakes.FakeKubernetesConfigGetter) + k8sConfigGetter.GetReturns(&clientcmdapi.Config{ + AuthInfos: map[string]*clientcmdapi.AuthInfo{"foo": {}, "bar": {}}, + }, nil) + whoAmIer = new(v7actionfakes.FakeWhoAmIer) + k8sAuthActor = v7action.NewKubernetesAuthActor(config, k8sConfigGetter, whoAmIer) + }) + + Describe("Authenticate", func() { + JustBeforeEach(func() { + err = k8sAuthActor.Authenticate(map[string]string{"k8s-auth-info": "bar"}, "", constant.GrantTypePassword) + }) + + It("sets the Kubernetes auth-info", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(config.SetKubernetesAuthInfoCallCount()).To(Equal(1)) + Expect(config.SetKubernetesAuthInfoArgsForCall(0)).To(Equal("bar")) + }) + }) + + Describe("GetLoginPrompts", func() { + var authPrompts map[string]coreconfig.AuthPrompt + + JustBeforeEach(func() { + authPrompts, err = k8sAuthActor.GetLoginPrompts() + }) + + It("returns an auth prompt menu", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(authPrompts).To(HaveLen(1)) + Expect(authPrompts).To(HaveKey("k8s-auth-info")) + + authPrompt := authPrompts["k8s-auth-info"] + Expect(authPrompt.Type).To(Equal(coreconfig.AuthPromptTypeMenu)) + Expect(authPrompt.DisplayName).To(Equal("Choose your Kubernetes authentication info")) + Expect(authPrompt.Entries).To(ConsistOf("foo", "bar")) + }) + + It("sorts the entries", func() { + authPrompt := authPrompts["k8s-auth-info"] + Expect(authPrompt.Entries).To(Equal([]string{"bar", "foo"})) + }) + + When("getting the k8s config fails", func() { + BeforeEach(func() { + k8sConfigGetter.GetReturns(nil, errors.New("oomph!")) + }) + + It("returns the error", func() { + Expect(err).To(MatchError("oomph!")) + }) + }) + + When("no auth infos are in the k8s config", func() { + BeforeEach(func() { + k8sConfigGetter.GetReturns(&clientcmdapi.Config{}, nil) + }) + + It("returns an error", func() { + Expect(err).To(MatchError("no kubernetes authentication infos configured")) + }) + }) + }) + + Describe("Get Current User", func() { + var ( + user configv3.User + err error + ) + + BeforeEach(func() { + whoAmIer.WhoAmIReturns(resources.K8sUser{Name: "bob", Kind: "User"}, nil, nil) + }) + + JustBeforeEach(func() { + user, err = k8sAuthActor.GetCurrentUser() + }) + + It("uses the WhoAmI function to get the real current user name", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(user.Name).To(Equal("bob")) + }) + + When("calling the whoami endpoint fails", func() { + BeforeEach(func() { + whoAmIer.WhoAmIReturns(resources.K8sUser{}, nil, errors.New("boom!")) + }) + + It("returns an error", func() { + Expect(err).To(MatchError(ContainSubstring("boom!"))) + }) + }) + }) +}) diff --git a/actor/v7action/label_test.go b/actor/v7action/label_test.go index 4b9348cb0f9..df3a573ad40 100644 --- a/actor/v7action/label_test.go +++ b/actor/v7action/label_test.go @@ -959,7 +959,8 @@ var _ = Describe("labels", func() { GUID: "some-guid", Metadata: &resources.Metadata{ Labels: expectedLabels, - }}}, + }, + }}, ccv3.Warnings([]string{"warning-1", "warning-2"}), nil, ) @@ -1122,7 +1123,8 @@ var _ = Describe("labels", func() { GUID: "some-guid", Metadata: &resources.Metadata{ Labels: expectedLabels, - }}}, + }, + }}, ccv3.Warnings([]string{"warning-1", "warning-2"}), nil, ) @@ -1204,7 +1206,8 @@ var _ = Describe("labels", func() { Name: resourceName, Metadata: &resources.Metadata{ Labels: expectedLabels, - }}}, + }, + }}, []string{"warning-1", "warning-2"}, nil, ) @@ -1422,7 +1425,8 @@ var _ = Describe("labels", func() { Name: resourceName, Metadata: &resources.Metadata{ Labels: expectedLabels, - }}}, + }, + }}, []string{"warning-1", "warning-2"}, nil, ) diff --git a/actor/v7action/logging_test.go b/actor/v7action/logging_test.go index c7ff9e75c3f..8cefdb9a6b1 100644 --- a/actor/v7action/logging_test.go +++ b/actor/v7action/logging_test.go @@ -12,7 +12,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" "code.cloudfoundry.org/cli/resources" logcache "code.cloudfoundry.org/go-log-cache" - "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" + "code.cloudfoundry.org/go-loggregator/v8/rpc/loggregator_v2" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) diff --git a/actor/v7action/security_group_test.go b/actor/v7action/security_group_test.go index 02aa8f691d6..ed0a72500eb 100644 --- a/actor/v7action/security_group_test.go +++ b/actor/v7action/security_group_test.go @@ -30,7 +30,6 @@ var _ = Describe("Security Group Actions", func() { BeforeEach(func() { fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) actor = NewActor(fakeCloudControllerClient, nil, nil, nil, nil, nil) - }) Describe("BindSecurityGroupToSpaces", func() { diff --git a/actor/v7action/space_test.go b/actor/v7action/space_test.go index 4dbe54cc656..b3f67ab13b7 100644 --- a/actor/v7action/space_test.go +++ b/actor/v7action/space_test.go @@ -265,10 +265,12 @@ var _ = Describe("Space", func() { When("the cloud controller returns a space with a quota relationship", func() { BeforeEach(func() { fakeCloudControllerClient.GetSpacesReturns( - []resources.Space{{GUID: "some-space-guid", Name: spaceName, + []resources.Space{{ + GUID: "some-space-guid", Name: spaceName, Relationships: resources.Relationships{ constant.RelationshipTypeQuota: resources.Relationship{GUID: "some-space-quota-guid"}, - }}}, + }, + }}, ccv3.IncludedResources{}, ccv3.Warnings{"some-space-warning"}, nil) }) diff --git a/actor/v7action/stack_test.go b/actor/v7action/stack_test.go index 39d95a29f17..aaab0d4aa00 100644 --- a/actor/v7action/stack_test.go +++ b/actor/v7action/stack_test.go @@ -25,7 +25,6 @@ var _ = Describe("Stack", func() { }) Describe("Get stack by name", func() { - var expectedErr error var err error var warnings Warnings diff --git a/actor/v7action/target.go b/actor/v7action/target.go index 99ab47ba63a..a63a02711c2 100644 --- a/actor/v7action/target.go +++ b/actor/v7action/target.go @@ -31,9 +31,11 @@ func (actor Actor) SetTarget(settings TargetSettings) (Warnings, error) { Routing: rootInfo.Routing(), SkipSSLValidation: settings.SkipSSLValidation, UAA: rootInfo.UAA(), + CFOnK8s: rootInfo.CFOnK8s, }) actor.Config.SetTokenInformation("", "", "") + actor.Config.SetKubernetesAuthInfo("") return allWarnings, nil } @@ -42,4 +44,5 @@ func (actor Actor) SetTarget(settings TargetSettings) (Warnings, error) { func (actor Actor) ClearTarget() { actor.Config.SetTargetInformation(configv3.TargetInformationArgs{}) actor.Config.SetTokenInformation("", "", "") + actor.Config.SetKubernetesAuthInfo("") } diff --git a/actor/v7action/target_test.go b/actor/v7action/target_test.go index b09c74994a5..54123fd35ce 100644 --- a/actor/v7action/target_test.go +++ b/actor/v7action/target_test.go @@ -25,7 +25,6 @@ var _ = Describe("Targeting", func() { BeforeEach(func() { actor, fakeCloudControllerClient, fakeConfig, _, _, _, _ = NewTestActor() - }) Describe("SetTarget", func() { @@ -120,6 +119,7 @@ var _ = Describe("Targeting", func() { Expect(targetInfoArgs.LogCache).To(Equal(expectedLogCache)) Expect(targetInfoArgs.Routing).To(Equal(expectedRouting)) Expect(targetInfoArgs.SkipSSLValidation).To(Equal(skipSSLValidation)) + Expect(targetInfoArgs.CFOnK8s).To(BeFalse()) }) It("clears all the token information", func() { @@ -131,10 +131,29 @@ var _ = Describe("Targeting", func() { Expect(sshOAuthClient).To(BeEmpty()) }) + It("clears the Kubernetes auth-info", func() { + Expect(fakeConfig.SetKubernetesAuthInfoCallCount()).To(Equal(1)) + authInfo := fakeConfig.SetKubernetesAuthInfoArgsForCall(0) + + Expect(authInfo).To(BeEmpty()) + }) + It("succeeds and returns all warnings", func() { Expect(err).ToNot(HaveOccurred()) Expect(warnings).To(ConsistOf(Warnings{"info-warning"})) }) + + When("deployed on Kubernetes", func() { + BeforeEach(func() { + fakeCloudControllerClient.GetInfoReturns(ccv3.Info{CFOnK8s: true}, nil, nil) + }) + + It("sets the CFOnK8s target information", func() { + Expect(fakeConfig.SetTargetInformationCallCount()).To(Equal(1)) + targetInfoArgs := fakeConfig.SetTargetInformationArgsForCall(0) + Expect(targetInfoArgs.CFOnK8s).To(BeTrue()) + }) + }) }) Describe("ClearTarget", func() { @@ -164,5 +183,14 @@ var _ = Describe("Targeting", func() { Expect(refreshToken).To(BeEmpty()) Expect(sshOAuthClient).To(BeEmpty()) }) + + It("clears the Kubernetes auth-info", func() { + actor.ClearTarget() + + Expect(fakeConfig.SetKubernetesAuthInfoCallCount()).To(Equal(1)) + authInfo := fakeConfig.SetKubernetesAuthInfoArgsForCall(0) + + Expect(authInfo).To(BeEmpty()) + }) }) }) diff --git a/actor/v7action/v7action_suite_test.go b/actor/v7action/v7action_suite_test.go index 5d2a56804f8..675a860f222 100644 --- a/actor/v7action/v7action_suite_test.go +++ b/actor/v7action/v7action_suite_test.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" "strings" + "testing" "time" . "code.cloudfoundry.org/cli/actor/v7action" @@ -14,8 +15,6 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" log "github.com/sirupsen/logrus" - - "testing" ) func TestV3Action(t *testing.T) { diff --git a/actor/v7action/v7actionfakes/fake_cloud_controller_client.go b/actor/v7action/v7actionfakes/fake_cloud_controller_client.go index ca4a7e21d35..0c37e114ddf 100644 --- a/actor/v7action/v7actionfakes/fake_cloud_controller_client.go +++ b/actor/v7action/v7actionfakes/fake_cloud_controller_client.go @@ -2665,6 +2665,20 @@ type FakeCloudControllerClient struct { result2 ccv3.Warnings result3 error } + WhoAmIStub func() (resources.K8sUser, ccv3.Warnings, error) + whoAmIMutex sync.RWMutex + whoAmIArgsForCall []struct { + } + whoAmIReturns struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + } + whoAmIReturnsOnCall map[int]struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + } invocations map[string][][]interface{} invocationsMutex sync.RWMutex } @@ -14232,6 +14246,64 @@ func (fake *FakeCloudControllerClient) UploadPackageReturnsOnCall(i int, result1 }{result1, result2, result3} } +func (fake *FakeCloudControllerClient) WhoAmI() (resources.K8sUser, ccv3.Warnings, error) { + fake.whoAmIMutex.Lock() + ret, specificReturn := fake.whoAmIReturnsOnCall[len(fake.whoAmIArgsForCall)] + fake.whoAmIArgsForCall = append(fake.whoAmIArgsForCall, struct { + }{}) + fake.recordInvocation("WhoAmI", []interface{}{}) + fake.whoAmIMutex.Unlock() + if fake.WhoAmIStub != nil { + return fake.WhoAmIStub() + } + if specificReturn { + return ret.result1, ret.result2, ret.result3 + } + fakeReturns := fake.whoAmIReturns + return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 +} + +func (fake *FakeCloudControllerClient) WhoAmICallCount() int { + fake.whoAmIMutex.RLock() + defer fake.whoAmIMutex.RUnlock() + return len(fake.whoAmIArgsForCall) +} + +func (fake *FakeCloudControllerClient) WhoAmICalls(stub func() (resources.K8sUser, ccv3.Warnings, error)) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = stub +} + +func (fake *FakeCloudControllerClient) WhoAmIReturns(result1 resources.K8sUser, result2 ccv3.Warnings, result3 error) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = nil + fake.whoAmIReturns = struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }{result1, result2, result3} +} + +func (fake *FakeCloudControllerClient) WhoAmIReturnsOnCall(i int, result1 resources.K8sUser, result2 ccv3.Warnings, result3 error) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = nil + if fake.whoAmIReturnsOnCall == nil { + fake.whoAmIReturnsOnCall = make(map[int]struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }) + } + fake.whoAmIReturnsOnCall[i] = struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }{result1, result2, result3} +} + func (fake *FakeCloudControllerClient) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() @@ -14585,6 +14657,8 @@ func (fake *FakeCloudControllerClient) Invocations() map[string][][]interface{} defer fake.uploadDropletBitsMutex.RUnlock() fake.uploadPackageMutex.RLock() defer fake.uploadPackageMutex.RUnlock() + fake.whoAmIMutex.RLock() + defer fake.whoAmIMutex.RUnlock() copiedInvocations := map[string][][]interface{}{} for key, value := range fake.invocations { copiedInvocations[key] = value diff --git a/actor/v7action/v7actionfakes/fake_config.go b/actor/v7action/v7actionfakes/fake_config.go index d9e05fd823d..9bbf83bc714 100644 --- a/actor/v7action/v7actionfakes/fake_config.go +++ b/actor/v7action/v7actionfakes/fake_config.go @@ -30,6 +30,18 @@ type FakeConfig struct { accessTokenReturnsOnCall map[int]struct { result1 string } + CurrentUserStub func() (configv3.User, error) + currentUserMutex sync.RWMutex + currentUserArgsForCall []struct { + } + currentUserReturns struct { + result1 configv3.User + result2 error + } + currentUserReturnsOnCall map[int]struct { + result1 configv3.User + result2 error + } DialTimeoutStub func() time.Duration dialTimeoutMutex sync.RWMutex dialTimeoutArgsForCall []struct { @@ -40,6 +52,16 @@ type FakeConfig struct { dialTimeoutReturnsOnCall map[int]struct { result1 time.Duration } + IsCFOnK8sStub func() bool + isCFOnK8sMutex sync.RWMutex + isCFOnK8sArgsForCall []struct { + } + isCFOnK8sReturns struct { + result1 bool + } + isCFOnK8sReturnsOnCall map[int]struct { + result1 bool + } PollingIntervalStub func() time.Duration pollingIntervalMutex sync.RWMutex pollingIntervalArgsForCall []struct { @@ -75,6 +97,11 @@ type FakeConfig struct { setAccessTokenArgsForCall []struct { arg1 string } + SetKubernetesAuthInfoStub func(string) + setKubernetesAuthInfoMutex sync.RWMutex + setKubernetesAuthInfoArgsForCall []struct { + arg1 string + } SetRefreshTokenStub func(string) setRefreshTokenMutex sync.RWMutex setRefreshTokenArgsForCall []struct { @@ -265,6 +292,61 @@ func (fake *FakeConfig) AccessTokenReturnsOnCall(i int, result1 string) { }{result1} } +func (fake *FakeConfig) CurrentUser() (configv3.User, error) { + fake.currentUserMutex.Lock() + ret, specificReturn := fake.currentUserReturnsOnCall[len(fake.currentUserArgsForCall)] + fake.currentUserArgsForCall = append(fake.currentUserArgsForCall, struct { + }{}) + fake.recordInvocation("CurrentUser", []interface{}{}) + fake.currentUserMutex.Unlock() + if fake.CurrentUserStub != nil { + return fake.CurrentUserStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.currentUserReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeConfig) CurrentUserCallCount() int { + fake.currentUserMutex.RLock() + defer fake.currentUserMutex.RUnlock() + return len(fake.currentUserArgsForCall) +} + +func (fake *FakeConfig) CurrentUserCalls(stub func() (configv3.User, error)) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = stub +} + +func (fake *FakeConfig) CurrentUserReturns(result1 configv3.User, result2 error) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = nil + fake.currentUserReturns = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + +func (fake *FakeConfig) CurrentUserReturnsOnCall(i int, result1 configv3.User, result2 error) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = nil + if fake.currentUserReturnsOnCall == nil { + fake.currentUserReturnsOnCall = make(map[int]struct { + result1 configv3.User + result2 error + }) + } + fake.currentUserReturnsOnCall[i] = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + func (fake *FakeConfig) DialTimeout() time.Duration { fake.dialTimeoutMutex.Lock() ret, specificReturn := fake.dialTimeoutReturnsOnCall[len(fake.dialTimeoutArgsForCall)] @@ -317,6 +399,58 @@ func (fake *FakeConfig) DialTimeoutReturnsOnCall(i int, result1 time.Duration) { }{result1} } +func (fake *FakeConfig) IsCFOnK8s() bool { + fake.isCFOnK8sMutex.Lock() + ret, specificReturn := fake.isCFOnK8sReturnsOnCall[len(fake.isCFOnK8sArgsForCall)] + fake.isCFOnK8sArgsForCall = append(fake.isCFOnK8sArgsForCall, struct { + }{}) + fake.recordInvocation("IsCFOnK8s", []interface{}{}) + fake.isCFOnK8sMutex.Unlock() + if fake.IsCFOnK8sStub != nil { + return fake.IsCFOnK8sStub() + } + if specificReturn { + return ret.result1 + } + fakeReturns := fake.isCFOnK8sReturns + return fakeReturns.result1 +} + +func (fake *FakeConfig) IsCFOnK8sCallCount() int { + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() + return len(fake.isCFOnK8sArgsForCall) +} + +func (fake *FakeConfig) IsCFOnK8sCalls(stub func() bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = stub +} + +func (fake *FakeConfig) IsCFOnK8sReturns(result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + fake.isCFOnK8sReturns = struct { + result1 bool + }{result1} +} + +func (fake *FakeConfig) IsCFOnK8sReturnsOnCall(i int, result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + if fake.isCFOnK8sReturnsOnCall == nil { + fake.isCFOnK8sReturnsOnCall = make(map[int]struct { + result1 bool + }) + } + fake.isCFOnK8sReturnsOnCall[i] = struct { + result1 bool + }{result1} +} + func (fake *FakeConfig) PollingInterval() time.Duration { fake.pollingIntervalMutex.Lock() ret, specificReturn := fake.pollingIntervalReturnsOnCall[len(fake.pollingIntervalArgsForCall)] @@ -504,6 +638,37 @@ func (fake *FakeConfig) SetAccessTokenArgsForCall(i int) string { return argsForCall.arg1 } +func (fake *FakeConfig) SetKubernetesAuthInfo(arg1 string) { + fake.setKubernetesAuthInfoMutex.Lock() + fake.setKubernetesAuthInfoArgsForCall = append(fake.setKubernetesAuthInfoArgsForCall, struct { + arg1 string + }{arg1}) + fake.recordInvocation("SetKubernetesAuthInfo", []interface{}{arg1}) + fake.setKubernetesAuthInfoMutex.Unlock() + if fake.SetKubernetesAuthInfoStub != nil { + fake.SetKubernetesAuthInfoStub(arg1) + } +} + +func (fake *FakeConfig) SetKubernetesAuthInfoCallCount() int { + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() + return len(fake.setKubernetesAuthInfoArgsForCall) +} + +func (fake *FakeConfig) SetKubernetesAuthInfoCalls(stub func(string)) { + fake.setKubernetesAuthInfoMutex.Lock() + defer fake.setKubernetesAuthInfoMutex.Unlock() + fake.SetKubernetesAuthInfoStub = stub +} + +func (fake *FakeConfig) SetKubernetesAuthInfoArgsForCall(i int) string { + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() + argsForCall := fake.setKubernetesAuthInfoArgsForCall[i] + return argsForCall.arg1 +} + func (fake *FakeConfig) SetRefreshToken(arg1 string) { fake.setRefreshTokenMutex.Lock() fake.setRefreshTokenArgsForCall = append(fake.setRefreshTokenArgsForCall, struct { @@ -952,8 +1117,12 @@ func (fake *FakeConfig) Invocations() map[string][][]interface{} { defer fake.aPIVersionMutex.RUnlock() fake.accessTokenMutex.RLock() defer fake.accessTokenMutex.RUnlock() + fake.currentUserMutex.RLock() + defer fake.currentUserMutex.RUnlock() fake.dialTimeoutMutex.RLock() defer fake.dialTimeoutMutex.RUnlock() + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() fake.pollingIntervalMutex.RLock() defer fake.pollingIntervalMutex.RUnlock() fake.refreshTokenMutex.RLock() @@ -962,6 +1131,8 @@ func (fake *FakeConfig) Invocations() map[string][][]interface{} { defer fake.sSHOAuthClientMutex.RUnlock() fake.setAccessTokenMutex.RLock() defer fake.setAccessTokenMutex.RUnlock() + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() fake.setRefreshTokenMutex.RLock() defer fake.setRefreshTokenMutex.RUnlock() fake.setTargetInformationMutex.RLock() diff --git a/actor/v7action/v7actionfakes/fake_kubernetes_config_getter.go b/actor/v7action/v7actionfakes/fake_kubernetes_config_getter.go new file mode 100644 index 00000000000..f22933d1bb8 --- /dev/null +++ b/actor/v7action/v7actionfakes/fake_kubernetes_config_getter.go @@ -0,0 +1,107 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package v7actionfakes + +import ( + "sync" + + "code.cloudfoundry.org/cli/actor/v7action" + "k8s.io/client-go/tools/clientcmd/api" +) + +type FakeKubernetesConfigGetter struct { + GetStub func() (*api.Config, error) + getMutex sync.RWMutex + getArgsForCall []struct { + } + getReturns struct { + result1 *api.Config + result2 error + } + getReturnsOnCall map[int]struct { + result1 *api.Config + result2 error + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeKubernetesConfigGetter) Get() (*api.Config, error) { + fake.getMutex.Lock() + ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] + fake.getArgsForCall = append(fake.getArgsForCall, struct { + }{}) + fake.recordInvocation("Get", []interface{}{}) + fake.getMutex.Unlock() + if fake.GetStub != nil { + return fake.GetStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.getReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeKubernetesConfigGetter) GetCallCount() int { + fake.getMutex.RLock() + defer fake.getMutex.RUnlock() + return len(fake.getArgsForCall) +} + +func (fake *FakeKubernetesConfigGetter) GetCalls(stub func() (*api.Config, error)) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = stub +} + +func (fake *FakeKubernetesConfigGetter) GetReturns(result1 *api.Config, result2 error) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = nil + fake.getReturns = struct { + result1 *api.Config + result2 error + }{result1, result2} +} + +func (fake *FakeKubernetesConfigGetter) GetReturnsOnCall(i int, result1 *api.Config, result2 error) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = nil + if fake.getReturnsOnCall == nil { + fake.getReturnsOnCall = make(map[int]struct { + result1 *api.Config + result2 error + }) + } + fake.getReturnsOnCall[i] = struct { + result1 *api.Config + result2 error + }{result1, result2} +} + +func (fake *FakeKubernetesConfigGetter) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.getMutex.RLock() + defer fake.getMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeKubernetesConfigGetter) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ v7action.KubernetesConfigGetter = new(FakeKubernetesConfigGetter) diff --git a/actor/v7action/v7actionfakes/fake_who_am_ier.go b/actor/v7action/v7actionfakes/fake_who_am_ier.go new file mode 100644 index 00000000000..0d1eb42bacc --- /dev/null +++ b/actor/v7action/v7actionfakes/fake_who_am_ier.go @@ -0,0 +1,113 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package v7actionfakes + +import ( + "sync" + + "code.cloudfoundry.org/cli/actor/v7action" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" + "code.cloudfoundry.org/cli/resources" +) + +type FakeWhoAmIer struct { + WhoAmIStub func() (resources.K8sUser, ccv3.Warnings, error) + whoAmIMutex sync.RWMutex + whoAmIArgsForCall []struct { + } + whoAmIReturns struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + } + whoAmIReturnsOnCall map[int]struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeWhoAmIer) WhoAmI() (resources.K8sUser, ccv3.Warnings, error) { + fake.whoAmIMutex.Lock() + ret, specificReturn := fake.whoAmIReturnsOnCall[len(fake.whoAmIArgsForCall)] + fake.whoAmIArgsForCall = append(fake.whoAmIArgsForCall, struct { + }{}) + fake.recordInvocation("WhoAmI", []interface{}{}) + fake.whoAmIMutex.Unlock() + if fake.WhoAmIStub != nil { + return fake.WhoAmIStub() + } + if specificReturn { + return ret.result1, ret.result2, ret.result3 + } + fakeReturns := fake.whoAmIReturns + return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 +} + +func (fake *FakeWhoAmIer) WhoAmICallCount() int { + fake.whoAmIMutex.RLock() + defer fake.whoAmIMutex.RUnlock() + return len(fake.whoAmIArgsForCall) +} + +func (fake *FakeWhoAmIer) WhoAmICalls(stub func() (resources.K8sUser, ccv3.Warnings, error)) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = stub +} + +func (fake *FakeWhoAmIer) WhoAmIReturns(result1 resources.K8sUser, result2 ccv3.Warnings, result3 error) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = nil + fake.whoAmIReturns = struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }{result1, result2, result3} +} + +func (fake *FakeWhoAmIer) WhoAmIReturnsOnCall(i int, result1 resources.K8sUser, result2 ccv3.Warnings, result3 error) { + fake.whoAmIMutex.Lock() + defer fake.whoAmIMutex.Unlock() + fake.WhoAmIStub = nil + if fake.whoAmIReturnsOnCall == nil { + fake.whoAmIReturnsOnCall = make(map[int]struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }) + } + fake.whoAmIReturnsOnCall[i] = struct { + result1 resources.K8sUser + result2 ccv3.Warnings + result3 error + }{result1, result2, result3} +} + +func (fake *FakeWhoAmIer) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.whoAmIMutex.RLock() + defer fake.whoAmIMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeWhoAmIer) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ v7action.WhoAmIer = new(FakeWhoAmIer) diff --git a/api/cloudcontroller/ccv3/info.go b/api/cloudcontroller/ccv3/info.go index 288d1060861..8a2e694a18c 100644 --- a/api/cloudcontroller/ccv3/info.go +++ b/api/cloudcontroller/ccv3/info.go @@ -39,7 +39,8 @@ type InfoLinks struct { // controller API. type Info struct { // Links is a list of top level Cloud Controller APIs. - Links InfoLinks `json:"links"` + Links InfoLinks `json:"links"` + CFOnK8s bool `json:"cf_on_k8s"` } // AppSSHEndpoint returns the HREF for SSHing into an app container. diff --git a/api/cloudcontroller/ccv3/info_test.go b/api/cloudcontroller/ccv3/info_test.go index b90c500218f..8f77db3ba96 100644 --- a/api/cloudcontroller/ccv3/info_test.go +++ b/api/cloudcontroller/ccv3/info_test.go @@ -18,7 +18,7 @@ var _ = Describe("Info", func() { client *Client rootRespondWith http.HandlerFunc - apis Info + info Info warnings Warnings executeErr error ) @@ -37,7 +37,7 @@ var _ = Describe("Info", func() { ), ) - apis, warnings, executeErr = client.GetInfo() + info, warnings, executeErr = client.GetInfo() }) Describe("when all requests are successful", func() { @@ -86,18 +86,29 @@ var _ = Describe("Info", func() { It("returns the CC Information", func() { Expect(executeErr).NotTo(HaveOccurred()) - Expect(apis.UAA()).To(Equal("https://uaa.bosh-lite.com")) - Expect(apis.Logging()).To(Equal("wss://doppler.bosh-lite.com:443")) - Expect(apis.NetworkPolicyV1()).To(Equal(fmt.Sprintf("%s/networking/v1/external", server.URL()))) - Expect(apis.AppSSHHostKeyFingerprint()).To(Equal("some-fingerprint")) - Expect(apis.AppSSHEndpoint()).To(Equal("ssh.bosh-lite.com:2222")) - Expect(apis.OAuthClient()).To(Equal("some-client")) + Expect(info.UAA()).To(Equal("https://uaa.bosh-lite.com")) + Expect(info.Logging()).To(Equal("wss://doppler.bosh-lite.com:443")) + Expect(info.NetworkPolicyV1()).To(Equal(fmt.Sprintf("%s/networking/v1/external", server.URL()))) + Expect(info.AppSSHHostKeyFingerprint()).To(Equal("some-fingerprint")) + Expect(info.AppSSHEndpoint()).To(Equal("ssh.bosh-lite.com:2222")) + Expect(info.OAuthClient()).To(Equal("some-client")) + Expect(info.CFOnK8s).To(BeFalse()) }) It("returns all warnings", func() { Expect(executeErr).NotTo(HaveOccurred()) Expect(warnings).To(ConsistOf("warning 1")) }) + + When("CF-on-K8s", func() { + BeforeEach(func() { + rootRespondWith = RespondWith(http.StatusOK, `{ "cf_on_k8s": true }`) + }) + + It("sets the CFOnK8s", func() { + Expect(info.CFOnK8s).To(BeTrue()) + }) + }) }) When("the cloud controller encounters an error", func() { diff --git a/api/cloudcontroller/ccv3/internal/api_routes.go b/api/cloudcontroller/ccv3/internal/api_routes.go index c69bd7a6e63..f1d637933f3 100644 --- a/api/cloudcontroller/ccv3/internal/api_routes.go +++ b/api/cloudcontroller/ccv3/internal/api_routes.go @@ -172,6 +172,7 @@ const ( PutTaskCancelRequest = "PutTaskCancel" SharePrivateDomainRequest = "SharePrivateDomainRequest" UnmapRouteRequest = "UnmapRoute" + WhoAmI = "WhoAmI" ) // APIRoutes is a list of routes used by the router to construct request URLs. @@ -339,4 +340,5 @@ var APIRoutes = map[string]Route{ GetUserRequest: {Path: "/v3/users/:user_guid", Method: http.MethodGet}, PostUserRequest: {Path: "/v3/users", Method: http.MethodPost}, DeleteUserRequest: {Path: "/v3/users/:user_guid", Method: http.MethodDelete}, + WhoAmI: {Path: "/whoami", Method: http.MethodGet}, } diff --git a/api/cloudcontroller/ccv3/user.go b/api/cloudcontroller/ccv3/user.go index 88412343e84..7b2aa8edb20 100644 --- a/api/cloudcontroller/ccv3/user.go +++ b/api/cloudcontroller/ccv3/user.go @@ -60,3 +60,14 @@ func (client *Client) GetUsers(query ...Query) ([]resources.User, Warnings, erro return users, warnings, err } + +func (client *Client) WhoAmI() (resources.K8sUser, Warnings, error) { + var user resources.K8sUser + + _, warnings, err := client.MakeRequest(RequestParams{ + RequestName: internal.WhoAmI, + ResponseBody: &user, + }) + + return user, warnings, err +} diff --git a/api/cloudcontroller/ccv3/user_test.go b/api/cloudcontroller/ccv3/user_test.go index 4331634e6d6..19637ae5b8e 100644 --- a/api/cloudcontroller/ccv3/user_test.go +++ b/api/cloudcontroller/ccv3/user_test.go @@ -1,9 +1,8 @@ package ccv3_test import ( - "net/http" - "fmt" + "net/http" "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" . "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" @@ -34,14 +33,14 @@ var _ = Describe("User", func() { When("no error occurs", func() { BeforeEach(func() { response := `{ - "guid": "some-uaa-guid", - "username": "some-user-name", - "presentation_name": "some-user-name", - "origin": "ldap", - "created_at": "2016-12-07T18:18:30Z", - "updated_at": null - - }` + "guid": "some-uaa-guid", + "username": "some-user-name", + "presentation_name": "some-user-name", + "origin": "ldap", + "created_at": "2016-12-07T18:18:30Z", + "updated_at": null + + }` expectedBody := `{"guid":"some-uaa-guid"}` server.AppendHandlers( CombineHandlers( @@ -355,4 +354,63 @@ var _ = Describe("User", func() { }) }) }) + + Describe("Who am I", func() { + var ( + k8sUser resources.K8sUser + warnings Warnings + executeErr error + ) + + JustBeforeEach(func() { + k8sUser, warnings, executeErr = client.WhoAmI() + }) + + When("the request succeeds", func() { + BeforeEach(func() { + response := `{ + "name": "bob", + "kind": "User" + }` + server.AppendHandlers( + CombineHandlers( + VerifyRequest(http.MethodGet, "/whoami"), + RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), + ), + ) + }) + + It("returns the expected user and all warnings", func() { + Expect(executeErr).ToNot(HaveOccurred()) + Expect(k8sUser.Name).To(Equal("bob")) + Expect(k8sUser.Kind).To(Equal("User")) + Expect(warnings).To(ConsistOf("warning-1")) + }) + }) + + When("cloud controller returns an error", func() { + BeforeEach(func() { + response := `{ + "errors": [ + { + "code": 1000, + "detail": "Not authenticated", + "title": "CF-InvalidAuthToken" + } + ] + }` + server.AppendHandlers( + CombineHandlers( + VerifyRequest(http.MethodGet, "/whoami"), + RespondWith(http.StatusUnauthorized, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), + ), + ) + }) + + It("returns the error", func() { + Expect(executeErr).To(MatchError(ccerror.InvalidAuthTokenError{Message: "Not authenticated"})) + Expect(warnings).To(ConsistOf("warning-1")) + }) + }) + }) }) diff --git a/api/cloudcontroller/wrapper/kubernetes_authentication.go b/api/cloudcontroller/wrapper/kubernetes_authentication.go new file mode 100644 index 00000000000..b683278077e --- /dev/null +++ b/api/cloudcontroller/wrapper/kubernetes_authentication.go @@ -0,0 +1,151 @@ +package wrapper + +import ( + "bytes" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "errors" + "fmt" + "net/http" + + "code.cloudfoundry.org/cli/actor/v7action" + "code.cloudfoundry.org/cli/api/cloudcontroller" + "code.cloudfoundry.org/cli/command" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/client-go/transport" + + _ "k8s.io/client-go/plugin/pkg/client/auth/azure" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" +) + +type KubernetesAuthentication struct { + connection cloudcontroller.Connection + config command.Config + k8sConfigGetter v7action.KubernetesConfigGetter +} + +func NewKubernetesAuthentication( + config command.Config, + k8sConfigGetter v7action.KubernetesConfigGetter, +) *KubernetesAuthentication { + + return &KubernetesAuthentication{ + config: config, + k8sConfigGetter: k8sConfigGetter, + } +} + +func (a *KubernetesAuthentication) Make(request *cloudcontroller.Request, passedResponse *cloudcontroller.Response) error { + username, err := a.config.CurrentUserName() + if err != nil { + return err + } + if username == "" { + return errors.New("current user not set") + } + + k8sConfig, err := a.k8sConfigGetter.Get() + if err != nil { + return err + } + + restConfig, err := clientcmd.NewDefaultClientConfig( + *k8sConfig, + &clientcmd.ConfigOverrides{ + Context: api.Context{AuthInfo: username}, + }).ClientConfig() + if err != nil { + return err + } + + tlsConfig, err := rest.TLSConfigFor(restConfig) + if err != nil { + return fmt.Errorf("failed to get tls config: %w", err) + } + + if tlsConfig != nil && tlsConfig.GetClientCertificate != nil { + cert, err := tlsConfig.GetClientCertificate(nil) + if err != nil { + return fmt.Errorf("failed to get client certificate: %w", err) + } + + if len(cert.Certificate) > 0 && cert.PrivateKey != nil { + var buf bytes.Buffer + + if err := pem.Encode(&buf, &pem.Block{Type: "CERTIFICATE", Bytes: cert.Certificate[0]}); err != nil { + return fmt.Errorf("could not convert certificate to PEM format: %w", err) + } + + key, err := x509.MarshalPKCS8PrivateKey(cert.PrivateKey) + if err != nil { + return fmt.Errorf("could not marshal private key: %w", err) + } + + if err := pem.Encode(&buf, &pem.Block{Type: "PRIVATE KEY", Bytes: key}); err != nil { + return fmt.Errorf("could not convert key to PEM format: %w", err) + } + + auth := "ClientCert " + base64.StdEncoding.EncodeToString(buf.Bytes()) + request.Header.Set("Authorization", auth) + + return a.connection.Make(request, passedResponse) + } + } + + transportConfig, err := restConfig.TransportConfig() + if err != nil { + return fmt.Errorf("failed to get transport config: %w", err) + } + + var roundtripper http.RoundTripper + if transportConfig.WrapTransport == nil { + // i.e. not auth-provider or exec plugin + roundtripper, err = transport.HTTPWrappersForConfig(transportConfig, connectionRoundTripper{ + connection: a.connection, + ccRequest: request, + ccResponse: passedResponse, + }) + if err != nil { + return fmt.Errorf("failed to create new transport: %w", err) + } + } else { + roundtripper = transportConfig.WrapTransport(connectionRoundTripper{ + connection: a.connection, + ccRequest: request, + ccResponse: passedResponse, + }) + } + + _, err = roundtripper.RoundTrip(request.Request) + + return err +} + +func (a *KubernetesAuthentication) Wrap(innerconnection cloudcontroller.Connection) cloudcontroller.Connection { + a.connection = innerconnection + + return a +} + +type connectionRoundTripper struct { + connection cloudcontroller.Connection + ccRequest *cloudcontroller.Request + ccResponse *cloudcontroller.Response +} + +func (rt connectionRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + // The passed `*req` is a shallow clone of the original `*req` with the auth header added. + // So we need to reset it on the `ccRequest`. + rt.ccRequest.Request = req + + err := rt.connection.Make(rt.ccRequest, rt.ccResponse) + if err != nil { + return nil, err + } + + return rt.ccResponse.HTTPResponse, nil +} diff --git a/api/cloudcontroller/wrapper/kubernetes_authentication_test.go b/api/cloudcontroller/wrapper/kubernetes_authentication_test.go new file mode 100644 index 00000000000..e46a282438e --- /dev/null +++ b/api/cloudcontroller/wrapper/kubernetes_authentication_test.go @@ -0,0 +1,460 @@ +package wrapper_test + +import ( + "encoding/base64" + "encoding/json" + "encoding/pem" + "errors" + "io/ioutil" + "net/http" + "os" + "strings" + "time" + + "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" + "code.cloudfoundry.org/cli/api/cloudcontroller" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/ccv3fakes" + "code.cloudfoundry.org/cli/api/cloudcontroller/wrapper" + "code.cloudfoundry.org/cli/command/commandfakes" + + "github.com/SermoDigital/jose/crypto" + "github.com/SermoDigital/jose/jws" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" + "k8s.io/client-go/tools/clientcmd/api" +) + +const ( + clientCertData = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJVk9iMUFIckxNUjh3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRFd01EVXhOVEExTURsYUZ3MHlNakV3TURVeE5UQTFNVEZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJrdWxLbS9qTTJhZWZsdjkKK00zQk9Jc2QvVXZrRTBONGhWb3hSeWRBbE0xQXhWd3REYUdzL3dmUzRzb0xuNHJENTF3UE1SRlNJaitwSzdGYQprRGdaR0x4UFhrai96UkZOTzcvU3J2RHYwVGxjYjJENzNCS21qaXArQ2hBWkpQdWhMQlY2VnlTN0pXSWhOM1lOCktyamR5TnB5MHN3SjI1TW9CbW1saUpFc3V2dCtDaEhseERqWE9KenF1U2owa1hPQVVsWUFTN1dKK09JMU9HbzQKUjcvdHdHZlFTNW9oYXpRVVlDR2lZSllYcjVRNkVKTmJOVVI0RjdpRSthY1I5Rm9GNnNKSmkrQStET1VDUFFSKwptbjQ5Zm1pcFVHSGtMc3BicTNFZ0FEME40VW5jcmIyeUJEMFNVTmdLQmJjclY1S2hybFA2SzkwNkY5NEpubzNHCm1Id1JwUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUV2VNZ1ZBRkRhbWcraDRqS3hoRUh2Q1l5egp5akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBUUxMWWFXQTRva1M2b3ZEWjQ1Z28ybkVZdUR4MklmRXZwYnh3CkNmYkFTNDY4M3lLT3FiYVBHOEpTVGhSbkh3TWlMcVBrbGFsdkJvV2R3aFB5Vkk0d2tVNHI4Y2c0UEpxNEZwWnQKVkNUQzFPZWVwRGpTMFpVQjRwSDVIZVlNQUxqSDBqcFV3RU96djFpaEtid05IMHFoZ2pGeUNTdld5TG9oZHdzbApJWXIvV1NEZm50NlBETC84TjFpcEJJbEN5Z1JHVGdoSFhPemhHUklPWG4rYWVOR29yWm9YWm0xbHErc1hyUnc5CktNdVZhRmdhaWVjSm0vbytyemFFSG9VZjRYOERKeVNubmVTa3ViaEx6ZERNc2o5eEs1cEJpdFgvaDlQMUQrMkcKeW5rcWdJVTJSWTM0SjBRcnU4Z0syNlJVT2pOcHIvRWJHQ0dUQUxiMXJnSDM0K2NFdlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" + clientKeyData = "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3VTNlVxYitNelpwNSsKVy8zNHpjRTRpeDM5UytRVFEzaUZXakZISjBDVXpVREZYQzBOb2F6L0I5TGl5Z3VmaXNQblhBOHhFVklpUDZrcgpzVnFRT0JrWXZFOWVTUC9ORVUwN3Y5S3U4Ty9ST1Z4dllQdmNFcWFPS240S0VCa2srNkVzRlhwWEpMc2xZaUUzCmRnMHF1TjNJMm5MU3pBbmJreWdHYWFXSWtTeTYrMzRLRWVYRU9OYzRuT3E1S1BTUmM0QlNWZ0JMdFluNDRqVTQKYWpoSHYrM0FaOUJMbWlGck5CUmdJYUpnbGhldmxEb1FrMXMxUkhnWHVJVDVweEgwV2dYcXdrbUw0RDRNNVFJOQpCSDZhZmoxK2FLbFFZZVF1eWx1cmNTQUFQUTNoU2R5dHZiSUVQUkpRMkFvRnR5dFhrcUd1VS9vcjNUb1gzZ21lCmpjYVlmQkdsQWdNQkFBRUNnZ0VBZG80WndLM3VteTM0TFBjaDM3VUU4eE1keVFkd0VmSlk3a3dWTE5MMFNNTDgKaGNKWEd1aVlKYmtLcHh6TG55L2laV0xuS25jZnFSQW9ZQUg1R2hRdWJmYlkvY2NseURVMmxhZTdCU2Y1MkJUdQpYUXhaQks3aS85ekRjdERVYWFXSFVkY2lLbGhmdStQdHVDM2ljdWJnWlJqQjljUzRCOVVtNm9XK0JSREtuandICkduQ0lEZlNNQWt4VXdTaUwwa2NXelNpZ1BYMVN3UHcxOEZvZWgzTmJEd1VXTHhxUWZLVThydVlSTUsxYUg5M3cKcjFtbjlDWUwvd0hiVWRqcmtZMlIxTjVUR21ab2Vldm5qUXgyQVc2NkYzdEg1cGg4RTF6TEFQVTl4TFdRTW9KcwpXM0gzSTdUaEYvRnJuNERQa3hQbThUUVVhQUdvQ09SSWFUQkN5VlgxQVFLQmdRREkxbkRmNWYySHdHaldrTStpCk9YbGE1R1VnRUtXaGZpeGhidE5OclNpMDU5VnZQUEJwNXdtbGQzMHJKUDhWem8vbnFnUW5ISmpmaEQ2Y3NSMTQKL2VlMHZ1Um0zYzZwZzMrODdwOHhWY3lLNHhDd0JmdFFuMGRZWWFLMkRMOEtYb0liYThpN09EQmFoNW5OZWQwcgpKa1RPcE5NRGRkL0p0bEpPZ25jRXBlUk9oUUtCZ1FEZUt1L0R1MXU1QVR3Y3p5STRXOWV1L1YwTXRwMHdqM3RpClF2MmpObW83QU1zS3BwK0ZKVDFqWFhUKzZCTm02OWpxUVJwdlAyd2RhVUdqV1dLa1lHVEVpbUZCc2ZuKzJDOFAKOEc3Uk50YWpRdEV2QlR1ZDZPN0tZUkFoTU56dm9RcDkrZmJKY1ZsRG13Nlk0bUYzUTJXS3NmZU51TGtpY3VqNQpYVFV1ekVMd29RS0JnUUREU0IvQTFYVEx4cjhwd3V6aHBGam5sQ1R3Skwrb1kzTHIya01EeUZkSWNCUU1jWWlpCnNNK2tZS2NJaUpTdnM0WWhrQ014bEpEZzVVbXNPbHVhQmVpQ3l3cHpLMEdEZWlWK285ZU90UXFLRVhkc2NLU0oKSkJiUFRVQlZHOWUyVVdiWkd0aTNrazhSOThBSkYzR0NQMWV3Um53WFpVb1FiSU5qYTJBbTJOZEJzUUtCZ0Q4eApOVXVXTWl1NE56SDJsTVExRTI4NXI4cmE4bkVLanN6UFF6ZTJWWmI4emNQMHl2RGpPOGZVb0YrVkFWZklBOFgxCnlLQVdDUm1BZytRRG03UW5tdUh3Zm1OaVRUcDRvVUpHWUM3d0N6TWE0VWNmbE9xQWc5TmFzbXpPYWpsYXRCSkwKRkRBT0pwYTlOdlN6aDRlVnl2OGRTYzJzMmpQN1BWc1ljUFVqc25LaEFvR0JBSy9kQjlnVEFpME5nczVmaVNtWQovWkp3Yk52MjcyTHdKbWV4Vit2eWtjN3J5LzRraTRQb2xRd1BHNzQ5eFZ0T2NNc2FhRlVNMVVkclN2NlIwbjlkCmpTbXhCeTl2YWdzc1FmVDNSc3BvUUJKM0w5YWxiNHM2V2ZtUEpzNkFrQkhIZHNpVXFaaElYT2J2WE1lQ0k2aVMKOTQ2R0toekFxMlVGbjhFUGxXaFVNeEFiCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K" +) + +var _ = Describe("KubernetesAuthentication", func() { + var ( + k8sAuthWrapper *wrapper.KubernetesAuthentication + config *commandfakes.FakeConfig + k8sConfigGetter *v7actionfakes.FakeKubernetesConfigGetter + wrappedConnection *ccv3fakes.FakeConnectionWrapper + req *cloudcontroller.Request + resp *cloudcontroller.Response + kubeConfig *api.Config + makeErr error + ) + + BeforeEach(func() { + kubeConfig = &api.Config{ + Kind: "Config", + APIVersion: "v1", + Clusters: map[string]*api.Cluster{ + "my-cluster": { + Server: "https://example.org", + }, + }, + Contexts: map[string]*api.Context{ + "my-context": { + Cluster: "my-cluster", + AuthInfo: "my-auth-info", + Namespace: "my-namespace", + }, + }, + CurrentContext: "my-context", + AuthInfos: map[string]*api.AuthInfo{}, + } + + k8sConfigGetter = new(v7actionfakes.FakeKubernetesConfigGetter) + k8sConfigGetter.GetReturns(kubeConfig, nil) + + config = new(commandfakes.FakeConfig) + config.CurrentUserNameReturns("auth-test", nil) + + wrappedConnection = new(ccv3fakes.FakeConnectionWrapper) + + httpReq, err := http.NewRequest(http.MethodPost, "", strings.NewReader("hello")) + Expect(err).NotTo(HaveOccurred()) + req = cloudcontroller.NewRequest(httpReq, nil) + + resp = &cloudcontroller.Response{ + HTTPResponse: &http.Response{ + StatusCode: http.StatusTeapot, + }, + } + }) + + JustBeforeEach(func() { + k8sAuthWrapper = wrapper.NewKubernetesAuthentication(config, k8sConfigGetter) + k8sAuthWrapper.Wrap(wrappedConnection) + + makeErr = k8sAuthWrapper.Make(req, resp) + }) + + When("getting the k8s config fails", func() { + BeforeEach(func() { + k8sConfigGetter.GetReturns(nil, errors.New("boom!")) + }) + + It("returns the error", func() { + Expect(makeErr).To(MatchError("boom!")) + }) + }) + + When("no user is set in the config", func() { + BeforeEach(func() { + config.CurrentUserNameReturns("", nil) + }) + + It("errors", func() { + Expect(makeErr).To(MatchError(ContainSubstring("current user not set"))) + }) + }) + + When("there is an error getting the current user from the config", func() { + BeforeEach(func() { + config.CurrentUserNameReturns("", errors.New("boom")) + }) + + It("errors", func() { + Expect(makeErr).To(MatchError(ContainSubstring("boom"))) + }) + }) + + When("the chosen kubeernetes auth info is not present in kubeconfig", func() { + BeforeEach(func() { + config.CurrentUserNameReturns("not-present", nil) + }) + + It("errors", func() { + Expect(makeErr).To(MatchError(ContainSubstring(`auth info "not-present" does not exist`))) + }) + }) + + checkCalls := func() *cloudcontroller.Request { + Expect(makeErr).NotTo(HaveOccurred()) + Expect(wrappedConnection.MakeCallCount()).To(Equal(1)) + + actualReq, actualResp := wrappedConnection.MakeArgsForCall(0) + Expect(actualResp.HTTPResponse).To(HaveHTTPStatus(http.StatusTeapot)) + + body, err := ioutil.ReadAll(actualReq.Body) + Expect(err).NotTo(HaveOccurred()) + Expect(string(body)).To(Equal("hello")) + + return actualReq + } + + checkBearerTokenInAuthHeader := func() { + actualReq := checkCalls() + + token, err := jws.ParseJWTFromRequest(actualReq.Request) + Expect(err).NotTo(HaveOccurred()) + Expect(token.Validate(keyPair.Public(), crypto.SigningMethodRS256)).To(Succeed()) + + claims := token.Claims() + Expect(claims).To(HaveKeyWithValue("another", "thing")) + } + + checkClientCertInAuthHeader := func() { + actualReq := checkCalls() + + Expect(actualReq.Header).To(HaveKeyWithValue("Authorization", ConsistOf(HavePrefix("ClientCert ")))) + + certAndKeyPEMBase64 := actualReq.Header.Get("Authorization")[11:] + certAndKeyPEM, err := base64.StdEncoding.DecodeString(certAndKeyPEMBase64) + Expect(err).NotTo(HaveOccurred()) + + cert, rest := pem.Decode(certAndKeyPEM) + Expect(cert.Type).To(Equal(pemDecodeKubeConfigCertData(clientCertData).Type)) + Expect(cert.Bytes).To(Equal(pemDecodeKubeConfigCertData(clientCertData).Bytes)) + + var key *pem.Block + key, rest = pem.Decode(rest) + Expect(key.Bytes).To(Equal(pemDecodeKubeConfigCertData(clientKeyData).Bytes)) + + Expect(rest).To(BeEmpty()) + } + + Describe("auth-provider", func() { + var token []byte + + BeforeEach(func() { + jwt := jws.NewJWT(jws.Claims{ + "exp": time.Now().Add(time.Hour).Unix(), + "another": "thing", + }, crypto.SigningMethodRS256) + var err error + token, err = jwt.Serialize(keyPair) + Expect(err).NotTo(HaveOccurred()) + + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + AuthProvider: &api.AuthProviderConfig{ + Name: "oidc", + Config: map[string]string{ + "id-token": string(token), + "idp-issuer-url": "-", + "client-id": "-", + }, + }, + } + }) + + It("uses the auth-provider to generate the Bearer token", func() { + checkBearerTokenInAuthHeader() + }) + }) + + Describe("client certs", func() { + var ( + certFilePath string + keyFilePath string + ) + + BeforeEach(func() { + certFilePath = writeToFile(clientCertData) + keyFilePath = writeToFile(clientKeyData) + }) + + AfterEach(func() { + Expect(os.RemoveAll(certFilePath)).To(Succeed()) + Expect(os.RemoveAll(keyFilePath)).To(Succeed()) + }) + + When("inline cert and key are provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificateData: []byte(base64Decode(clientCertData)), + ClientKeyData: []byte(base64Decode(clientKeyData)), + } + }) + + It("puts concatenated client ceritificate and key data into the Authorization header", func() { + checkClientCertInAuthHeader() + }) + }) + + When("cert and key are provided in files", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificate: certFilePath, + ClientKey: keyFilePath, + } + }) + + It("puts concatenated client ceritificate and key data into the Authorization header", func() { + checkClientCertInAuthHeader() + }) + + When("cert file cannot be read", func() { + BeforeEach(func() { + Expect(os.Remove(certFilePath)).To(Succeed()) + }) + + It("returns an error", func() { + Expect(makeErr).To(MatchError(ContainSubstring(certFilePath))) + }) + }) + + When("key file cannot be read", func() { + BeforeEach(func() { + Expect(os.Remove(keyFilePath)).To(Succeed()) + }) + + It("returns an error", func() { + Expect(makeErr).To(MatchError(ContainSubstring(keyFilePath))) + }) + }) + }) + + When("file and inline cert is provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificate: certFilePath, + ClientCertificateData: []byte(base64Decode(clientCertData)), + ClientKeyData: []byte(base64Decode(clientKeyData)), + } + }) + + It("complains about invalid configuration", func() { + Expect(makeErr).To(MatchError(ContainSubstring("client-cert-data and client-cert are both specified"))) + }) + }) + + When("file and inline key is provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificateData: []byte(base64Decode(clientCertData)), + ClientKeyData: []byte(base64Decode(clientKeyData)), + ClientKey: keyFilePath, + } + }) + + It("complains about invalid configuration", func() { + Expect(makeErr).To(MatchError(ContainSubstring("client-key-data and client-key are both specified"))) + }) + }) + + When("inline cert and key file are provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificateData: []byte(base64Decode(clientCertData)), + ClientKey: keyFilePath, + } + }) + + It("uses the inline key", func() { + checkClientCertInAuthHeader() + }) + }) + + When("cert file and inline key are provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + ClientCertificate: certFilePath, + ClientKeyData: []byte(base64Decode(clientKeyData)), + } + }) + + It("uses the inline key", func() { + checkClientCertInAuthHeader() + }) + }) + }) + + Describe("exec", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + Exec: &api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + InteractiveMode: "Never", + Command: "echo", + }, + } + }) + + When("the command returns a token", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"].Exec.Args = []string{execCredential(&clientauthenticationv1beta1.ExecCredentialStatus{ + Token: "a-token", + })} + }) + + It("uses the exec command to generate the Bearer token", func() { + Expect(makeErr).NotTo(HaveOccurred()) + Expect(wrappedConnection.MakeCallCount()).To(Equal(1)) + + actualReq, actualResp := wrappedConnection.MakeArgsForCall(0) + Expect(actualResp.HTTPResponse).To(HaveHTTPStatus(http.StatusTeapot)) + Expect(actualReq.Header.Get("Authorization")).To(Equal("Bearer a-token")) + }) + }) + + When("the command returns a client cert and key", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"].Exec.Args = []string{execCredential(&clientauthenticationv1beta1.ExecCredentialStatus{ + ClientCertificateData: base64Decode(clientCertData), + ClientKeyData: base64Decode(clientKeyData), + })} + }) + + It("uses the exec command to generate client certs", func() { + checkClientCertInAuthHeader() + }) + }) + }) + + Describe("tokens provided in config", func() { + var token []byte + + BeforeEach(func() { + jwt := jws.NewJWT(jws.Claims{ + "exp": time.Now().Add(time.Hour).Unix(), + "another": "thing", + }, crypto.SigningMethodRS256) + var err error + token, err = jwt.Serialize(keyPair) + Expect(err).NotTo(HaveOccurred()) + }) + + Context("inline tokens", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + Token: string(token), + } + }) + + It("inserts the token in the authorization header", func() { + checkBearerTokenInAuthHeader() + }) + }) + + Context("token file paths", func() { + var tokenFilePath string + + BeforeEach(func() { + tokenFile, err := ioutil.TempFile("", "") + Expect(err).NotTo(HaveOccurred()) + defer tokenFile.Close() + _, err = tokenFile.Write(token) + Expect(err).NotTo(HaveOccurred()) + tokenFilePath = tokenFile.Name() + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + TokenFile: tokenFilePath, + } + }) + + AfterEach(func() { + Expect(os.RemoveAll(tokenFilePath)).To(Succeed()) + }) + + It("inserts the token in the authorization header", func() { + checkBearerTokenInAuthHeader() + }) + }) + + When("both file and inline token are provided", func() { + BeforeEach(func() { + kubeConfig.AuthInfos["auth-test"] = &api.AuthInfo{ + Token: string(token), + TokenFile: "some-path", + } + }) + + It("the inline token takes precedence", func() { + checkBearerTokenInAuthHeader() + }) + }) + }) +}) + +func pemDecodeKubeConfigCertData(data string) *pem.Block { + decodedData, err := base64.StdEncoding.DecodeString(data) + Expect(err).NotTo(HaveOccurred()) + pemDecodedBlock, rest := pem.Decode(decodedData) + Expect(rest).To(BeEmpty()) + return pemDecodedBlock +} + +func base64Decode(encoded string) string { + decoded, err := base64.StdEncoding.DecodeString(encoded) + Expect(err).NotTo(HaveOccurred()) + return string(decoded) +} + +func writeToFile(base64Data string) string { + file, err := ioutil.TempFile("", "") + Expect(err).NotTo(HaveOccurred()) + file.WriteString(base64Decode(base64Data)) + Expect(file.Close()).To(Succeed()) + return file.Name() +} + +func execCredential(status *clientauthenticationv1beta1.ExecCredentialStatus) string { + execCred, err := json.Marshal(clientauthenticationv1beta1.ExecCredential{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + Status: status, + }) + Expect(err).NotTo(HaveOccurred()) + return string(execCred) +} diff --git a/api/cloudcontroller/wrapper/uaa_authentication.go b/api/cloudcontroller/wrapper/uaa_authentication.go index 861f5b4e9d7..d11ae162857 100644 --- a/api/cloudcontroller/wrapper/uaa_authentication.go +++ b/api/cloudcontroller/wrapper/uaa_authentication.go @@ -50,10 +50,6 @@ func NewUAAAuthentication(client UAAClient, cache TokenCache) *UAAAuthentication // wrapped connection's Make. If the client is not set on the wrapper, it will // not add any header or handle any authentication errors. func (t *UAAAuthentication) Make(request *cloudcontroller.Request, passedResponse *cloudcontroller.Response) error { - if t.client == nil { - return t.connection.Make(request, passedResponse) - } - if request.Header.Get("Authorization") == "" && (t.cache.AccessToken() != "" || t.cache.RefreshToken() != "") { // assert a valid access token for authenticated requests err := t.refreshTokenIfNecessary(t.cache.AccessToken()) diff --git a/api/cloudcontroller/wrapper/uaa_authentication_test.go b/api/cloudcontroller/wrapper/uaa_authentication_test.go index b89f219dc93..e6429356230 100644 --- a/api/cloudcontroller/wrapper/uaa_authentication_test.go +++ b/api/cloudcontroller/wrapper/uaa_authentication_test.go @@ -50,22 +50,6 @@ var _ = Describe("UAA Authentication", func() { }) Describe("Make", func() { - When("the client is nil", func() { - BeforeEach(func() { - inner.SetClient(nil) - - fakeConnection.MakeReturns(ccerror.InvalidAuthTokenError{}) - }) - - It("calls the connection without any side effects", func() { - err := wrapper.Make(request, nil) - Expect(err).To(MatchError(ccerror.InvalidAuthTokenError{})) - - Expect(fakeClient.RefreshAccessTokenCallCount()).To(Equal(0)) - Expect(fakeConnection.MakeCallCount()).To(Equal(1)) - }) - }) - When("no tokens are set", func() { BeforeEach(func() { inMemoryCache.SetAccessToken("") diff --git a/api/cloudcontroller/wrapper/wrapper_suite_test.go b/api/cloudcontroller/wrapper/wrapper_suite_test.go index f0ca6eeda02..ba828571f05 100644 --- a/api/cloudcontroller/wrapper/wrapper_suite_test.go +++ b/api/cloudcontroller/wrapper/wrapper_suite_test.go @@ -2,13 +2,14 @@ package wrapper_test import ( "bytes" + "crypto/rand" + "crypto/rsa" "log" + "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" . "github.com/onsi/gomega/ghttp" - - "testing" ) func TestCloudcontroller(t *testing.T) { @@ -16,7 +17,10 @@ func TestCloudcontroller(t *testing.T) { RunSpecs(t, "Cloud Controller Wrapper Suite") } -var server *Server +var ( + server *Server + keyPair *rsa.PrivateKey +) var _ = SynchronizedBeforeSuite(func() []byte { return []byte{} @@ -25,6 +29,10 @@ var _ = SynchronizedBeforeSuite(func() []byte { // Suppresses ginkgo server logs server.HTTPTestServer.Config.ErrorLog = log.New(&bytes.Buffer{}, "", 0) + + var err error + keyPair, err = rsa.GenerateKey(rand.Reader, 2048) + Expect(err).NotTo(HaveOccurred()) }) var _ = SynchronizedAfterSuite(func() { diff --git a/cf/configuration/coreconfig/config_data.go b/cf/configuration/coreconfig/config_data.go index 975d1aa0ee7..a5314a124c4 100644 --- a/cf/configuration/coreconfig/config_data.go +++ b/cf/configuration/coreconfig/config_data.go @@ -12,11 +12,13 @@ type AuthPromptType string const ( AuthPromptTypeText AuthPromptType = "TEXT" AuthPromptTypePassword AuthPromptType = "PASSWORD" + AuthPromptTypeMenu AuthPromptType = "MENU" ) type AuthPrompt struct { Type AuthPromptType DisplayName string + Entries []string } type Data struct { diff --git a/command/commandfakes/fake_config.go b/command/commandfakes/fake_config.go index 4a4c307d06e..4e94d9f543c 100644 --- a/command/commandfakes/fake_config.go +++ b/command/commandfakes/fake_config.go @@ -201,6 +201,16 @@ type FakeConfig struct { hasTargetedSpaceReturnsOnCall map[int]struct { result1 bool } + IsCFOnK8sStub func() bool + isCFOnK8sMutex sync.RWMutex + isCFOnK8sArgsForCall []struct { + } + isCFOnK8sReturns struct { + result1 bool + } + isCFOnK8sReturnsOnCall map[int]struct { + result1 bool + } IsTTYStub func() bool isTTYMutex sync.RWMutex isTTYArgsForCall []struct { @@ -371,6 +381,11 @@ type FakeConfig struct { setColorEnabledArgsForCall []struct { arg1 string } + SetKubernetesAuthInfoStub func(string) + setKubernetesAuthInfoMutex sync.RWMutex + setKubernetesAuthInfoArgsForCall []struct { + arg1 string + } SetLocaleStub func(string) setLocaleMutex sync.RWMutex setLocaleArgsForCall []struct { @@ -621,16 +636,15 @@ func (fake *FakeConfig) APIVersion() string { ret, specificReturn := fake.aPIVersionReturnsOnCall[len(fake.aPIVersionArgsForCall)] fake.aPIVersionArgsForCall = append(fake.aPIVersionArgsForCall, struct { }{}) - stub := fake.APIVersionStub - fakeReturns := fake.aPIVersionReturns fake.recordInvocation("APIVersion", []interface{}{}) fake.aPIVersionMutex.Unlock() - if stub != nil { - return stub() + if fake.APIVersionStub != nil { + return fake.APIVersionStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.aPIVersionReturns return fakeReturns.result1 } @@ -674,16 +688,15 @@ func (fake *FakeConfig) AccessToken() string { ret, specificReturn := fake.accessTokenReturnsOnCall[len(fake.accessTokenArgsForCall)] fake.accessTokenArgsForCall = append(fake.accessTokenArgsForCall, struct { }{}) - stub := fake.AccessTokenStub - fakeReturns := fake.accessTokenReturns fake.recordInvocation("AccessToken", []interface{}{}) fake.accessTokenMutex.Unlock() - if stub != nil { - return stub() + if fake.AccessTokenStub != nil { + return fake.AccessTokenStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.accessTokenReturns return fakeReturns.result1 } @@ -727,10 +740,9 @@ func (fake *FakeConfig) AddPlugin(arg1 configv3.Plugin) { fake.addPluginArgsForCall = append(fake.addPluginArgsForCall, struct { arg1 configv3.Plugin }{arg1}) - stub := fake.AddPluginStub fake.recordInvocation("AddPlugin", []interface{}{arg1}) fake.addPluginMutex.Unlock() - if stub != nil { + if fake.AddPluginStub != nil { fake.AddPluginStub(arg1) } } @@ -760,10 +772,9 @@ func (fake *FakeConfig) AddPluginRepository(arg1 string, arg2 string) { arg1 string arg2 string }{arg1, arg2}) - stub := fake.AddPluginRepositoryStub fake.recordInvocation("AddPluginRepository", []interface{}{arg1, arg2}) fake.addPluginRepositoryMutex.Unlock() - if stub != nil { + if fake.AddPluginRepositoryStub != nil { fake.AddPluginRepositoryStub(arg1, arg2) } } @@ -792,16 +803,15 @@ func (fake *FakeConfig) AuthorizationEndpoint() string { ret, specificReturn := fake.authorizationEndpointReturnsOnCall[len(fake.authorizationEndpointArgsForCall)] fake.authorizationEndpointArgsForCall = append(fake.authorizationEndpointArgsForCall, struct { }{}) - stub := fake.AuthorizationEndpointStub - fakeReturns := fake.authorizationEndpointReturns fake.recordInvocation("AuthorizationEndpoint", []interface{}{}) fake.authorizationEndpointMutex.Unlock() - if stub != nil { - return stub() + if fake.AuthorizationEndpointStub != nil { + return fake.AuthorizationEndpointStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.authorizationEndpointReturns return fakeReturns.result1 } @@ -845,16 +855,15 @@ func (fake *FakeConfig) BinaryName() string { ret, specificReturn := fake.binaryNameReturnsOnCall[len(fake.binaryNameArgsForCall)] fake.binaryNameArgsForCall = append(fake.binaryNameArgsForCall, struct { }{}) - stub := fake.BinaryNameStub - fakeReturns := fake.binaryNameReturns fake.recordInvocation("BinaryName", []interface{}{}) fake.binaryNameMutex.Unlock() - if stub != nil { - return stub() + if fake.BinaryNameStub != nil { + return fake.BinaryNameStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.binaryNameReturns return fakeReturns.result1 } @@ -898,16 +907,15 @@ func (fake *FakeConfig) BinaryVersion() string { ret, specificReturn := fake.binaryVersionReturnsOnCall[len(fake.binaryVersionArgsForCall)] fake.binaryVersionArgsForCall = append(fake.binaryVersionArgsForCall, struct { }{}) - stub := fake.BinaryVersionStub - fakeReturns := fake.binaryVersionReturns fake.recordInvocation("BinaryVersion", []interface{}{}) fake.binaryVersionMutex.Unlock() - if stub != nil { - return stub() + if fake.BinaryVersionStub != nil { + return fake.BinaryVersionStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.binaryVersionReturns return fakeReturns.result1 } @@ -951,16 +959,15 @@ func (fake *FakeConfig) CFPassword() string { ret, specificReturn := fake.cFPasswordReturnsOnCall[len(fake.cFPasswordArgsForCall)] fake.cFPasswordArgsForCall = append(fake.cFPasswordArgsForCall, struct { }{}) - stub := fake.CFPasswordStub - fakeReturns := fake.cFPasswordReturns fake.recordInvocation("CFPassword", []interface{}{}) fake.cFPasswordMutex.Unlock() - if stub != nil { - return stub() + if fake.CFPasswordStub != nil { + return fake.CFPasswordStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.cFPasswordReturns return fakeReturns.result1 } @@ -1004,16 +1011,15 @@ func (fake *FakeConfig) CFUsername() string { ret, specificReturn := fake.cFUsernameReturnsOnCall[len(fake.cFUsernameArgsForCall)] fake.cFUsernameArgsForCall = append(fake.cFUsernameArgsForCall, struct { }{}) - stub := fake.CFUsernameStub - fakeReturns := fake.cFUsernameReturns fake.recordInvocation("CFUsername", []interface{}{}) fake.cFUsernameMutex.Unlock() - if stub != nil { - return stub() + if fake.CFUsernameStub != nil { + return fake.CFUsernameStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.cFUsernameReturns return fakeReturns.result1 } @@ -1057,16 +1063,15 @@ func (fake *FakeConfig) ColorEnabled() configv3.ColorSetting { ret, specificReturn := fake.colorEnabledReturnsOnCall[len(fake.colorEnabledArgsForCall)] fake.colorEnabledArgsForCall = append(fake.colorEnabledArgsForCall, struct { }{}) - stub := fake.ColorEnabledStub - fakeReturns := fake.colorEnabledReturns fake.recordInvocation("ColorEnabled", []interface{}{}) fake.colorEnabledMutex.Unlock() - if stub != nil { - return stub() + if fake.ColorEnabledStub != nil { + return fake.ColorEnabledStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.colorEnabledReturns return fakeReturns.result1 } @@ -1110,16 +1115,15 @@ func (fake *FakeConfig) CurrentUser() (configv3.User, error) { ret, specificReturn := fake.currentUserReturnsOnCall[len(fake.currentUserArgsForCall)] fake.currentUserArgsForCall = append(fake.currentUserArgsForCall, struct { }{}) - stub := fake.CurrentUserStub - fakeReturns := fake.currentUserReturns fake.recordInvocation("CurrentUser", []interface{}{}) fake.currentUserMutex.Unlock() - if stub != nil { - return stub() + if fake.CurrentUserStub != nil { + return fake.CurrentUserStub() } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.currentUserReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1166,16 +1170,15 @@ func (fake *FakeConfig) CurrentUserName() (string, error) { ret, specificReturn := fake.currentUserNameReturnsOnCall[len(fake.currentUserNameArgsForCall)] fake.currentUserNameArgsForCall = append(fake.currentUserNameArgsForCall, struct { }{}) - stub := fake.CurrentUserNameStub - fakeReturns := fake.currentUserNameReturns fake.recordInvocation("CurrentUserName", []interface{}{}) fake.currentUserNameMutex.Unlock() - if stub != nil { - return stub() + if fake.CurrentUserNameStub != nil { + return fake.CurrentUserNameStub() } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.currentUserNameReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1222,16 +1225,15 @@ func (fake *FakeConfig) DialTimeout() time.Duration { ret, specificReturn := fake.dialTimeoutReturnsOnCall[len(fake.dialTimeoutArgsForCall)] fake.dialTimeoutArgsForCall = append(fake.dialTimeoutArgsForCall, struct { }{}) - stub := fake.DialTimeoutStub - fakeReturns := fake.dialTimeoutReturns fake.recordInvocation("DialTimeout", []interface{}{}) fake.dialTimeoutMutex.Unlock() - if stub != nil { - return stub() + if fake.DialTimeoutStub != nil { + return fake.DialTimeoutStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.dialTimeoutReturns return fakeReturns.result1 } @@ -1275,16 +1277,15 @@ func (fake *FakeConfig) DockerPassword() string { ret, specificReturn := fake.dockerPasswordReturnsOnCall[len(fake.dockerPasswordArgsForCall)] fake.dockerPasswordArgsForCall = append(fake.dockerPasswordArgsForCall, struct { }{}) - stub := fake.DockerPasswordStub - fakeReturns := fake.dockerPasswordReturns fake.recordInvocation("DockerPassword", []interface{}{}) fake.dockerPasswordMutex.Unlock() - if stub != nil { - return stub() + if fake.DockerPasswordStub != nil { + return fake.DockerPasswordStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.dockerPasswordReturns return fakeReturns.result1 } @@ -1328,16 +1329,15 @@ func (fake *FakeConfig) Experimental() bool { ret, specificReturn := fake.experimentalReturnsOnCall[len(fake.experimentalArgsForCall)] fake.experimentalArgsForCall = append(fake.experimentalArgsForCall, struct { }{}) - stub := fake.ExperimentalStub - fakeReturns := fake.experimentalReturns fake.recordInvocation("Experimental", []interface{}{}) fake.experimentalMutex.Unlock() - if stub != nil { - return stub() + if fake.ExperimentalStub != nil { + return fake.ExperimentalStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.experimentalReturns return fakeReturns.result1 } @@ -1382,16 +1382,15 @@ func (fake *FakeConfig) GetPlugin(arg1 string) (configv3.Plugin, bool) { fake.getPluginArgsForCall = append(fake.getPluginArgsForCall, struct { arg1 string }{arg1}) - stub := fake.GetPluginStub - fakeReturns := fake.getPluginReturns fake.recordInvocation("GetPlugin", []interface{}{arg1}) fake.getPluginMutex.Unlock() - if stub != nil { - return stub(arg1) + if fake.GetPluginStub != nil { + return fake.GetPluginStub(arg1) } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.getPluginReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1446,16 +1445,15 @@ func (fake *FakeConfig) GetPluginCaseInsensitive(arg1 string) (configv3.Plugin, fake.getPluginCaseInsensitiveArgsForCall = append(fake.getPluginCaseInsensitiveArgsForCall, struct { arg1 string }{arg1}) - stub := fake.GetPluginCaseInsensitiveStub - fakeReturns := fake.getPluginCaseInsensitiveReturns fake.recordInvocation("GetPluginCaseInsensitive", []interface{}{arg1}) fake.getPluginCaseInsensitiveMutex.Unlock() - if stub != nil { - return stub(arg1) + if fake.GetPluginCaseInsensitiveStub != nil { + return fake.GetPluginCaseInsensitiveStub(arg1) } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.getPluginCaseInsensitiveReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1509,16 +1507,15 @@ func (fake *FakeConfig) HasTargetedOrganization() bool { ret, specificReturn := fake.hasTargetedOrganizationReturnsOnCall[len(fake.hasTargetedOrganizationArgsForCall)] fake.hasTargetedOrganizationArgsForCall = append(fake.hasTargetedOrganizationArgsForCall, struct { }{}) - stub := fake.HasTargetedOrganizationStub - fakeReturns := fake.hasTargetedOrganizationReturns fake.recordInvocation("HasTargetedOrganization", []interface{}{}) fake.hasTargetedOrganizationMutex.Unlock() - if stub != nil { - return stub() + if fake.HasTargetedOrganizationStub != nil { + return fake.HasTargetedOrganizationStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.hasTargetedOrganizationReturns return fakeReturns.result1 } @@ -1562,16 +1559,15 @@ func (fake *FakeConfig) HasTargetedSpace() bool { ret, specificReturn := fake.hasTargetedSpaceReturnsOnCall[len(fake.hasTargetedSpaceArgsForCall)] fake.hasTargetedSpaceArgsForCall = append(fake.hasTargetedSpaceArgsForCall, struct { }{}) - stub := fake.HasTargetedSpaceStub - fakeReturns := fake.hasTargetedSpaceReturns fake.recordInvocation("HasTargetedSpace", []interface{}{}) fake.hasTargetedSpaceMutex.Unlock() - if stub != nil { - return stub() + if fake.HasTargetedSpaceStub != nil { + return fake.HasTargetedSpaceStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.hasTargetedSpaceReturns return fakeReturns.result1 } @@ -1610,21 +1606,72 @@ func (fake *FakeConfig) HasTargetedSpaceReturnsOnCall(i int, result1 bool) { }{result1} } +func (fake *FakeConfig) IsCFOnK8s() bool { + fake.isCFOnK8sMutex.Lock() + ret, specificReturn := fake.isCFOnK8sReturnsOnCall[len(fake.isCFOnK8sArgsForCall)] + fake.isCFOnK8sArgsForCall = append(fake.isCFOnK8sArgsForCall, struct { + }{}) + fake.recordInvocation("IsCFOnK8s", []interface{}{}) + fake.isCFOnK8sMutex.Unlock() + if fake.IsCFOnK8sStub != nil { + return fake.IsCFOnK8sStub() + } + if specificReturn { + return ret.result1 + } + fakeReturns := fake.isCFOnK8sReturns + return fakeReturns.result1 +} + +func (fake *FakeConfig) IsCFOnK8sCallCount() int { + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() + return len(fake.isCFOnK8sArgsForCall) +} + +func (fake *FakeConfig) IsCFOnK8sCalls(stub func() bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = stub +} + +func (fake *FakeConfig) IsCFOnK8sReturns(result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + fake.isCFOnK8sReturns = struct { + result1 bool + }{result1} +} + +func (fake *FakeConfig) IsCFOnK8sReturnsOnCall(i int, result1 bool) { + fake.isCFOnK8sMutex.Lock() + defer fake.isCFOnK8sMutex.Unlock() + fake.IsCFOnK8sStub = nil + if fake.isCFOnK8sReturnsOnCall == nil { + fake.isCFOnK8sReturnsOnCall = make(map[int]struct { + result1 bool + }) + } + fake.isCFOnK8sReturnsOnCall[i] = struct { + result1 bool + }{result1} +} + func (fake *FakeConfig) IsTTY() bool { fake.isTTYMutex.Lock() ret, specificReturn := fake.isTTYReturnsOnCall[len(fake.isTTYArgsForCall)] fake.isTTYArgsForCall = append(fake.isTTYArgsForCall, struct { }{}) - stub := fake.IsTTYStub - fakeReturns := fake.isTTYReturns fake.recordInvocation("IsTTY", []interface{}{}) fake.isTTYMutex.Unlock() - if stub != nil { - return stub() + if fake.IsTTYStub != nil { + return fake.IsTTYStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.isTTYReturns return fakeReturns.result1 } @@ -1668,16 +1715,15 @@ func (fake *FakeConfig) Locale() string { ret, specificReturn := fake.localeReturnsOnCall[len(fake.localeArgsForCall)] fake.localeArgsForCall = append(fake.localeArgsForCall, struct { }{}) - stub := fake.LocaleStub - fakeReturns := fake.localeReturns fake.recordInvocation("Locale", []interface{}{}) fake.localeMutex.Unlock() - if stub != nil { - return stub() + if fake.LocaleStub != nil { + return fake.LocaleStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.localeReturns return fakeReturns.result1 } @@ -1721,16 +1767,15 @@ func (fake *FakeConfig) LogCacheEndpoint() string { ret, specificReturn := fake.logCacheEndpointReturnsOnCall[len(fake.logCacheEndpointArgsForCall)] fake.logCacheEndpointArgsForCall = append(fake.logCacheEndpointArgsForCall, struct { }{}) - stub := fake.LogCacheEndpointStub - fakeReturns := fake.logCacheEndpointReturns fake.recordInvocation("LogCacheEndpoint", []interface{}{}) fake.logCacheEndpointMutex.Unlock() - if stub != nil { - return stub() + if fake.LogCacheEndpointStub != nil { + return fake.LogCacheEndpointStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.logCacheEndpointReturns return fakeReturns.result1 } @@ -1774,16 +1819,15 @@ func (fake *FakeConfig) MinCLIVersion() string { ret, specificReturn := fake.minCLIVersionReturnsOnCall[len(fake.minCLIVersionArgsForCall)] fake.minCLIVersionArgsForCall = append(fake.minCLIVersionArgsForCall, struct { }{}) - stub := fake.MinCLIVersionStub - fakeReturns := fake.minCLIVersionReturns fake.recordInvocation("MinCLIVersion", []interface{}{}) fake.minCLIVersionMutex.Unlock() - if stub != nil { - return stub() + if fake.MinCLIVersionStub != nil { + return fake.MinCLIVersionStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.minCLIVersionReturns return fakeReturns.result1 } @@ -1827,16 +1871,15 @@ func (fake *FakeConfig) NOAARequestRetryCount() int { ret, specificReturn := fake.nOAARequestRetryCountReturnsOnCall[len(fake.nOAARequestRetryCountArgsForCall)] fake.nOAARequestRetryCountArgsForCall = append(fake.nOAARequestRetryCountArgsForCall, struct { }{}) - stub := fake.NOAARequestRetryCountStub - fakeReturns := fake.nOAARequestRetryCountReturns fake.recordInvocation("NOAARequestRetryCount", []interface{}{}) fake.nOAARequestRetryCountMutex.Unlock() - if stub != nil { - return stub() + if fake.NOAARequestRetryCountStub != nil { + return fake.NOAARequestRetryCountStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.nOAARequestRetryCountReturns return fakeReturns.result1 } @@ -1880,16 +1923,15 @@ func (fake *FakeConfig) NetworkPolicyV1Endpoint() string { ret, specificReturn := fake.networkPolicyV1EndpointReturnsOnCall[len(fake.networkPolicyV1EndpointArgsForCall)] fake.networkPolicyV1EndpointArgsForCall = append(fake.networkPolicyV1EndpointArgsForCall, struct { }{}) - stub := fake.NetworkPolicyV1EndpointStub - fakeReturns := fake.networkPolicyV1EndpointReturns fake.recordInvocation("NetworkPolicyV1Endpoint", []interface{}{}) fake.networkPolicyV1EndpointMutex.Unlock() - if stub != nil { - return stub() + if fake.NetworkPolicyV1EndpointStub != nil { + return fake.NetworkPolicyV1EndpointStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.networkPolicyV1EndpointReturns return fakeReturns.result1 } @@ -1933,16 +1975,15 @@ func (fake *FakeConfig) OverallPollingTimeout() time.Duration { ret, specificReturn := fake.overallPollingTimeoutReturnsOnCall[len(fake.overallPollingTimeoutArgsForCall)] fake.overallPollingTimeoutArgsForCall = append(fake.overallPollingTimeoutArgsForCall, struct { }{}) - stub := fake.OverallPollingTimeoutStub - fakeReturns := fake.overallPollingTimeoutReturns fake.recordInvocation("OverallPollingTimeout", []interface{}{}) fake.overallPollingTimeoutMutex.Unlock() - if stub != nil { - return stub() + if fake.OverallPollingTimeoutStub != nil { + return fake.OverallPollingTimeoutStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.overallPollingTimeoutReturns return fakeReturns.result1 } @@ -1986,16 +2027,15 @@ func (fake *FakeConfig) PluginHome() string { ret, specificReturn := fake.pluginHomeReturnsOnCall[len(fake.pluginHomeArgsForCall)] fake.pluginHomeArgsForCall = append(fake.pluginHomeArgsForCall, struct { }{}) - stub := fake.PluginHomeStub - fakeReturns := fake.pluginHomeReturns fake.recordInvocation("PluginHome", []interface{}{}) fake.pluginHomeMutex.Unlock() - if stub != nil { - return stub() + if fake.PluginHomeStub != nil { + return fake.PluginHomeStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.pluginHomeReturns return fakeReturns.result1 } @@ -2039,16 +2079,15 @@ func (fake *FakeConfig) PluginRepositories() []configv3.PluginRepository { ret, specificReturn := fake.pluginRepositoriesReturnsOnCall[len(fake.pluginRepositoriesArgsForCall)] fake.pluginRepositoriesArgsForCall = append(fake.pluginRepositoriesArgsForCall, struct { }{}) - stub := fake.PluginRepositoriesStub - fakeReturns := fake.pluginRepositoriesReturns fake.recordInvocation("PluginRepositories", []interface{}{}) fake.pluginRepositoriesMutex.Unlock() - if stub != nil { - return stub() + if fake.PluginRepositoriesStub != nil { + return fake.PluginRepositoriesStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.pluginRepositoriesReturns return fakeReturns.result1 } @@ -2092,16 +2131,15 @@ func (fake *FakeConfig) Plugins() []configv3.Plugin { ret, specificReturn := fake.pluginsReturnsOnCall[len(fake.pluginsArgsForCall)] fake.pluginsArgsForCall = append(fake.pluginsArgsForCall, struct { }{}) - stub := fake.PluginsStub - fakeReturns := fake.pluginsReturns fake.recordInvocation("Plugins", []interface{}{}) fake.pluginsMutex.Unlock() - if stub != nil { - return stub() + if fake.PluginsStub != nil { + return fake.PluginsStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.pluginsReturns return fakeReturns.result1 } @@ -2145,16 +2183,15 @@ func (fake *FakeConfig) PollingInterval() time.Duration { ret, specificReturn := fake.pollingIntervalReturnsOnCall[len(fake.pollingIntervalArgsForCall)] fake.pollingIntervalArgsForCall = append(fake.pollingIntervalArgsForCall, struct { }{}) - stub := fake.PollingIntervalStub - fakeReturns := fake.pollingIntervalReturns fake.recordInvocation("PollingInterval", []interface{}{}) fake.pollingIntervalMutex.Unlock() - if stub != nil { - return stub() + if fake.PollingIntervalStub != nil { + return fake.PollingIntervalStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.pollingIntervalReturns return fakeReturns.result1 } @@ -2198,16 +2235,15 @@ func (fake *FakeConfig) RefreshToken() string { ret, specificReturn := fake.refreshTokenReturnsOnCall[len(fake.refreshTokenArgsForCall)] fake.refreshTokenArgsForCall = append(fake.refreshTokenArgsForCall, struct { }{}) - stub := fake.RefreshTokenStub - fakeReturns := fake.refreshTokenReturns fake.recordInvocation("RefreshToken", []interface{}{}) fake.refreshTokenMutex.Unlock() - if stub != nil { - return stub() + if fake.RefreshTokenStub != nil { + return fake.RefreshTokenStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.refreshTokenReturns return fakeReturns.result1 } @@ -2251,10 +2287,9 @@ func (fake *FakeConfig) RemovePlugin(arg1 string) { fake.removePluginArgsForCall = append(fake.removePluginArgsForCall, struct { arg1 string }{arg1}) - stub := fake.RemovePluginStub fake.recordInvocation("RemovePlugin", []interface{}{arg1}) fake.removePluginMutex.Unlock() - if stub != nil { + if fake.RemovePluginStub != nil { fake.RemovePluginStub(arg1) } } @@ -2283,16 +2318,15 @@ func (fake *FakeConfig) RequestRetryCount() int { ret, specificReturn := fake.requestRetryCountReturnsOnCall[len(fake.requestRetryCountArgsForCall)] fake.requestRetryCountArgsForCall = append(fake.requestRetryCountArgsForCall, struct { }{}) - stub := fake.RequestRetryCountStub - fakeReturns := fake.requestRetryCountReturns fake.recordInvocation("RequestRetryCount", []interface{}{}) fake.requestRetryCountMutex.Unlock() - if stub != nil { - return stub() + if fake.RequestRetryCountStub != nil { + return fake.RequestRetryCountStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.requestRetryCountReturns return fakeReturns.result1 } @@ -2336,16 +2370,15 @@ func (fake *FakeConfig) RoutingEndpoint() string { ret, specificReturn := fake.routingEndpointReturnsOnCall[len(fake.routingEndpointArgsForCall)] fake.routingEndpointArgsForCall = append(fake.routingEndpointArgsForCall, struct { }{}) - stub := fake.RoutingEndpointStub - fakeReturns := fake.routingEndpointReturns fake.recordInvocation("RoutingEndpoint", []interface{}{}) fake.routingEndpointMutex.Unlock() - if stub != nil { - return stub() + if fake.RoutingEndpointStub != nil { + return fake.RoutingEndpointStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.routingEndpointReturns return fakeReturns.result1 } @@ -2389,16 +2422,15 @@ func (fake *FakeConfig) SSHOAuthClient() string { ret, specificReturn := fake.sSHOAuthClientReturnsOnCall[len(fake.sSHOAuthClientArgsForCall)] fake.sSHOAuthClientArgsForCall = append(fake.sSHOAuthClientArgsForCall, struct { }{}) - stub := fake.SSHOAuthClientStub - fakeReturns := fake.sSHOAuthClientReturns fake.recordInvocation("SSHOAuthClient", []interface{}{}) fake.sSHOAuthClientMutex.Unlock() - if stub != nil { - return stub() + if fake.SSHOAuthClientStub != nil { + return fake.SSHOAuthClientStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.sSHOAuthClientReturns return fakeReturns.result1 } @@ -2442,10 +2474,9 @@ func (fake *FakeConfig) SetAccessToken(arg1 string) { fake.setAccessTokenArgsForCall = append(fake.setAccessTokenArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetAccessTokenStub fake.recordInvocation("SetAccessToken", []interface{}{arg1}) fake.setAccessTokenMutex.Unlock() - if stub != nil { + if fake.SetAccessTokenStub != nil { fake.SetAccessTokenStub(arg1) } } @@ -2474,10 +2505,9 @@ func (fake *FakeConfig) SetAsyncTimeout(arg1 int) { fake.setAsyncTimeoutArgsForCall = append(fake.setAsyncTimeoutArgsForCall, struct { arg1 int }{arg1}) - stub := fake.SetAsyncTimeoutStub fake.recordInvocation("SetAsyncTimeout", []interface{}{arg1}) fake.setAsyncTimeoutMutex.Unlock() - if stub != nil { + if fake.SetAsyncTimeoutStub != nil { fake.SetAsyncTimeoutStub(arg1) } } @@ -2506,10 +2536,9 @@ func (fake *FakeConfig) SetColorEnabled(arg1 string) { fake.setColorEnabledArgsForCall = append(fake.setColorEnabledArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetColorEnabledStub fake.recordInvocation("SetColorEnabled", []interface{}{arg1}) fake.setColorEnabledMutex.Unlock() - if stub != nil { + if fake.SetColorEnabledStub != nil { fake.SetColorEnabledStub(arg1) } } @@ -2533,15 +2562,45 @@ func (fake *FakeConfig) SetColorEnabledArgsForCall(i int) string { return argsForCall.arg1 } +func (fake *FakeConfig) SetKubernetesAuthInfo(arg1 string) { + fake.setKubernetesAuthInfoMutex.Lock() + fake.setKubernetesAuthInfoArgsForCall = append(fake.setKubernetesAuthInfoArgsForCall, struct { + arg1 string + }{arg1}) + fake.recordInvocation("SetKubernetesAuthInfo", []interface{}{arg1}) + fake.setKubernetesAuthInfoMutex.Unlock() + if fake.SetKubernetesAuthInfoStub != nil { + fake.SetKubernetesAuthInfoStub(arg1) + } +} + +func (fake *FakeConfig) SetKubernetesAuthInfoCallCount() int { + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() + return len(fake.setKubernetesAuthInfoArgsForCall) +} + +func (fake *FakeConfig) SetKubernetesAuthInfoCalls(stub func(string)) { + fake.setKubernetesAuthInfoMutex.Lock() + defer fake.setKubernetesAuthInfoMutex.Unlock() + fake.SetKubernetesAuthInfoStub = stub +} + +func (fake *FakeConfig) SetKubernetesAuthInfoArgsForCall(i int) string { + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() + argsForCall := fake.setKubernetesAuthInfoArgsForCall[i] + return argsForCall.arg1 +} + func (fake *FakeConfig) SetLocale(arg1 string) { fake.setLocaleMutex.Lock() fake.setLocaleArgsForCall = append(fake.setLocaleArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetLocaleStub fake.recordInvocation("SetLocale", []interface{}{arg1}) fake.setLocaleMutex.Unlock() - if stub != nil { + if fake.SetLocaleStub != nil { fake.SetLocaleStub(arg1) } } @@ -2570,10 +2629,9 @@ func (fake *FakeConfig) SetMinCLIVersion(arg1 string) { fake.setMinCLIVersionArgsForCall = append(fake.setMinCLIVersionArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetMinCLIVersionStub fake.recordInvocation("SetMinCLIVersion", []interface{}{arg1}) fake.setMinCLIVersionMutex.Unlock() - if stub != nil { + if fake.SetMinCLIVersionStub != nil { fake.SetMinCLIVersionStub(arg1) } } @@ -2603,10 +2661,9 @@ func (fake *FakeConfig) SetOrganizationInformation(arg1 string, arg2 string) { arg1 string arg2 string }{arg1, arg2}) - stub := fake.SetOrganizationInformationStub fake.recordInvocation("SetOrganizationInformation", []interface{}{arg1, arg2}) fake.setOrganizationInformationMutex.Unlock() - if stub != nil { + if fake.SetOrganizationInformationStub != nil { fake.SetOrganizationInformationStub(arg1, arg2) } } @@ -2635,10 +2692,9 @@ func (fake *FakeConfig) SetRefreshToken(arg1 string) { fake.setRefreshTokenArgsForCall = append(fake.setRefreshTokenArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetRefreshTokenStub fake.recordInvocation("SetRefreshToken", []interface{}{arg1}) fake.setRefreshTokenMutex.Unlock() - if stub != nil { + if fake.SetRefreshTokenStub != nil { fake.SetRefreshTokenStub(arg1) } } @@ -2669,10 +2725,9 @@ func (fake *FakeConfig) SetSpaceInformation(arg1 string, arg2 string, arg3 bool) arg2 string arg3 bool }{arg1, arg2, arg3}) - stub := fake.SetSpaceInformationStub fake.recordInvocation("SetSpaceInformation", []interface{}{arg1, arg2, arg3}) fake.setSpaceInformationMutex.Unlock() - if stub != nil { + if fake.SetSpaceInformationStub != nil { fake.SetSpaceInformationStub(arg1, arg2, arg3) } } @@ -2701,10 +2756,9 @@ func (fake *FakeConfig) SetTargetInformation(arg1 configv3.TargetInformationArgs fake.setTargetInformationArgsForCall = append(fake.setTargetInformationArgsForCall, struct { arg1 configv3.TargetInformationArgs }{arg1}) - stub := fake.SetTargetInformationStub fake.recordInvocation("SetTargetInformation", []interface{}{arg1}) fake.setTargetInformationMutex.Unlock() - if stub != nil { + if fake.SetTargetInformationStub != nil { fake.SetTargetInformationStub(arg1) } } @@ -2735,10 +2789,9 @@ func (fake *FakeConfig) SetTokenInformation(arg1 string, arg2 string, arg3 strin arg2 string arg3 string }{arg1, arg2, arg3}) - stub := fake.SetTokenInformationStub fake.recordInvocation("SetTokenInformation", []interface{}{arg1, arg2, arg3}) fake.setTokenInformationMutex.Unlock() - if stub != nil { + if fake.SetTokenInformationStub != nil { fake.SetTokenInformationStub(arg1, arg2, arg3) } } @@ -2767,10 +2820,9 @@ func (fake *FakeConfig) SetTrace(arg1 string) { fake.setTraceArgsForCall = append(fake.setTraceArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetTraceStub fake.recordInvocation("SetTrace", []interface{}{arg1}) fake.setTraceMutex.Unlock() - if stub != nil { + if fake.SetTraceStub != nil { fake.SetTraceStub(arg1) } } @@ -2800,10 +2852,9 @@ func (fake *FakeConfig) SetUAAClientCredentials(arg1 string, arg2 string) { arg1 string arg2 string }{arg1, arg2}) - stub := fake.SetUAAClientCredentialsStub fake.recordInvocation("SetUAAClientCredentials", []interface{}{arg1, arg2}) fake.setUAAClientCredentialsMutex.Unlock() - if stub != nil { + if fake.SetUAAClientCredentialsStub != nil { fake.SetUAAClientCredentialsStub(arg1, arg2) } } @@ -2832,10 +2883,9 @@ func (fake *FakeConfig) SetUAAEndpoint(arg1 string) { fake.setUAAEndpointArgsForCall = append(fake.setUAAEndpointArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetUAAEndpointStub fake.recordInvocation("SetUAAEndpoint", []interface{}{arg1}) fake.setUAAEndpointMutex.Unlock() - if stub != nil { + if fake.SetUAAEndpointStub != nil { fake.SetUAAEndpointStub(arg1) } } @@ -2864,10 +2914,9 @@ func (fake *FakeConfig) SetUAAGrantType(arg1 string) { fake.setUAAGrantTypeArgsForCall = append(fake.setUAAGrantTypeArgsForCall, struct { arg1 string }{arg1}) - stub := fake.SetUAAGrantTypeStub fake.recordInvocation("SetUAAGrantType", []interface{}{arg1}) fake.setUAAGrantTypeMutex.Unlock() - if stub != nil { + if fake.SetUAAGrantTypeStub != nil { fake.SetUAAGrantTypeStub(arg1) } } @@ -2896,16 +2945,15 @@ func (fake *FakeConfig) SkipSSLValidation() bool { ret, specificReturn := fake.skipSSLValidationReturnsOnCall[len(fake.skipSSLValidationArgsForCall)] fake.skipSSLValidationArgsForCall = append(fake.skipSSLValidationArgsForCall, struct { }{}) - stub := fake.SkipSSLValidationStub - fakeReturns := fake.skipSSLValidationReturns fake.recordInvocation("SkipSSLValidation", []interface{}{}) fake.skipSSLValidationMutex.Unlock() - if stub != nil { - return stub() + if fake.SkipSSLValidationStub != nil { + return fake.SkipSSLValidationStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.skipSSLValidationReturns return fakeReturns.result1 } @@ -2949,16 +2997,15 @@ func (fake *FakeConfig) StagingTimeout() time.Duration { ret, specificReturn := fake.stagingTimeoutReturnsOnCall[len(fake.stagingTimeoutArgsForCall)] fake.stagingTimeoutArgsForCall = append(fake.stagingTimeoutArgsForCall, struct { }{}) - stub := fake.StagingTimeoutStub - fakeReturns := fake.stagingTimeoutReturns fake.recordInvocation("StagingTimeout", []interface{}{}) fake.stagingTimeoutMutex.Unlock() - if stub != nil { - return stub() + if fake.StagingTimeoutStub != nil { + return fake.StagingTimeoutStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.stagingTimeoutReturns return fakeReturns.result1 } @@ -3002,16 +3049,15 @@ func (fake *FakeConfig) StartupTimeout() time.Duration { ret, specificReturn := fake.startupTimeoutReturnsOnCall[len(fake.startupTimeoutArgsForCall)] fake.startupTimeoutArgsForCall = append(fake.startupTimeoutArgsForCall, struct { }{}) - stub := fake.StartupTimeoutStub - fakeReturns := fake.startupTimeoutReturns fake.recordInvocation("StartupTimeout", []interface{}{}) fake.startupTimeoutMutex.Unlock() - if stub != nil { - return stub() + if fake.StartupTimeoutStub != nil { + return fake.StartupTimeoutStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.startupTimeoutReturns return fakeReturns.result1 } @@ -3055,16 +3101,15 @@ func (fake *FakeConfig) Target() string { ret, specificReturn := fake.targetReturnsOnCall[len(fake.targetArgsForCall)] fake.targetArgsForCall = append(fake.targetArgsForCall, struct { }{}) - stub := fake.TargetStub - fakeReturns := fake.targetReturns fake.recordInvocation("Target", []interface{}{}) fake.targetMutex.Unlock() - if stub != nil { - return stub() + if fake.TargetStub != nil { + return fake.TargetStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.targetReturns return fakeReturns.result1 } @@ -3108,16 +3153,15 @@ func (fake *FakeConfig) TargetedOrganization() configv3.Organization { ret, specificReturn := fake.targetedOrganizationReturnsOnCall[len(fake.targetedOrganizationArgsForCall)] fake.targetedOrganizationArgsForCall = append(fake.targetedOrganizationArgsForCall, struct { }{}) - stub := fake.TargetedOrganizationStub - fakeReturns := fake.targetedOrganizationReturns fake.recordInvocation("TargetedOrganization", []interface{}{}) fake.targetedOrganizationMutex.Unlock() - if stub != nil { - return stub() + if fake.TargetedOrganizationStub != nil { + return fake.TargetedOrganizationStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.targetedOrganizationReturns return fakeReturns.result1 } @@ -3161,16 +3205,15 @@ func (fake *FakeConfig) TargetedOrganizationName() string { ret, specificReturn := fake.targetedOrganizationNameReturnsOnCall[len(fake.targetedOrganizationNameArgsForCall)] fake.targetedOrganizationNameArgsForCall = append(fake.targetedOrganizationNameArgsForCall, struct { }{}) - stub := fake.TargetedOrganizationNameStub - fakeReturns := fake.targetedOrganizationNameReturns fake.recordInvocation("TargetedOrganizationName", []interface{}{}) fake.targetedOrganizationNameMutex.Unlock() - if stub != nil { - return stub() + if fake.TargetedOrganizationNameStub != nil { + return fake.TargetedOrganizationNameStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.targetedOrganizationNameReturns return fakeReturns.result1 } @@ -3214,16 +3257,15 @@ func (fake *FakeConfig) TargetedSpace() configv3.Space { ret, specificReturn := fake.targetedSpaceReturnsOnCall[len(fake.targetedSpaceArgsForCall)] fake.targetedSpaceArgsForCall = append(fake.targetedSpaceArgsForCall, struct { }{}) - stub := fake.TargetedSpaceStub - fakeReturns := fake.targetedSpaceReturns fake.recordInvocation("TargetedSpace", []interface{}{}) fake.targetedSpaceMutex.Unlock() - if stub != nil { - return stub() + if fake.TargetedSpaceStub != nil { + return fake.TargetedSpaceStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.targetedSpaceReturns return fakeReturns.result1 } @@ -3267,16 +3309,15 @@ func (fake *FakeConfig) TerminalWidth() int { ret, specificReturn := fake.terminalWidthReturnsOnCall[len(fake.terminalWidthArgsForCall)] fake.terminalWidthArgsForCall = append(fake.terminalWidthArgsForCall, struct { }{}) - stub := fake.TerminalWidthStub - fakeReturns := fake.terminalWidthReturns fake.recordInvocation("TerminalWidth", []interface{}{}) fake.terminalWidthMutex.Unlock() - if stub != nil { - return stub() + if fake.TerminalWidthStub != nil { + return fake.TerminalWidthStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.terminalWidthReturns return fakeReturns.result1 } @@ -3320,16 +3361,15 @@ func (fake *FakeConfig) UAADisableKeepAlives() bool { ret, specificReturn := fake.uAADisableKeepAlivesReturnsOnCall[len(fake.uAADisableKeepAlivesArgsForCall)] fake.uAADisableKeepAlivesArgsForCall = append(fake.uAADisableKeepAlivesArgsForCall, struct { }{}) - stub := fake.UAADisableKeepAlivesStub - fakeReturns := fake.uAADisableKeepAlivesReturns fake.recordInvocation("UAADisableKeepAlives", []interface{}{}) fake.uAADisableKeepAlivesMutex.Unlock() - if stub != nil { - return stub() + if fake.UAADisableKeepAlivesStub != nil { + return fake.UAADisableKeepAlivesStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.uAADisableKeepAlivesReturns return fakeReturns.result1 } @@ -3373,16 +3413,15 @@ func (fake *FakeConfig) UAAEndpoint() string { ret, specificReturn := fake.uAAEndpointReturnsOnCall[len(fake.uAAEndpointArgsForCall)] fake.uAAEndpointArgsForCall = append(fake.uAAEndpointArgsForCall, struct { }{}) - stub := fake.UAAEndpointStub - fakeReturns := fake.uAAEndpointReturns fake.recordInvocation("UAAEndpoint", []interface{}{}) fake.uAAEndpointMutex.Unlock() - if stub != nil { - return stub() + if fake.UAAEndpointStub != nil { + return fake.UAAEndpointStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.uAAEndpointReturns return fakeReturns.result1 } @@ -3426,16 +3465,15 @@ func (fake *FakeConfig) UAAGrantType() string { ret, specificReturn := fake.uAAGrantTypeReturnsOnCall[len(fake.uAAGrantTypeArgsForCall)] fake.uAAGrantTypeArgsForCall = append(fake.uAAGrantTypeArgsForCall, struct { }{}) - stub := fake.UAAGrantTypeStub - fakeReturns := fake.uAAGrantTypeReturns fake.recordInvocation("UAAGrantType", []interface{}{}) fake.uAAGrantTypeMutex.Unlock() - if stub != nil { - return stub() + if fake.UAAGrantTypeStub != nil { + return fake.UAAGrantTypeStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.uAAGrantTypeReturns return fakeReturns.result1 } @@ -3479,16 +3517,15 @@ func (fake *FakeConfig) UAAOAuthClient() string { ret, specificReturn := fake.uAAOAuthClientReturnsOnCall[len(fake.uAAOAuthClientArgsForCall)] fake.uAAOAuthClientArgsForCall = append(fake.uAAOAuthClientArgsForCall, struct { }{}) - stub := fake.UAAOAuthClientStub - fakeReturns := fake.uAAOAuthClientReturns fake.recordInvocation("UAAOAuthClient", []interface{}{}) fake.uAAOAuthClientMutex.Unlock() - if stub != nil { - return stub() + if fake.UAAOAuthClientStub != nil { + return fake.UAAOAuthClientStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.uAAOAuthClientReturns return fakeReturns.result1 } @@ -3532,16 +3569,15 @@ func (fake *FakeConfig) UAAOAuthClientSecret() string { ret, specificReturn := fake.uAAOAuthClientSecretReturnsOnCall[len(fake.uAAOAuthClientSecretArgsForCall)] fake.uAAOAuthClientSecretArgsForCall = append(fake.uAAOAuthClientSecretArgsForCall, struct { }{}) - stub := fake.UAAOAuthClientSecretStub - fakeReturns := fake.uAAOAuthClientSecretReturns fake.recordInvocation("UAAOAuthClientSecret", []interface{}{}) fake.uAAOAuthClientSecretMutex.Unlock() - if stub != nil { - return stub() + if fake.UAAOAuthClientSecretStub != nil { + return fake.UAAOAuthClientSecretStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.uAAOAuthClientSecretReturns return fakeReturns.result1 } @@ -3584,10 +3620,9 @@ func (fake *FakeConfig) UnsetOrganizationAndSpaceInformation() { fake.unsetOrganizationAndSpaceInformationMutex.Lock() fake.unsetOrganizationAndSpaceInformationArgsForCall = append(fake.unsetOrganizationAndSpaceInformationArgsForCall, struct { }{}) - stub := fake.UnsetOrganizationAndSpaceInformationStub fake.recordInvocation("UnsetOrganizationAndSpaceInformation", []interface{}{}) fake.unsetOrganizationAndSpaceInformationMutex.Unlock() - if stub != nil { + if fake.UnsetOrganizationAndSpaceInformationStub != nil { fake.UnsetOrganizationAndSpaceInformationStub() } } @@ -3608,10 +3643,9 @@ func (fake *FakeConfig) UnsetSpaceInformation() { fake.unsetSpaceInformationMutex.Lock() fake.unsetSpaceInformationArgsForCall = append(fake.unsetSpaceInformationArgsForCall, struct { }{}) - stub := fake.UnsetSpaceInformationStub fake.recordInvocation("UnsetSpaceInformation", []interface{}{}) fake.unsetSpaceInformationMutex.Unlock() - if stub != nil { + if fake.UnsetSpaceInformationStub != nil { fake.UnsetSpaceInformationStub() } } @@ -3632,10 +3666,9 @@ func (fake *FakeConfig) UnsetUserInformation() { fake.unsetUserInformationMutex.Lock() fake.unsetUserInformationArgsForCall = append(fake.unsetUserInformationArgsForCall, struct { }{}) - stub := fake.UnsetUserInformationStub fake.recordInvocation("UnsetUserInformation", []interface{}{}) fake.unsetUserInformationMutex.Unlock() - if stub != nil { + if fake.UnsetUserInformationStub != nil { fake.UnsetUserInformationStub() } } @@ -3658,10 +3691,9 @@ func (fake *FakeConfig) V7SetSpaceInformation(arg1 string, arg2 string) { arg1 string arg2 string }{arg1, arg2}) - stub := fake.V7SetSpaceInformationStub fake.recordInvocation("V7SetSpaceInformation", []interface{}{arg1, arg2}) fake.v7SetSpaceInformationMutex.Unlock() - if stub != nil { + if fake.V7SetSpaceInformationStub != nil { fake.V7SetSpaceInformationStub(arg1, arg2) } } @@ -3690,16 +3722,15 @@ func (fake *FakeConfig) Verbose() (bool, []string) { ret, specificReturn := fake.verboseReturnsOnCall[len(fake.verboseArgsForCall)] fake.verboseArgsForCall = append(fake.verboseArgsForCall, struct { }{}) - stub := fake.VerboseStub - fakeReturns := fake.verboseReturns fake.recordInvocation("Verbose", []interface{}{}) fake.verboseMutex.Unlock() - if stub != nil { - return stub() + if fake.VerboseStub != nil { + return fake.VerboseStub() } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.verboseReturns return fakeReturns.result1, fakeReturns.result2 } @@ -3746,16 +3777,15 @@ func (fake *FakeConfig) WriteConfig() error { ret, specificReturn := fake.writeConfigReturnsOnCall[len(fake.writeConfigArgsForCall)] fake.writeConfigArgsForCall = append(fake.writeConfigArgsForCall, struct { }{}) - stub := fake.WriteConfigStub - fakeReturns := fake.writeConfigReturns fake.recordInvocation("WriteConfig", []interface{}{}) fake.writeConfigMutex.Unlock() - if stub != nil { - return stub() + if fake.WriteConfigStub != nil { + return fake.WriteConfigStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.writeConfigReturns return fakeReturns.result1 } @@ -3799,16 +3829,15 @@ func (fake *FakeConfig) WritePluginConfig() error { ret, specificReturn := fake.writePluginConfigReturnsOnCall[len(fake.writePluginConfigArgsForCall)] fake.writePluginConfigArgsForCall = append(fake.writePluginConfigArgsForCall, struct { }{}) - stub := fake.WritePluginConfigStub - fakeReturns := fake.writePluginConfigReturns fake.recordInvocation("WritePluginConfig", []interface{}{}) fake.writePluginConfigMutex.Unlock() - if stub != nil { - return stub() + if fake.WritePluginConfigStub != nil { + return fake.WritePluginConfigStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.writePluginConfigReturns return fakeReturns.result1 } @@ -3888,6 +3917,8 @@ func (fake *FakeConfig) Invocations() map[string][][]interface{} { defer fake.hasTargetedOrganizationMutex.RUnlock() fake.hasTargetedSpaceMutex.RLock() defer fake.hasTargetedSpaceMutex.RUnlock() + fake.isCFOnK8sMutex.RLock() + defer fake.isCFOnK8sMutex.RUnlock() fake.isTTYMutex.RLock() defer fake.isTTYMutex.RUnlock() fake.localeMutex.RLock() @@ -3926,6 +3957,8 @@ func (fake *FakeConfig) Invocations() map[string][][]interface{} { defer fake.setAsyncTimeoutMutex.RUnlock() fake.setColorEnabledMutex.RLock() defer fake.setColorEnabledMutex.RUnlock() + fake.setKubernetesAuthInfoMutex.RLock() + defer fake.setKubernetesAuthInfoMutex.RUnlock() fake.setLocaleMutex.RLock() defer fake.setLocaleMutex.RUnlock() fake.setMinCLIVersionMutex.RLock() diff --git a/command/commandfakes/fake_shared_actor.go b/command/commandfakes/fake_shared_actor.go index b47add345b8..fec3b1b77d3 100644 --- a/command/commandfakes/fake_shared_actor.go +++ b/command/commandfakes/fake_shared_actor.go @@ -85,16 +85,15 @@ func (fake *FakeSharedActor) CheckTarget(arg1 bool, arg2 bool) error { arg1 bool arg2 bool }{arg1, arg2}) - stub := fake.CheckTargetStub - fakeReturns := fake.checkTargetReturns fake.recordInvocation("CheckTarget", []interface{}{arg1, arg2}) fake.checkTargetMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) + if fake.CheckTargetStub != nil { + return fake.CheckTargetStub(arg1, arg2) } if specificReturn { return ret.result1 } + fakeReturns := fake.checkTargetReturns return fakeReturns.result1 } @@ -145,16 +144,15 @@ func (fake *FakeSharedActor) IsLoggedIn() bool { ret, specificReturn := fake.isLoggedInReturnsOnCall[len(fake.isLoggedInArgsForCall)] fake.isLoggedInArgsForCall = append(fake.isLoggedInArgsForCall, struct { }{}) - stub := fake.IsLoggedInStub - fakeReturns := fake.isLoggedInReturns fake.recordInvocation("IsLoggedIn", []interface{}{}) fake.isLoggedInMutex.Unlock() - if stub != nil { - return stub() + if fake.IsLoggedInStub != nil { + return fake.IsLoggedInStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.isLoggedInReturns return fakeReturns.result1 } @@ -198,16 +196,15 @@ func (fake *FakeSharedActor) IsOrgTargeted() bool { ret, specificReturn := fake.isOrgTargetedReturnsOnCall[len(fake.isOrgTargetedArgsForCall)] fake.isOrgTargetedArgsForCall = append(fake.isOrgTargetedArgsForCall, struct { }{}) - stub := fake.IsOrgTargetedStub - fakeReturns := fake.isOrgTargetedReturns fake.recordInvocation("IsOrgTargeted", []interface{}{}) fake.isOrgTargetedMutex.Unlock() - if stub != nil { - return stub() + if fake.IsOrgTargetedStub != nil { + return fake.IsOrgTargetedStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.isOrgTargetedReturns return fakeReturns.result1 } @@ -251,16 +248,15 @@ func (fake *FakeSharedActor) IsSpaceTargeted() bool { ret, specificReturn := fake.isSpaceTargetedReturnsOnCall[len(fake.isSpaceTargetedArgsForCall)] fake.isSpaceTargetedArgsForCall = append(fake.isSpaceTargetedArgsForCall, struct { }{}) - stub := fake.IsSpaceTargetedStub - fakeReturns := fake.isSpaceTargetedReturns fake.recordInvocation("IsSpaceTargeted", []interface{}{}) fake.isSpaceTargetedMutex.Unlock() - if stub != nil { - return stub() + if fake.IsSpaceTargetedStub != nil { + return fake.IsSpaceTargetedStub() } if specificReturn { return ret.result1 } + fakeReturns := fake.isSpaceTargetedReturns return fakeReturns.result1 } @@ -304,16 +300,15 @@ func (fake *FakeSharedActor) RequireCurrentUser() (string, error) { ret, specificReturn := fake.requireCurrentUserReturnsOnCall[len(fake.requireCurrentUserArgsForCall)] fake.requireCurrentUserArgsForCall = append(fake.requireCurrentUserArgsForCall, struct { }{}) - stub := fake.RequireCurrentUserStub - fakeReturns := fake.requireCurrentUserReturns fake.recordInvocation("RequireCurrentUser", []interface{}{}) fake.requireCurrentUserMutex.Unlock() - if stub != nil { - return stub() + if fake.RequireCurrentUserStub != nil { + return fake.RequireCurrentUserStub() } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.requireCurrentUserReturns return fakeReturns.result1, fakeReturns.result2 } @@ -360,16 +355,15 @@ func (fake *FakeSharedActor) RequireTargetedOrg() (string, error) { ret, specificReturn := fake.requireTargetedOrgReturnsOnCall[len(fake.requireTargetedOrgArgsForCall)] fake.requireTargetedOrgArgsForCall = append(fake.requireTargetedOrgArgsForCall, struct { }{}) - stub := fake.RequireTargetedOrgStub - fakeReturns := fake.requireTargetedOrgReturns fake.recordInvocation("RequireTargetedOrg", []interface{}{}) fake.requireTargetedOrgMutex.Unlock() - if stub != nil { - return stub() + if fake.RequireTargetedOrgStub != nil { + return fake.RequireTargetedOrgStub() } if specificReturn { return ret.result1, ret.result2 } + fakeReturns := fake.requireTargetedOrgReturns return fakeReturns.result1, fakeReturns.result2 } diff --git a/command/config.go b/command/config.go index 7aec299c670..44b30e5ba99 100644 --- a/command/config.go +++ b/command/config.go @@ -80,4 +80,6 @@ type Config interface { Verbose() (bool, []string) WritePluginConfig() error WriteConfig() error + IsCFOnK8s() bool + SetKubernetesAuthInfo(authInfo string) } diff --git a/command/translatableerror/not_supported_on_k8s_error.go b/command/translatableerror/not_supported_on_k8s_error.go new file mode 100644 index 00000000000..630edef1271 --- /dev/null +++ b/command/translatableerror/not_supported_on_k8s_error.go @@ -0,0 +1,19 @@ +package translatableerror + +// NotSupportedOnKubernetesArgumentError represents an error caused by using an +// argument that is not supported on kubernetes +type NotSupportedOnKubernetesArgumentError struct { + Arg string +} + +func (NotSupportedOnKubernetesArgumentError) DisplayUsage() {} + +func (NotSupportedOnKubernetesArgumentError) Error() string { + return "The argument {{.Arg}} is not supported on Kubernetes" +} + +func (e NotSupportedOnKubernetesArgumentError) Translate(translate func(string, ...interface{}) string) string { + return translate(e.Error(), map[string]interface{}{ + "Arg": e.Arg, + }) +} diff --git a/command/v7/actor.go b/command/v7/actor.go index 52fc12ece70..d8bc2a17dca 100644 --- a/command/v7/actor.go +++ b/command/v7/actor.go @@ -14,6 +14,7 @@ import ( "code.cloudfoundry.org/cli/cf/configuration/coreconfig" "code.cloudfoundry.org/cli/resources" "code.cloudfoundry.org/cli/types" + "code.cloudfoundry.org/cli/util/configv3" "github.com/SermoDigital/jose/jwt" ) @@ -99,6 +100,7 @@ type Actor interface { GetApplicationsByNamesAndSpace(appNames []string, spaceGUID string) ([]resources.Application, v7action.Warnings, error) GetBuildpackLabels(buildpackName string, buildpackStack string) (map[string]types.NullString, v7action.Warnings, error) GetBuildpacks(labelSelector string) ([]resources.Buildpack, v7action.Warnings, error) + GetCurrentUser() (configv3.User, error) GetDefaultDomain(orgGUID string) (resources.Domain, v7action.Warnings, error) GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error) GetDomain(domainGUID string) (resources.Domain, v7action.Warnings, error) diff --git a/command/v7/add_network_policy_command.go b/command/v7/add_network_policy_command.go index 1af831be9ad..b795bde454a 100644 --- a/command/v7/add_network_policy_command.go +++ b/command/v7/add_network_policy_command.go @@ -98,7 +98,7 @@ func (cmd AddNetworkPolicyCommand) Execute(args []string) error { destSpaceGUID = destSpace.GUID } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/add_network_policy_command_test.go b/command/v7/add_network_policy_command_test.go index e046bdfd05a..998afb510c9 100644 --- a/command/v7/add_network_policy_command_test.go +++ b/command/v7/add_network_policy_command_test.go @@ -88,7 +88,7 @@ var _ = Describe("add-network-policy Command", func() { When("the user is logged in, an org is targeted, and a space is targeted", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) }) diff --git a/command/v7/allow_space_ssh_command.go b/command/v7/allow_space_ssh_command.go index 3900e532600..38e6f99e56b 100644 --- a/command/v7/allow_space_ssh_command.go +++ b/command/v7/allow_space_ssh_command.go @@ -14,13 +14,12 @@ type AllowSpaceSSHCommand struct { } func (cmd *AllowSpaceSSHCommand) Execute(args []string) error { - err := cmd.SharedActor.CheckTarget(true, false) if err != nil { return err } - currentUserName, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -30,7 +29,7 @@ func (cmd *AllowSpaceSSHCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Enabling ssh support for space {{.Space}} as {{.CurrentUserName}}...", map[string]interface{}{ "Space": inputSpace, - "CurrentUserName": currentUserName, + "CurrentUserName": currentUser.Name, }) warnings, err := cmd.Actor.UpdateSpaceFeature(inputSpace, targetedOrgGUID, true, "ssh") @@ -50,5 +49,4 @@ func (cmd *AllowSpaceSSHCommand) Execute(args []string) error { cmd.UI.DisplayOK() return err - } diff --git a/command/v7/allow_space_ssh_command_test.go b/command/v7/allow_space_ssh_command_test.go index de3d1553c6b..b8697fa1d1c 100644 --- a/command/v7/allow_space_ssh_command_test.go +++ b/command/v7/allow_space_ssh_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/command/commandfakes" . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -47,7 +48,7 @@ var _ = Describe("allow-space-ssh Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) currentUserName = "some-user" - fakeConfig.CurrentUserNameReturns(currentUserName, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { @@ -71,7 +72,7 @@ var _ = Describe("allow-space-ssh Command", func() { When("checking the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("", errors.New("uh oh")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("uh oh")) }) It("returns the error", func() { diff --git a/command/v7/api_command.go b/command/v7/api_command.go index aa222af4c96..5127b33bbf5 100644 --- a/command/v7/api_command.go +++ b/command/v7/api_command.go @@ -26,7 +26,7 @@ func (cmd *APICommand) Setup(config command.Config, ui command.UI) error { cmd.UI = ui cmd.Config = config - ccClient, _ := shared.NewWrappedCloudControllerClient(config, ui) + ccClient := shared.NewWrappedCloudControllerClient(config, ui) cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, nil, clock.NewClock()) return nil } diff --git a/command/v7/api_command_test.go b/command/v7/api_command_test.go index 66fad029a24..a69afda6996 100644 --- a/command/v7/api_command_test.go +++ b/command/v7/api_command_test.go @@ -144,9 +144,7 @@ API version: 100.200.300`, }) When("the URL host does not exist", func() { - var ( - requestErr ccerror.RequestError - ) + var requestErr ccerror.RequestError BeforeEach(func() { CCAPI = "i.do.not.exist.com" diff --git a/command/v7/app_command.go b/command/v7/app_command.go index 9c7227dc195..d431a71ff55 100644 --- a/command/v7/app_command.go +++ b/command/v7/app_command.go @@ -24,7 +24,7 @@ func (cmd AppCommand) Execute(args []string) error { return cmd.displayAppGUID() } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/app_command_test.go b/command/v7/app_command_test.go index 784fd423367..238376ba7b7 100644 --- a/command/v7/app_command_test.go +++ b/command/v7/app_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("app Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -87,7 +87,7 @@ var _ = Describe("app Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/apply_manifest_command.go b/command/v7/apply_manifest_command.go index 86ae5c0f55a..5f959382f51 100644 --- a/command/v7/apply_manifest_command.go +++ b/command/v7/apply_manifest_command.go @@ -50,7 +50,7 @@ func (cmd ApplyManifestCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/apply_manifest_command_test.go b/command/v7/apply_manifest_command_test.go index ff940a22532..bc29e3c54e1 100644 --- a/command/v7/apply_manifest_command_test.go +++ b/command/v7/apply_manifest_command_test.go @@ -88,7 +88,7 @@ var _ = Describe("apply-manifest Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -109,7 +109,7 @@ var _ = Describe("apply-manifest Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) When("the manifest location is specified with `-f`", func() { diff --git a/command/v7/apps_command.go b/command/v7/apps_command.go index f0ca3ab6748..e25ad73f5be 100644 --- a/command/v7/apps_command.go +++ b/command/v7/apps_command.go @@ -22,7 +22,7 @@ func (cmd AppsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/apps_command_test.go b/command/v7/apps_command_test.go index a9307cd8c34..4da0afec7da 100644 --- a/command/v7/apps_command_test.go +++ b/command/v7/apps_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("apps Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -87,7 +87,7 @@ var _ = Describe("apps Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/bind_route_service_command.go b/command/v7/bind_route_service_command.go index 6bffdf3cbe8..b6e0b2fa867 100644 --- a/command/v7/bind_route_service_command.go +++ b/command/v7/bind_route_service_command.go @@ -76,7 +76,7 @@ In Windows Command Line use single-quoted, escaped JSON: '{\"valid\":\"json\"}' } func (cmd BindRouteServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/bind_route_service_command_test.go b/command/v7/bind_route_service_command_test.go index b9925caebfb..537c529843a 100644 --- a/command/v7/bind_route_service_command_test.go +++ b/command/v7/bind_route_service_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("bind-route-service Command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: fakeOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.CreateRouteBindingReturns( nil, @@ -346,7 +346,7 @@ var _ = Describe("bind-route-service Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/bind_running_security_group_command.go b/command/v7/bind_running_security_group_command.go index 6997a5d1323..82aca45eb39 100644 --- a/command/v7/bind_running_security_group_command.go +++ b/command/v7/bind_running_security_group_command.go @@ -21,7 +21,7 @@ func (cmd BindRunningSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/bind_running_security_group_command_test.go b/command/v7/bind_running_security_group_command_test.go index 02460926392..c993a862412 100644 --- a/command/v7/bind_running_security_group_command_test.go +++ b/command/v7/bind_running_security_group_command_test.go @@ -47,7 +47,7 @@ var _ = Describe("bind-running-security-group Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) @@ -63,7 +63,7 @@ var _ = Describe("bind-running-security-group Command", func() { When("the current user is invalid", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, errors.New("some-error")) }) diff --git a/command/v7/bind_security_group_command.go b/command/v7/bind_security_group_command.go index 154d451ed27..712eedfd7ca 100644 --- a/command/v7/bind_security_group_command.go +++ b/command/v7/bind_security_group_command.go @@ -27,7 +27,7 @@ func (cmd BindSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/bind_security_group_command_test.go b/command/v7/bind_security_group_command_test.go index c8acfadf0ae..b90fa78d797 100644 --- a/command/v7/bind_security_group_command_test.go +++ b/command/v7/bind_security_group_command_test.go @@ -53,7 +53,7 @@ var _ = Describe("bind-security-group Command", func() { cmd.RequiredArgs.SecurityGroupName = "some-security-group" cmd.RequiredArgs.OrganizationName = "some-org" - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) fakeActor.GetSecurityGroupReturns( @@ -95,7 +95,7 @@ var _ = Describe("bind-security-group Command", func() { BeforeEach(func() { expectedErr = errors.New("getting current user error") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) diff --git a/command/v7/bind_service_command.go b/command/v7/bind_service_command.go index 55c5512f23c..4f4f9e480a9 100644 --- a/command/v7/bind_service_command.go +++ b/command/v7/bind_service_command.go @@ -101,7 +101,7 @@ CF_NAME bind-service myapp mydb -c ~/workspace/tmp/instance_config.json --bindin } func (cmd BindServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/bind_service_command_test.go b/command/v7/bind_service_command_test.go index e2ec55dac4c..f38481905dc 100644 --- a/command/v7/bind_service_command_test.go +++ b/command/v7/bind_service_command_test.go @@ -58,7 +58,7 @@ var _ = Describe("bind-service Command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: fakeOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.CreateServiceAppBindingReturns( nil, @@ -323,7 +323,7 @@ var _ = Describe("bind-service Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/bind_staging_security_group_command.go b/command/v7/bind_staging_security_group_command.go index ae637a4ce25..306c0548d0c 100644 --- a/command/v7/bind_staging_security_group_command.go +++ b/command/v7/bind_staging_security_group_command.go @@ -21,7 +21,7 @@ func (cmd BindStagingSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/bind_staging_security_group_command_test.go b/command/v7/bind_staging_security_group_command_test.go index 09fc76fe7c0..c7069f91b7a 100644 --- a/command/v7/bind_staging_security_group_command_test.go +++ b/command/v7/bind_staging_security_group_command_test.go @@ -47,7 +47,7 @@ var _ = Describe("bind-staging-security-group Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) @@ -63,7 +63,7 @@ var _ = Describe("bind-staging-security-group Command", func() { When("the current user is invalid", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, errors.New("some-error")) }) diff --git a/command/v7/buildpacks_command.go b/command/v7/buildpacks_command.go index 8a8533fd06e..d0726abb496 100644 --- a/command/v7/buildpacks_command.go +++ b/command/v7/buildpacks_command.go @@ -21,7 +21,7 @@ func (cmd BuildpacksCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/buildpacks_command_test.go b/command/v7/buildpacks_command_test.go index 04f6b35ee89..6dd304e0686 100644 --- a/command/v7/buildpacks_command_test.go +++ b/command/v7/buildpacks_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("buildpacks Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its runnning", func() { diff --git a/command/v7/cancel_deployment_command.go b/command/v7/cancel_deployment_command.go index c89296eae12..55998b32a4c 100644 --- a/command/v7/cancel_deployment_command.go +++ b/command/v7/cancel_deployment_command.go @@ -18,7 +18,7 @@ func (cmd *CancelDeploymentCommand) Execute(args []string) error { return err } - userName, err := cmd.Config.CurrentUserName() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -29,7 +29,7 @@ func (cmd *CancelDeploymentCommand) Execute(args []string) error { "AppName": cmd.RequiredArgs.AppName, "OrgName": cmd.Config.TargetedOrganization().Name, "SpaceName": cmd.Config.TargetedSpace().Name, - "UserName": userName, + "UserName": user.Name, }, ) diff --git a/command/v7/cancel_deployment_command_test.go b/command/v7/cancel_deployment_command_test.go index 0653058f6e1..ce597a138b2 100644 --- a/command/v7/cancel_deployment_command_test.go +++ b/command/v7/cancel_deployment_command_test.go @@ -63,7 +63,7 @@ var _ = Describe("Cancel deployment command", func() { GUID: spaceGUID, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "timmyD"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "timmyD"}, nil) }) JustBeforeEach(func() { @@ -90,7 +90,7 @@ var _ = Describe("Cancel deployment command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserNameReturns("", expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/check_route_command.go b/command/v7/check_route_command.go index 2649bae98d0..444cd1f4d25 100644 --- a/command/v7/check_route_command.go +++ b/command/v7/check_route_command.go @@ -37,7 +37,7 @@ func (cmd CheckRouteCommand) Execute(args []string) error { return err } - _, err = cmd.Config.CurrentUser() + _, err = cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/check_route_command_test.go b/command/v7/check_route_command_test.go index d529be0b960..548dd7e28a3 100644 --- a/command/v7/check_route_command_test.go +++ b/command/v7/check_route_command_test.go @@ -47,7 +47,7 @@ var _ = Describe("check-route Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeActor.CheckRouteReturns( true, v7action.Warnings{"check-route-warning"}, @@ -77,12 +77,12 @@ var _ = Describe("check-route Command", func() { }) It("checks if the user is logged in", func() { - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) When("the user is not logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("no current user")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("no current user")) }) It("returns an error", func() { diff --git a/command/v7/copy_source_command.go b/command/v7/copy_source_command.go index 8ee79fe91b0..42f869b2458 100644 --- a/command/v7/copy_source_command.go +++ b/command/v7/copy_source_command.go @@ -67,7 +67,7 @@ func (cmd CopySourceCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/copy_source_command_test.go b/command/v7/copy_source_command_test.go index 7d4af8fa7c3..3b8cedb9c04 100644 --- a/command/v7/copy_source_command_test.go +++ b/command/v7/copy_source_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("copy-source Command", func() { fakeConfig.BinaryNameReturns(binaryName) fakeSharedActor.CheckTargetReturns(nil) - fakeConfig.CurrentUserReturns(configv3.User{Name: userName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: userName}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) @@ -112,12 +112,12 @@ var _ = Describe("copy-source Command", func() { }) It("retrieves the current user", func() { - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) When("retrieving the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("not-logged-in")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("not-logged-in")) }) It("returns an error", func() { diff --git a/command/v7/create_app_command.go b/command/v7/create_app_command.go index 4d250626605..938be0bcf73 100644 --- a/command/v7/create_app_command.go +++ b/command/v7/create_app_command.go @@ -22,7 +22,7 @@ func (cmd CreateAppCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_app_command_test.go b/command/v7/create_app_command_test.go index c53faa93895..d4b416a7492 100644 --- a/command/v7/create_app_command_test.go +++ b/command/v7/create_app_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("create-app Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) }) diff --git a/command/v7/create_app_manifest_command.go b/command/v7/create_app_manifest_command.go index ab824c73c57..69d8652b50b 100644 --- a/command/v7/create_app_manifest_command.go +++ b/command/v7/create_app_manifest_command.go @@ -39,7 +39,7 @@ func (cmd CreateAppManifestCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_app_manifest_command_test.go b/command/v7/create_app_manifest_command_test.go index 65ac1a1904f..23894166f13 100644 --- a/command/v7/create_app_manifest_command_test.go +++ b/command/v7/create_app_manifest_command_test.go @@ -79,7 +79,7 @@ var _ = Describe("create-app-manifest Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ GUID: "some-space-guid", Name: "some-space"}) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/create_buildpack_command.go b/command/v7/create_buildpack_command.go index 4a0dcb2e857..526fdc83474 100644 --- a/command/v7/create_buildpack_command.go +++ b/command/v7/create_buildpack_command.go @@ -37,7 +37,7 @@ func (cmd CreateBuildpackCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_buildpack_command_test.go b/command/v7/create_buildpack_command_test.go index 374772da8a5..43b96f17a3f 100644 --- a/command/v7/create_buildpack_command_test.go +++ b/command/v7/create_buildpack_command_test.go @@ -84,7 +84,7 @@ var _ = Describe("create buildpack Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) }) It("should print text indicating it is creating a buildpack", func() { diff --git a/command/v7/create_isolation_segment_command.go b/command/v7/create_isolation_segment_command.go index a170740eabe..04026ec5edf 100644 --- a/command/v7/create_isolation_segment_command.go +++ b/command/v7/create_isolation_segment_command.go @@ -19,7 +19,7 @@ func (cmd CreateIsolationSegmentCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_isolation_segment_command_test.go b/command/v7/create_isolation_segment_command_test.go index 66112a628f6..1654035701d 100644 --- a/command/v7/create_isolation_segment_command_test.go +++ b/command/v7/create_isolation_segment_command_test.go @@ -69,7 +69,7 @@ var _ = Describe("create-isolation-segment Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) cmd.RequiredArgs.IsolationSegmentName = isolationSegment }) diff --git a/command/v7/create_org_command.go b/command/v7/create_org_command.go index a7ca4c30a6d..f28156bac8f 100644 --- a/command/v7/create_org_command.go +++ b/command/v7/create_org_command.go @@ -20,7 +20,7 @@ func (cmd CreateOrgCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_org_command_test.go b/command/v7/create_org_command_test.go index 3c19d346c79..e710b03fe42 100644 --- a/command/v7/create_org_command_test.go +++ b/command/v7/create_org_command_test.go @@ -45,7 +45,7 @@ var _ = Describe("create-org Command", func() { fakeConfig.BinaryNameReturns(binaryName) orgName = "some-org" currentUsername = "bob" - fakeConfig.CurrentUserReturns(configv3.User{Name: currentUsername}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUsername}, nil) quotaName = "quota-name" cmd = v7.CreateOrgCommand{ diff --git a/command/v7/create_org_quota_command.go b/command/v7/create_org_quota_command.go index 6f9bfa78ae1..fe34a1de228 100644 --- a/command/v7/create_org_quota_command.go +++ b/command/v7/create_org_quota_command.go @@ -28,7 +28,7 @@ func (cmd CreateOrgQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_org_quota_command_test.go b/command/v7/create_org_quota_command_test.go index e1fe74f5d1d..d8f66f51fdd 100644 --- a/command/v7/create_org_quota_command_test.go +++ b/command/v7/create_org_quota_command_test.go @@ -48,7 +48,7 @@ var _ = Describe("create-org-quota Command", func() { } currentUserName = "bob" - fakeConfig.CurrentUserReturns(configv3.User{Name: currentUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/create_package_command.go b/command/v7/create_package_command.go index 3febb4f3421..47f6d2ff284 100644 --- a/command/v7/create_package_command.go +++ b/command/v7/create_package_command.go @@ -39,7 +39,11 @@ func (cmd CreatePackageCommand) Execute(args []string) error { } isDockerImage := (cmd.DockerImage.Path != "") - err = cmd.PackageDisplayer.DisplaySetupMessage(cmd.RequiredArgs.AppName, isDockerImage) + user, err := cmd.Actor.GetCurrentUser() + if err != nil { + return err + } + err = cmd.PackageDisplayer.DisplaySetupMessage(cmd.RequiredArgs.AppName, user.Name, isDockerImage) if err != nil { return err } diff --git a/command/v7/create_package_command_test.go b/command/v7/create_package_command_test.go index f89c2a2b621..24dabe17479 100644 --- a/command/v7/create_package_command_test.go +++ b/command/v7/create_package_command_test.go @@ -83,7 +83,7 @@ var _ = Describe("create-package Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) }) diff --git a/command/v7/create_private_domain_command.go b/command/v7/create_private_domain_command.go index 6727fde8a86..a0cbe7b4818 100644 --- a/command/v7/create_private_domain_command.go +++ b/command/v7/create_private_domain_command.go @@ -18,7 +18,7 @@ func (cmd CreatePrivateDomainCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_private_domain_command_test.go b/command/v7/create_private_domain_command_test.go index 8363c569f90..68f2fd6448d 100644 --- a/command/v7/create_private_domain_command_test.go +++ b/command/v7/create_private_domain_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("create-private-domain Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) }) It("should print text indicating it is creating a domain", func() { diff --git a/command/v7/create_route_command.go b/command/v7/create_route_command.go index 654bfb0fcc0..7d6fc07e6bd 100644 --- a/command/v7/create_route_command.go +++ b/command/v7/create_route_command.go @@ -24,7 +24,7 @@ func (cmd CreateRouteCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_route_command_test.go b/command/v7/create_route_command_test.go index ab9235bb432..b53f14758d9 100644 --- a/command/v7/create_route_command_test.go +++ b/command/v7/create_route_command_test.go @@ -92,7 +92,7 @@ var _ = Describe("create-route Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: spaceName, GUID: spaceGUID, diff --git a/command/v7/create_security_group_command.go b/command/v7/create_security_group_command.go index 420cde2c061..7c1f29c4b76 100644 --- a/command/v7/create_security_group_command.go +++ b/command/v7/create_security_group_command.go @@ -22,7 +22,7 @@ func (cmd CreateSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_security_group_command_test.go b/command/v7/create_security_group_command_test.go index 6f0c22d9da0..51b23f27e4b 100644 --- a/command/v7/create_security_group_command_test.go +++ b/command/v7/create_security_group_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("create-security-group Command", func() { } fakeConfig.HasTargetedOrganizationReturns(false) fakeConfig.HasTargetedSpaceReturns(false) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/create_service_broker_command.go b/command/v7/create_service_broker_command.go index 99c2d224c6d..0fbd44c5f69 100644 --- a/command/v7/create_service_broker_command.go +++ b/command/v7/create_service_broker_command.go @@ -21,7 +21,7 @@ func (cmd *CreateServiceBrokerCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_service_broker_command_test.go b/command/v7/create_service_broker_command_test.go index 6cc91f4ea52..f19175c3779 100644 --- a/command/v7/create_service_broker_command_test.go +++ b/command/v7/create_service_broker_command_test.go @@ -65,7 +65,7 @@ var _ = Describe("create-service-broker Command", func() { When("fetching the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("an error occurred")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("an error occurred")) }) It("return an error", func() { @@ -75,7 +75,7 @@ var _ = Describe("create-service-broker Command", func() { When("fetching the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) It("checks that there is a valid target", func() { diff --git a/command/v7/create_service_command.go b/command/v7/create_service_command.go index 1a60195e9ac..ee10e723bba 100644 --- a/command/v7/create_service_command.go +++ b/command/v7/create_service_command.go @@ -110,7 +110,7 @@ func (cmd CreateServiceCommand) Execute(args []string) error { } func (cmd CreateServiceCommand) displayCreatingMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_service_command_test.go b/command/v7/create_service_command_test.go index 2e291c9f932..1deddb8d440 100644 --- a/command/v7/create_service_command_test.go +++ b/command/v7/create_service_command_test.go @@ -90,7 +90,7 @@ var _ = Describe("create-service Command", func() { Name: fakeOrgName, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) }) It("calls the actor with the right arguments", func() { @@ -292,7 +292,7 @@ var _ = Describe("create-service Command", func() { When("getting the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom")) }) It("returns the error", func() { diff --git a/command/v7/create_service_key_command.go b/command/v7/create_service_key_command.go index 6d8987c8ff3..34bfba0542d 100644 --- a/command/v7/create_service_key_command.go +++ b/command/v7/create_service_key_command.go @@ -81,7 +81,7 @@ CF_NAME create-service-key mydb mykey -c ~/workspace/tmp/instance_config.json } func (cmd CreateServiceKeyCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_service_key_command_test.go b/command/v7/create_service_key_command_test.go index 74e4541bf18..83363defefa 100644 --- a/command/v7/create_service_key_command_test.go +++ b/command/v7/create_service_key_command_test.go @@ -49,7 +49,7 @@ var _ = Describe("create-service-key Command", func() { } fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.CreateServiceKeyReturns( nil, @@ -292,7 +292,7 @@ var _ = Describe("create-service-key Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/create_shared_domain_command.go b/command/v7/create_shared_domain_command.go index 39237843927..feb9940e213 100644 --- a/command/v7/create_shared_domain_command.go +++ b/command/v7/create_shared_domain_command.go @@ -20,7 +20,7 @@ func (cmd CreateSharedDomainCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_shared_domain_command_test.go b/command/v7/create_shared_domain_command_test.go index b042d80cf11..9484348694d 100644 --- a/command/v7/create_shared_domain_command_test.go +++ b/command/v7/create_shared_domain_command_test.go @@ -76,7 +76,7 @@ var _ = Describe("create-shared-domain Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) }) It("should print text indicating it is creating a domain", func() { diff --git a/command/v7/create_space_command.go b/command/v7/create_space_command.go index 376cb5d0144..dd8b85dd7ba 100644 --- a/command/v7/create_space_command.go +++ b/command/v7/create_space_command.go @@ -31,9 +31,7 @@ func (cmd CreateSpaceCommand) Execute(args []string) error { return err } - var ( - orgName, orgGUID string - ) + var orgName, orgGUID string if cmd.Organization == "" { _, err = cmd.SharedActor.RequireTargetedOrg() @@ -52,7 +50,7 @@ func (cmd CreateSpaceCommand) Execute(args []string) error { orgGUID = org.GUID } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_space_command_test.go b/command/v7/create_space_command_test.go index 1ce148cf5c4..d11c05f044f 100644 --- a/command/v7/create_space_command_test.go +++ b/command/v7/create_space_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("create-space Command", func() { Name: "some-org-name", GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{ + fakeActor.GetCurrentUserReturns(configv3.User{ Name: userName, Origin: "some-user-origin", }, nil) diff --git a/command/v7/create_space_quota_command.go b/command/v7/create_space_quota_command.go index afc5eb2e7d3..892d04675e7 100644 --- a/command/v7/create_space_quota_command.go +++ b/command/v7/create_space_quota_command.go @@ -27,7 +27,7 @@ func (cmd CreateSpaceQuotaCommand) Execute([]string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_space_quota_command_test.go b/command/v7/create_space_quota_command_test.go index 6e0894673da..6e94f2cb402 100644 --- a/command/v7/create_space_quota_command_test.go +++ b/command/v7/create_space_quota_command_test.go @@ -79,7 +79,7 @@ var _ = Describe("create-space-quota Command", func() { Name: "some-org-name", GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{ + fakeActor.GetCurrentUserReturns(configv3.User{ Name: userName, Origin: "some-user-origin", }, nil) diff --git a/command/v7/create_user_provided_service_command.go b/command/v7/create_user_provided_service_command.go index bf3bf04e00e..c0cc5e5083b 100644 --- a/command/v7/create_user_provided_service_command.go +++ b/command/v7/create_user_provided_service_command.go @@ -52,7 +52,7 @@ func (cmd CreateUserProvidedServiceCommand) Execute(args []string) error { } func (cmd CreateUserProvidedServiceCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/create_user_provided_service_command_test.go b/command/v7/create_user_provided_service_command_test.go index 9f508b9367e..805649e3942 100644 --- a/command/v7/create_user_provided_service_command_test.go +++ b/command/v7/create_user_provided_service_command_test.go @@ -86,7 +86,7 @@ var _ = Describe("create-user-provided-service Command", func() { Name: fakeOrgName, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) setPositionalFlags(&cmd, fakeServiceInstanceName) @@ -188,7 +188,7 @@ var _ = Describe("create-user-provided-service Command", func() { When("getting the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom")) }) It("returns the error", func() { diff --git a/command/v7/delete_command.go b/command/v7/delete_command.go index b45abf764bf..23edea0b683 100644 --- a/command/v7/delete_command.go +++ b/command/v7/delete_command.go @@ -21,7 +21,7 @@ func (cmd DeleteCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_command_test.go b/command/v7/delete_command_test.go index d67c273e3ce..880f2629aa3 100644 --- a/command/v7/delete_command_test.go +++ b/command/v7/delete_command_test.go @@ -61,7 +61,7 @@ var _ = Describe("delete Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -132,7 +132,7 @@ var _ = Describe("delete Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/delete_isolation_segment_command.go b/command/v7/delete_isolation_segment_command.go index 6e586ca6c3a..4858cf110f3 100644 --- a/command/v7/delete_isolation_segment_command.go +++ b/command/v7/delete_isolation_segment_command.go @@ -35,7 +35,7 @@ func (cmd DeleteIsolationSegmentCommand) Execute(args []string) error { } } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_isolation_segment_command_test.go b/command/v7/delete_isolation_segment_command_test.go index 82382680858..32f5d672085 100644 --- a/command/v7/delete_isolation_segment_command_test.go +++ b/command/v7/delete_isolation_segment_command_test.go @@ -70,7 +70,7 @@ var _ = Describe("delete-isolation-segment Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) cmd.RequiredArgs.IsolationSegmentName = isolationSegment }) diff --git a/command/v7/delete_org_command.go b/command/v7/delete_org_command.go index 4131654ea90..33c38d99a11 100644 --- a/command/v7/delete_org_command.go +++ b/command/v7/delete_org_command.go @@ -20,7 +20,7 @@ func (cmd *DeleteOrgCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_org_command_test.go b/command/v7/delete_org_command_test.go index 38bf89cc523..8895d0c15fc 100644 --- a/command/v7/delete_org_command_test.go +++ b/command/v7/delete_org_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("delete-org Command", func() { BeforeEach(func() { returnedErr = errors.New("some error") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedErr) }) It("returns the error", func() { @@ -88,7 +88,7 @@ var _ = Describe("delete-org Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/delete_org_quota_command.go b/command/v7/delete_org_quota_command.go index 3df1937cfb4..b3199feb326 100644 --- a/command/v7/delete_org_quota_command.go +++ b/command/v7/delete_org_quota_command.go @@ -20,7 +20,7 @@ func (cmd DeleteOrgQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_org_quota_command_test.go b/command/v7/delete_org_quota_command_test.go index 466c39b8e0f..b160cad6920 100644 --- a/command/v7/delete_org_quota_command_test.go +++ b/command/v7/delete_org_quota_command_test.go @@ -37,7 +37,7 @@ var _ = Describe("delete-org-quota Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd = DeleteOrgQuotaCommand{ BaseCommand: BaseCommand{ diff --git a/command/v7/delete_orphaned_routes_command.go b/command/v7/delete_orphaned_routes_command.go index f8bb427b4e0..3e006d9e630 100644 --- a/command/v7/delete_orphaned_routes_command.go +++ b/command/v7/delete_orphaned_routes_command.go @@ -14,7 +14,7 @@ func (cmd DeleteOrphanedRoutesCommand) Execute(args []string) error { return err } - _, err = cmd.Config.CurrentUser() + _, err = cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -32,7 +32,7 @@ func (cmd DeleteOrphanedRoutesCommand) Execute(args []string) error { } } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_orphaned_routes_command_test.go b/command/v7/delete_orphaned_routes_command_test.go index d0b8b09f2b4..8e32faa7d0b 100644 --- a/command/v7/delete_orphaned_routes_command_test.go +++ b/command/v7/delete_orphaned_routes_command_test.go @@ -57,7 +57,7 @@ var _ = Describe("delete-orphaned-routes Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -99,7 +99,7 @@ var _ = Describe("delete-orphaned-routes Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -195,6 +195,5 @@ var _ = Describe("delete-orphaned-routes Command", func() { }) }) }) - }) }) diff --git a/command/v7/delete_private_domain_command.go b/command/v7/delete_private_domain_command.go index 1899ca6c378..52152a26516 100644 --- a/command/v7/delete_private_domain_command.go +++ b/command/v7/delete_private_domain_command.go @@ -23,7 +23,7 @@ func (cmd DeletePrivateDomainCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_private_domain_command_test.go b/command/v7/delete_private_domain_command_test.go index 0e43f958159..d2bea0cffc8 100644 --- a/command/v7/delete_private_domain_command_test.go +++ b/command/v7/delete_private_domain_command_test.go @@ -58,7 +58,7 @@ var _ = Describe("delete-private-domain Command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -85,7 +85,7 @@ var _ = Describe("delete-private-domain Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/delete_route_command.go b/command/v7/delete_route_command.go index 13614b6b1ae..9b707dc8fba 100644 --- a/command/v7/delete_route_command.go +++ b/command/v7/delete_route_command.go @@ -39,7 +39,7 @@ func (cmd DeleteRouteCommand) Execute(args []string) error { return err } - _, err = cmd.Config.CurrentUser() + _, err = cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_route_command_test.go b/command/v7/delete_route_command_test.go index 653f28b324b..3180ad7f0eb 100644 --- a/command/v7/delete_route_command_test.go +++ b/command/v7/delete_route_command_test.go @@ -64,7 +64,7 @@ var _ = Describe("delete-route Command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -91,7 +91,7 @@ var _ = Describe("delete-route Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/delete_security_group_command.go b/command/v7/delete_security_group_command.go index 2cdab62be49..cc446096cbf 100644 --- a/command/v7/delete_security_group_command.go +++ b/command/v7/delete_security_group_command.go @@ -22,7 +22,7 @@ func (cmd *DeleteSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_security_group_command_test.go b/command/v7/delete_security_group_command_test.go index 6bb006f2c71..4c322dff253 100644 --- a/command/v7/delete_security_group_command_test.go +++ b/command/v7/delete_security_group_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("delete-security-group Command", func() { BeforeEach(func() { returnedErr = errors.New("some error") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedErr) }) It("returns the error", func() { @@ -88,7 +88,7 @@ var _ = Describe("delete-security-group Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/delete_service_broker_command_test.go b/command/v7/delete_service_broker_command_test.go index e42cf285aa5..da7ab2fbc23 100644 --- a/command/v7/delete_service_broker_command_test.go +++ b/command/v7/delete_service_broker_command_test.go @@ -52,7 +52,7 @@ var _ = Describe("delete-service-broker Command", func() { setPositionalFlags(&cmd, serviceBrokerName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/delete_service_command.go b/command/v7/delete_service_command.go index aa44b8a33d7..670d5d8b34a 100644 --- a/command/v7/delete_service_command.go +++ b/command/v7/delete_service_command.go @@ -73,7 +73,7 @@ func (cmd DeleteServiceCommand) Usage() string { } func (cmd DeleteServiceCommand) displayEvent() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_service_command_test.go b/command/v7/delete_service_command_test.go index 2f12f260ddb..bb8efba7fb5 100644 --- a/command/v7/delete_service_command_test.go +++ b/command/v7/delete_service_command_test.go @@ -253,7 +253,7 @@ var _ = Describe("delete-service command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: orgName}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: spaceName, GUID: spaceGUID}) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) cmd = DeleteServiceCommand{ BaseCommand: BaseCommand{ @@ -342,7 +342,7 @@ var _ = Describe("delete-service command", func() { When("getting the username fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("boom")) confirmYes() }) diff --git a/command/v7/delete_service_key_command.go b/command/v7/delete_service_key_command.go index b114245ceda..52cec6cc8cd 100644 --- a/command/v7/delete_service_key_command.go +++ b/command/v7/delete_service_key_command.go @@ -89,7 +89,7 @@ func (cmd DeleteServiceKeyCommand) displayPrompt() (bool, error) { } func (cmd DeleteServiceKeyCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_service_key_command_test.go b/command/v7/delete_service_key_command_test.go index 72970e5a7a8..f2d3ec7c885 100644 --- a/command/v7/delete_service_key_command_test.go +++ b/command/v7/delete_service_key_command_test.go @@ -50,7 +50,7 @@ var _ = Describe("delete-service-key Command", func() { } fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns( nil, @@ -351,7 +351,7 @@ var _ = Describe("delete-service-key Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/delete_shared_domain_command.go b/command/v7/delete_shared_domain_command.go index e293cd7f142..f0045f6c0c8 100644 --- a/command/v7/delete_shared_domain_command.go +++ b/command/v7/delete_shared_domain_command.go @@ -22,7 +22,7 @@ func (cmd DeleteSharedDomainCommand) Execute(args []string) error { } domainName := cmd.RequiredArgs.Domain - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_shared_domain_command_test.go b/command/v7/delete_shared_domain_command_test.go index eeb0b84fcef..11bbfc3e846 100644 --- a/command/v7/delete_shared_domain_command_test.go +++ b/command/v7/delete_shared_domain_command_test.go @@ -59,7 +59,7 @@ var _ = Describe("delete-shared-domain Command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -86,7 +86,7 @@ var _ = Describe("delete-shared-domain Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/delete_space_command.go b/command/v7/delete_space_command.go index 9652ef0e715..efc65de0e2b 100644 --- a/command/v7/delete_space_command.go +++ b/command/v7/delete_space_command.go @@ -32,7 +32,7 @@ func (cmd DeleteSpaceCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_space_command_test.go b/command/v7/delete_space_command_test.go index 45afc51fe83..455e544dbe9 100644 --- a/command/v7/delete_space_command_test.go +++ b/command/v7/delete_space_command_test.go @@ -47,7 +47,7 @@ var _ = Describe("delete-space Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) JustBeforeEach(func() { @@ -96,7 +96,7 @@ var _ = Describe("delete-space Command", func() { BeforeEach(func() { returnedErr = errors.New("some error") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedErr) }) It("returns the error", func() { diff --git a/command/v7/delete_space_quota_command.go b/command/v7/delete_space_quota_command.go index 5d8ca16ba71..a12b9648a36 100644 --- a/command/v7/delete_space_quota_command.go +++ b/command/v7/delete_space_quota_command.go @@ -20,7 +20,7 @@ func (cmd DeleteSpaceQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/delete_space_quota_command_test.go b/command/v7/delete_space_quota_command_test.go index b070f097ee9..224deef5ee1 100644 --- a/command/v7/delete_space_quota_command_test.go +++ b/command/v7/delete_space_quota_command_test.go @@ -37,7 +37,7 @@ var _ = Describe("delete-space-quota Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org", GUID: "targeted-org-guid"}) fakeConfig.TargetedOrganizationNameReturns("some-org") diff --git a/command/v7/delete_user_command.go b/command/v7/delete_user_command.go index ff6e35b4fb6..a4ca2975918 100644 --- a/command/v7/delete_user_command.go +++ b/command/v7/delete_user_command.go @@ -37,14 +37,14 @@ func (cmd *DeleteUserCommand) Execute(args []string) error { } } - currentUser, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } cmd.UI.DisplayTextWithFlavor("Deleting user {{.TargetUser}} as {{.CurrentUser}}...", map[string]interface{}{ "TargetUser": cmd.RequiredArgs.Username, - "CurrentUser": currentUser, + "CurrentUser": currentUser.Name, }) user, err := cmd.Actor.GetUser(cmd.RequiredArgs.Username, cmd.Origin) @@ -59,7 +59,6 @@ func (cmd *DeleteUserCommand) Execute(args []string) error { } warnings, err := cmd.Actor.DeleteUser(user.GUID) - if err != nil { return err } diff --git a/command/v7/delete_user_command_test.go b/command/v7/delete_user_command_test.go index efb29b9e6fb..247cd7bfff3 100644 --- a/command/v7/delete_user_command_test.go +++ b/command/v7/delete_user_command_test.go @@ -8,6 +8,7 @@ import ( . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -15,6 +16,8 @@ import ( ) var _ = Describe("delete-user Command", func() { + const currentUser = "bob" + var ( cmd DeleteUserCommand testUI *ui.UI @@ -24,8 +27,6 @@ var _ = Describe("delete-user Command", func() { binaryName string executeErr error input *Buffer - currentUser string - err error ) BeforeEach(func() { @@ -34,8 +35,7 @@ var _ = Describe("delete-user Command", func() { fakeConfig = new(commandfakes.FakeConfig) fakeSharedActor = new(commandfakes.FakeSharedActor) fakeActor = new(v7fakes.FakeActor) - currentUser, err = fakeConfig.CurrentUserName() - Expect(err).NotTo(HaveOccurred()) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUser}, nil) cmd = DeleteUserCommand{ BaseCommand: BaseCommand{ diff --git a/command/v7/disable_feature_flag_command.go b/command/v7/disable_feature_flag_command.go index f6ef34fdd2f..6c3e36678ab 100644 --- a/command/v7/disable_feature_flag_command.go +++ b/command/v7/disable_feature_flag_command.go @@ -18,7 +18,7 @@ func (cmd DisableFeatureFlagCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/disable_feature_flag_command_test.go b/command/v7/disable_feature_flag_command_test.go index bb3b2feb44e..a5ec2ab340c 100644 --- a/command/v7/disable_feature_flag_command_test.go +++ b/command/v7/disable_feature_flag_command_test.go @@ -70,7 +70,7 @@ var _ = Describe("Disable Feature Flag Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/disable_org_isolation_command.go b/command/v7/disable_org_isolation_command.go index 0101c0cfeb5..a430f0ad058 100644 --- a/command/v7/disable_org_isolation_command.go +++ b/command/v7/disable_org_isolation_command.go @@ -17,7 +17,7 @@ func (cmd DisableOrgIsolationCommand) Execute(args []string) error { if err != nil { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/disable_org_isolation_command_test.go b/command/v7/disable_org_isolation_command_test.go index d5e2062e1f9..2b05b519f41 100644 --- a/command/v7/disable_org_isolation_command_test.go +++ b/command/v7/disable_org_isolation_command_test.go @@ -49,7 +49,7 @@ var _ = Describe("disable-org-isolation Command", func() { org = "org1" isolationSegment = "segment1" - fakeConfig.CurrentUserReturns(configv3.User{Name: "admin"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "admin"}, nil) cmd.RequiredArgs.OrganizationName = org cmd.RequiredArgs.IsolationSegmentName = isolationSegment @@ -79,7 +79,7 @@ var _ = Describe("disable-org-isolation Command", func() { When("user is not logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("user-not-logged-in")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("user-not-logged-in")) cmd.RequiredArgs.OrganizationName = org cmd.RequiredArgs.IsolationSegmentName = isolationSegment }) diff --git a/command/v7/disable_service_access_command.go b/command/v7/disable_service_access_command.go index 910115f9755..5abd3b9359e 100644 --- a/command/v7/disable_service_access_command.go +++ b/command/v7/disable_service_access_command.go @@ -38,7 +38,7 @@ func (cmd DisableServiceAccessCommand) Execute(args []string) error { } func (cmd DisableServiceAccessCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/disable_service_access_command_test.go b/command/v7/disable_service_access_command_test.go index 49eb0d3366b..d7c597a2820 100644 --- a/command/v7/disable_service_access_command_test.go +++ b/command/v7/disable_service_access_command_test.go @@ -58,7 +58,7 @@ var _ = Describe("disable-service-access Command", func() { "message text", func(plan, org, broker, expected string) { setPositionalFlags(&cmd, "fake-service") - fakeConfig.CurrentUserReturns(configv3.User{Name: "fake-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "fake-user"}, nil) setFlag(&cmd, "-o", org) setFlag(&cmd, "-p", plan) diff --git a/command/v7/disable_ssh_command.go b/command/v7/disable_ssh_command.go index 3cddb8b0d5f..794f0b0f36a 100644 --- a/command/v7/disable_ssh_command.go +++ b/command/v7/disable_ssh_command.go @@ -18,14 +18,14 @@ func (cmd *DisableSSHCommand) Execute(args []string) error { return err } - username, err := cmd.Config.CurrentUserName() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } cmd.UI.DisplayTextWithFlavor("Disabling ssh support for app {{.AppName}} as {{.CurrentUserName}}...", map[string]interface{}{ "AppName": cmd.RequiredArgs.AppName, - "CurrentUserName": username, + "CurrentUserName": user.Name, }) app, getAppWarnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) diff --git a/command/v7/disable_ssh_command_test.go b/command/v7/disable_ssh_command_test.go index b90a06a7bfc..b3715c66a0e 100644 --- a/command/v7/disable_ssh_command_test.go +++ b/command/v7/disable_ssh_command_test.go @@ -9,6 +9,7 @@ import ( . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -48,7 +49,7 @@ var _ = Describe("disable-ssh Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) currentUserName = "some-user" - fakeConfig.CurrentUserNameReturns(currentUserName, nil) + fakeDisableSSHActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { @@ -160,7 +161,6 @@ var _ = Describe("disable-ssh Command", func() { When("GetAppFeature action errors", func() { returnedErr := errors.New("some-error") BeforeEach(func() { - fakeDisableSSHActor.GetAppFeatureReturns( resources.ApplicationFeature{}, nil, diff --git a/command/v7/disallow_space_ssh_command.go b/command/v7/disallow_space_ssh_command.go index de22e9b586b..295d3d966de 100644 --- a/command/v7/disallow_space_ssh_command.go +++ b/command/v7/disallow_space_ssh_command.go @@ -14,13 +14,12 @@ type DisallowSpaceSSHCommand struct { } func (cmd *DisallowSpaceSSHCommand) Execute(args []string) error { - err := cmd.SharedActor.CheckTarget(true, false) if err != nil { return err } - currentUserName, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -30,7 +29,7 @@ func (cmd *DisallowSpaceSSHCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Disabling ssh support for space {{.Space}} as {{.CurrentUserName}}...", map[string]interface{}{ "Space": inputSpace, - "CurrentUserName": currentUserName, + "CurrentUserName": currentUser.Name, }) warnings, err := cmd.Actor.UpdateSpaceFeature(inputSpace, targetedOrgGUID, false, "ssh") @@ -49,5 +48,4 @@ func (cmd *DisallowSpaceSSHCommand) Execute(args []string) error { cmd.UI.DisplayOK() return err - } diff --git a/command/v7/disallow_space_ssh_command_test.go b/command/v7/disallow_space_ssh_command_test.go index cbe6ca6bd39..d0dbe4bb951 100644 --- a/command/v7/disallow_space_ssh_command_test.go +++ b/command/v7/disallow_space_ssh_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/command/commandfakes" . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -47,7 +48,7 @@ var _ = Describe("disallow-space-ssh Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) currentUserName = "some-user" - fakeConfig.CurrentUserNameReturns(currentUserName, nil) + disallowSpaceSSHActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { @@ -71,7 +72,7 @@ var _ = Describe("disallow-space-ssh Command", func() { When("checking the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("", errors.New("uh oh")) + disallowSpaceSSHActor.GetCurrentUserReturns(configv3.User{}, errors.New("uh oh")) }) It("returns the error", func() { diff --git a/command/v7/domains_command.go b/command/v7/domains_command.go index 8a48279ecb1..09b59929f59 100644 --- a/command/v7/domains_command.go +++ b/command/v7/domains_command.go @@ -23,7 +23,7 @@ func (cmd DomainsCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/domains_command_test.go b/command/v7/domains_command_test.go index db853bd41e8..498e45370a2 100644 --- a/command/v7/domains_command_test.go +++ b/command/v7/domains_command_test.go @@ -89,7 +89,7 @@ var _ = Describe("domains Command", func() { Context("When the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("DomainsActor returns an error", func() { diff --git a/command/v7/download_droplet_command.go b/command/v7/download_droplet_command.go index 5c1b52609e9..0b4b55cb6a0 100644 --- a/command/v7/download_droplet_command.go +++ b/command/v7/download_droplet_command.go @@ -28,7 +28,7 @@ func (cmd DownloadDropletCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/download_droplet_command_test.go b/command/v7/download_droplet_command_test.go index 5f9d4b16a14..826ba8b12a6 100644 --- a/command/v7/download_droplet_command_test.go +++ b/command/v7/download_droplet_command_test.go @@ -58,7 +58,7 @@ var _ = Describe("download-droplet Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ GUID: "some-space-guid", Name: "some-space"}) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/droplets_command.go b/command/v7/droplets_command.go index a9b58e221ca..2e61020c71e 100644 --- a/command/v7/droplets_command.go +++ b/command/v7/droplets_command.go @@ -24,7 +24,7 @@ func (cmd DropletsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/droplets_command_test.go b/command/v7/droplets_command_test.go index 554de013811..bd9ef93014c 100644 --- a/command/v7/droplets_command_test.go +++ b/command/v7/droplets_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("droplets Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -87,7 +87,7 @@ var _ = Describe("droplets Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/enable_feature_flag_command.go b/command/v7/enable_feature_flag_command.go index 4ca569c9c85..f15945aa8e2 100644 --- a/command/v7/enable_feature_flag_command.go +++ b/command/v7/enable_feature_flag_command.go @@ -18,7 +18,7 @@ func (cmd EnableFeatureFlagCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/enable_feature_flag_command_test.go b/command/v7/enable_feature_flag_command_test.go index 5e0228ebd30..84717d362a4 100644 --- a/command/v7/enable_feature_flag_command_test.go +++ b/command/v7/enable_feature_flag_command_test.go @@ -70,7 +70,7 @@ var _ = Describe("Enable Feature Flag Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/enable_org_isolation_command.go b/command/v7/enable_org_isolation_command.go index 54bb5ad9a14..be089ce48c5 100644 --- a/command/v7/enable_org_isolation_command.go +++ b/command/v7/enable_org_isolation_command.go @@ -17,7 +17,7 @@ func (cmd EnableOrgIsolationCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/enable_org_isolation_command_test.go b/command/v7/enable_org_isolation_command_test.go index aa1b0579c29..ed6e1f29ad3 100644 --- a/command/v7/enable_org_isolation_command_test.go +++ b/command/v7/enable_org_isolation_command_test.go @@ -70,7 +70,7 @@ var _ = Describe("enable-org-isolation Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) cmd.RequiredArgs.OrganizationName = org cmd.RequiredArgs.IsolationSegmentName = isolationSegment diff --git a/command/v7/enable_service_access_command.go b/command/v7/enable_service_access_command.go index 82fbe5a485f..3246cf9a3e8 100644 --- a/command/v7/enable_service_access_command.go +++ b/command/v7/enable_service_access_command.go @@ -40,7 +40,7 @@ func (cmd EnableServiceAccessCommand) Execute(args []string) error { } func (cmd EnableServiceAccessCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/enable_service_access_command_test.go b/command/v7/enable_service_access_command_test.go index b38d7b8a01d..b74631d2737 100644 --- a/command/v7/enable_service_access_command_test.go +++ b/command/v7/enable_service_access_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("enable-service-access command", func() { DescribeTable( "message text", func(plan, org, broker, expected string) { - fakeConfig.CurrentUserReturns(configv3.User{Name: "fake-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "fake-user"}, nil) setPositionalFlags(&cmd, "fake-service") setFlag(&cmd, "-p", plan) diff --git a/command/v7/enable_ssh_command.go b/command/v7/enable_ssh_command.go index 7fadce6d718..836d2f9c487 100644 --- a/command/v7/enable_ssh_command.go +++ b/command/v7/enable_ssh_command.go @@ -18,14 +18,14 @@ func (cmd *EnableSSHCommand) Execute(args []string) error { return err } - username, err := cmd.Config.CurrentUserName() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } cmd.UI.DisplayTextWithFlavor("Enabling ssh support for app {{.AppName}} as {{.CurrentUserName}}...", map[string]interface{}{ "AppName": cmd.RequiredArgs.AppName, - "CurrentUserName": username, + "CurrentUserName": user.Name, }) app, getAppWarnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) diff --git a/command/v7/enable_ssh_command_test.go b/command/v7/enable_ssh_command_test.go index 8f6431e95be..6f10da55d7e 100644 --- a/command/v7/enable_ssh_command_test.go +++ b/command/v7/enable_ssh_command_test.go @@ -10,6 +10,7 @@ import ( . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -49,7 +50,7 @@ var _ = Describe("enable-ssh Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) currentUserName = "some-user" - fakeConfig.CurrentUserNameReturns(currentUserName, nil) + fakeEnableSSHActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { @@ -185,7 +186,6 @@ var _ = Describe("enable-ssh Command", func() { When("GetAppFeature action errors", func() { returnedErr := errors.New("some-error") BeforeEach(func() { - fakeEnableSSHActor.GetAppFeatureReturns( resources.ApplicationFeature{}, nil, diff --git a/command/v7/env_command.go b/command/v7/env_command.go index 84b05fdb8b8..a021cdfc02f 100644 --- a/command/v7/env_command.go +++ b/command/v7/env_command.go @@ -22,7 +22,7 @@ func (cmd EnvCommand) Execute(_ []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/env_command_test.go b/command/v7/env_command_test.go index f03a6d2dc6c..73ffa2d1baa 100644 --- a/command/v7/env_command_test.go +++ b/command/v7/env_command_test.go @@ -76,7 +76,7 @@ var _ = Describe("env Command", func() { When("getting the current user returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns the error", func() { @@ -86,7 +86,7 @@ var _ = Describe("env Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("getting the environment returns env vars for all groups", func() { diff --git a/command/v7/events_command.go b/command/v7/events_command.go index 566169ae6c7..bca46d76781 100644 --- a/command/v7/events_command.go +++ b/command/v7/events_command.go @@ -19,7 +19,7 @@ func (cmd EventsCommand) Execute(_ []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/events_command_test.go b/command/v7/events_command_test.go index 3873cba5b75..6f1e6faae61 100644 --- a/command/v7/events_command_test.go +++ b/command/v7/events_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("events Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -87,7 +87,7 @@ var _ = Describe("events Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/feature_flag_command.go b/command/v7/feature_flag_command.go index 7d113030cd7..4a0db0e2aac 100644 --- a/command/v7/feature_flag_command.go +++ b/command/v7/feature_flag_command.go @@ -21,7 +21,7 @@ func (cmd FeatureFlagCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/feature_flag_command_test.go b/command/v7/feature_flag_command_test.go index c70a51e5f9c..8c6b191a134 100644 --- a/command/v7/feature_flag_command_test.go +++ b/command/v7/feature_flag_command_test.go @@ -50,7 +50,7 @@ var _ = Describe("Feature Flag Command", func() { fakeConfig.BinaryNameReturns(binaryName) cmd.RequiredArgs.Feature = featureFlagName - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) fakeActor.GetFeatureFlagByNameReturns(resources.FeatureFlag{ Name: "flag1", diff --git a/command/v7/feature_flags_command.go b/command/v7/feature_flags_command.go index 5d98ccd1147..64c6ce47d03 100644 --- a/command/v7/feature_flags_command.go +++ b/command/v7/feature_flags_command.go @@ -19,7 +19,7 @@ func (cmd FeatureFlagsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/feature_flags_command_test.go b/command/v7/feature_flags_command_test.go index 9f86f63c819..c14ae693026 100644 --- a/command/v7/feature_flags_command_test.go +++ b/command/v7/feature_flags_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("Feature Flags Command", func() { Context("When the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("FeatureFlagsActor returns an error", func() { diff --git a/command/v7/get_health_check_command.go b/command/v7/get_health_check_command.go index 1611d15f3d5..050f6a568de 100644 --- a/command/v7/get_health_check_command.go +++ b/command/v7/get_health_check_command.go @@ -21,7 +21,7 @@ func (cmd GetHealthCheckCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/get_health_check_command_test.go b/command/v7/get_health_check_command_test.go index 6e8a00ff003..de730ad5fcb 100644 --- a/command/v7/get_health_check_command_test.go +++ b/command/v7/get_health_check_command_test.go @@ -59,7 +59,7 @@ var _ = Describe("get-health-check Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -86,7 +86,7 @@ var _ = Describe("get-health-check Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/isolation_segments_command.go b/command/v7/isolation_segments_command.go index 4f77f3b305a..8eed00effa0 100644 --- a/command/v7/isolation_segments_command.go +++ b/command/v7/isolation_segments_command.go @@ -18,7 +18,7 @@ func (cmd IsolationSegmentsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/isolation_segments_command_test.go b/command/v7/isolation_segments_command_test.go index bb6530e0359..88bd5ce1b42 100644 --- a/command/v7/isolation_segments_command_test.go +++ b/command/v7/isolation_segments_command_test.go @@ -66,7 +66,7 @@ var _ = Describe("isolation-segments Command", func() { When("checking target does not fail", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("an error is not encountered getting the isolation segment summaries", func() { diff --git a/command/v7/label_updater.go b/command/v7/label_updater.go index 948e58d9ef5..ce48fcd2854 100644 --- a/command/v7/label_updater.go +++ b/command/v7/label_updater.go @@ -9,11 +9,13 @@ import ( "code.cloudfoundry.org/cli/command" "code.cloudfoundry.org/cli/command/translatableerror" "code.cloudfoundry.org/cli/types" + "code.cloudfoundry.org/cli/util/configv3" ) //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . SetLabelActor type SetLabelActor interface { + GetCurrentUser() (configv3.User, error) UpdateApplicationLabelsByApplicationName(string, string, map[string]types.NullString) (v7action.Warnings, error) UpdateBuildpackLabelsByBuildpackNameAndStack(string, string, map[string]types.NullString) (v7action.Warnings, error) UpdateDomainLabelsByDomainName(string, map[string]types.NullString) (v7action.Warnings, error) @@ -60,12 +62,13 @@ func (cmd *LabelUpdater) Execute(targetResource TargetResource, labels map[strin cmd.labels = labels cmd.targetResource.ResourceType = strings.ToLower(cmd.targetResource.ResourceType) - var err error - cmd.Username, err = cmd.Config.CurrentUserName() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } + cmd.Username = user.Name + if err := cmd.validateFlags(); err != nil { return err } diff --git a/command/v7/label_updater_test.go b/command/v7/label_updater_test.go index 9e013384e9d..de8411f0aac 100644 --- a/command/v7/label_updater_test.go +++ b/command/v7/label_updater_test.go @@ -95,7 +95,7 @@ var _ = Describe("LabelUpdater", func() { ResourceType: "anything", ResourceName: resourceName, } - fakeConfig.CurrentUserNameReturns("some-user", errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, errors.New("boom")) }) It("returns an error", func() { @@ -238,11 +238,12 @@ var _ = Describe("LabelUpdater", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"}) - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap }) @@ -306,7 +307,7 @@ var _ = Describe("LabelUpdater", func() { When("Unsetting labels", func() { BeforeEach(func() { cmd.Action = Unset - //FIXME do we want to change the labels to all have nil values? + // FIXME do we want to change the labels to all have nil values? }) It("shows 'Removing' as action", func() { Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Removing label(s) for app %s in org fake-org / space fake-space as some-user...`), appName)) @@ -316,7 +317,7 @@ var _ = Describe("LabelUpdater", func() { When("Setting labels", func() { BeforeEach(func() { cmd.Action = Set - //FIXME do we want to change the labels to all have not nil values? + // FIXME do we want to change the labels to all have not nil values? }) It("shows 'Setting' as action", func() { @@ -339,18 +340,18 @@ var _ = Describe("LabelUpdater", func() { } fakeSharedActor.CheckTargetReturns(nil) - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackReturns( v7action.Warnings([]string{"some-warning-1", "some-warning-2"}), nil, ) - }) JustBeforeEach(func() { @@ -404,7 +405,8 @@ var _ = Describe("LabelUpdater", func() { } expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } }) It("calls the right actor", func() { @@ -456,7 +458,7 @@ var _ = Describe("LabelUpdater", func() { When("Setting labels", func() { BeforeEach(func() { cmd.Action = Set - //FIXME do we want to change the labels to all have not nil values? + // FIXME do we want to change the labels to all have not nil values? }) When("stack is passed", func() { @@ -492,10 +494,11 @@ var _ = Describe("LabelUpdater", func() { } expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeActor.UpdateDomainLabelsByDomainNameReturns( v7action.Warnings{"some-warning-1", "some-warning-2"}, nil, @@ -587,11 +590,12 @@ var _ = Describe("LabelUpdater", func() { ResourceName: orgName, } fakeSharedActor.CheckTargetReturns(nil) - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns( @@ -687,10 +691,11 @@ var _ = Describe("LabelUpdater", func() { expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "space-guid"}) fakeActor.UpdateRouteLabelsReturns(v7action.Warnings{"some-warning-1", "some-warning-2"}, @@ -782,7 +787,7 @@ var _ = Describe("LabelUpdater", func() { ResourceName: expectedServiceBrokerName, } - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), "some-other-key": types.NewNullString(), @@ -887,11 +892,12 @@ var _ = Describe("LabelUpdater", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"}) - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap }) @@ -977,9 +983,7 @@ var _ = Describe("LabelUpdater", func() { }) When("updating labels on service-offering", func() { - var ( - executeErr error - ) + var executeErr error const serviceBrokerName = "brokerName" const serviceOfferingName = "serviceOfferingName" @@ -994,7 +998,7 @@ var _ = Describe("LabelUpdater", func() { "some-other-key": types.NewNullString(), } - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeActor.UpdateServiceOfferingLabelsReturns( v7action.Warnings{"some-warning-1", "some-warning-2"}, nil, @@ -1120,9 +1124,7 @@ var _ = Describe("LabelUpdater", func() { }) When("updating labels on service-plan", func() { - var ( - executeErr error - ) + var executeErr error const serviceBrokerName = "brokerName" const serviceOfferingName = "serviceOfferingName" @@ -1138,7 +1140,7 @@ var _ = Describe("LabelUpdater", func() { "some-other-key": types.NewNullString(), } - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeActor.UpdateServicePlanLabelsReturns( v7action.Warnings{"some-warning-1", "some-warning-2"}, nil, @@ -1330,7 +1332,6 @@ var _ = Describe("LabelUpdater", func() { }) }) }) - }) }) @@ -1349,10 +1350,11 @@ var _ = Describe("LabelUpdater", func() { } expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), - "some-other-key": types.NewNullString()} + "some-other-key": types.NewNullString(), + } labels = expectedMap - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns( configv3.Organization{Name: "fake-org", GUID: "some-org-guid"}) @@ -1450,7 +1452,7 @@ var _ = Describe("LabelUpdater", func() { ResourceType: "stack", ResourceName: stackName, } - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeSharedActor.CheckTargetReturns(nil) expectedMap = map[string]types.NullString{ "some-label": types.NewNullString("some-value"), @@ -1473,7 +1475,6 @@ var _ = Describe("LabelUpdater", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(testUI.Err).To(Say("some-warning-1")) Expect(testUI.Err).To(Say("some-warning-2")) - }) It("passes the correct parameters into the actor", func() { diff --git a/command/v7/labels_command.go b/command/v7/labels_command.go index f1bcf554ed4..4b371508558 100644 --- a/command/v7/labels_command.go +++ b/command/v7/labels_command.go @@ -47,11 +47,13 @@ func (cmd LabelsCommand) Execute(args []string) error { err error ) - cmd.username, err = cmd.Config.CurrentUserName() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } + cmd.username = user.Name + if err := cmd.validateFlags(); err != nil { return err } diff --git a/command/v7/labels_command_test.go b/command/v7/labels_command_test.go index 4c2ff51f567..200e4c78075 100644 --- a/command/v7/labels_command_test.go +++ b/command/v7/labels_command_test.go @@ -49,7 +49,7 @@ var _ = Describe("labels command", func() { Context("shared validations", func() { When("fetching the current user's name fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", errors.New("boom")) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, errors.New("boom")) executeErr = cmd.Execute(nil) }) @@ -182,18 +182,16 @@ var _ = Describe("labels command", func() { } }) }) - }) Describe("listing labels", func() { - JustBeforeEach(func() { executeErr = cmd.Execute(nil) }) Describe("for apps", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"}) cmd.RequiredArgs = flag.LabelsArgs{ @@ -273,7 +271,7 @@ var _ = Describe("labels command", func() { Describe("for domains", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "domain", ResourceName: "example.com", @@ -346,12 +344,11 @@ var _ = Describe("labels command", func() { Expect(testUI.Out).ToNot(Say("OK")) }) }) - }) Describe("for orgs", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "org", ResourceName: "fake-org", @@ -422,12 +419,11 @@ var _ = Describe("labels command", func() { Expect(testUI.Out).ToNot(Say("OK")) }) }) - }) Describe("for routes", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"}) cmd.RequiredArgs = flag.LabelsArgs{ @@ -503,12 +499,11 @@ var _ = Describe("labels command", func() { Expect(testUI.Out).ToNot(Say("OK")) }) }) - }) Describe("for spaces", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org", GUID: "some-org-guid"}) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "space", @@ -580,12 +575,11 @@ var _ = Describe("labels command", func() { Expect(testUI.Out).ToNot(Say("OK")) }) }) - }) Describe("for stacks", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "stack", ResourceName: "fake-stack", @@ -656,12 +650,11 @@ var _ = Describe("labels command", func() { Expect(testUI.Out).ToNot(Say("OK")) }) }) - }) Describe("for buildpacks", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "buildpack", ResourceName: "my-buildpack", @@ -773,7 +766,7 @@ var _ = Describe("labels command", func() { Describe("for service-brokers", func() { When("There is an error fetching the labels", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "service-broker", @@ -804,7 +797,7 @@ var _ = Describe("labels command", func() { "some-label": types.NewNullString("some-value"), } - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "service-broker", @@ -831,14 +824,13 @@ var _ = Describe("labels command", func() { It("prints all the warnings", func() { Expect(testUI.Err).To(Say("some-warning-1")) Expect(testUI.Err).To(Say("some-warning-2")) - }) }) }) Describe("for service-instances", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"}) @@ -905,7 +897,7 @@ var _ = Describe("labels command", func() { Describe("for service-offerings", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "service-offering", @@ -990,7 +982,7 @@ var _ = Describe("labels command", func() { Describe("for service-plans", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeLabelsActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) cmd.RequiredArgs = flag.LabelsArgs{ ResourceType: "service-plan", diff --git a/command/v7/login_command.go b/command/v7/login_command.go index e1cb0ad80ca..a98aaf695ac 100644 --- a/command/v7/login_command.go +++ b/command/v7/login_command.go @@ -1,7 +1,6 @@ package v7 import ( - "errors" "fmt" "io" "net/url" @@ -16,6 +15,7 @@ import ( "code.cloudfoundry.org/cli/actor/v7action" "code.cloudfoundry.org/cli/api/uaa/constant" "code.cloudfoundry.org/cli/cf/configuration/coreconfig" + "code.cloudfoundry.org/cli/cf/errors" "code.cloudfoundry.org/cli/command" "code.cloudfoundry.org/cli/command/translatableerror" "code.cloudfoundry.org/cli/command/v7/shared" @@ -60,7 +60,7 @@ type LoginCommand struct { } func (cmd *LoginCommand) Setup(config command.Config, ui command.UI) error { - ccClient, _ := shared.NewWrappedCloudControllerClient(config, ui) + ccClient := shared.NewWrappedCloudControllerClient(config, ui) cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, nil, clock.NewClock()) cmd.ActorReloader = ActualActorReloader{} @@ -98,6 +98,11 @@ func (cmd *LoginCommand) Execute(args []string) error { return err } + err = cmd.validateTargetSpecificFlags() + if err != nil { + return err + } + versionWarning, err := shared.CheckCCAPIVersion(cmd.Config.APIVersion()) if err != nil { cmd.UI.DisplayWarning("Warning: unable to determine whether targeted API's version meets minimum supported.") @@ -208,7 +213,7 @@ func (cmd *LoginCommand) determineAPIEndpoint() (v7action.TargetSettings, error) endpoint := cmd.APIEndpoint skipSSLValidation := cmd.SkipSSLValidation - var configTarget = cmd.Config.Target() + configTarget := cmd.Config.Target() if endpoint == "" && configTarget != "" { endpoint = configTarget @@ -255,7 +260,7 @@ func (cmd *LoginCommand) targetAPI(settings v7action.TargetSettings) error { func (cmd *LoginCommand) authenticate() error { var err error - var credentials = make(map[string]string) + credentials := make(map[string]string) prompts, err := cmd.Actor.GetLoginPrompts() if err != nil { @@ -272,7 +277,11 @@ func (cmd *LoginCommand) authenticate() error { } for key, prompt := range nonPasswordPrompts { - credentials[key], err = cmd.UI.DisplayTextPrompt(prompt.DisplayName) + if prompt.Type == coreconfig.AuthPromptTypeMenu { + credentials[key], err = cmd.UI.DisplayTextMenu(prompt.Entries, prompt.DisplayName) + } else { + credentials[key], err = cmd.UI.DisplayTextPrompt(prompt.DisplayName) + } if err != nil { return err } @@ -398,13 +407,13 @@ func (cmd *LoginCommand) showStatus() { }, } - user, err := cmd.Config.CurrentUserName() - if user == "" || err != nil { + user, err := cmd.Actor.GetCurrentUser() + if user.Name == "" || err != nil { cmd.UI.DisplayKeyValueTable("", tableContent, 3) command.DisplayNotLoggedInText(cmd.Config.BinaryName(), cmd.UI) return } - tableContent = append(tableContent, []string{cmd.UI.TranslateText("user:"), user}) + tableContent = append(tableContent, []string{cmd.UI.TranslateText("user:"), user.Name}) orgName := cmd.Config.TargetedOrganizationName() if orgName == "" { @@ -459,7 +468,6 @@ func (cmd *LoginCommand) promptChosenOrg(orgs []resources.Organization) (resourc } chosenOrgName, err := cmd.promptMenu(orgNames, "Select an org:", "Org") - if err != nil { if invalidChoice, ok := err.(ui.InvalidChoiceError); ok { if cmd.Space != "" { @@ -572,6 +580,29 @@ func (cmd *LoginCommand) validateFlags() error { return nil } +func (cmd *LoginCommand) validateTargetSpecificFlags() error { + if !cmd.Config.IsCFOnK8s() { + return nil + } + + if cmd.Password != "" { + return translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "-p"} + } + if cmd.SSO { + return translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--sso"} + } + if cmd.SSOPasscode != "" { + return translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--sso-passcode"} + } + if cmd.Username != "" { + return translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "-u"} + } + if cmd.Origin != "" { + return translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--origin"} + } + return nil +} + func contains(s []string, v string) bool { for _, x := range s { if x == v { diff --git a/command/v7/login_command_test.go b/command/v7/login_command_test.go index 51b059834d5..b2bcb502230 100644 --- a/command/v7/login_command_test.go +++ b/command/v7/login_command_test.go @@ -123,6 +123,63 @@ var _ = Describe("login Command", func() { Expect(executeErr).To(MatchError(translatableerror.PasswordGrantTypeLogoutRequiredError{})) }) }) + + When("running against cf-on-k8s API", func() { + BeforeEach(func() { + fakeConfig.IsCFOnK8sReturns(true) + fakeConfig.TargetReturns("https://foo.bar") + }) + + When("password flag is provider", func() { + BeforeEach(func() { + cmd.Password = "pass" + }) + + It("returns unsupported flag error", func() { + Expect(executeErr).To(Equal(translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "-p"})) + }) + }) + + When("sso flag is provider", func() { + BeforeEach(func() { + cmd.SSO = true + }) + + It("returns unsupported flag error", func() { + Expect(executeErr).To(Equal(translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--sso"})) + }) + }) + + When("sso passcode flag is provider", func() { + BeforeEach(func() { + cmd.SSOPasscode = "sso-pass" + }) + + It("returns unsupported flag error", func() { + Expect(executeErr).To(Equal(translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--sso-passcode"})) + }) + }) + + When("username flag is provider", func() { + BeforeEach(func() { + cmd.Username = "my-user" + }) + + It("returns unsupported flag error", func() { + Expect(executeErr).To(Equal(translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "-u"})) + }) + }) + + When("origin flag is provider", func() { + BeforeEach(func() { + cmd.Origin = "my-origin" + }) + + It("returns unsupported flag error", func() { + Expect(executeErr).To(Equal(translatableerror.NotSupportedOnKubernetesArgumentError{Arg: "--origin"})) + }) + }) + }) }) Describe("API Endpoint", func() { @@ -563,7 +620,7 @@ var _ = Describe("login Command", func() { When("authenticating succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("potatoface", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "potatoface"}, nil) _, err := input.Write([]byte("faker\nsomeaccount\nsomepassword\ngarbage\n")) Expect(err).ToNot(HaveOccurred()) }) @@ -643,7 +700,7 @@ var _ = Describe("login Command", func() { }, }, nil) - fakeConfig.CurrentUserNameReturns("potatoface", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "potatoface"}, nil) }) When("--sso flag is set", func() { @@ -723,7 +780,7 @@ var _ = Describe("login Command", func() { fakeActor.AuthenticateReturns(uaa.UnauthorizedError{ Message: "Bad credentials", }) - fakeConfig.CurrentUserNameReturns("", nil) + fakeActor.GetCurrentUserReturns(configv3.User{}, nil) _, err := input.Write([]byte("some-passcode\n")) Expect(err).ToNot(HaveOccurred()) }) @@ -768,7 +825,7 @@ var _ = Describe("login Command", func() { cmd.Username = "some-user" cmd.Password = "some-password" fakeConfig.APIVersionReturns("3.4.5") - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) It("writes to the config", func() { @@ -803,7 +860,7 @@ var _ = Describe("login Command", func() { cmd.Username = "some-user" cmd.Password = "some-password" fakeConfig.APIVersionReturns("3.4.5") - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) When("-o was passed", func() { @@ -873,7 +930,7 @@ var _ = Describe("login Command", func() { cmd.Username = "some-user" cmd.Password = "some-password" cmd.Space = "some-space" - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetReturns("https://example.com") fakeActor.GetOrganizationsReturns( []resources.Organization{}, @@ -891,7 +948,7 @@ var _ = Describe("login Command", func() { When("no org valid org exists", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( - []resources.Organization{resources.Organization{ + []resources.Organization{{ GUID: "some-org-guid", Name: "some-org-name", }}, @@ -919,10 +976,10 @@ var _ = Describe("login Command", func() { When("only one valid org exists", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( - []resources.Organization{resources.Organization{ + []resources.Organization{{ GUID: "some-org-guid1", Name: "some-org-name1", - }, resources.Organization{ + }, { GUID: "some-org-guid2", Name: "some-org-name2", }}, @@ -944,15 +1001,15 @@ var _ = Describe("login Command", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( []resources.Organization{ - resources.Organization{ + { GUID: "some-org-guid3", Name: "1234", }, - resources.Organization{ + { GUID: "some-org-guid1", Name: "some-org-name1", }, - resources.Organization{ + { GUID: "some-org-guid2", Name: "some-org-name2", }, @@ -975,7 +1032,7 @@ var _ = Describe("login Command", func() { When("filtering the orgs errors", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( - []resources.Organization{resources.Organization{ + []resources.Organization{{ GUID: "some-org-guid", Name: "some-org-name", }}, @@ -1015,7 +1072,7 @@ var _ = Describe("login Command", func() { When("fetching the organizations succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetReturns("https://example.com") }) @@ -1039,7 +1096,7 @@ var _ = Describe("login Command", func() { When("only one org exists", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( - []resources.Organization{resources.Organization{ + []resources.Organization{{ GUID: "some-org-guid", Name: "some-org-name", }}, @@ -1061,15 +1118,15 @@ var _ = Describe("login Command", func() { BeforeEach(func() { fakeActor.GetOrganizationsReturns( []resources.Organization{ - resources.Organization{ + { GUID: "some-org-guid3", Name: "1234", }, - resources.Organization{ + { GUID: "some-org-guid1", Name: "some-org-name1", }, - resources.Organization{ + { GUID: "some-org-guid2", Name: "some-org-name2", }, @@ -1083,7 +1140,8 @@ var _ = Describe("login Command", func() { When("the position is valid", func() { BeforeEach(func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{ - GUID: "targeted-org-guid1"}) + GUID: "targeted-org-guid1", + }) fakeConfig.TargetedOrganizationNameReturns("targeted-org-name") _, err := input.Write([]byte("2\n")) Expect(err).ToNot(HaveOccurred()) @@ -1191,7 +1249,6 @@ var _ = Describe("login Command", func() { }) }) }) - }) When("more than 50 orgs exist", func() { @@ -1245,7 +1302,6 @@ var _ = Describe("login Command", func() { }) }) }) - }) }) @@ -1276,14 +1332,15 @@ var _ = Describe("login Command", func() { cmd.Username = "some-user" cmd.Password = "some-password" fakeConfig.APIVersionReturns("3.4.5") - fakeConfig.CurrentUserNameReturns("some-user", nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) When("an org has been successfully targeted", func() { BeforeEach(func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{ GUID: "targeted-org-guid", - Name: "targeted-org-name"}, + Name: "targeted-org-name", + }, ) fakeConfig.TargetedOrganizationNameReturns("targeted-org-name") }) @@ -1554,9 +1611,7 @@ var _ = Describe("login Command", func() { Expect(fakeConfig.SetSpaceInformationCallCount()).To(Equal(0)) }) }) - }) - }) When("the user enters text which is both a space name and a digit", func() { @@ -1653,7 +1708,6 @@ var _ = Describe("login Command", func() { It("does not target the space", func() { Expect(fakeConfig.SetSpaceInformationCallCount()).To(Equal(0)) }) - }) When("the space is not in the list", func() { @@ -1671,7 +1725,6 @@ var _ = Describe("login Command", func() { }) }) }) - }) }) diff --git a/command/v7/logout_command.go b/command/v7/logout_command.go index 1ac952e5c99..0e7850c977f 100644 --- a/command/v7/logout_command.go +++ b/command/v7/logout_command.go @@ -28,7 +28,7 @@ func (cmd *LogoutCommand) Setup(config command.Config, ui command.UI) error { } func (cmd LogoutCommand) Execute(args []string) error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/logout_command_test.go b/command/v7/logout_command_test.go index ba9561b1190..e0b09f5cb51 100644 --- a/command/v7/logout_command_test.go +++ b/command/v7/logout_command_test.go @@ -33,7 +33,7 @@ var _ = Describe("logout command", func() { }, } - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -59,12 +59,12 @@ var _ = Describe("logout command", func() { When("unable to revoke token", func() { When("because the user is not logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{}, nil) }) It("does not impact the logout", func() { Expect(executeErr).ToNot(HaveOccurred()) - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) Expect(fakeConfig.UnsetUserInformationCallCount()).To(Equal(1)) Expect(testUI.Out).To(Say("Logging out ...")) Expect(testUI.Out).To(Say("OK")) diff --git a/command/v7/logs_command.go b/command/v7/logs_command.go index 5093a143e24..e5232665010 100644 --- a/command/v7/logs_command.go +++ b/command/v7/logs_command.go @@ -38,7 +38,7 @@ func (cmd LogsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/logs_command_test.go b/command/v7/logs_command_test.go index 530b7be0f6d..ea188379989 100644 --- a/command/v7/logs_command_test.go +++ b/command/v7/logs_command_test.go @@ -51,7 +51,7 @@ var _ = Describe("logs command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) cmd.RequiredArgs.AppName = "some-app" - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/map_route_command.go b/command/v7/map_route_command.go index fbeba5b12ed..c9ca6b381ac 100644 --- a/command/v7/map_route_command.go +++ b/command/v7/map_route_command.go @@ -41,7 +41,7 @@ func (cmd MapRouteCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/map_route_command_test.go b/command/v7/map_route_command_test.go index 6cef92a3f7f..3e7b111edeb 100644 --- a/command/v7/map_route_command_test.go +++ b/command/v7/map_route_command_test.go @@ -75,7 +75,7 @@ var _ = Describe("map-route Command", func() { GUID: spaceGUID, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -102,7 +102,7 @@ var _ = Describe("map-route Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/marketplace_command.go b/command/v7/marketplace_command.go index 4b96f3a075a..47adc8eb88a 100644 --- a/command/v7/marketplace_command.go +++ b/command/v7/marketplace_command.go @@ -77,7 +77,7 @@ func (cmd MarketplaceCommand) processLoginContext() (string, error) { return "", err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return "", err } diff --git a/command/v7/marketplace_command_test.go b/command/v7/marketplace_command_test.go index 428797f573b..ca4410c572e 100644 --- a/command/v7/marketplace_command_test.go +++ b/command/v7/marketplace_command_test.go @@ -50,7 +50,7 @@ var _ = Describe("marketplace command", func() { Name: "fake-org-name", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "fake-username"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "fake-username"}, nil) }) Describe("pre-flight checks", func() { @@ -70,7 +70,7 @@ var _ = Describe("marketplace command", func() { }) It("gets the user", func() { - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) It("checks the target", func() { @@ -82,7 +82,7 @@ var _ = Describe("marketplace command", func() { When("getting the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("fake get user error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("fake get user error")) }) It("returns an error", func() { @@ -107,7 +107,7 @@ var _ = Describe("marketplace command", func() { }) It("does not try to get the username or check the target", func() { - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(0)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(0)) Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(0)) }) }) diff --git a/command/v7/network_policies_command.go b/command/v7/network_policies_command.go index 5929ffab0ce..6a8a6e1f1d5 100644 --- a/command/v7/network_policies_command.go +++ b/command/v7/network_policies_command.go @@ -51,7 +51,7 @@ func (cmd NetworkPoliciesCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/network_policies_command_test.go b/command/v7/network_policies_command_test.go index 1b7886113b7..97b0fb57d0a 100644 --- a/command/v7/network_policies_command_test.go +++ b/command/v7/network_policies_command_test.go @@ -17,21 +17,23 @@ import ( var _ = Describe("network-policies Command", func() { var ( - cmd NetworkPoliciesCommand - testUI *ui.UI - fakeConfig *commandfakes.FakeConfig - fakeSharedActor *commandfakes.FakeSharedActor - fakeActor *v7fakes.FakeNetworkPoliciesActor - binaryName string - executeErr error - srcApp string + cmd NetworkPoliciesCommand + testUI *ui.UI + fakeConfig *commandfakes.FakeConfig + fakeSharedActor *commandfakes.FakeSharedActor + fakeActor *v7fakes.FakeActor + fakeNetworkPoliciesActor *v7fakes.FakeNetworkPoliciesActor + binaryName string + executeErr error + srcApp string ) BeforeEach(func() { testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) fakeConfig = new(commandfakes.FakeConfig) fakeSharedActor = new(commandfakes.FakeSharedActor) - fakeActor = new(v7fakes.FakeNetworkPoliciesActor) + fakeActor = new(v7fakes.FakeActor) + fakeNetworkPoliciesActor = new(v7fakes.FakeNetworkPoliciesActor) srcApp = "" @@ -40,8 +42,9 @@ var _ = Describe("network-policies Command", func() { Config: fakeConfig, SharedActor: fakeSharedActor, UI: testUI, + Actor: fakeActor, }, - NetworkingActor: fakeActor, + NetworkingActor: fakeNetworkPoliciesActor, SourceApp: srcApp, } @@ -70,7 +73,7 @@ var _ = Describe("network-policies Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) }) @@ -81,7 +84,7 @@ var _ = Describe("network-policies Command", func() { When("fetching the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns an error", func() { @@ -91,7 +94,7 @@ var _ = Describe("network-policies Command", func() { When("listing policies is successful", func() { BeforeEach(func() { - fakeActor.NetworkPoliciesBySpaceReturns([]cfnetworkingaction.Policy{ + fakeNetworkPoliciesActor.NetworkPoliciesBySpaceReturns([]cfnetworkingaction.Policy{ { SourceName: "app1", DestinationName: "app2", @@ -114,8 +117,8 @@ var _ = Describe("network-policies Command", func() { It("lists the policies when no error occurs", func() { Expect(executeErr).ToNot(HaveOccurred()) - Expect(fakeActor.NetworkPoliciesBySpaceCallCount()).To(Equal(1)) - passedSpaceGuid := fakeActor.NetworkPoliciesBySpaceArgsForCall(0) + Expect(fakeNetworkPoliciesActor.NetworkPoliciesBySpaceCallCount()).To(Equal(1)) + passedSpaceGuid := fakeNetworkPoliciesActor.NetworkPoliciesBySpaceArgsForCall(0) Expect(passedSpaceGuid).To(Equal("some-space-guid")) Expect(testUI.Out).To(Say(`Listing network policies in org some-org / space some-space as some-user\.\.\.`)) @@ -131,7 +134,7 @@ var _ = Describe("network-policies Command", func() { When("a source app name is passed", func() { BeforeEach(func() { cmd.SourceApp = "some-app" - fakeActor.NetworkPoliciesBySpaceAndAppNameReturns([]cfnetworkingaction.Policy{ + fakeNetworkPoliciesActor.NetworkPoliciesBySpaceAndAppNameReturns([]cfnetworkingaction.Policy{ { SourceName: "app1", DestinationName: "app2", @@ -154,8 +157,8 @@ var _ = Describe("network-policies Command", func() { It("lists the policies when no error occurs", func() { Expect(executeErr).ToNot(HaveOccurred()) - Expect(fakeActor.NetworkPoliciesBySpaceAndAppNameCallCount()).To(Equal(1)) - passedSpaceGuid, passedSrcAppName := fakeActor.NetworkPoliciesBySpaceAndAppNameArgsForCall(0) + Expect(fakeNetworkPoliciesActor.NetworkPoliciesBySpaceAndAppNameCallCount()).To(Equal(1)) + passedSpaceGuid, passedSrcAppName := fakeNetworkPoliciesActor.NetworkPoliciesBySpaceAndAppNameArgsForCall(0) Expect(passedSpaceGuid).To(Equal("some-space-guid")) Expect(passedSrcAppName).To(Equal("some-app")) @@ -173,7 +176,7 @@ var _ = Describe("network-policies Command", func() { When("listing the policies is not successful", func() { BeforeEach(func() { - fakeActor.NetworkPoliciesBySpaceReturns([]cfnetworkingaction.Policy{}, cfnetworkingaction.Warnings{"some-warning-1", "some-warning-2"}, actionerror.ApplicationNotFoundError{Name: srcApp}) + fakeNetworkPoliciesActor.NetworkPoliciesBySpaceReturns([]cfnetworkingaction.Policy{}, cfnetworkingaction.Warnings{"some-warning-1", "some-warning-2"}, actionerror.ApplicationNotFoundError{Name: srcApp}) }) It("displays warnings and returns the error", func() { diff --git a/command/v7/org_command.go b/command/v7/org_command.go index 972cd68bfe0..0f2a238713c 100644 --- a/command/v7/org_command.go +++ b/command/v7/org_command.go @@ -43,7 +43,7 @@ func (cmd OrgCommand) displayOrgGUID() error { } func (cmd OrgCommand) displayOrgSummary() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/org_command_test.go b/command/v7/org_command_test.go index a66260b5ca2..2dccc3a8c49 100644 --- a/command/v7/org_command_test.go +++ b/command/v7/org_command_test.go @@ -134,7 +134,7 @@ var _ = Describe("org Command", func() { When("the --guid flag is not provided", func() { When("no errors occur", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -195,7 +195,7 @@ var _ = Describe("org Command", func() { Expect(testUI.Out).To(Say(`spaces:\s+space1, space2`)) Expect(testUI.Out).To(Say(`isolation segments:\s+isolation-segment-1 \(default\), isolation-segment-2`)) - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) Expect(fakeActor.GetOrganizationSummaryByNameCallCount()).To(Equal(1)) orgName := fakeActor.GetOrganizationSummaryByNameArgsForCall(0) @@ -231,7 +231,7 @@ var _ = Describe("org Command", func() { BeforeEach(func() { expectedErr = errors.New("getting current user error") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) diff --git a/command/v7/org_quota_command.go b/command/v7/org_quota_command.go index 9f55424a7b6..5458bb24fb7 100644 --- a/command/v7/org_quota_command.go +++ b/command/v7/org_quota_command.go @@ -20,7 +20,7 @@ func (cmd OrgQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/org_quota_command_test.go b/command/v7/org_quota_command_test.go index dcff1b5813c..187fcda8d56 100644 --- a/command/v7/org_quota_command_test.go +++ b/command/v7/org_quota_command_test.go @@ -65,7 +65,7 @@ var _ = Describe("Org Quota Command", func() { When("getting the org quota fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -90,7 +90,7 @@ var _ = Describe("Org Quota Command", func() { When("getting the org quota succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, diff --git a/command/v7/org_quotas_command.go b/command/v7/org_quotas_command.go index d774c48a236..2fb561d07f0 100644 --- a/command/v7/org_quotas_command.go +++ b/command/v7/org_quotas_command.go @@ -18,7 +18,7 @@ func (cmd OrgQuotasCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/org_quotas_command_test.go b/command/v7/org_quotas_command_test.go index 0096fe1927c..d69e632c6f0 100644 --- a/command/v7/org_quotas_command_test.go +++ b/command/v7/org_quotas_command_test.go @@ -57,7 +57,7 @@ var _ = Describe("org-quotas command", func() { When("running the command successfully", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) orgQuotas := []resources.OrganizationQuota{ { Quota: resources.Quota{ @@ -160,7 +160,7 @@ var _ = Describe("org-quotas command", func() { When("the quota list is empty", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) fakeActor.GetOrganizationQuotasReturns([]resources.OrganizationQuota{}, v7action.Warnings{"some-warning-1", "some-warning-2"}, nil) }) diff --git a/command/v7/org_users_command.go b/command/v7/org_users_command.go index 16434e85611..f7af79783b4 100644 --- a/command/v7/org_users_command.go +++ b/command/v7/org_users_command.go @@ -22,7 +22,7 @@ func (cmd *OrgUsersCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/org_users_command_test.go b/command/v7/org_users_command_test.go index 848529da91b..cdba41439e2 100644 --- a/command/v7/org_users_command_test.go +++ b/command/v7/org_users_command_test.go @@ -75,7 +75,7 @@ var _ = Describe("org-users Command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("get-current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("get-current-user-error")) }) It("returns the error", func() { @@ -85,7 +85,7 @@ var _ = Describe("org-users Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/orgs_command.go b/command/v7/orgs_command.go index 5a5ed52fc97..92c2cd179b4 100644 --- a/command/v7/orgs_command.go +++ b/command/v7/orgs_command.go @@ -19,7 +19,7 @@ func (cmd OrgsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/orgs_command_test.go b/command/v7/orgs_command_test.go index c2da3108c85..161ee27f9c7 100644 --- a/command/v7/orgs_command_test.go +++ b/command/v7/orgs_command_test.go @@ -68,7 +68,7 @@ var _ = Describe("orgs Command", func() { When("the user is logged in and an org is targeted", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("get-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("get-user-error")) }) It("returns the error", func() { @@ -78,7 +78,7 @@ var _ = Describe("orgs Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/packages_command.go b/command/v7/packages_command.go index 0d35de66dbf..2aa01385d7f 100644 --- a/command/v7/packages_command.go +++ b/command/v7/packages_command.go @@ -22,7 +22,7 @@ func (cmd PackagesCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/packages_command_test.go b/command/v7/packages_command_test.go index f1d77c97147..87ae1f29039 100644 --- a/command/v7/packages_command_test.go +++ b/command/v7/packages_command_test.go @@ -59,7 +59,7 @@ var _ = Describe("packages Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -86,7 +86,7 @@ var _ = Describe("packages Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/passwd_command.go b/command/v7/passwd_command.go index fcdf18d79e2..f68baa1cb12 100644 --- a/command/v7/passwd_command.go +++ b/command/v7/passwd_command.go @@ -16,7 +16,7 @@ func (cmd PasswdCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/passwd_command_test.go b/command/v7/passwd_command_test.go index 64066a02f28..8a3bf5d3972 100644 --- a/command/v7/passwd_command_test.go +++ b/command/v7/passwd_command_test.go @@ -42,7 +42,7 @@ var _ = Describe("passwd Command", func() { }, } - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve", GUID: "steve-guid"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve", GUID: "steve-guid"}, nil) fakeUI.DisplayPasswordPromptReturnsOnCall(0, "old1", nil) fakeUI.DisplayPasswordPromptReturnsOnCall(1, "new1", nil) @@ -98,7 +98,7 @@ var _ = Describe("passwd Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/purge_service_instance_command.go b/command/v7/purge_service_instance_command.go index 653b39d01fc..fc646e47cf8 100644 --- a/command/v7/purge_service_instance_command.go +++ b/command/v7/purge_service_instance_command.go @@ -67,7 +67,7 @@ func (cmd PurgeServiceInstanceCommand) Usage() string { } func (cmd PurgeServiceInstanceCommand) displayEvent() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/purge_service_instance_command_test.go b/command/v7/purge_service_instance_command_test.go index f93aea04e88..d5f3e7e32f3 100644 --- a/command/v7/purge_service_instance_command_test.go +++ b/command/v7/purge_service_instance_command_test.go @@ -110,7 +110,7 @@ var _ = Describe("purge-service-instance command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: orgName}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: spaceName, GUID: spaceGUID}) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) cmd = PurgeServiceInstanceCommand{ BaseCommand: BaseCommand{ @@ -201,7 +201,7 @@ var _ = Describe("purge-service-instance command", func() { When("getting the username fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("boom")) confirmYes() }) diff --git a/command/v7/push_command.go b/command/v7/push_command.go index 4d6b48019e6..c7becf02fef 100644 --- a/command/v7/push_command.go +++ b/command/v7/push_command.go @@ -146,7 +146,7 @@ func (cmd PushCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/push_command_test.go b/command/v7/push_command_test.go index eba133c0599..6d5d77fdcef 100644 --- a/command/v7/push_command_test.go +++ b/command/v7/push_command_test.go @@ -188,7 +188,7 @@ var _ = Describe("push Command", func() { When("the user is logged in, and org and space are targeted", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: userName}, nil) + fakeDiffActor.GetCurrentUserReturns(configv3.User{Name: userName}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{ Name: orgName, @@ -415,7 +415,6 @@ var _ = Describe("push Command", func() { Expect(executeErr).To(MatchError("apply-manifest-error")) Expect(testUI.Err).To(Say("apply-manifest-warnings")) }) - }) When("applying the manifest succeeds", func() { @@ -451,15 +450,14 @@ var _ = Describe("push Command", func() { Expect(executeErr).To(MatchError("create-push-plans-error")) Expect(testUI.Err).To(Say("create-push-plans-warnings")) }) - }) When("creating the push plans succeeds", func() { BeforeEach(func() { fakeActor.CreatePushPlansReturns( []v7pushaction.PushPlan{ - v7pushaction.PushPlan{Application: resources.Application{Name: "first-app", GUID: "potato"}}, - v7pushaction.PushPlan{Application: resources.Application{Name: "second-app", GUID: "potato"}}, + {Application: resources.Application{Name: "first-app", GUID: "potato"}}, + {Application: resources.Application{Name: "second-app", GUID: "potato"}}, }, v7action.Warnings{"create-push-plans-warnings"}, nil, @@ -593,7 +591,6 @@ var _ = Describe("push Command", func() { passedAppName, spaceGUID, _ = fakeVersionActor.GetStreamingLogsForApplicationByNameAndSpaceArgsForCall(1) Expect(passedAppName).To(Equal(appName2)) Expect(spaceGUID).To(Equal("some-space-guid")) - }) }) @@ -665,7 +662,6 @@ var _ = Describe("push Command", func() { Expect(testUI.Err).To(Say("get-application-summary-warnings")) }) }) - }) When("actualize returns an error", func() { diff --git a/command/v7/remove_network_policy_command.go b/command/v7/remove_network_policy_command.go index b7d2dee1ea6..c959bd40678 100644 --- a/command/v7/remove_network_policy_command.go +++ b/command/v7/remove_network_policy_command.go @@ -81,7 +81,7 @@ func (cmd RemoveNetworkPolicyCommand) Execute(args []string) error { destSpaceGUID = destSpace.GUID } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/remove_network_policy_command_test.go b/command/v7/remove_network_policy_command_test.go index 796a00fdff9..66247bc31ff 100644 --- a/command/v7/remove_network_policy_command_test.go +++ b/command/v7/remove_network_policy_command_test.go @@ -84,7 +84,7 @@ var _ = Describe("remove-network-policy Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) }) diff --git a/command/v7/rename_command.go b/command/v7/rename_command.go index 2680ca77283..a2bb0b6efe0 100644 --- a/command/v7/rename_command.go +++ b/command/v7/rename_command.go @@ -17,7 +17,7 @@ func (cmd RenameCommand) Execute(args []string) error { if err != nil { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rename_command_test.go b/command/v7/rename_command_test.go index c5af690ee88..4700666540b 100644 --- a/command/v7/rename_command_test.go +++ b/command/v7/rename_command_test.go @@ -45,7 +45,7 @@ var _ = Describe("rename Command", func() { cmd.RequiredArgs.OldAppName = "old-app-name" cmd.RequiredArgs.NewAppName = "new-app-name" - fakeConfig.CurrentUserReturns(configv3.User{Name: "username"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "username"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "targeted-org"}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "targeted-space"}) fakeActor.RenameApplicationByNameAndSpaceGUIDReturns(resources.Application{Name: "new-app-name"}, v7action.Warnings{"rename-app-warning"}, nil) @@ -86,7 +86,7 @@ var _ = Describe("rename Command", func() { ) BeforeEach(func() { returnedError = errors.New("current user not found") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedError) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedError) }) It("returns the CurrentUser error", func() { Expect(executeErr).To(MatchError(returnedError)) diff --git a/command/v7/rename_org_command.go b/command/v7/rename_org_command.go index 94f18aec7fa..628095f80d5 100644 --- a/command/v7/rename_org_command.go +++ b/command/v7/rename_org_command.go @@ -18,7 +18,7 @@ func (cmd RenameOrgCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rename_org_command_test.go b/command/v7/rename_org_command_test.go index 45ad25e0cc8..5a61f65bb23 100644 --- a/command/v7/rename_org_command_test.go +++ b/command/v7/rename_org_command_test.go @@ -48,7 +48,7 @@ var _ = Describe("rename-org Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) JustBeforeEach(func() { @@ -61,7 +61,7 @@ var _ = Describe("rename-org Command", func() { BeforeEach(func() { returnedErr = errors.New("some error") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedErr) }) It("returns the error", func() { @@ -70,7 +70,7 @@ var _ = Describe("rename-org Command", func() { }) When("when the command succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "username"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "username"}, nil) fakeActor.RenameOrganizationReturns( resources.Organization{GUID: "old-org-guid", Name: "new-org-name"}, v7action.Warnings{"warning-1", "warning-2"}, diff --git a/command/v7/rename_service_broker_command.go b/command/v7/rename_service_broker_command.go index aa586cef1c7..4cd5ad001a8 100644 --- a/command/v7/rename_service_broker_command.go +++ b/command/v7/rename_service_broker_command.go @@ -24,7 +24,7 @@ func (cmd *RenameServiceBrokerCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rename_service_broker_command_test.go b/command/v7/rename_service_broker_command_test.go index 3eb552a8ff9..c5cc9947952 100644 --- a/command/v7/rename_service_broker_command_test.go +++ b/command/v7/rename_service_broker_command_test.go @@ -59,7 +59,7 @@ var _ = Describe("rename-service-broker command", func() { nil, ) - fakeConfig.CurrentUserReturns(configv3.User{Name: "user"}, nil) + fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{Name: "user"}, nil) }) When("rename succeeds", func() { @@ -126,7 +126,7 @@ var _ = Describe("rename-service-broker command", func() { When("it fails to get the current user", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("no user found")) + fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{}, errors.New("no user found")) }) It("returns the error and displays all warnings", func() { diff --git a/command/v7/rename_service_command.go b/command/v7/rename_service_command.go index d69e6d331c5..f298e75c307 100644 --- a/command/v7/rename_service_command.go +++ b/command/v7/rename_service_command.go @@ -49,7 +49,7 @@ func (cmd RenameServiceCommand) Usage() string { } func (cmd RenameServiceCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rename_service_command_test.go b/command/v7/rename_service_command_test.go index 0bd659484c0..1a7aeeca305 100644 --- a/command/v7/rename_service_command_test.go +++ b/command/v7/rename_service_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("rename-service command test", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: spaceGUID, Name: spaceName}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: orgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) fakeActor.RenameServiceInstanceReturns(v7action.Warnings{"rename instance warning"}, nil) }) @@ -107,7 +107,7 @@ var _ = Describe("rename-service command test", func() { When("getting the user returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bang")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bang")) }) It("returns the error", func() { diff --git a/command/v7/rename_space_command.go b/command/v7/rename_space_command.go index af1e0ee28db..cf63ebf7d14 100644 --- a/command/v7/rename_space_command.go +++ b/command/v7/rename_space_command.go @@ -18,7 +18,7 @@ func (cmd RenameSpaceCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rename_space_command_test.go b/command/v7/rename_space_command_test.go index d425f0146d1..fbb020fdb8e 100644 --- a/command/v7/rename_space_command_test.go +++ b/command/v7/rename_space_command_test.go @@ -49,7 +49,7 @@ var _ = Describe("rename-space Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) JustBeforeEach(func() { @@ -78,7 +78,7 @@ var _ = Describe("rename-space Command", func() { BeforeEach(func() { returnedErr = errors.New("some error") - fakeConfig.CurrentUserReturns(configv3.User{}, returnedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, returnedErr) }) It("returns the error", func() { @@ -88,7 +88,7 @@ var _ = Describe("rename-space Command", func() { When("when the command succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "username"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "username"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-targeted-org", GUID: "org-guid"}) fakeActor.RenameSpaceByNameAndOrganizationGUIDReturns( resources.Space{GUID: "old-space-guid", Name: "new-space-name"}, diff --git a/command/v7/reset_org_default_isolation_segment_command.go b/command/v7/reset_org_default_isolation_segment_command.go index bd10206ddf8..26763b4ff45 100644 --- a/command/v7/reset_org_default_isolation_segment_command.go +++ b/command/v7/reset_org_default_isolation_segment_command.go @@ -18,7 +18,7 @@ func (cmd ResetOrgDefaultIsolationSegmentCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/reset_org_default_isolation_segment_command_test.go b/command/v7/reset_org_default_isolation_segment_command_test.go index 96b11c9c7e0..aa76bf487f8 100644 --- a/command/v7/reset_org_default_isolation_segment_command_test.go +++ b/command/v7/reset_org_default_isolation_segment_command_test.go @@ -82,19 +82,19 @@ var _ = Describe("reset-org-default-isolation-segment Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { Expect(executeErr).To(Equal(expectedErr)) - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) }) When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("the org lookup is unsuccessful", func() { diff --git a/command/v7/reset_space_isolation_segment_command.go b/command/v7/reset_space_isolation_segment_command.go index 7ad5c4dd8a8..4d878135064 100644 --- a/command/v7/reset_space_isolation_segment_command.go +++ b/command/v7/reset_space_isolation_segment_command.go @@ -18,7 +18,7 @@ func (cmd ResetSpaceIsolationSegmentCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/reset_space_isolation_segment_command_test.go b/command/v7/reset_space_isolation_segment_command_test.go index 732863260ba..0a8638d2422 100644 --- a/command/v7/reset_space_isolation_segment_command_test.go +++ b/command/v7/reset_space_isolation_segment_command_test.go @@ -71,7 +71,7 @@ var _ = Describe("reset-space-isolation-segment Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{ Name: org, GUID: "some-org-guid", diff --git a/command/v7/restage_command.go b/command/v7/restage_command.go index 1b43bafd3e3..628bd852130 100644 --- a/command/v7/restage_command.go +++ b/command/v7/restage_command.go @@ -41,7 +41,7 @@ func (cmd RestageCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/restage_command_test.go b/command/v7/restage_command_test.go index 714dc4be175..7de6e0488b1 100644 --- a/command/v7/restage_command_test.go +++ b/command/v7/restage_command_test.go @@ -61,7 +61,7 @@ var _ = Describe("restage Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeSharedActor.CheckTargetReturns(nil) fakeActor.GetApplicationByNameAndSpaceReturns( app, @@ -97,7 +97,7 @@ var _ = Describe("restage Command", func() { When("the user is not logged in", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/restart_app_instance_command.go b/command/v7/restart_app_instance_command.go index d2598da20b1..756f3941022 100644 --- a/command/v7/restart_app_instance_command.go +++ b/command/v7/restart_app_instance_command.go @@ -19,7 +19,7 @@ func (cmd RestartAppInstanceCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/restart_app_instance_command_test.go b/command/v7/restart_app_instance_command_test.go index feb88a99787..4108024c61a 100644 --- a/command/v7/restart_app_instance_command_test.go +++ b/command/v7/restart_app_instance_command_test.go @@ -81,7 +81,7 @@ var _ = Describe("restart-app-instance Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -98,7 +98,7 @@ var _ = Describe("restart-app-instance Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) When("restarting the specified instance returns an error", func() { diff --git a/command/v7/restart_command.go b/command/v7/restart_command.go index 4e4b6e5e216..66652cc0cf8 100644 --- a/command/v7/restart_command.go +++ b/command/v7/restart_command.go @@ -38,7 +38,7 @@ func (cmd RestartCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/restart_command_test.go b/command/v7/restart_command_test.go index 41eb6d74dcf..fbe3f8b6d5c 100644 --- a/command/v7/restart_command_test.go +++ b/command/v7/restart_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("restart Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(app, v7action.Warnings{"get-app-warning"}, nil) cmd = v7.RestartCommand{ @@ -97,7 +97,7 @@ var _ = Describe("restart Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/revisions_command.go b/command/v7/revisions_command.go index c20d4b72f23..c6c484fff5b 100644 --- a/command/v7/revisions_command.go +++ b/command/v7/revisions_command.go @@ -34,7 +34,7 @@ func (cmd RevisionsCommand) Execute(_ []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/revisions_command_test.go b/command/v7/revisions_command_test.go index 63c07c0cd07..8323069fa27 100644 --- a/command/v7/revisions_command_test.go +++ b/command/v7/revisions_command_test.go @@ -86,7 +86,7 @@ var _ = Describe("revisions Command", func() { When("getting the current user returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns the error", func() { @@ -96,7 +96,7 @@ var _ = Describe("revisions Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("when revisions are available", func() { diff --git a/command/v7/rollback_command.go b/command/v7/rollback_command.go index ea832ce8216..8c3e0f005ca 100644 --- a/command/v7/rollback_command.go +++ b/command/v7/rollback_command.go @@ -44,7 +44,7 @@ func (cmd RollbackCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/rollback_command_test.go b/command/v7/rollback_command_test.go index 70255407600..ac2a0aa7ce5 100644 --- a/command/v7/rollback_command_test.go +++ b/command/v7/rollback_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("rollback Command", func() { ) fakeConfig.BinaryNameReturns(binaryName) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{ Name: "some-org", GUID: "some-org-guid", @@ -107,7 +107,7 @@ var _ = Describe("rollback Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("returns an error", func() { diff --git a/command/v7/route_command.go b/command/v7/route_command.go index 86dbc69ba6b..1ed64478ee6 100644 --- a/command/v7/route_command.go +++ b/command/v7/route_command.go @@ -40,7 +40,7 @@ func (cmd RouteCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/route_command_test.go b/command/v7/route_command_test.go index d209c055bac..2249d13ee7a 100644 --- a/command/v7/route_command_test.go +++ b/command/v7/route_command_test.go @@ -51,7 +51,7 @@ var _ = Describe("route Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeActor.GetDomainByNameReturns( resources.Domain{Name: domainName, GUID: "domain-guid"}, @@ -94,12 +94,12 @@ var _ = Describe("route Command", func() { }) It("checks if the user is logged in", func() { - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) When("the user is not logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("no current user")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("no current user")) }) It("returns an error", func() { diff --git a/command/v7/router_groups_command.go b/command/v7/router_groups_command.go index dabc5413dc4..924d8b44e08 100644 --- a/command/v7/router_groups_command.go +++ b/command/v7/router_groups_command.go @@ -18,7 +18,7 @@ func (cmd RouterGroupsCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/router_groups_command_test.go b/command/v7/router_groups_command_test.go index 78ce446f71c..32c64b543b2 100644 --- a/command/v7/router_groups_command_test.go +++ b/command/v7/router_groups_command_test.go @@ -71,7 +71,7 @@ var _ = Describe("router-groups Command", func() { Context("when the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("getting router groups succeeds", func() { diff --git a/command/v7/routes_command.go b/command/v7/routes_command.go index 4bbb3ac0120..437704cdc8f 100644 --- a/command/v7/routes_command.go +++ b/command/v7/routes_command.go @@ -30,7 +30,7 @@ func (cmd RoutesCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/routes_command_test.go b/command/v7/routes_command_test.go index ad012886b60..bc43f357733 100644 --- a/command/v7/routes_command_test.go +++ b/command/v7/routes_command_test.go @@ -88,7 +88,7 @@ var _ = Describe("routes Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{ GUID: "some-org-guid", Name: "some-org", diff --git a/command/v7/run_task_command.go b/command/v7/run_task_command.go index 47719b0d31b..c01bbe2e243 100644 --- a/command/v7/run_task_command.go +++ b/command/v7/run_task_command.go @@ -28,7 +28,7 @@ func (cmd RunTaskCommand) Execute(args []string) error { space := cmd.Config.TargetedSpace() - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/run_task_command_test.go b/command/v7/run_task_command_test.go index 90b8c0caed5..34233afe90b 100644 --- a/command/v7/run_task_command_test.go +++ b/command/v7/run_task_command_test.go @@ -90,7 +90,7 @@ var _ = Describe("run-task Command", func() { BeforeEach(func() { expectedErr = errors.New("got bananapants??") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) @@ -102,7 +102,7 @@ var _ = Describe("run-task Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/running_environment_variable_group_command.go b/command/v7/running_environment_variable_group_command.go index 9b782ce7cf9..9f36b48809e 100644 --- a/command/v7/running_environment_variable_group_command.go +++ b/command/v7/running_environment_variable_group_command.go @@ -18,7 +18,7 @@ func (cmd RunningEnvironmentVariableGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/running_environment_variable_group_command_test.go b/command/v7/running_environment_variable_group_command_test.go index 8c652e57eda..7e259a60f5c 100644 --- a/command/v7/running_environment_variable_group_command_test.go +++ b/command/v7/running_environment_variable_group_command_test.go @@ -69,7 +69,7 @@ var _ = Describe("running-environment-variable-group Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/running_security_groups_command.go b/command/v7/running_security_groups_command.go index b3f84c84494..07969d0e485 100644 --- a/command/v7/running_security_groups_command.go +++ b/command/v7/running_security_groups_command.go @@ -17,7 +17,7 @@ func (cmd RunningSecurityGroupsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/running_security_groups_command_test.go b/command/v7/running_security_groups_command_test.go index fcff0981938..dda4ab5ba08 100644 --- a/command/v7/running_security_groups_command_test.go +++ b/command/v7/running_security_groups_command_test.go @@ -63,7 +63,7 @@ var _ = Describe("Running Security Groups Command", func() { When("there are no globally enabled running security groups found", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -88,7 +88,7 @@ var _ = Describe("Running Security Groups Command", func() { When("there are globally enabled running security groups", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) When("the security group does not have associated rules or spaces", func() { diff --git a/command/v7/scale_command.go b/command/v7/scale_command.go index 12e0bd9e789..fd0ed4f5469 100644 --- a/command/v7/scale_command.go +++ b/command/v7/scale_command.go @@ -29,7 +29,7 @@ func (cmd ScaleCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/scale_command_test.go b/command/v7/scale_command_test.go index 89abd07a942..0286c41ebfe 100644 --- a/command/v7/scale_command_test.go +++ b/command/v7/scale_command_test.go @@ -87,7 +87,7 @@ var _ = Describe("scale Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ GUID: "some-space-guid", Name: "some-space"}) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) @@ -97,7 +97,7 @@ var _ = Describe("scale Command", func() { BeforeEach(func() { expectedErr = errors.New("getting current user error") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) diff --git a/command/v7/security_group_command.go b/command/v7/security_group_command.go index 9d42e93b982..b264d4a0009 100644 --- a/command/v7/security_group_command.go +++ b/command/v7/security_group_command.go @@ -19,7 +19,7 @@ func (cmd SecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/security_group_command_test.go b/command/v7/security_group_command_test.go index a92b1842e43..faa3ddbabfd 100644 --- a/command/v7/security_group_command_test.go +++ b/command/v7/security_group_command_test.go @@ -65,7 +65,7 @@ var _ = Describe("Security Group Command", func() { When("getting the security group fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -89,7 +89,7 @@ var _ = Describe("Security Group Command", func() { When("getting the security group succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org", GUID: "some-org-guid"}) }) diff --git a/command/v7/security_groups_command.go b/command/v7/security_groups_command.go index 13c721da2cf..b5b1442b794 100644 --- a/command/v7/security_groups_command.go +++ b/command/v7/security_groups_command.go @@ -17,7 +17,7 @@ func (cmd SecurityGroupsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/security_groups_command_test.go b/command/v7/security_groups_command_test.go index 3674346b098..0d682e1f4c6 100644 --- a/command/v7/security_groups_command_test.go +++ b/command/v7/security_groups_command_test.go @@ -64,7 +64,7 @@ var _ = Describe("Security Groups Command", func() { When("getting the security groups fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -88,7 +88,7 @@ var _ = Describe("Security Groups Command", func() { When("getting the security groups succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org", GUID: "some-org-guid"}) }) diff --git a/command/v7/service_access_command.go b/command/v7/service_access_command.go index acf93097c33..f61fb64ac3f 100644 --- a/command/v7/service_access_command.go +++ b/command/v7/service_access_command.go @@ -93,7 +93,7 @@ func accessFromVisibilityType(visibilityType string) string { } func (cmd ServiceAccessCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/service_access_command_test.go b/command/v7/service_access_command_test.go index 574370392bd..0424f118218 100644 --- a/command/v7/service_access_command_test.go +++ b/command/v7/service_access_command_test.go @@ -44,7 +44,7 @@ var _ = Describe("service-access Command", func() { When("logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetReturns("some-url") }) @@ -178,14 +178,14 @@ var _ = Describe("service-access Command", func() { When("getting user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("fake get user error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("fake get user error")) }) It("returns an error", func() { executeErr := cmd.Execute(nil) Expect(executeErr).To(MatchError("fake get user error")) - Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1)) + Expect(fakeActor.GetCurrentUserCallCount()).To(Equal(1)) }) }) }) diff --git a/command/v7/service_brokers_command.go b/command/v7/service_brokers_command.go index bbf5ae14b41..4c36910b29b 100644 --- a/command/v7/service_brokers_command.go +++ b/command/v7/service_brokers_command.go @@ -18,7 +18,7 @@ func (cmd *ServiceBrokersCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/service_brokers_command_test.go b/command/v7/service_brokers_command_test.go index 2bf39910903..d4f35de0786 100644 --- a/command/v7/service_brokers_command_test.go +++ b/command/v7/service_brokers_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("service-brokers Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -92,7 +92,7 @@ var _ = Describe("service-brokers Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) It("displays a message with the username", func() { diff --git a/command/v7/service_command.go b/command/v7/service_command.go index b6ed561737f..c528d7ae59f 100644 --- a/command/v7/service_command.go +++ b/command/v7/service_command.go @@ -98,7 +98,7 @@ func (cmd ServiceCommand) fetchAndDisplayDetails() error { } func (cmd ServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/service_command_test.go b/command/v7/service_command_test.go index 516339e5a20..5a0985311e5 100644 --- a/command/v7/service_command_test.go +++ b/command/v7/service_command_test.go @@ -54,7 +54,7 @@ var _ = Describe("service command", func() { }, } - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) fakeConfig.TargetedSpaceReturns(configv3.Space{ GUID: spaceGUID, diff --git a/command/v7/service_key_command.go b/command/v7/service_key_command.go index c6fa6fdcd21..9bb96a4007e 100644 --- a/command/v7/service_key_command.go +++ b/command/v7/service_key_command.go @@ -49,7 +49,7 @@ func (cmd ServiceKeyCommand) guid() error { } func (cmd ServiceKeyCommand) details() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/service_key_command_test.go b/command/v7/service_key_command_test.go index 3c98dac13b7..14710e52f85 100644 --- a/command/v7/service_key_command_test.go +++ b/command/v7/service_key_command_test.go @@ -68,7 +68,7 @@ var _ = Describe("service-key Command", func() { const fakeUserName = "fake-user-name" BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.GetServiceKeyDetailsByServiceInstanceAndNameReturns( resources.ServiceCredentialBindingDetails{ @@ -102,7 +102,7 @@ var _ = Describe("service-key Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/service_keys_command.go b/command/v7/service_keys_command.go index fd95b32a46a..2d5c7f5affa 100644 --- a/command/v7/service_keys_command.go +++ b/command/v7/service_keys_command.go @@ -51,7 +51,7 @@ func (cmd ServiceKeysCommand) Examples() string { } func (cmd ServiceKeysCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/service_keys_command_test.go b/command/v7/service_keys_command_test.go index a633cd5b781..7cd2fff5b62 100644 --- a/command/v7/service_keys_command_test.go +++ b/command/v7/service_keys_command_test.go @@ -48,7 +48,7 @@ var _ = Describe("service-keys Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.GetServiceKeysByServiceInstanceReturns( []resources.ServiceCredentialBinding{ @@ -130,7 +130,7 @@ var _ = Describe("service-keys Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/services_command.go b/command/v7/services_command.go index c665037b4a0..a8c0df21f6b 100644 --- a/command/v7/services_command.go +++ b/command/v7/services_command.go @@ -41,7 +41,7 @@ func (cmd ServicesCommand) Usage() string { } func (cmd ServicesCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/services_command_test.go b/command/v7/services_command_test.go index 8c76875be00..24ddaabf1b2 100644 --- a/command/v7/services_command_test.go +++ b/command/v7/services_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("services command", func() { Name: org, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) fakeActor.GetServiceInstancesForSpaceReturns( []v7action.ServiceInstance{ @@ -191,7 +191,7 @@ var _ = Describe("services command", func() { When("getting the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bang")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bang")) }) It("fails", func() { diff --git a/command/v7/set_droplet_command.go b/command/v7/set_droplet_command.go index b9304be32b9..4528c1d6492 100644 --- a/command/v7/set_droplet_command.go +++ b/command/v7/set_droplet_command.go @@ -17,7 +17,7 @@ func (cmd SetDropletCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_droplet_command_test.go b/command/v7/set_droplet_command_test.go index a2b353b704c..3b1dcfb14e7 100644 --- a/command/v7/set_droplet_command_test.go +++ b/command/v7/set_droplet_command_test.go @@ -80,7 +80,7 @@ var _ = Describe("set-droplet Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -97,7 +97,7 @@ var _ = Describe("set-droplet Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.SetApplicationDropletByApplicationNameAndSpaceReturns(v7action.Warnings{"warning-1", "warning-2"}, nil) }) @@ -127,7 +127,7 @@ var _ = Describe("set-droplet Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) expectedErr = actionerror.ApplicationNotFoundError{Name: app} fakeActor.SetApplicationDropletByApplicationNameAndSpaceReturns(v7action.Warnings{"warning-1", "warning-2"}, expectedErr) }) diff --git a/command/v7/set_env_command.go b/command/v7/set_env_command.go index 0a3e739b30e..2dc01c88a44 100644 --- a/command/v7/set_env_command.go +++ b/command/v7/set_env_command.go @@ -19,7 +19,7 @@ func (cmd SetEnvCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_env_command_test.go b/command/v7/set_env_command_test.go index b3fec239d18..ef109a614b1 100644 --- a/command/v7/set_env_command_test.go +++ b/command/v7/set_env_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("set-env Command", func() { When("getting the current user returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns the error", func() { @@ -88,7 +88,7 @@ var _ = Describe("set-env Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("setting the environment succeeds", func() { diff --git a/command/v7/set_health_check_command.go b/command/v7/set_health_check_command.go index e66dc875b92..83059b3d2d8 100644 --- a/command/v7/set_health_check_command.go +++ b/command/v7/set_health_check_command.go @@ -20,7 +20,7 @@ func (cmd SetHealthCheckCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_health_check_command_test.go b/command/v7/set_health_check_command_test.go index 83b872d9bd1..18c7451828c 100644 --- a/command/v7/set_health_check_command_test.go +++ b/command/v7/set_health_check_command_test.go @@ -65,7 +65,7 @@ var _ = Describe("set-health-check Command", func() { GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -92,7 +92,7 @@ var _ = Describe("set-health-check Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/set_org_default_isolation_segment_command.go b/command/v7/set_org_default_isolation_segment_command.go index df6b1342736..a19f517fa00 100644 --- a/command/v7/set_org_default_isolation_segment_command.go +++ b/command/v7/set_org_default_isolation_segment_command.go @@ -18,7 +18,7 @@ func (cmd SetOrgDefaultIsolationSegmentCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_org_default_isolation_segment_command_test.go b/command/v7/set_org_default_isolation_segment_command_test.go index 4ba665bc06e..982064c0a58 100644 --- a/command/v7/set_org_default_isolation_segment_command_test.go +++ b/command/v7/set_org_default_isolation_segment_command_test.go @@ -50,7 +50,7 @@ var _ = Describe("set-org-default-isolation-segment Command", func() { org = "some-org" isolationSegment = "segment1" - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) cmd.RequiredArgs.OrganizationName = org cmd.RequiredArgs.IsolationSegmentName = isolationSegment @@ -84,7 +84,7 @@ var _ = Describe("set-org-default-isolation-segment Command", func() { When("fetching the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns an error", func() { diff --git a/command/v7/set_org_quota_command.go b/command/v7/set_org_quota_command.go index 4d8734b0b39..2baad4c8efe 100644 --- a/command/v7/set_org_quota_command.go +++ b/command/v7/set_org_quota_command.go @@ -18,7 +18,7 @@ func (cmd *SetOrgQuotaCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -26,7 +26,7 @@ func (cmd *SetOrgQuotaCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Setting quota {{.QuotaName}} to org {{.OrgName}} as {{.UserName}}...", map[string]interface{}{ "QuotaName": cmd.RequiredArgs.OrganizationQuota, "OrgName": cmd.RequiredArgs.Organization, - "UserName": currentUser, + "UserName": currentUser.Name, }) org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.RequiredArgs.Organization) diff --git a/command/v7/set_org_quota_command_test.go b/command/v7/set_org_quota_command_test.go index 053ce3da626..88ac05c07f5 100644 --- a/command/v7/set_org_quota_command_test.go +++ b/command/v7/set_org_quota_command_test.go @@ -7,6 +7,7 @@ import ( "code.cloudfoundry.org/cli/command/flag" "code.cloudfoundry.org/cli/command/v7/v7fakes" "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "code.cloudfoundry.org/cli/command/v7" @@ -53,7 +54,7 @@ var _ = Describe("set-org-quota Command", func() { fakeConfig.BinaryNameReturns(binaryName) currentUser = "current-user" - fakeConfig.CurrentUserNameReturns(currentUser, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUser}, nil) fakeActor.GetOrganizationByNameReturns( resources.Organization{GUID: "some-org-guid"}, @@ -122,7 +123,7 @@ var _ = Describe("set-org-quota Command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("", errors.New("current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("current-user-error")) }) It("returns the error", func() { diff --git a/command/v7/set_org_role_command.go b/command/v7/set_org_role_command.go index 9756681e14a..a57ea353999 100644 --- a/command/v7/set_org_role_command.go +++ b/command/v7/set_org_role_command.go @@ -29,7 +29,7 @@ func (cmd *SetOrgRoleCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_org_role_command_test.go b/command/v7/set_org_role_command_test.go index 8fecc41923c..6c4ad32269b 100644 --- a/command/v7/set_org_role_command_test.go +++ b/command/v7/set_org_role_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("set-org-role Command", func() { }) BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "current-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "current-user"}, nil) fakeActor.GetOrganizationByNameReturns( resources.Organization{GUID: "some-org-guid", Name: "some-org-name"}, diff --git a/command/v7/set_running_environment_variable_group_command.go b/command/v7/set_running_environment_variable_group_command.go index b2b93d806fe..c305199768d 100644 --- a/command/v7/set_running_environment_variable_group_command.go +++ b/command/v7/set_running_environment_variable_group_command.go @@ -24,7 +24,7 @@ func (cmd SetRunningEnvironmentVariableGroupCommand) Execute(args []string) erro return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_running_environment_variable_group_command_test.go b/command/v7/set_running_environment_variable_group_command_test.go index 81f649dafbd..a7e5b5d76ac 100644 --- a/command/v7/set_running_environment_variable_group_command_test.go +++ b/command/v7/set_running_environment_variable_group_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("set-running-environment-variable-group Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/set_space_isolation_segment_command.go b/command/v7/set_space_isolation_segment_command.go index fa42aa98eea..53588995591 100644 --- a/command/v7/set_space_isolation_segment_command.go +++ b/command/v7/set_space_isolation_segment_command.go @@ -18,7 +18,7 @@ func (cmd SetSpaceIsolationSegmentCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_space_isolation_segment_command_test.go b/command/v7/set_space_isolation_segment_command_test.go index e34e72b9444..c6554154b83 100644 --- a/command/v7/set_space_isolation_segment_command_test.go +++ b/command/v7/set_space_isolation_segment_command_test.go @@ -71,7 +71,7 @@ var _ = Describe("set-space-isolation-segment Command", func() { When("the user is logged in", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{ Name: org, GUID: "some-org-guid", diff --git a/command/v7/set_space_quota_command.go b/command/v7/set_space_quota_command.go index 90a36af8e77..ab97cfabcd7 100644 --- a/command/v7/set_space_quota_command.go +++ b/command/v7/set_space_quota_command.go @@ -18,7 +18,7 @@ func (cmd *SetSpaceQuotaCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -26,7 +26,7 @@ func (cmd *SetSpaceQuotaCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Setting space quota {{.QuotaName}} to space {{.SpaceName}} as {{.UserName}}...", map[string]interface{}{ "QuotaName": cmd.RequiredArgs.SpaceQuota, "SpaceName": cmd.RequiredArgs.Space, - "UserName": currentUser, + "UserName": currentUser.Name, }) org := cmd.Config.TargetedOrganization() diff --git a/command/v7/set_space_quota_command_test.go b/command/v7/set_space_quota_command_test.go index dd9c40c0ef2..e94e62f841e 100644 --- a/command/v7/set_space_quota_command_test.go +++ b/command/v7/set_space_quota_command_test.go @@ -73,7 +73,7 @@ var _ = Describe("set-space-quota Command", func() { fakeConfig.BinaryNameReturns(binaryName) currentUser = "current-user" - fakeConfig.CurrentUserNameReturns(currentUser, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUser}, nil) fakeConfig.TargetedOrganizationReturns(org) diff --git a/command/v7/set_space_role_command.go b/command/v7/set_space_role_command.go index f23d45b853b..77ba20ced8b 100644 --- a/command/v7/set_space_role_command.go +++ b/command/v7/set_space_role_command.go @@ -31,7 +31,7 @@ func (cmd *SetSpaceRoleCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_space_role_command_test.go b/command/v7/set_space_role_command_test.go index 6b9cd1249e8..ac29113070d 100644 --- a/command/v7/set_space_role_command_test.go +++ b/command/v7/set_space_role_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("set-space-role Command", func() { }) BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "current-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "current-user"}, nil) fakeActor.GetOrganizationByNameReturns( resources.Organization{ diff --git a/command/v7/set_staging_environment_variable_group_command.go b/command/v7/set_staging_environment_variable_group_command.go index 84a6bac78f8..20cd146d30f 100644 --- a/command/v7/set_staging_environment_variable_group_command.go +++ b/command/v7/set_staging_environment_variable_group_command.go @@ -24,7 +24,7 @@ func (cmd SetStagingEnvironmentVariableGroupCommand) Execute(args []string) erro return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/set_staging_environment_variable_group_command_test.go b/command/v7/set_staging_environment_variable_group_command_test.go index 28c4ba853b5..511a8df6616 100644 --- a/command/v7/set_staging_environment_variable_group_command_test.go +++ b/command/v7/set_staging_environment_variable_group_command_test.go @@ -72,7 +72,7 @@ var _ = Describe("set-staging-environment-variable-group Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/share_private_domain_command.go b/command/v7/share_private_domain_command.go index 66bb9c95b9f..2ba4f0a8612 100644 --- a/command/v7/share_private_domain_command.go +++ b/command/v7/share_private_domain_command.go @@ -18,7 +18,7 @@ func (cmd SharePrivateDomainCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/share_private_domain_command_test.go b/command/v7/share_private_domain_command_test.go index c1bb263b130..6d01497b177 100644 --- a/command/v7/share_private_domain_command_test.go +++ b/command/v7/share_private_domain_command_test.go @@ -75,7 +75,7 @@ var _ = Describe("share-private-domain command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("current-user-error")) }) It("returns an error", func() { @@ -90,7 +90,7 @@ var _ = Describe("share-private-domain command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) }) It("should print text indicating it is sharing a domain", func() { diff --git a/command/v7/share_service_command.go b/command/v7/share_service_command.go index ef9a1fd018a..fdf72c1ad50 100644 --- a/command/v7/share_service_command.go +++ b/command/v7/share_service_command.go @@ -48,7 +48,7 @@ func (cmd ShareServiceCommand) Execute(args []string) error { } func (cmd ShareServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/share_service_command_test.go b/command/v7/share_service_command_test.go index 27f43cc65b2..46fd5a8f349 100644 --- a/command/v7/share_service_command_test.go +++ b/command/v7/share_service_command_test.go @@ -85,7 +85,7 @@ var _ = Describe("share-service command", func() { fakeSharedActor.CheckTargetReturns(nil) fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: expectedTargetedSpaceGuid}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{GUID: expectedTargetedOrgGuid, Name: expectedTargetedOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: expectedUser}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: expectedUser}, nil) }) When("the share completes successfully", func() { @@ -167,7 +167,7 @@ var _ = Describe("share-service command", func() { When("getting the username fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("boom")) }) It("returns the error", func() { diff --git a/command/v7/shared/app_stager.go b/command/v7/shared/app_stager.go index 2f5e73ad4e0..a94f168a9ae 100644 --- a/command/v7/shared/app_stager.go +++ b/command/v7/shared/app_stager.go @@ -58,6 +58,7 @@ type Stager struct { type stagingAndStartActor interface { CreateDeploymentByApplicationAndDroplet(appGUID string, dropletGUID string) (string, v7action.Warnings, error) CreateDeploymentByApplicationAndRevision(appGUID string, revisionGUID string) (string, v7action.Warnings, error) + GetCurrentUser() (configv3.User, error) GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error) GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) PollStart(app resources.Application, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) @@ -172,7 +173,7 @@ func (stager *Stager) StartApp( return err } } else { - user, err := stager.Config.CurrentUser() + user, err := stager.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/shared/app_stager_test.go b/command/v7/shared/app_stager_test.go index 079c4736616..0650715bbea 100644 --- a/command/v7/shared/app_stager_test.go +++ b/command/v7/shared/app_stager_test.go @@ -121,7 +121,7 @@ var _ = Describe("app stager", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(testUI.Out).To(Say("Staging app and tracing logs...")) - user, err := fakeConfig.CurrentUser() + user, err := fakeActor.GetCurrentUser() Expect(err).NotTo(HaveOccurred()) Expect(testUI.Out).To(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, app.Name, organization.Name, space.Name, user.Name)) Expect(testUI.Out).To(Say("Waiting for app to start...")) @@ -330,7 +330,7 @@ var _ = Describe("app stager", func() { organization = configv3.Organization{Name: "some-org"} resourceGUID = "droplet-guid" - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetDetailedAppSummaryReturns(v7action.DetailedApplicationSummary{}, v7action.Warnings{"application-summary-warning-1", "application-summary-warning-2"}, nil) }) @@ -456,7 +456,7 @@ var _ = Describe("app stager", func() { It("displays output for each step of starting", func() { Expect(executeErr).To(BeNil()) - user, err := fakeConfig.CurrentUser() + user, err := fakeActor.GetCurrentUser() Expect(err).NotTo(HaveOccurred()) Expect(testUI.Out).To(Say(`Starting app %s in org %s / space %s as %s\.\.\.`, app.Name, organization.Name, space.Name, user.Name)) @@ -490,7 +490,7 @@ var _ = Describe("app stager", func() { It("displays output for each step of restarting", func() { Expect(executeErr).To(BeNil()) - user, err := fakeConfig.CurrentUser() + user, err := fakeActor.GetCurrentUser() Expect(err).NotTo(HaveOccurred()) Expect(testUI.Out).To(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, app.Name, organization.Name, space.Name, user.Name)) diff --git a/command/v7/shared/new_clients.go b/command/v7/shared/new_clients.go index c919b29094a..4486bd8ffab 100644 --- a/command/v7/shared/new_clients.go +++ b/command/v7/shared/new_clients.go @@ -1,6 +1,7 @@ package shared import ( + "code.cloudfoundry.org/cli/actor/v7action" "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" ccWrapper "code.cloudfoundry.org/cli/api/cloudcontroller/wrapper" "code.cloudfoundry.org/cli/api/router" @@ -14,24 +15,27 @@ import ( func GetNewClientsAndConnectToCF(config command.Config, ui command.UI, minVersionV3 string) (*ccv3.Client, *uaa.Client, *router.Client, error) { var err error - ccClient, authWrapper := NewWrappedCloudControllerClient(config, ui) - - ccClient, err = connectToCF(config, ui, ccClient, minVersionV3) + uaaClient, err := newWrappedUAAClient(config, ui) if err != nil { return nil, nil, nil, err } - uaaClient, err := newWrappedUAAClient(config, ui, ccClient, authWrapper) + routingClient, err := newWrappedRoutingClient(config, ui, uaaClient) if err != nil { return nil, nil, nil, err } - routingClient, err := newWrappedRoutingClient(config, ui, uaaClient) + ccClient := NewAuthWrappedCloudControllerClient(config, ui, uaaClient) + + ccClient, err = connectToCF(config, ui, ccClient, minVersionV3) + if err != nil { + return nil, nil, nil, err + } return ccClient, uaaClient, routingClient, err } -func NewWrappedCloudControllerClient(config command.Config, ui command.UI) (*ccv3.Client, *ccWrapper.UAAAuthentication) { +func NewWrappedCloudControllerClient(config command.Config, ui command.UI, extraWrappers ...ccv3.ConnectionWrapper) *ccv3.Client { ccWrappers := []ccv3.ConnectionWrapper{} verbose, location := config.Verbose() @@ -42,22 +46,32 @@ func NewWrappedCloudControllerClient(config command.Config, ui command.UI) (*ccv ccWrappers = append(ccWrappers, ccWrapper.NewRequestLogger(ui.RequestLoggerFileWriter(location))) } - authWrapper := ccWrapper.NewUAAAuthentication(nil, config) - - ccWrappers = append(ccWrappers, authWrapper) + ccWrappers = append(ccWrappers, extraWrappers...) ccWrappers = append(ccWrappers, ccWrapper.NewRetryRequest(config.RequestRetryCount())) - ccClient := ccv3.NewClient(ccv3.Config{ + return ccv3.NewClient(ccv3.Config{ AppName: config.BinaryName(), AppVersion: config.BinaryVersion(), JobPollingTimeout: config.OverallPollingTimeout(), JobPollingInterval: config.PollingInterval(), Wrappers: ccWrappers, }) - return ccClient, authWrapper } -func newWrappedUAAClient(config command.Config, ui command.UI, ccClient *ccv3.Client, authWrapper *ccWrapper.UAAAuthentication) (*uaa.Client, error) { +func NewAuthWrappedCloudControllerClient(config command.Config, ui command.UI, uaaClient *uaa.Client) *ccv3.Client { + var authWrapper ccv3.ConnectionWrapper + authWrapper = ccWrapper.NewUAAAuthentication(uaaClient, config) + if config.IsCFOnK8s() { + authWrapper = ccWrapper.NewKubernetesAuthentication( + config, + v7action.NewDefaultKubernetesConfigGetter(), + ) + } + + return NewWrappedCloudControllerClient(config, ui, authWrapper) +} + +func newWrappedUAAClient(config command.Config, ui command.UI) (*uaa.Client, error) { var err error verbose, location := config.Verbose() @@ -78,9 +92,6 @@ func newWrappedUAAClient(config command.Config, ui command.UI, ccClient *ccv3.Cl return nil, err } - uaaAuthWrapper.SetClient(uaaClient) - authWrapper.SetClient(uaaClient) - return uaaClient, nil } diff --git a/command/v7/shared/new_clients_test.go b/command/v7/shared/new_clients_test.go index 71d16c1b289..04bb1ec4b87 100644 --- a/command/v7/shared/new_clients_test.go +++ b/command/v7/shared/new_clients_test.go @@ -58,9 +58,8 @@ var _ = Describe("New Clients", func() { }) When("not targetting", func() { - It("does not target and returns no UAA client", func() { - ccClient, authWrapper := NewWrappedCloudControllerClient(fakeConfig, testUI) - Expect(authWrapper).ToNot(BeNil()) + It("does not target", func() { + ccClient := NewWrappedCloudControllerClient(fakeConfig, testUI) Expect(ccClient).ToNot(BeNil()) Expect(fakeConfig.SkipSSLValidationCallCount()).To(Equal(0)) }) diff --git a/command/v7/shared/package_displayer.go b/command/v7/shared/package_displayer.go index 73ed36df804..615c851102f 100644 --- a/command/v7/shared/package_displayer.go +++ b/command/v7/shared/package_displayer.go @@ -16,7 +16,7 @@ func NewPackageDisplayer(ui command.UI, config command.Config) PackageDisplayer } } -func (display PackageDisplayer) DisplaySetupMessage(appName string, isDockerImage bool) error { +func (display PackageDisplayer) DisplaySetupMessage(appName, currentUser string, isDockerImage bool) error { var flavorTextTemplate string if isDockerImage { flavorTextTemplate = "Creating docker package for app {{.AppName}} in org {{.CurrentOrg}} / space {{.CurrentSpace}} as {{.CurrentUser}}..." @@ -24,15 +24,11 @@ func (display PackageDisplayer) DisplaySetupMessage(appName string, isDockerImag flavorTextTemplate = "Creating and uploading bits package for app {{.AppName}} in org {{.CurrentOrg}} / space {{.CurrentSpace}} as {{.CurrentUser}}..." } - currentUser, err := display.config.CurrentUser() - if err != nil { - return err - } display.ui.DisplayTextWithFlavor(flavorTextTemplate, map[string]interface{}{ "AppName": appName, "CurrentSpace": display.config.TargetedSpace().Name, "CurrentOrg": display.config.TargetedOrganization().Name, - "CurrentUser": currentUser.Name, + "CurrentUser": currentUser, }) return nil diff --git a/command/v7/space_command.go b/command/v7/space_command.go index 3fbc2b42c9a..cf5d52ea7d3 100644 --- a/command/v7/space_command.go +++ b/command/v7/space_command.go @@ -33,7 +33,7 @@ func (cmd SpaceCommand) Execute(args []string) error { return cmd.displaySpaceGUID(spaceName, targetedOrg.GUID) } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/space_command_test.go b/command/v7/space_command_test.go index 613e9888dfd..5f2a9cbd0fc 100644 --- a/command/v7/space_command_test.go +++ b/command/v7/space_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("space command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { @@ -82,7 +82,7 @@ var _ = Describe("space command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/space_quota_command.go b/command/v7/space_quota_command.go index 81b3d6188f7..8cbdcc2d45d 100644 --- a/command/v7/space_quota_command.go +++ b/command/v7/space_quota_command.go @@ -20,7 +20,7 @@ func (cmd SpaceQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/space_quota_command_test.go b/command/v7/space_quota_command_test.go index 5bb7233b4a6..ce15a9c9fc4 100644 --- a/command/v7/space_quota_command_test.go +++ b/command/v7/space_quota_command_test.go @@ -66,7 +66,7 @@ var _ = Describe("Space Quota Command", func() { When("getting the space quota fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -90,7 +90,7 @@ var _ = Describe("Space Quota Command", func() { When("getting the space quota succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org", GUID: "some-org-guid"}) falseValue := false diff --git a/command/v7/space_quotas_command.go b/command/v7/space_quotas_command.go index addfd2b44ec..481cd6c61f5 100644 --- a/command/v7/space_quotas_command.go +++ b/command/v7/space_quotas_command.go @@ -18,7 +18,7 @@ func (cmd SpaceQuotasCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/space_quotas_command_test.go b/command/v7/space_quotas_command_test.go index 8782f364d7e..c0626293045 100644 --- a/command/v7/space_quotas_command_test.go +++ b/command/v7/space_quotas_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("space-quotas command", func() { When("running the command successfully", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) spaceQuotas := []resources.SpaceQuota{ { Quota: resources.Quota{ @@ -167,7 +167,7 @@ var _ = Describe("space-quotas command", func() { When("the quota list is empty", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) fakeActor.GetSpaceQuotasByOrgGUIDReturns([]resources.SpaceQuota{}, v7action.Warnings{"some-warning-1", "some-warning-2"}, nil) }) diff --git a/command/v7/space_users_command.go b/command/v7/space_users_command.go index 9ab01a0c8cc..d17029ec03c 100644 --- a/command/v7/space_users_command.go +++ b/command/v7/space_users_command.go @@ -21,7 +21,7 @@ func (cmd *SpaceUsersCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/space_users_command_test.go b/command/v7/space_users_command_test.go index 1d637378865..58b96fbca69 100644 --- a/command/v7/space_users_command_test.go +++ b/command/v7/space_users_command_test.go @@ -75,7 +75,7 @@ var _ = Describe("space-users Command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("get-current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("get-current-user-error")) }) It("returns the error", func() { @@ -85,7 +85,7 @@ var _ = Describe("space-users Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/spaces_command.go b/command/v7/spaces_command.go index b3db2a42e2c..430c264dba6 100644 --- a/command/v7/spaces_command.go +++ b/command/v7/spaces_command.go @@ -19,7 +19,7 @@ func (cmd SpacesCommand) Execute([]string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/spaces_command_test.go b/command/v7/spaces_command_test.go index af8acecb4ec..bd2a53bc1ab 100644 --- a/command/v7/spaces_command_test.go +++ b/command/v7/spaces_command_test.go @@ -75,7 +75,7 @@ var _ = Describe("spaces Command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("get-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("get-user-error")) }) It("returns the error", func() { @@ -85,7 +85,7 @@ var _ = Describe("spaces Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/ssh_enabled_command_test.go b/command/v7/ssh_enabled_command_test.go index ce168503255..abcd806db66 100644 --- a/command/v7/ssh_enabled_command_test.go +++ b/command/v7/ssh_enabled_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/command/commandfakes" . "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/v7fakes" + "code.cloudfoundry.org/cli/util/configv3" "code.cloudfoundry.org/cli/util/ui" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -49,7 +50,7 @@ var _ = Describe("ssh-enabled Command", func() { binaryName = "faceman" fakeConfig.BinaryNameReturns(binaryName) currentUserName = "some-user" - fakeConfig.CurrentUserNameReturns(currentUserName, nil) + fakeSSHEnabledActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/stack_command.go b/command/v7/stack_command.go index bb10ffd456b..a7ca6add762 100644 --- a/command/v7/stack_command.go +++ b/command/v7/stack_command.go @@ -44,7 +44,7 @@ func (cmd *StackCommand) displayStackGUID() error { } func (cmd *StackCommand) displayStackInfo() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/stack_command_test.go b/command/v7/stack_command_test.go index df528bf1dc9..c7127c3b589 100644 --- a/command/v7/stack_command_test.go +++ b/command/v7/stack_command_test.go @@ -77,7 +77,7 @@ var _ = Describe("Stack Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -90,7 +90,7 @@ var _ = Describe("Stack Command", func() { BeforeEach(func() { fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "some-space", GUID: "some-space-guid"}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "some-org"}) - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) Context("When the stack exists", func() { diff --git a/command/v7/stacks_command.go b/command/v7/stacks_command.go index ea91ef5c3a9..0e4b7926331 100644 --- a/command/v7/stacks_command.go +++ b/command/v7/stacks_command.go @@ -22,7 +22,7 @@ func (cmd StacksCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/stacks_command_test.go b/command/v7/stacks_command_test.go index 75533edbdbc..dff97b6ee03 100644 --- a/command/v7/stacks_command_test.go +++ b/command/v7/stacks_command_test.go @@ -74,7 +74,7 @@ var _ = Describe("stacks Command", func() { Context("When the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("StacksActor returns an error", func() { diff --git a/command/v7/stage_package_command.go b/command/v7/stage_package_command.go index 37712be8222..729f497461b 100644 --- a/command/v7/stage_package_command.go +++ b/command/v7/stage_package_command.go @@ -41,7 +41,7 @@ func (cmd StagePackageCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/stage_package_command_test.go b/command/v7/stage_package_command_test.go index f546d325cf5..a1906806f47 100644 --- a/command/v7/stage_package_command_test.go +++ b/command/v7/stage_package_command_test.go @@ -81,7 +81,7 @@ var _ = Describe("stage-package Command", func() { GUID: spaceGUID, Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) allLogsWritten = make(chan bool) fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) { diff --git a/command/v7/staging_environment_variable_group_command.go b/command/v7/staging_environment_variable_group_command.go index bcfea5b9d9a..3746e7a458d 100644 --- a/command/v7/staging_environment_variable_group_command.go +++ b/command/v7/staging_environment_variable_group_command.go @@ -19,7 +19,7 @@ func (cmd StagingEnvironmentVariableGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/staging_environment_variable_group_command_test.go b/command/v7/staging_environment_variable_group_command_test.go index 1aa710988c6..9ecf27e568a 100644 --- a/command/v7/staging_environment_variable_group_command_test.go +++ b/command/v7/staging_environment_variable_group_command_test.go @@ -69,7 +69,7 @@ var _ = Describe("staging-environment-variable-group Command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "apple"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "apple"}, nil) }) It("should print text indicating its running", func() { diff --git a/command/v7/staging_security_groups_command.go b/command/v7/staging_security_groups_command.go index f9cb0137f15..8b4203eb577 100644 --- a/command/v7/staging_security_groups_command.go +++ b/command/v7/staging_security_groups_command.go @@ -17,7 +17,7 @@ func (cmd StagingSecurityGroupsCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/staging_security_groups_command_test.go b/command/v7/staging_security_groups_command_test.go index 9efc4847b12..c0fe38d6f07 100644 --- a/command/v7/staging_security_groups_command_test.go +++ b/command/v7/staging_security_groups_command_test.go @@ -63,7 +63,7 @@ var _ = Describe("Staging Security Groups Command", func() { When("there are no globally enabled staging security groups found", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{ Name: "some-user", }, @@ -88,7 +88,7 @@ var _ = Describe("Staging Security Groups Command", func() { When("there are globally enabled staging security groups", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "some-user"}, nil) }) When("the security group does not have associated rules or spaces", func() { diff --git a/command/v7/start_command.go b/command/v7/start_command.go index 79b3589b8ec..23271215110 100644 --- a/command/v7/start_command.go +++ b/command/v7/start_command.go @@ -39,7 +39,7 @@ func (cmd StartCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/start_command_test.go b/command/v7/start_command_test.go index 8e3f67cbf58..24ec6f7b185 100644 --- a/command/v7/start_command_test.go +++ b/command/v7/start_command_test.go @@ -54,7 +54,7 @@ var _ = Describe("start Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(app, v7action.Warnings{"get-app-warning"}, nil) cmd = v7.StartCommand{ @@ -94,7 +94,7 @@ var _ = Describe("start Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/stop_command.go b/command/v7/stop_command.go index c7ee62b5809..514f1ecba58 100644 --- a/command/v7/stop_command.go +++ b/command/v7/stop_command.go @@ -18,7 +18,7 @@ func (cmd StopCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/stop_command_test.go b/command/v7/stop_command_test.go index 189287a233d..18efa1d4de7 100644 --- a/command/v7/stop_command_test.go +++ b/command/v7/stop_command_test.go @@ -80,7 +80,7 @@ var _ = Describe("stop Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { @@ -97,7 +97,7 @@ var _ = Describe("stop Command", func() { Name: "some-space", GUID: "some-space-guid", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{GUID: "some-app-guid", State: constant.ApplicationStarted}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil) fakeActor.StopApplicationReturns(v7action.Warnings{"stop-warning-1", "stop-warning-2"}, nil) }) @@ -129,7 +129,7 @@ var _ = Describe("stop Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) expectedErr = actionerror.ApplicationNotFoundError{Name: app} fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{State: constant.ApplicationStarted}, v7action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr) }) @@ -153,7 +153,7 @@ var _ = Describe("stop Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{State: constant.ApplicationStarted}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil) expectedErr = actionerror.ApplicationNotFoundError{Name: app} fakeActor.StopApplicationReturns(v7action.Warnings{"stop-warning-1", "stop-warning-2"}, expectedErr) @@ -178,7 +178,7 @@ var _ = Describe("stop Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil) }) @@ -205,7 +205,7 @@ var _ = Describe("stop Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) expectedErr = errors.New("some-error") fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{State: constant.ApplicationStarted}, v7action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr) }) @@ -231,7 +231,7 @@ var _ = Describe("stop Command", func() { fakeConfig.TargetedSpaceReturns(configv3.Space{ Name: "some-space", }) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) fakeActor.GetApplicationByNameAndSpaceReturns(resources.Application{State: constant.ApplicationStarted}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil) expectedErr = errors.New("some-error") fakeActor.StopApplicationReturns(v7action.Warnings{"stop-warning-1", "stop-warning-2"}, expectedErr) diff --git a/command/v7/target_command.go b/command/v7/target_command.go index edc565e3cdc..05595ca294a 100644 --- a/command/v7/target_command.go +++ b/command/v7/target_command.go @@ -22,7 +22,7 @@ func (cmd *TargetCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { cmd.clearTargets() return err diff --git a/command/v7/target_command_test.go b/command/v7/target_command_test.go index 765a03350b5..3d245ad0899 100644 --- a/command/v7/target_command_test.go +++ b/command/v7/target_command_test.go @@ -88,7 +88,7 @@ var _ = Describe("target Command", func() { BeforeEach(func() { someErr = errors.New("some-current-user-error") - fakeConfig.CurrentUserReturns(configv3.User{}, someErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, someErr) }) It("returns the same error", func() { @@ -101,7 +101,7 @@ var _ = Describe("target Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/tasks_command.go b/command/v7/tasks_command.go index 2a8e49dd00f..9c3cf8fcdf6 100644 --- a/command/v7/tasks_command.go +++ b/command/v7/tasks_command.go @@ -25,7 +25,7 @@ func (cmd TasksCommand) Execute(args []string) error { space := cmd.Config.TargetedSpace() - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/tasks_command_test.go b/command/v7/tasks_command_test.go index 632dd3e04c2..aeccd989a18 100644 --- a/command/v7/tasks_command_test.go +++ b/command/v7/tasks_command_test.go @@ -88,7 +88,7 @@ var _ = Describe("tasks Command", func() { BeforeEach(func() { expectedErr = errors.New("get current user error") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) @@ -100,7 +100,7 @@ var _ = Describe("tasks Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/terminate_task_command.go b/command/v7/terminate_task_command.go index b1b2cd5bc11..0099980f16c 100644 --- a/command/v7/terminate_task_command.go +++ b/command/v7/terminate_task_command.go @@ -33,7 +33,7 @@ func (cmd TerminateTaskCommand) Execute(args []string) error { space := cmd.Config.TargetedSpace() - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/terminate_task_command_test.go b/command/v7/terminate_task_command_test.go index 626b5f9bb11..5528bf0fa66 100644 --- a/command/v7/terminate_task_command_test.go +++ b/command/v7/terminate_task_command_test.go @@ -102,7 +102,7 @@ var _ = Describe("terminate-task Command", func() { BeforeEach(func() { expectedErr = errors.New("get current user error") - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{}, expectedErr) }) @@ -114,7 +114,7 @@ var _ = Describe("terminate-task Command", func() { When("getting the current user does not return an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/unbind_route_service_command.go b/command/v7/unbind_route_service_command.go index 2e012ffa950..d973dc6c48b 100644 --- a/command/v7/unbind_route_service_command.go +++ b/command/v7/unbind_route_service_command.go @@ -95,7 +95,7 @@ func (cmd UnbindRouteServiceCommand) displayPrompt() (bool, error) { } func (cmd UnbindRouteServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unbind_route_service_command_test.go b/command/v7/unbind_route_service_command_test.go index f9cf32a4be6..4b0c5e6044f 100644 --- a/command/v7/unbind_route_service_command_test.go +++ b/command/v7/unbind_route_service_command_test.go @@ -62,7 +62,7 @@ var _ = Describe("unbind-route-service Command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: fakeOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.DeleteRouteBindingReturns( nil, @@ -452,7 +452,7 @@ var _ = Describe("unbind-route-service Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/unbind_running_group_command_test.go b/command/v7/unbind_running_group_command_test.go index 7f921dbccb7..cef38fad9c6 100644 --- a/command/v7/unbind_running_group_command_test.go +++ b/command/v7/unbind_running_group_command_test.go @@ -46,7 +46,7 @@ var _ = Describe("unbind-running-security-group Command", func() { cmd.RequiredArgs.SecurityGroup = "some-security-group" - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/unbind_running_security_group_command.go b/command/v7/unbind_running_security_group_command.go index 4f0ad46beb4..264a4ab86cd 100644 --- a/command/v7/unbind_running_security_group_command.go +++ b/command/v7/unbind_running_security_group_command.go @@ -22,7 +22,7 @@ func (cmd UnbindRunningSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unbind_security_group.go b/command/v7/unbind_security_group.go index b74e0290864..9bc55399cc8 100644 --- a/command/v7/unbind_security_group.go +++ b/command/v7/unbind_security_group.go @@ -29,7 +29,7 @@ func (cmd UnbindSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unbind_security_group_test.go b/command/v7/unbind_security_group_test.go index 06c25749d0c..4af1a6edb30 100644 --- a/command/v7/unbind_security_group_test.go +++ b/command/v7/unbind_security_group_test.go @@ -52,7 +52,7 @@ var _ = Describe("unbind-security-group Command", func() { fakeConfig.BinaryNameReturns(binaryName) fakeConfig.ExperimentalReturns(true) - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) fakeActor.UnbindSecurityGroupReturns( @@ -84,7 +84,7 @@ var _ = Describe("unbind-security-group Command", func() { When("getting the current user fails", func() { BeforeEach(func() { expectedErr = errors.New("getting user failed") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("returns an error", func() { diff --git a/command/v7/unbind_service_command.go b/command/v7/unbind_service_command.go index 660cc38c622..ccf2f134fd7 100644 --- a/command/v7/unbind_service_command.go +++ b/command/v7/unbind_service_command.go @@ -61,7 +61,7 @@ func (cmd UnbindServiceCommand) Usage() string { } func (cmd UnbindServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unbind_service_command_test.go b/command/v7/unbind_service_command_test.go index f2779f0871c..686708b3761 100644 --- a/command/v7/unbind_service_command_test.go +++ b/command/v7/unbind_service_command_test.go @@ -56,7 +56,7 @@ var _ = Describe("unbind-service Command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: fakeOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) fakeActor.DeleteServiceAppBindingReturns( nil, @@ -305,7 +305,7 @@ var _ = Describe("unbind-service Command", func() { When("getting the username returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bad thing")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing")) }) It("returns the error", func() { diff --git a/command/v7/unbind_staging_security_group_command.go b/command/v7/unbind_staging_security_group_command.go index 69463f693a1..3734ed62483 100644 --- a/command/v7/unbind_staging_security_group_command.go +++ b/command/v7/unbind_staging_security_group_command.go @@ -22,7 +22,7 @@ func (cmd UnbindStagingSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unbind_staging_security_group_command_test.go b/command/v7/unbind_staging_security_group_command_test.go index af9e3e0d7fc..7588628cc73 100644 --- a/command/v7/unbind_staging_security_group_command_test.go +++ b/command/v7/unbind_staging_security_group_command_test.go @@ -46,7 +46,7 @@ var _ = Describe("unbind-staging-security-group Command", func() { cmd.RequiredArgs.SecurityGroup = "some-security-group" - fakeConfig.CurrentUserReturns( + fakeActor.GetCurrentUserReturns( configv3.User{Name: "some-user"}, nil) }) diff --git a/command/v7/unmap_route_command.go b/command/v7/unmap_route_command.go index 2f1c2e4157d..d6bc80da0a2 100644 --- a/command/v7/unmap_route_command.go +++ b/command/v7/unmap_route_command.go @@ -38,7 +38,7 @@ func (cmd UnmapRouteCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unmap_route_command_test.go b/command/v7/unmap_route_command_test.go index 935ff65b41d..03ab812213a 100644 --- a/command/v7/unmap_route_command_test.go +++ b/command/v7/unmap_route_command_test.go @@ -83,7 +83,7 @@ var _ = Describe("unmap-route Command", func() { GUID: spaceGUID, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: userName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: userName}, nil) fakeActor.GetDomainByNameReturns( resources.Domain{Name: "some-domain.com", GUID: "domain-guid"}, @@ -138,7 +138,7 @@ var _ = Describe("unmap-route Command", func() { BeforeEach(func() { expectedErr = errors.New("some current user error") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("return an error", func() { diff --git a/command/v7/unset_env_command.go b/command/v7/unset_env_command.go index e1c4e1224ac..47243449dda 100644 --- a/command/v7/unset_env_command.go +++ b/command/v7/unset_env_command.go @@ -20,7 +20,7 @@ func (cmd UnsetEnvCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unset_env_command_test.go b/command/v7/unset_env_command_test.go index d1981cb8ee0..2e1175dc50b 100644 --- a/command/v7/unset_env_command_test.go +++ b/command/v7/unset_env_command_test.go @@ -77,7 +77,7 @@ var _ = Describe("unset-env Command", func() { When("getting the current user returns an error", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("some-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("some-error")) }) It("returns the error", func() { @@ -87,7 +87,7 @@ var _ = Describe("unset-env Command", func() { When("getting the current user succeeds", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "banana"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "banana"}, nil) }) When("unsetting the environment variable succeeds", func() { diff --git a/command/v7/unset_org_role_command.go b/command/v7/unset_org_role_command.go index c77cf45706b..c7798f0d174 100644 --- a/command/v7/unset_org_role_command.go +++ b/command/v7/unset_org_role_command.go @@ -26,7 +26,7 @@ func (cmd *UnsetOrgRoleCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unset_org_role_command_test.go b/command/v7/unset_org_role_command_test.go index dbf7edd48df..7e4695e4ec9 100644 --- a/command/v7/unset_org_role_command_test.go +++ b/command/v7/unset_org_role_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("unset-org-role Command", func() { }) BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "current-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "current-user"}, nil) fakeActor.GetOrganizationByNameReturns( resources.Organization{ diff --git a/command/v7/unset_space_quota_command.go b/command/v7/unset_space_quota_command.go index c5ac052ad6a..39d4f8bd6ef 100644 --- a/command/v7/unset_space_quota_command.go +++ b/command/v7/unset_space_quota_command.go @@ -18,7 +18,7 @@ func (cmd *UnsetSpaceQuotaCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUserName() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } @@ -28,7 +28,7 @@ func (cmd *UnsetSpaceQuotaCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Unassigning space quota {{.QuotaName}} from space {{.SpaceName}} as {{.UserName}}...", map[string]interface{}{ "QuotaName": cmd.RequiredArgs.SpaceQuota, "SpaceName": cmd.RequiredArgs.Space, - "UserName": currentUser, + "UserName": currentUser.Name, }) warnings, err := cmd.Actor.UnsetSpaceQuota(cmd.RequiredArgs.SpaceQuota, cmd.RequiredArgs.Space, targetedOrgGUID) diff --git a/command/v7/unset_space_quota_command_test.go b/command/v7/unset_space_quota_command_test.go index 0aa1cf93dca..3a93e9dd666 100644 --- a/command/v7/unset_space_quota_command_test.go +++ b/command/v7/unset_space_quota_command_test.go @@ -73,7 +73,7 @@ var _ = Describe("unset-space-quota Command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserNameReturns("", errors.New("current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("current-user-error")) }) It("returns the error", func() { @@ -96,8 +96,7 @@ var _ = Describe("unset-space-quota Command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserNameReturns(currentUser, nil) - + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUser}, nil) }) It("unsets the quota to the organization", func() { @@ -136,8 +135,7 @@ var _ = Describe("unset-space-quota Command", func() { GUID: "some-org-guid", }) - fakeConfig.CurrentUserNameReturns(currentUser, nil) - + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUser}, nil) }) It("unsets the quota to the organization", func() { diff --git a/command/v7/unset_space_role_command.go b/command/v7/unset_space_role_command.go index 0bfc040bf58..56abfc332fb 100644 --- a/command/v7/unset_space_role_command.go +++ b/command/v7/unset_space_role_command.go @@ -26,7 +26,7 @@ func (cmd *UnsetSpaceRoleCommand) Execute(args []string) error { return err } - currentUser, err := cmd.Config.CurrentUser() + currentUser, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unset_space_role_command_test.go b/command/v7/unset_space_role_command_test.go index ef0105e3885..e5c9e760943 100644 --- a/command/v7/unset_space_role_command_test.go +++ b/command/v7/unset_space_role_command_test.go @@ -55,7 +55,7 @@ var _ = Describe("unset-space-role Command", func() { }) BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "current-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "current-user"}, nil) fakeActor.GetOrganizationByNameReturns( resources.Organization{ diff --git a/command/v7/unshare_private_domain_command.go b/command/v7/unshare_private_domain_command.go index 69cfccb1f89..d2fe3878251 100644 --- a/command/v7/unshare_private_domain_command.go +++ b/command/v7/unshare_private_domain_command.go @@ -18,7 +18,7 @@ func (cmd UnsharePrivateDomainCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unshare_private_domain_command_test.go b/command/v7/unshare_private_domain_command_test.go index b83d95bdc88..12e92e52b17 100644 --- a/command/v7/unshare_private_domain_command_test.go +++ b/command/v7/unshare_private_domain_command_test.go @@ -78,7 +78,7 @@ var _ = Describe("unshare-private-domain command", func() { When("getting the current user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("current-user-error")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("current-user-error")) }) It("returns an error", func() { @@ -93,7 +93,7 @@ var _ = Describe("unshare-private-domain command", func() { When("the environment is setup correctly", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{Name: "the-user"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "the-user"}, nil) }) When("the user says yes", func() { diff --git a/command/v7/unshare_service_command.go b/command/v7/unshare_service_command.go index 714da9daa81..73d1d213cbf 100644 --- a/command/v7/unshare_service_command.go +++ b/command/v7/unshare_service_command.go @@ -66,7 +66,7 @@ func (cmd UnshareServiceCommand) Execute(args []string) error { } func (cmd UnshareServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/unshare_service_command_test.go b/command/v7/unshare_service_command_test.go index 9243a46fd4e..e5ae7caa0fc 100644 --- a/command/v7/unshare_service_command_test.go +++ b/command/v7/unshare_service_command_test.go @@ -114,7 +114,7 @@ var _ = Describe("unshare-service command", func() { fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: expectedTargetedOrgName}) fakeConfig.TargetedSpaceReturns(configv3.Space{Name: expectedSpaceName, GUID: expectedTargetedSpaceGuid}) - fakeConfig.CurrentUserReturns(configv3.User{Name: expectedUser}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: expectedUser}, nil) cmd = UnshareServiceCommand{ BaseCommand: BaseCommand{ @@ -156,7 +156,7 @@ var _ = Describe("unshare-service command", func() { fakeSharedActor.CheckTargetReturns(nil) fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: expectedTargetedSpaceGuid}) fakeConfig.TargetedOrganizationReturns(configv3.Organization{GUID: expectedTargetedOrgGuid, Name: expectedTargetedOrgName}) - fakeConfig.CurrentUserReturns(configv3.User{Name: expectedUser}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: expectedUser}, nil) }) It("prompts the user", func() { @@ -220,7 +220,7 @@ var _ = Describe("unshare-service command", func() { When("getting the username fails", func() { BeforeEach(func() { input.Write([]byte("y\n")) - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("boom")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("boom")) }) It("returns the error", func() { diff --git a/command/v7/update_buildpack_command.go b/command/v7/update_buildpack_command.go index 5a59f7def14..b0e40dee66b 100644 --- a/command/v7/update_buildpack_command.go +++ b/command/v7/update_buildpack_command.go @@ -91,7 +91,7 @@ func (cmd UpdateBuildpackCommand) validateSetup() (configv3.User, error) { return user, err } - return cmd.Config.CurrentUser() + return cmd.Actor.GetCurrentUser() } func (cmd UpdateBuildpackCommand) prepareBuildpackBits() (string, string, error) { diff --git a/command/v7/update_buildpack_command_test.go b/command/v7/update_buildpack_command_test.go index da56d6524f8..05de1f2e8a9 100644 --- a/command/v7/update_buildpack_command_test.go +++ b/command/v7/update_buildpack_command_test.go @@ -147,7 +147,7 @@ var _ = Describe("UpdateBuildpackCommand", func() { When("getting the current user fails", func() { BeforeEach(func() { expectedErr = errors.New("some-error that happened") - fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr) + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) }) It("returns the error", func() { @@ -160,7 +160,7 @@ var _ = Describe("UpdateBuildpackCommand", func() { BeforeEach(func() { userName = "some-user" - fakeConfig.CurrentUserReturns(configv3.User{Name: userName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: userName}, nil) }) When("preparing buildpack bits causes an error", func() { diff --git a/command/v7/update_org_quota_command.go b/command/v7/update_org_quota_command.go index cc188b329a4..04a93c6a7b8 100644 --- a/command/v7/update_org_quota_command.go +++ b/command/v7/update_org_quota_command.go @@ -35,7 +35,7 @@ func (cmd UpdateOrgQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_org_quota_command_test.go b/command/v7/update_org_quota_command_test.go index cd903e1aa03..4dd534d5dc2 100644 --- a/command/v7/update_org_quota_command_test.go +++ b/command/v7/update_org_quota_command_test.go @@ -49,7 +49,7 @@ var _ = Describe("UpdateOrgQuotaCommand", func() { } currentUserName = "bob" - fakeConfig.CurrentUserReturns(configv3.User{Name: currentUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/update_security_group_command.go b/command/v7/update_security_group_command.go index 8cd8a1c5fac..6fdbbd3f6e2 100644 --- a/command/v7/update_security_group_command.go +++ b/command/v7/update_security_group_command.go @@ -21,7 +21,7 @@ func (cmd UpdateSecurityGroupCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_security_group_command_test.go b/command/v7/update_security_group_command_test.go index c15652a450d..cc4b82fdbae 100644 --- a/command/v7/update_security_group_command_test.go +++ b/command/v7/update_security_group_command_test.go @@ -53,7 +53,7 @@ var _ = Describe("update-security-group Command", func() { } fakeConfig.HasTargetedOrganizationReturns(false) fakeConfig.HasTargetedSpaceReturns(false) - fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: "steve"}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/update_service_broker_command.go b/command/v7/update_service_broker_command.go index ad39ad1393c..8380755d656 100644 --- a/command/v7/update_service_broker_command.go +++ b/command/v7/update_service_broker_command.go @@ -24,7 +24,7 @@ func (cmd UpdateServiceBrokerCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_service_broker_command_test.go b/command/v7/update_service_broker_command_test.go index 8a95d70d17c..d3a2b658bc4 100644 --- a/command/v7/update_service_broker_command_test.go +++ b/command/v7/update_service_broker_command_test.go @@ -59,7 +59,7 @@ var _ = Describe("update-service-broker command", func() { nil, ) - fakeConfig.CurrentUserReturns(configv3.User{Name: "user"}, nil) + fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{Name: "user"}, nil) }) It("succeeds", func() { @@ -113,7 +113,7 @@ var _ = Describe("update-service-broker command", func() { When("it fails to get the current user", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("no user found")) + fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{}, errors.New("no user found")) }) It("returns the error and displays all warnings", func() { diff --git a/command/v7/update_service_command.go b/command/v7/update_service_command.go index 6ce5f3157d6..289cec1ed8c 100644 --- a/command/v7/update_service_command.go +++ b/command/v7/update_service_command.go @@ -115,7 +115,7 @@ CF_NAME update-service mydb -t "list, of, tags" } func (cmd UpdateServiceCommand) displayIntro() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_service_command_test.go b/command/v7/update_service_command_test.go index ffa549d2f2c..5e9a55b1f49 100644 --- a/command/v7/update_service_command_test.go +++ b/command/v7/update_service_command_test.go @@ -60,7 +60,7 @@ var _ = Describe("update-service command", func() { Name: spaceName, GUID: spaceGUID, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) fakeStream := make(chan v7action.PollJobEvent) close(fakeStream) @@ -266,7 +266,7 @@ var _ = Describe("update-service command", func() { When("getting the user fails", func() { BeforeEach(func() { - fakeConfig.CurrentUserReturns(configv3.User{}, errors.New("bang")) + fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bang")) }) It("returns the error", func() { diff --git a/command/v7/update_space_quota_command.go b/command/v7/update_space_quota_command.go index d5e30b1fc5a..c2905ecae64 100644 --- a/command/v7/update_space_quota_command.go +++ b/command/v7/update_space_quota_command.go @@ -35,7 +35,7 @@ func (cmd UpdateSpaceQuotaCommand) Execute(args []string) error { return err } - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_space_quota_command_test.go b/command/v7/update_space_quota_command_test.go index 37f1d10cffe..2caf0945a62 100644 --- a/command/v7/update_space_quota_command_test.go +++ b/command/v7/update_space_quota_command_test.go @@ -50,7 +50,7 @@ var _ = Describe("UpdateSpaceQuotaCommand", func() { } currentUserName = "bob" - fakeConfig.CurrentUserReturns(configv3.User{Name: currentUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: currentUserName}, nil) fakeConfig.TargetedOrganizationReturns(configv3.Organization{GUID: "targeted-org-guid"}) fakeConfig.TargetedOrganizationNameReturns(orgName) }) diff --git a/command/v7/update_user_provided_service_command.go b/command/v7/update_user_provided_service_command.go index fde7c3ae375..71b9eb1a6e4 100644 --- a/command/v7/update_user_provided_service_command.go +++ b/command/v7/update_user_provided_service_command.go @@ -63,7 +63,7 @@ func (cmd *UpdateUserProvidedServiceCommand) Execute(args []string) error { } func (cmd UpdateUserProvidedServiceCommand) displayMessage() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/update_user_provided_service_command_test.go b/command/v7/update_user_provided_service_command_test.go index f590ca95b98..ac55f322aa7 100644 --- a/command/v7/update_user_provided_service_command_test.go +++ b/command/v7/update_user_provided_service_command_test.go @@ -97,7 +97,7 @@ var _ = Describe("update-user-provided-service Command", func() { Name: fakeOrgName, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: fakeUserName}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) setPositionalFlags(&cmd, fakeServiceInstanceName) diff --git a/command/v7/upgrade_service_command.go b/command/v7/upgrade_service_command.go index 9b67cc851cc..81bd39a065a 100644 --- a/command/v7/upgrade_service_command.go +++ b/command/v7/upgrade_service_command.go @@ -65,7 +65,7 @@ func (cmd UpgradeServiceCommand) Usage() string { } func (cmd UpgradeServiceCommand) displayEvent() error { - user, err := cmd.Config.CurrentUser() + user, err := cmd.Actor.GetCurrentUser() if err != nil { return err } diff --git a/command/v7/upgrade_service_command_test.go b/command/v7/upgrade_service_command_test.go index dfb6c34061a..bc8aa3f54fa 100644 --- a/command/v7/upgrade_service_command_test.go +++ b/command/v7/upgrade_service_command_test.go @@ -58,7 +58,7 @@ var _ = Describe("upgrade-service command", func() { Name: spaceName, GUID: spaceGUID, }) - fakeConfig.CurrentUserReturns(configv3.User{Name: username}, nil) + fakeActor.GetCurrentUserReturns(configv3.User{Name: username}, nil) }) JustBeforeEach(func() { diff --git a/command/v7/v7fakes/fake_actor.go b/command/v7/v7fakes/fake_actor.go index 96679e882bc..8065bc84341 100644 --- a/command/v7/v7fakes/fake_actor.go +++ b/command/v7/v7fakes/fake_actor.go @@ -17,6 +17,7 @@ import ( v7 "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/resources" "code.cloudfoundry.org/cli/types" + "code.cloudfoundry.org/cli/util/configv3" "github.com/SermoDigital/jose/jwt" ) @@ -1210,6 +1211,18 @@ type FakeActor struct { result2 v7action.Warnings result3 error } + GetCurrentUserStub func() (configv3.User, error) + getCurrentUserMutex sync.RWMutex + getCurrentUserArgsForCall []struct { + } + getCurrentUserReturns struct { + result1 configv3.User + result2 error + } + getCurrentUserReturnsOnCall map[int]struct { + result1 configv3.User + result2 error + } GetDefaultDomainStub func(string) (resources.Domain, v7action.Warnings, error) getDefaultDomainMutex sync.RWMutex getDefaultDomainArgsForCall []struct { @@ -8714,6 +8727,61 @@ func (fake *FakeActor) GetBuildpacksReturnsOnCall(i int, result1 []resources.Bui }{result1, result2, result3} } +func (fake *FakeActor) GetCurrentUser() (configv3.User, error) { + fake.getCurrentUserMutex.Lock() + ret, specificReturn := fake.getCurrentUserReturnsOnCall[len(fake.getCurrentUserArgsForCall)] + fake.getCurrentUserArgsForCall = append(fake.getCurrentUserArgsForCall, struct { + }{}) + fake.recordInvocation("GetCurrentUser", []interface{}{}) + fake.getCurrentUserMutex.Unlock() + if fake.GetCurrentUserStub != nil { + return fake.GetCurrentUserStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.getCurrentUserReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeActor) GetCurrentUserCallCount() int { + fake.getCurrentUserMutex.RLock() + defer fake.getCurrentUserMutex.RUnlock() + return len(fake.getCurrentUserArgsForCall) +} + +func (fake *FakeActor) GetCurrentUserCalls(stub func() (configv3.User, error)) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = stub +} + +func (fake *FakeActor) GetCurrentUserReturns(result1 configv3.User, result2 error) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = nil + fake.getCurrentUserReturns = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + +func (fake *FakeActor) GetCurrentUserReturnsOnCall(i int, result1 configv3.User, result2 error) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = nil + if fake.getCurrentUserReturnsOnCall == nil { + fake.getCurrentUserReturnsOnCall = make(map[int]struct { + result1 configv3.User + result2 error + }) + } + fake.getCurrentUserReturnsOnCall[i] = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + func (fake *FakeActor) GetDefaultDomain(arg1 string) (resources.Domain, v7action.Warnings, error) { fake.getDefaultDomainMutex.Lock() ret, specificReturn := fake.getDefaultDomainReturnsOnCall[len(fake.getDefaultDomainArgsForCall)] @@ -18934,6 +19002,8 @@ func (fake *FakeActor) Invocations() map[string][][]interface{} { defer fake.getBuildpackLabelsMutex.RUnlock() fake.getBuildpacksMutex.RLock() defer fake.getBuildpacksMutex.RUnlock() + fake.getCurrentUserMutex.RLock() + defer fake.getCurrentUserMutex.RUnlock() fake.getDefaultDomainMutex.RLock() defer fake.getDefaultDomainMutex.RUnlock() fake.getDetailedAppSummaryMutex.RLock() diff --git a/command/v7/v7fakes/fake_set_label_actor.go b/command/v7/v7fakes/fake_set_label_actor.go index 676d0f4245d..8eb74fcb505 100644 --- a/command/v7/v7fakes/fake_set_label_actor.go +++ b/command/v7/v7fakes/fake_set_label_actor.go @@ -7,9 +7,22 @@ import ( "code.cloudfoundry.org/cli/actor/v7action" v7 "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/types" + "code.cloudfoundry.org/cli/util/configv3" ) type FakeSetLabelActor struct { + GetCurrentUserStub func() (configv3.User, error) + getCurrentUserMutex sync.RWMutex + getCurrentUserArgsForCall []struct { + } + getCurrentUserReturns struct { + result1 configv3.User + result2 error + } + getCurrentUserReturnsOnCall map[int]struct { + result1 configv3.User + result2 error + } UpdateApplicationLabelsByApplicationNameStub func(string, string, map[string]types.NullString) (v7action.Warnings, error) updateApplicationLabelsByApplicationNameMutex sync.RWMutex updateApplicationLabelsByApplicationNameArgsForCall []struct { @@ -176,6 +189,61 @@ type FakeSetLabelActor struct { invocationsMutex sync.RWMutex } +func (fake *FakeSetLabelActor) GetCurrentUser() (configv3.User, error) { + fake.getCurrentUserMutex.Lock() + ret, specificReturn := fake.getCurrentUserReturnsOnCall[len(fake.getCurrentUserArgsForCall)] + fake.getCurrentUserArgsForCall = append(fake.getCurrentUserArgsForCall, struct { + }{}) + fake.recordInvocation("GetCurrentUser", []interface{}{}) + fake.getCurrentUserMutex.Unlock() + if fake.GetCurrentUserStub != nil { + return fake.GetCurrentUserStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.getCurrentUserReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeSetLabelActor) GetCurrentUserCallCount() int { + fake.getCurrentUserMutex.RLock() + defer fake.getCurrentUserMutex.RUnlock() + return len(fake.getCurrentUserArgsForCall) +} + +func (fake *FakeSetLabelActor) GetCurrentUserCalls(stub func() (configv3.User, error)) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = stub +} + +func (fake *FakeSetLabelActor) GetCurrentUserReturns(result1 configv3.User, result2 error) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = nil + fake.getCurrentUserReturns = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + +func (fake *FakeSetLabelActor) GetCurrentUserReturnsOnCall(i int, result1 configv3.User, result2 error) { + fake.getCurrentUserMutex.Lock() + defer fake.getCurrentUserMutex.Unlock() + fake.GetCurrentUserStub = nil + if fake.getCurrentUserReturnsOnCall == nil { + fake.getCurrentUserReturnsOnCall = make(map[int]struct { + result1 configv3.User + result2 error + }) + } + fake.getCurrentUserReturnsOnCall[i] = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + func (fake *FakeSetLabelActor) UpdateApplicationLabelsByApplicationName(arg1 string, arg2 string, arg3 map[string]types.NullString) (v7action.Warnings, error) { fake.updateApplicationLabelsByApplicationNameMutex.Lock() ret, specificReturn := fake.updateApplicationLabelsByApplicationNameReturnsOnCall[len(fake.updateApplicationLabelsByApplicationNameArgsForCall)] @@ -891,6 +959,8 @@ func (fake *FakeSetLabelActor) UpdateStackLabelsByStackNameReturnsOnCall(i int, func (fake *FakeSetLabelActor) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() + fake.getCurrentUserMutex.RLock() + defer fake.getCurrentUserMutex.RUnlock() fake.updateApplicationLabelsByApplicationNameMutex.RLock() defer fake.updateApplicationLabelsByApplicationNameMutex.RUnlock() fake.updateBuildpackLabelsByBuildpackNameAndStackMutex.RLock() diff --git a/go.mod b/go.mod index d67598838c6..4733b4ee0d6 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 code.cloudfoundry.org/clock v1.0.0 code.cloudfoundry.org/diego-ssh v0.0.0-20170109142818-18cdb3586e7f - code.cloudfoundry.org/go-log-cache v1.0.1-0.20200316170138-f466e0302c34 - code.cloudfoundry.org/go-loggregator v7.4.0+incompatible + code.cloudfoundry.org/go-log-cache v1.0.1-0.20211011162012-ede82a99d3cc + code.cloudfoundry.org/go-loggregator/v8 v8.0.5 code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.3 code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be @@ -40,7 +40,7 @@ require ( github.com/moby/moby v1.4.2-0.20171120205147-9de84a78d76e github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d github.com/onsi/ginkgo v1.16.4 - github.com/onsi/gomega v1.10.5 + github.com/onsi/gomega v1.13.0 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/pkg/errors v0.9.1 github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f @@ -50,14 +50,15 @@ require ( github.com/tedsuo/rata v1.0.1-0.20170830210128-07d200713958 github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 - golang.org/x/net v0.0.0-20210716203947-853a461950ff - golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf // indirect - golang.org/x/text v0.3.6 - golang.org/x/tools v0.1.5 // indirect - gopkg.in/cheggaaa/pb.v1 v1.0.27 - gopkg.in/yaml.v2 v2.3.0 + golang.org/x/net v0.0.0-20211013171255-e13a2654a71e + golang.org/x/sys v0.0.0-20211013075003-97ac67df715c // indirect + golang.org/x/text v0.3.7 + golang.org/x/tools v0.1.6-0.20210908190839-cf92b39a962c // indirect + google.golang.org/genproto v0.0.0-20211013025323-ce878158c4d4 // indirect + google.golang.org/grpc v1.41.0 // indirect + gopkg.in/cheggaaa/pb.v1 v1.0.28 + gopkg.in/yaml.v2 v2.4.0 + k8s.io/client-go v0.22.2 ) replace gopkg.in/fsnotify.v1 v1.4.7 => github.com/fsnotify/fsnotify v1.4.7 - -replace github.com/golang/protobuf => github.com/golang/protobuf v1.3.4 diff --git a/go.sum b/go.sum index 4bcafc592e3..6ee6cbe53b0 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,36 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= code.cloudfoundry.org/bytefmt v0.0.0-20170428003108-f4415fafc561 h1:OKYHUwj6pyB9KWBoyy1yPJVWvoYV2N+9QqbvbSw8LjM= code.cloudfoundry.org/bytefmt v0.0.0-20170428003108-f4415fafc561/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 h1:Yc9r1p21kEpni9WlG4mwOZw87TB2QlyS9sAEebZ3+ak= @@ -11,29 +43,53 @@ code.cloudfoundry.org/clock v1.0.0 h1:kFXWQM4bxYvdBw2X8BbBeXwQNgfoWv1vqAk2ZZyBN2 code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= code.cloudfoundry.org/diego-ssh v0.0.0-20170109142818-18cdb3586e7f h1:xDSTgaS6b/AkaBqvyEYfu6i1Z+y8JSCHAd/e1HGqyF4= code.cloudfoundry.org/diego-ssh v0.0.0-20170109142818-18cdb3586e7f/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= +code.cloudfoundry.org/go-diodes v0.0.0-20180905200951-72629b5276e3/go.mod h1:Jzi+ccHgo/V/PLQUaQ6hnZcC1c4BS790gx21LRRui4g= code.cloudfoundry.org/go-envstruct v1.5.0/go.mod h1:E2S/gzRZpZ51PZnIv7Bo7QvcgH18yio19upkrRk0xLU= -code.cloudfoundry.org/go-log-cache v1.0.1-0.20200316170138-f466e0302c34 h1:cSOAscWrWx7uix5SjqePlqDad/n8f2A/bugsSttxVx4= -code.cloudfoundry.org/go-log-cache v1.0.1-0.20200316170138-f466e0302c34/go.mod h1:0+5CSLZehiHLkrWCmwPt7mA/RlAa71idWz4SG4wfhOE= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible h1:KqZYloMQWM5Zg/BQKunOIA4OODh7djZbk48qqbowNFI= -code.cloudfoundry.org/go-loggregator v7.4.0+incompatible/go.mod h1:KPBTRqj+y738Nhf1+g4JHFaBU8j7dedirR5ETNHvMXU= +code.cloudfoundry.org/go-log-cache v1.0.1-0.20211011162012-ede82a99d3cc h1:8gj5Z08i9ZvoIGi1A/E2CEQTbvJjogYQgBQUI2/DyNE= +code.cloudfoundry.org/go-log-cache v1.0.1-0.20211011162012-ede82a99d3cc/go.mod h1:8thG6lrstlbeI44hc7QgSnX8eau68+mNt9Pp33/TEcg= +code.cloudfoundry.org/go-loggregator/v8 v8.0.2-0.20200722201844-b5130958b65d/go.mod h1:Or3cWTXwK6d3caPRBTUJv/suT+47jOltB7hYC/3ECCo= +code.cloudfoundry.org/go-loggregator/v8 v8.0.5 h1:p1rrGxTwUqLjlUVtbjTAvKOSGNmPuBja8LeQOQgRrBc= +code.cloudfoundry.org/go-loggregator/v8 v8.0.5/go.mod h1:mLlJ1ZyG6gVvBEtYypvbztRvFeCtBsTxE9tt+85tS6Y= code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f h1:UrKzEwTgeiff9vxdrfdqxibzpWjxLnuXDI5m6z3GJAk= code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI= code.cloudfoundry.org/jsonry v1.1.3 h1:pt7JvBaoZEObO9lppoAMjpscsE2uv7OKX9JiB3oNYxE= code.cloudfoundry.org/jsonry v1.1.3/go.mod h1:IYd9/qJOvdVQk/SEkw3zPKpJp4GNAN+LYjU9eD3pspo= code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be h1:rnGRgbKlOPKbI9N/PscJ78Ug5Iw+o1kE7aDW01V+0FM= code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= -code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a h1:8rqv2w8xEceNwckcF5ONeRt0qBHlh5bnNfFnYTrZbxs= code.cloudfoundry.org/rfc5424 v0.0.0-20180905210152-236a6d29298a/go.mod h1:tkZo8GtzBjySJ7USvxm4E36lNQw1D3xM6oKHGqdaAJ4= +code.cloudfoundry.org/tlsconfig v0.0.0-20200131000646-bbe0f8da39b3/go.mod h1:eTbFJpyXRGuFVyg5+oaj9B2eIbIc+0/kZjH8ftbtdew= code.cloudfoundry.org/tlsconfig v0.0.0-20210615191307-5d92ef3894a7 h1:5N6M1WbWH3bknkX80Q/s7eEo5odqjixLAW79Zrrbqu0= code.cloudfoundry.org/tlsconfig v0.0.0-20210615191307-5d92ef3894a7/go.mod h1:CKI5CV+3MlfcohVSuU3FxXubFyC52lYJGMLnZ2ltvks= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d/go.mod h1:YUJiVOr5xl0N/RjMxM1tHmgSpBbi5UM+KoVR5AoejO0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +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.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 h1:koK7z0nSsRiRiBWwa+E714Puh+DO+ZRdIyAXiXzL+lg= github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:bXvGk6IkT1Agy7qzJ+DjIw/SJ1AaB3AvAuMDVV+Vkoo= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmatcuk/doublestar v1.3.1 h1:rT8rxDPsavp9G+4ZULzqhhUSaI/OPsTZNG88Z3i0xvY= @@ -42,16 +98,30 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 h1:y4B3+GPxKlrigF1ha5FFErxK+sr6sWxQovRMzwMhejo= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charlievieth/fs v0.0.0-20170613215519-7dc373669fa1 h1:vTlpHKxJqykyKdW9bkrDJNWeKNuSIAJ0TP/K4lRsz/Q= github.com/charlievieth/fs v0.0.0-20170613215519-7dc373669fa1/go.mod h1:sAoA1zHCH4FJPE2gne5iBiiVG66U7Nyp6JqlOo+FEyg= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudfoundry/bosh-cli v5.5.1+incompatible h1:a4SP5/+ZlnfrMefIhklrw7UkbujwgXPIR0/nfCigI6I= github.com/cloudfoundry/bosh-cli v5.5.1+incompatible/go.mod h1:rzIB+e1sn7wQL/TJ54bl/FemPKRhXby5BIMS3tLuWFM= github.com/cloudfoundry/bosh-utils v0.0.0-20180315210917-c6a922e299b8 h1:x6vZOZ7rlvGro4GKDg0DaQz2za8Q6GjhVoB7vH6BZ2I= github.com/cloudfoundry/bosh-utils v0.0.0-20180315210917-c6a922e299b8/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= +github.com/cloudfoundry/dropsonde v1.0.0/go.mod h1:6zwvrWK5TpxBVYi1cdkE5WDsIO8E0n7qAJg3wR9B67c= +github.com/cloudfoundry/gosteno v0.0.0-20150423193413-0c8581caea35/go.mod h1:3YBPUR85RIrvaUTdA1dL38YSp6s3OHu1xrWLkGt2Mog= +github.com/cloudfoundry/loggregatorlib v0.0.0-20170823162133-36eddf15ef12/go.mod h1:ucj7+svyACshmxV3Zze2NAcEcdbBf9scZYR+QKCX9/w= +github.com/cloudfoundry/sonde-go v0.0.0-20171206171820-b33733203bb4/go.mod h1:GS0pCHd7onIsewbw8Ue9qa9pZPv2V88cUZDttK6KzgI= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/cppforlife/go-patch v0.1.0 h1:I0fT+gFTSW4xWwvaTaUUVjr9xxjNXJ4naGc01BeQjwY= github.com/cppforlife/go-patch v0.1.0/go.mod h1:67a7aIi94FHDZdoeGSJRRFDp66l9MhaAG1yGxpUoFD8= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.1 h1:5DPkzz/0MwUpvR4fxASKzgApeq2OMFY5FfYtrX28Coo= github.com/cyphar/filepath-securejoin v0.2.1/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -61,57 +131,156 @@ github.com/docker/distribution v2.6.0-rc.1.0.20171109224904-e5b5e44386f7+incompa github.com/docker/distribution v2.6.0-rc.1.0.20171109224904-e5b5e44386f7+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20171120205147-9de84a78d76e h1:M+/1NNHE/mg+RUox/04+rZoahJVklPfs6xZFECVnxso= github.com/docker/docker v1.4.2-0.20171120205147-9de84a78d76e/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drewolson/testflight v1.0.0/go.mod h1:t9oKuuEohRGLb80SWX+uxJHuhX98B7HnojqtW+Ryq30= +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/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/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.5.1-0.20170926111411-5df930a27be2 h1:lSx4zNYRd54K1yU6E/Uak9R4GqTMt7L44QU8aT1W3Go= github.com/fatih/color v1.5.1-0.20170926111411-5df930a27be2/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +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.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +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/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +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= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/grpc-ecosystem/grpc-gateway v1.14.0 h1:CI8J2kQ4VC2vS3lhVQa+5lMpwCyqyNCAWAPHGMGszQw= -github.com/grpc-ecosystem/grpc-gateway v1.14.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0/go.mod h1:qrJPVzv9YlhsrxJc3P/Q85nr0w1lIRikTl4JlhdDH5w= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jessevdk/go-flags v0.0.0-20170926144705-f88afde2fa19/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4 h1:xKkUL6QBojwguhKKetf1SocCAKqc6W7S/mGm9xEGllo= github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.0.0-20160823170715-cfb55aafdaf3/go.mod h1:Bvhd+E3laJ0AVkG0c9rmtZcnhV0HQ3+c3YxxqTvc/gA= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.0.0-20160504234017-7cafcd837844/go.mod h1:sjUstKUATFIcff4qlB53Kml0wQPtJVc/3fWrmuUmcfA= -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= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/loggregator/go-bindata v0.0.0-20190422223605-5f11cfb2d7d9/go.mod h1:PvsJfK9t/8OdGvSanpYlwJ1EPoJ/hwT3c52txAzqooY= github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +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/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= @@ -120,38 +289,57 @@ github.com/mattn/go-runewidth v0.0.5-0.20181218000649-703b5e6b11ae h1:575usOHCDz github.com/mattn/go-runewidth v0.0.5-0.20181218000649-703b5e6b11ae/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/moby v1.4.2-0.20171120205147-9de84a78d76e h1:6+Fs/ljqCOuJ4Ie4VUB/wQ/9oSpk2YvtSR5Clf13puk= github.com/moby/moby v1.4.2-0.20171120205147-9de84a78d76e/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +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/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20171031171758-652e15c9a27e/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20171105031654-1eecca0ba8e6/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pivotal-cf/brokerapi/v7 v7.2.0/go.mod h1:5QRQ8vJmav91F+AvY5NA/QoDOq70XgBVxXKUK4N/cNE= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/poy/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:x1vqpbcMW9T/KRcQ4b48diSiSVtYgvwQ5xzDByEg4WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -163,14 +351,22 @@ github.com/sclevine/spec v1.2.0 h1:1Jwdf9jSfDl9NVmt8ndHqbTZ7XCCPbh1jI3hkDBHVYA= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/square/certstrap v1.2.0 h1:ecgyABrbFLr8jSbOC6oTBmBek0t/HqtgrMUZCPuyfdw= github.com/square/certstrap v1.2.0/go.mod h1:CUHqV+fxJW0Y5UQFnnbYwQ7bpKXO1AKbic9g73799yw= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00 h1:mujcChM89zOHwgZBBNr5WZ77mBXP1yR+gLThGCYZgAg= github.com/tedsuo/ifrit v0.0.0-20191009134036-9a97d0632f00/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= github.com/tedsuo/rata v1.0.1-0.20170830210128-07d200713958 h1:mueRRuRjR35dEOkHdhpoRcruNgBz0ohG659HxxmcAwA= @@ -179,22 +375,58 @@ github.com/unrolled/secure v0.0.0-20180416205222-a1cf62cc2159/go.mod h1:mnPT77IA github.com/urfave/cli v1.21.0/go.mod h1:lxDj6qX9Q6lWQxIrbrT0nwecwUtRnhVZAJjJZrVUZZQ= github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= @@ -204,26 +436,57 @@ golang.org/x/net v0.0.0-20180418062111-d41e8174641f/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/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-20190724013045-ca1201d0de80/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-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= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210716203947-853a461950ff h1:j2EK/QoxYNBsXI4R7fQkkRUk8y6wnOBI+6hgPdP/6Ds= -golang.org/x/net v0.0.0-20210716203947-853a461950ff/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211013171255-e13a2654a71e h1:Xj+JO91noE97IN6F/7WZxzC5QE6yENAQPrwIYhW3bsA= +golang.org/x/net v0.0.0-20211013171255-e13a2654a71e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180419222023-a2a45943ae67/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -232,12 +495,36 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -245,52 +532,181 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c h1:taxlMj0D/1sOAuv/CbSD+MMDof2vbyPTqz5FNYKpXt8= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200609164405-eb789aa7ce50/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/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-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6-0.20210908190839-cf92b39a962c h1:C0nyHiBU2m0cR6hDiUORWqQIt3h37wsp1255QBSSXqY= +golang.org/x/tools v0.1.6-0.20210908190839-cf92b39a962c/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20200304201815-d429ff31ee6c h1:Mm69MraVZ+yh1vw8pQOUW4uJkkSEQbbTr076A94lvqs= -google.golang.org/genproto v0.0.0-20200304201815-d429ff31ee6c/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20211013025323-ce878158c4d4 h1:NBxB1XxiWpGqkPUiJ9PoBXkHV5A9+GohMOA+EmWoPbU= +google.golang.org/genproto v0.0.0-20211013025323-ce878158c4d4/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +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.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 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/yaml.v2 v2.0.0-20171116090243-287cf08546ab/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -298,9 +714,41 @@ 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.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +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/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= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.2.0-0.dev/go.mod h1:XtegFAyX/PfluP4921rXU5IkjkqBCDnUq4W8VCIoKvM= +k8s.io/api v0.22.2 h1:M8ZzAD0V6725Fjg53fKeTJxGsJvRbk4TEm/fexHMtfw= +k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= +k8s.io/apimachinery v0.22.2 h1:ejz6y/zNma8clPVfNDLnPbleBo6MpoFy/HBiBqCouVk= +k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/client-go v0.22.2 h1:DaSQgs02aCC1QcwUdkKZWOeaVsQjYvWv8ZazcZ6JcHc= +k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +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/integration/README.md b/integration/README.md index 021f6641e3b..de326244cb7 100644 --- a/integration/README.md +++ b/integration/README.md @@ -24,7 +24,8 @@ Running `make integration-tests` can be time-consuming, because it includes the - `isolated` suite is for tests that are stand alone and do not affect each other. They are meant to run in their own organization and space, and will not affect system state. This is the most common type of integration tests. - `push` suite is for tests related to the `cf push` command only. - `experimental` suite is for tests that require the cf experimental flag to be set and/or an experimental feature for the CF CLI. -- `plugin` suite is for tests that surround the CF CLI plugin framework. *These tests do not run in parallel.* +- `plugin` suite is for tests that surround the CF CLI plugin framework. _These tests do not run in parallel._ +- `selfcontained` suite is for tests that talk to a fake CF API, hence they do not require a cf deployment ## How to run These tests rely on [ginkgo](https://github.com/onsi/ginkgo) to be installed. diff --git a/integration/helpers/command.go b/integration/helpers/command.go index 377b014db61..f8f7cad7375 100644 --- a/integration/helpers/command.go +++ b/integration/helpers/command.go @@ -39,14 +39,14 @@ func CF(args ...string) *Session { type CFEnv struct { WorkingDirectory string EnvVars map[string]string - stdin io.Reader + Stdin io.Reader } // CustomCF runs a 'cf' command with a custom environment and given arguments. func CustomCF(cfEnv CFEnv, args ...string) *Session { command := exec.Command("cf", args...) - if cfEnv.stdin != nil { - command.Stdin = cfEnv.stdin + if cfEnv.Stdin != nil { + command.Stdin = cfEnv.Stdin } if cfEnv.WorkingDirectory != "" { command.Dir = cfEnv.WorkingDirectory diff --git a/integration/v7/isolated/api_command_test.go b/integration/v7/isolated/api_command_test.go index d312c8035c9..b3339b84679 100644 --- a/integration/v7/isolated/api_command_test.go +++ b/integration/v7/isolated/api_command_test.go @@ -81,7 +81,6 @@ var _ = Describe("api command", func() { Context("--unset is passed", func() { BeforeEach(func() { - userConfig := configv3.Config{ ConfigFile: configv3.JSONConfig{ ConfigVersion: configv3.CurrentConfigVersion, @@ -338,6 +337,7 @@ var _ = Describe("api command", func() { Expect(configFile.TargetedSpace.GUID).To(BeEmpty()) Expect(configFile.TargetedSpace.Name).To(BeEmpty()) Expect(configFile.TargetedSpace.AllowSSH).To(BeFalse()) + Expect(configFile.CFOnK8s).To(Equal(configv3.CFOnK8s{})) }) It("handles API endpoints with trailing slash", func() { diff --git a/integration/v7/isolated/login_command_test.go b/integration/v7/isolated/login_command_test.go index 2aa1c420ace..70004c90b57 100644 --- a/integration/v7/isolated/login_command_test.go +++ b/integration/v7/isolated/login_command_test.go @@ -624,7 +624,7 @@ var _ = Describe("login command", func() { Eventually(session.Err).Should(Say("Service account currently logged in. Use 'cf logout' to log out service account and try again.")) Eventually(session).Should(Exit(1)) - //And I am still logged in + // And I am still logged in targetSession := helpers.CF("target") Eventually(targetSession).Should(Exit(0)) }) diff --git a/integration/v7/selfcontained/api_command_test.go b/integration/v7/selfcontained/api_command_test.go new file mode 100644 index 00000000000..3347cb83b1a --- /dev/null +++ b/integration/v7/selfcontained/api_command_test.go @@ -0,0 +1,99 @@ +package selfcontained_test + +import ( + "net/http" + + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/integration/v7/selfcontained/fake" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gexec" +) + +var _ = Describe("cf api", func() { + var apiConfig fake.CFAPIConfig + + BeforeEach(func() { + apiConfig = fake.CFAPIConfig{ + Routes: map[string]fake.Response{ + "GET /": {Code: http.StatusOK, Body: ccv3.Info{}}, + }, + } + apiServer.SetConfiguration(apiConfig) + }) + + JustBeforeEach(func() { + Eventually(helpers.CF("api", apiServer.URL())).Should(gexec.Exit(0)) + }) + + It("disables cf-on-k8s in config", func() { + Expect(loadConfig().CFOnK8s.Enabled).To(BeFalse()) + }) + + When("pointed to cf-on-k8s", func() { + BeforeEach(func() { + apiConfig.Routes["GET /"] = fake.Response{ + Code: http.StatusOK, Body: ccv3.Info{CFOnK8s: true}, + } + apiServer.SetConfiguration(apiConfig) + }) + + It("enables cf-on-k8s in config", func() { + Expect(loadConfig().CFOnK8s.Enabled).To(BeTrue()) + }) + }) + + When("already logged into a cf-on-k8s", func() { + BeforeEach(func() { + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.CFOnK8s.Enabled = true + config.ConfigFile.CFOnK8s.AuthInfo = "something" + }) + }) + + It("disables cf-on-k8s in config and clears the auth-info", func() { + Expect(loadConfig().CFOnK8s).To(Equal(configv3.CFOnK8s{ + Enabled: false, + AuthInfo: "", + })) + }) + + When("pointed to cf-on-k8s", func() { + BeforeEach(func() { + apiConfig.Routes["GET /"] = fake.Response{ + Code: http.StatusOK, Body: ccv3.Info{CFOnK8s: true}, + } + apiServer.SetConfiguration(apiConfig) + }) + + It("clears the auth-info", func() { + Expect(loadConfig().CFOnK8s).To(Equal(configv3.CFOnK8s{ + Enabled: true, + AuthInfo: "", + })) + }) + }) + }) +}) + +var _ = Describe("cf api --unset", func() { + BeforeEach(func() { + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.CFOnK8s.Enabled = true + config.ConfigFile.CFOnK8s.AuthInfo = "something" + }) + }) + + JustBeforeEach(func() { + Eventually(helpers.CF("api", "--unset")).Should(gexec.Exit(0)) + }) + + It("disables cf-on-k8s in config and clears the auth-info", func() { + Expect(loadConfig().CFOnK8s).To(Equal(configv3.CFOnK8s{ + Enabled: false, + AuthInfo: "", + })) + }) +}) diff --git a/integration/v7/selfcontained/create_space_command_test.go b/integration/v7/selfcontained/create_space_command_test.go new file mode 100644 index 00000000000..21c7e65ccb4 --- /dev/null +++ b/integration/v7/selfcontained/create_space_command_test.go @@ -0,0 +1,107 @@ +package selfcontained_test + +import ( + "net/http" + "os" + "path/filepath" + + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/integration/v7/selfcontained/fake" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gbytes" + "github.com/onsi/gomega/gexec" + apiv1 "k8s.io/client-go/tools/clientcmd/api/v1" +) + +var _ = Describe("Create Space Command", func() { + Describe("CF-on-k8s", func() { + var ( + kubeConfigPath string + kubeConfig apiv1.Config + session *gexec.Session + apiConfig fake.CFAPIConfig + ) + + BeforeEach(func() { + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.Target = apiServer.URL() + config.ConfigFile.CFOnK8s.Enabled = true + config.ConfigFile.CFOnK8s.AuthInfo = "my-auth" + config.ConfigFile.TargetedOrganization.GUID = "org-guid" + config.ConfigFile.TargetedOrganization.Name = "my-org" + }) + + apiConfig = fake.CFAPIConfig{ + Routes: map[string]fake.Response{ + "POST /v3/spaces": {Code: http.StatusCreated}, + "POST /v3/roles": {Code: http.StatusCreated}, + "GET /whoami": { + Code: http.StatusOK, Body: map[string]interface{}{ + "name": "my-user", + "kind": "User", + }, + }, + }, + } + apiServer.SetConfiguration(apiConfig) + + kubeConfig = apiv1.Config{ + Kind: "Config", + APIVersion: "v1", + AuthInfos: []apiv1.NamedAuthInfo{ + { + Name: "my-auth", + AuthInfo: apiv1.AuthInfo{ + Token: "foo", + }, + }, + }, + Clusters: []apiv1.NamedCluster{ + { + Name: "my-cluster", + Cluster: apiv1.Cluster{ + Server: "https://example.org", + }, + }, + }, + Contexts: []apiv1.NamedContext{ + { + Name: "my-context", + Context: apiv1.Context{ + Cluster: "my-cluster", + AuthInfo: "my-auth", + Namespace: "my-namespace", + }, + }, + }, + CurrentContext: "my-context", + } + + kubeConfigPath := filepath.Join(homeDir, ".kube", "config") + storeKubeConfig(kubeConfig, kubeConfigPath) + + env = helpers.CFEnv{ + EnvVars: map[string]string{ + "KUBECONFIG": kubeConfigPath, + }, + } + }) + + JustBeforeEach(func() { + session = helpers.CustomCF(env, "create-space", "my-space") + }) + + AfterEach(func() { + Expect(os.RemoveAll(kubeConfigPath)).To(Succeed()) + }) + + It("creates a role using the name from the /whoami endpoint", func() { + Eventually(session).Should(gexec.Exit(0)) + + Expect(session).To(gbytes.Say("Assigning role SpaceManager to user my-user in org my-org")) + Expect(session).To(gbytes.Say("Assigning role SpaceDeveloper to user my-user in org my-org")) + }) + }) +}) diff --git a/integration/v7/selfcontained/fake/cf_api.go b/integration/v7/selfcontained/fake/cf_api.go new file mode 100644 index 00000000000..5fecd07102a --- /dev/null +++ b/integration/v7/selfcontained/fake/cf_api.go @@ -0,0 +1,68 @@ +package fake + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + + . "github.com/onsi/gomega" + "github.com/onsi/gomega/ghttp" +) + +type CFAPI struct { + server *ghttp.Server +} + +type CFAPIConfig struct { + Routes map[string]Response +} + +type Response struct { + Code int + Body interface{} +} + +func NewCFAPI() *CFAPI { + server := ghttp.NewServer() + return &CFAPI{ + server: server, + } +} + +func (a *CFAPI) SetConfiguration(config CFAPIConfig) { + a.server.Reset() + + for request, response := range config.Routes { + method, path := parseRequest(request) + responseBytes, err := json.Marshal(response.Body) + Expect(err).NotTo(HaveOccurred()) + + a.server.RouteToHandler(method, path, ghttp.RespondWith(response.Code, responseBytes)) + } +} + +func (a *CFAPI) Close() { + a.server.Close() +} + +func (a *CFAPI) URL() string { + return a.server.URL() +} + +func (a *CFAPI) ReceivedRequests() map[string][]*http.Request { + result := map[string][]*http.Request{} + + for _, req := range a.server.ReceivedRequests() { + key := fmt.Sprintf("%s %s", req.Method, req.URL.Path) + result[key] = append(result[key], req) + } + + return result +} + +func parseRequest(request string) (string, string) { + fields := strings.Split(request, " ") + Expect(fields).To(HaveLen(2)) + return fields[0], fields[1] +} diff --git a/integration/v7/selfcontained/kubernetes_auth_test.go b/integration/v7/selfcontained/kubernetes_auth_test.go new file mode 100644 index 00000000000..113c8e4f175 --- /dev/null +++ b/integration/v7/selfcontained/kubernetes_auth_test.go @@ -0,0 +1,106 @@ +package selfcontained_test + +import ( + "net/http" + "path/filepath" + + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/integration/v7/selfcontained/fake" + "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gexec" + apiv1 "k8s.io/client-go/tools/clientcmd/api/v1" +) + +var _ = Describe("auth-provider", func() { + var ( + apiConfig fake.CFAPIConfig + kubeConfig apiv1.Config + ) + + BeforeEach(func() { + apiConfig = fake.CFAPIConfig{ + Routes: map[string]fake.Response{ + "GET /v3/apps": { + Code: http.StatusOK, Body: map[string]interface{}{ + "pagination": map[string]interface{}{}, + "resources": []resources.Application{}, + }, + }, + }, + } + apiServer.SetConfiguration(apiConfig) + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.Target = apiServer.URL() + config.ConfigFile.CFOnK8s.Enabled = true + config.ConfigFile.CFOnK8s.AuthInfo = "one" + config.ConfigFile.TargetedOrganization = configv3.Organization{ + GUID: "my-org", + Name: "My Org", + } + + config.ConfigFile.TargetedSpace = configv3.Space{ + GUID: "my-space", + Name: "My Space", + } + }) + + kubeConfig = apiv1.Config{ + Kind: "Config", + APIVersion: "v1", + AuthInfos: []apiv1.NamedAuthInfo{ + { + Name: "one", AuthInfo: apiv1.AuthInfo{ + AuthProvider: &apiv1.AuthProviderConfig{ + Name: "oidc", + Config: map[string]string{ + "id-token": string(token), + "idp-issuer-url": "-", + "client-id": "-", + }, + }, + }, + }, + }, + Clusters: []apiv1.NamedCluster{ + { + Name: "my-cluster", + Cluster: apiv1.Cluster{ + Server: "https://example.org", + }, + }, + }, + Contexts: []apiv1.NamedContext{ + { + Name: "my-context", + Context: apiv1.Context{ + Cluster: "my-cluster", + AuthInfo: "my-auth-info", + Namespace: "my-namespace", + }, + }, + }, + CurrentContext: "my-context", + } + kubeConfigPath := filepath.Join(homeDir, ".kube", "config") + storeKubeConfig(kubeConfig, kubeConfigPath) + + env = helpers.CFEnv{ + EnvVars: map[string]string{ + "KUBECONFIG": kubeConfigPath, + }, + } + }) + + JustBeforeEach(func() { + Eventually(helpers.CustomCF(env, "apps")).Should(gexec.Exit(0)) + }) + + It("sends the Bearer token in the Authorization header", func() { + reqs := apiServer.ReceivedRequests()["GET /v3/apps"] + Expect(reqs).To(HaveLen(1)) + Expect(reqs[0].Header).To(HaveKeyWithValue("Authorization", ConsistOf("Bearer "+string(token)))) + }) +}) diff --git a/integration/v7/selfcontained/login_command_test.go b/integration/v7/selfcontained/login_command_test.go new file mode 100644 index 00000000000..5e41d783fec --- /dev/null +++ b/integration/v7/selfcontained/login_command_test.go @@ -0,0 +1,165 @@ +package selfcontained_test + +import ( + "fmt" + "net/http" + "os" + "path/filepath" + + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/integration/v7/selfcontained/fake" + "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gbytes" + "github.com/onsi/gomega/gexec" + apiv1 "k8s.io/client-go/tools/clientcmd/api/v1" +) + +var _ = Describe("LoginCommand", func() { + Describe("CF-on-k8s", func() { + var ( + stdin *gbytes.Buffer + kubeConfigPath string + kubeConfig apiv1.Config + session *gexec.Session + loginArgs []string + apiConfig fake.CFAPIConfig + ) + + BeforeEach(func() { + loginArgs = []string{"login"} + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.Target = apiServer.URL() + config.ConfigFile.CFOnK8s.Enabled = true + }) + + apiConfig = fake.CFAPIConfig{ + Routes: map[string]fake.Response{ + "GET /": {Code: http.StatusOK, Body: ccv3.Info{CFOnK8s: true}}, + "GET /v3/organizations": { + Code: http.StatusOK, Body: map[string]interface{}{ + "pagination": map[string]interface{}{}, + "resources": []resources.Organization{}, + }, + }, + }, + } + apiServer.SetConfiguration(apiConfig) + + kubeConfig = apiv1.Config{ + Kind: "Config", + APIVersion: "v1", + AuthInfos: []apiv1.NamedAuthInfo{ + { + Name: "one", + AuthInfo: apiv1.AuthInfo{ + Token: "foo", + }, + }, + { + Name: "two", + AuthInfo: apiv1.AuthInfo{ + AuthProvider: &apiv1.AuthProviderConfig{ + Name: "oidc", + Config: map[string]string{ + "id-token": string(token), + "idp-issuer-url": "-", + "client-id": "-", + }, + }, + }, + }, + }, + Clusters: []apiv1.NamedCluster{ + { + Name: "my-cluster", + Cluster: apiv1.Cluster{ + Server: "https://example.org", + }, + }, + }, + Contexts: []apiv1.NamedContext{ + { + Name: "my-context", + Context: apiv1.Context{ + Cluster: "my-cluster", + AuthInfo: "my-auth-info", + Namespace: "my-namespace", + }, + }, + }, + CurrentContext: "my-context", + } + + kubeConfigPath := filepath.Join(homeDir, ".kube", "config") + storeKubeConfig(kubeConfig, kubeConfigPath) + + stdin = gbytes.NewBuffer() + _, wErr := fmt.Fprintf(stdin, "%d\n", 2) + Expect(wErr).ToNot(HaveOccurred()) + + env = helpers.CFEnv{ + Stdin: stdin, + EnvVars: map[string]string{ + "KUBECONFIG": kubeConfigPath, + }, + } + }) + + JustBeforeEach(func() { + session = helpers.CustomCF(env, loginArgs...) + }) + + AfterEach(func() { + Expect(os.RemoveAll(kubeConfigPath)).To(Succeed()) + }) + + It("prompts the user to select a user from the kube config file", func() { + Eventually(session).Should(gbytes.Say("1. one")) + Eventually(session).Should(gbytes.Say("2. two")) + Eventually(session).Should(gbytes.Say("Choose your Kubernetes authentication info")) + Eventually(session).Should(gbytes.Say("OK")) + Eventually(session).Should(gexec.Exit(0)) + }) + + It("sets the user into the configuration", func() { + Eventually(session).Should(gexec.Exit(0)) + Expect(loadConfig().CFOnK8s.AuthInfo).To(Equal("two")) + }) + + It("displays the logged in user", func() { + Eventually(session).Should(gbytes.Say("user:(\\s*)two")) + }) + + When("the kubeconfig contains no user information", func() { + BeforeEach(func() { + kubeConfig.AuthInfos = []apiv1.NamedAuthInfo{} + storeKubeConfig(kubeConfig, filepath.Join(homeDir, ".kube", "config")) + }) + + It("displays an error", func() { + Eventually(session.Err).Should(gbytes.Say("Unable to authenticate.")) + Eventually(session).Should(gbytes.Say("FAILED")) + Eventually(session).Should(gexec.Exit(1)) + }) + }) + + When("providing -a flag without having targeted the api before", func() { + BeforeEach(func() { + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.Target = "" + config.ConfigFile.CFOnK8s = configv3.CFOnK8s{} + }) + + loginArgs = append(loginArgs, "-a", apiServer.URL()) + }) + + It("displays the logged in user", func() { + Eventually(session).Should(gbytes.Say("user:(\\s*)two")) + }) + }) + }) +}) diff --git a/integration/v7/selfcontained/logout_command_test.go b/integration/v7/selfcontained/logout_command_test.go new file mode 100644 index 00000000000..55e53f35a5d --- /dev/null +++ b/integration/v7/selfcontained/logout_command_test.go @@ -0,0 +1,29 @@ +package selfcontained_test + +import ( + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gexec" +) + +var _ = Describe("cf logout", func() { + BeforeEach(func() { + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.CFOnK8s.Enabled = true + config.ConfigFile.CFOnK8s.AuthInfo = "something" + }) + }) + + JustBeforeEach(func() { + Eventually(helpers.CF("logout")).Should(gexec.Exit(0)) + }) + + It("clears the auth-info", func() { + Expect(loadConfig().CFOnK8s).To(Equal(configv3.CFOnK8s{ + Enabled: true, + AuthInfo: "", + })) + }) +}) diff --git a/integration/v7/selfcontained/selfcontained_suite_test.go b/integration/v7/selfcontained/selfcontained_suite_test.go new file mode 100644 index 00000000000..403915d2aed --- /dev/null +++ b/integration/v7/selfcontained/selfcontained_suite_test.go @@ -0,0 +1,113 @@ +package selfcontained_test + +import ( + "bytes" + "crypto/rand" + "crypto/rsa" + "encoding/base64" + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "code.cloudfoundry.org/cli/integration/helpers" + "code.cloudfoundry.org/cli/integration/v7/selfcontained/fake" + "code.cloudfoundry.org/cli/util/configv3" + "github.com/SermoDigital/jose/crypto" + "github.com/SermoDigital/jose/jws" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "gopkg.in/yaml.v2" + apiv1 "k8s.io/client-go/tools/clientcmd/api/v1" +) + +var ( + homeDir string + apiServer *fake.CFAPI + env helpers.CFEnv + token []byte +) + +func TestSelfcontained(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Selfcontained Suite") +} + +var _ = BeforeEach(func() { + homeDir = helpers.SetHomeDir() + apiServer = fake.NewCFAPI() + helpers.SetConfig(func(config *configv3.Config) { + config.ConfigFile.Target = apiServer.URL() + }) + + keyPair, err := rsa.GenerateKey(rand.Reader, 2048) + Expect(err).NotTo(HaveOccurred()) + + jwt := jws.NewJWT(jws.Claims{ + "exp": time.Now().Add(time.Hour).Unix(), + }, crypto.SigningMethodRS256) + token, err = jwt.Serialize(keyPair) + Expect(err).NotTo(HaveOccurred()) +}) + +var _ = AfterEach(func() { + apiServer.Close() + helpers.DestroyHomeDir(homeDir) +}) + +func loadConfig() configv3.JSONConfig { + rawConfig, err := ioutil.ReadFile(filepath.Join(homeDir, ".cf", "config.json")) + Expect(err).NotTo(HaveOccurred()) + + var configFile configv3.JSONConfig + Expect(json.Unmarshal(rawConfig, &configFile)).To(Succeed()) + + return configFile +} + +func storeKubeConfig(kubeconfig apiv1.Config, kubeConfigPath string) { + Expect(os.MkdirAll(filepath.Dir(kubeConfigPath), 0o755)).To(Succeed()) + kubeConfigFile, err := os.OpenFile(kubeConfigPath, os.O_CREATE|os.O_WRONLY, 0o755) + Expect(kubeConfigFile.Truncate(0)).To(Succeed()) + Expect(err).NotTo(HaveOccurred()) + + // we need to serialise the config to JSON as the Config type only has json annotations (and no yaml ones) + // However, during json serialisation, byte arrays are base64 encoded which is not a desired side effect. + // In order to address this, we base64 decode them in advance + kubeconfig = base64DecodeClientCertByteArrays(kubeconfig) + var buf bytes.Buffer + err = json.NewEncoder(&buf).Encode(kubeconfig) + Expect(err).NotTo(HaveOccurred()) + + var configmap map[string]interface{} + err = json.Unmarshal(buf.Bytes(), &configmap) + Expect(err).NotTo(HaveOccurred()) + + // now we can save the config as yaml + err = yaml.NewEncoder(kubeConfigFile).Encode(configmap) + Expect(err).NotTo(HaveOccurred()) + Expect(kubeConfigFile.Close()).To(Succeed()) +} + +func base64DecodeClientCertByteArrays(kubeconfig apiv1.Config) apiv1.Config { + decodedAuthInfos := []apiv1.NamedAuthInfo{} + for _, authInfo := range kubeconfig.AuthInfos { + if len(authInfo.AuthInfo.ClientCertificateData) > 0 { + decodedCertData, err := base64.StdEncoding.DecodeString(string(authInfo.AuthInfo.ClientCertificateData)) + Expect(err).NotTo(HaveOccurred()) + authInfo.AuthInfo.ClientCertificateData = decodedCertData + } + if len(authInfo.AuthInfo.ClientKeyData) > 0 { + decodedKeyData, err := base64.StdEncoding.DecodeString(string(authInfo.AuthInfo.ClientKeyData)) + Expect(err).NotTo(HaveOccurred()) + authInfo.AuthInfo.ClientKeyData = decodedKeyData + } + + decodedAuthInfos = append(decodedAuthInfos, authInfo) + } + + kubeconfig.AuthInfos = decodedAuthInfos + return kubeconfig +} diff --git a/resources/user_resource.go b/resources/user_resource.go index cc6d9c6fa50..602aaa67919 100644 --- a/resources/user_resource.go +++ b/resources/user_resource.go @@ -8,3 +8,8 @@ type User struct { PresentationName string `json:"presentation_name"` Origin string `json:"origin"` } + +type K8sUser struct { + Name string `json:"name"` + Kind string `json:"kind"` +} diff --git a/util/configv3/config.go b/util/configv3/config.go index eeb6da99ea9..c6afb35ff5d 100644 --- a/util/configv3/config.go +++ b/util/configv3/config.go @@ -8,6 +8,13 @@ import ( "code.cloudfoundry.org/cli/version" ) +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . UserConfig + +type UserConfig interface { + CurrentUser() (User, error) + CurrentUserName() (string, error) +} + // Config combines the settings taken from the .cf/config.json, os.ENV, and the // plugin config. type Config struct { @@ -24,6 +31,8 @@ type Config struct { detectedSettings detectedSettings pluginsConfig PluginsConfig + + UserConfig } // BinaryVersion is the current version of the CF binary. @@ -97,3 +106,7 @@ func (config *Config) Verbose() (bool, []string) { return verbose, filePath } + +func (config *Config) SetKubernetesAuthInfo(authInfo string) { + config.ConfigFile.CFOnK8s.AuthInfo = authInfo +} diff --git a/util/configv3/config_test.go b/util/configv3/config_test.go index a646536f20a..b8f6e35aff2 100644 --- a/util/configv3/config_test.go +++ b/util/configv3/config_test.go @@ -3,8 +3,7 @@ package configv3_test import ( "os" - . "code.cloudfoundry.org/cli/util/configv3" - + "code.cloudfoundry.org/cli/util/configv3" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -12,7 +11,7 @@ import ( var _ = Describe("Config", func() { var ( homeDir string - config *Config + config *configv3.Config ) BeforeEach(func() { @@ -28,7 +27,7 @@ var _ = Describe("Config", func() { Expect(os.Setenv("FORCE_TTY", "true")).ToNot(HaveOccurred()) var err error - config, err = LoadConfig() + config, err = configv3.LoadConfig() Expect(err).ToNot(HaveOccurred()) Expect(config).ToNot(BeNil()) }) @@ -41,4 +40,20 @@ var _ = Describe("Config", func() { Expect(config.IsTTY()).To(BeTrue()) }) }) + + Describe("SetKubernetesAuthInfo", func() { + BeforeEach(func() { + var err error + config, err = configv3.LoadConfig() + Expect(err).NotTo(HaveOccurred()) + }) + + JustBeforeEach(func() { + config.SetKubernetesAuthInfo("k8s-auth") + }) + + It("sets the cf-on-k8s auth info", func() { + Expect(config.ConfigFile.CFOnK8s.AuthInfo).To(Equal("k8s-auth")) + }) + }) }) diff --git a/util/configv3/configv3fakes/fake_user_config.go b/util/configv3/configv3fakes/fake_user_config.go new file mode 100644 index 00000000000..72198fbd8a0 --- /dev/null +++ b/util/configv3/configv3fakes/fake_user_config.go @@ -0,0 +1,175 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package configv3fakes + +import ( + "sync" + + "code.cloudfoundry.org/cli/util/configv3" +) + +type FakeUserConfig struct { + CurrentUserStub func() (configv3.User, error) + currentUserMutex sync.RWMutex + currentUserArgsForCall []struct { + } + currentUserReturns struct { + result1 configv3.User + result2 error + } + currentUserReturnsOnCall map[int]struct { + result1 configv3.User + result2 error + } + CurrentUserNameStub func() (string, error) + currentUserNameMutex sync.RWMutex + currentUserNameArgsForCall []struct { + } + currentUserNameReturns struct { + result1 string + result2 error + } + currentUserNameReturnsOnCall map[int]struct { + result1 string + result2 error + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeUserConfig) CurrentUser() (configv3.User, error) { + fake.currentUserMutex.Lock() + ret, specificReturn := fake.currentUserReturnsOnCall[len(fake.currentUserArgsForCall)] + fake.currentUserArgsForCall = append(fake.currentUserArgsForCall, struct { + }{}) + fake.recordInvocation("CurrentUser", []interface{}{}) + fake.currentUserMutex.Unlock() + if fake.CurrentUserStub != nil { + return fake.CurrentUserStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.currentUserReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeUserConfig) CurrentUserCallCount() int { + fake.currentUserMutex.RLock() + defer fake.currentUserMutex.RUnlock() + return len(fake.currentUserArgsForCall) +} + +func (fake *FakeUserConfig) CurrentUserCalls(stub func() (configv3.User, error)) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = stub +} + +func (fake *FakeUserConfig) CurrentUserReturns(result1 configv3.User, result2 error) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = nil + fake.currentUserReturns = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + +func (fake *FakeUserConfig) CurrentUserReturnsOnCall(i int, result1 configv3.User, result2 error) { + fake.currentUserMutex.Lock() + defer fake.currentUserMutex.Unlock() + fake.CurrentUserStub = nil + if fake.currentUserReturnsOnCall == nil { + fake.currentUserReturnsOnCall = make(map[int]struct { + result1 configv3.User + result2 error + }) + } + fake.currentUserReturnsOnCall[i] = struct { + result1 configv3.User + result2 error + }{result1, result2} +} + +func (fake *FakeUserConfig) CurrentUserName() (string, error) { + fake.currentUserNameMutex.Lock() + ret, specificReturn := fake.currentUserNameReturnsOnCall[len(fake.currentUserNameArgsForCall)] + fake.currentUserNameArgsForCall = append(fake.currentUserNameArgsForCall, struct { + }{}) + fake.recordInvocation("CurrentUserName", []interface{}{}) + fake.currentUserNameMutex.Unlock() + if fake.CurrentUserNameStub != nil { + return fake.CurrentUserNameStub() + } + if specificReturn { + return ret.result1, ret.result2 + } + fakeReturns := fake.currentUserNameReturns + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeUserConfig) CurrentUserNameCallCount() int { + fake.currentUserNameMutex.RLock() + defer fake.currentUserNameMutex.RUnlock() + return len(fake.currentUserNameArgsForCall) +} + +func (fake *FakeUserConfig) CurrentUserNameCalls(stub func() (string, error)) { + fake.currentUserNameMutex.Lock() + defer fake.currentUserNameMutex.Unlock() + fake.CurrentUserNameStub = stub +} + +func (fake *FakeUserConfig) CurrentUserNameReturns(result1 string, result2 error) { + fake.currentUserNameMutex.Lock() + defer fake.currentUserNameMutex.Unlock() + fake.CurrentUserNameStub = nil + fake.currentUserNameReturns = struct { + result1 string + result2 error + }{result1, result2} +} + +func (fake *FakeUserConfig) CurrentUserNameReturnsOnCall(i int, result1 string, result2 error) { + fake.currentUserNameMutex.Lock() + defer fake.currentUserNameMutex.Unlock() + fake.CurrentUserNameStub = nil + if fake.currentUserNameReturnsOnCall == nil { + fake.currentUserNameReturnsOnCall = make(map[int]struct { + result1 string + result2 error + }) + } + fake.currentUserNameReturnsOnCall[i] = struct { + result1 string + result2 error + }{result1, result2} +} + +func (fake *FakeUserConfig) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.currentUserMutex.RLock() + defer fake.currentUserMutex.RUnlock() + fake.currentUserNameMutex.RLock() + defer fake.currentUserNameMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeUserConfig) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ configv3.UserConfig = new(FakeUserConfig) diff --git a/util/configv3/default_user_config.go b/util/configv3/default_user_config.go new file mode 100644 index 00000000000..f2d96dfb2a6 --- /dev/null +++ b/util/configv3/default_user_config.go @@ -0,0 +1,58 @@ +package configv3 + +import ( + "github.com/SermoDigital/jose/jws" +) + +type DefaultUserConfig struct { + // ConfigFile stores the configuration from the .cf/config + ConfigFile *JSONConfig +} + +// CurrentUser returns user information decoded from the JWT access token in +// .cf/config.json. +func (config DefaultUserConfig) CurrentUser() (User, error) { + return decodeUserFromJWT(config.ConfigFile.AccessToken) +} + +// CurrentUserName returns the name of a user as returned by CurrentUser() +func (config DefaultUserConfig) CurrentUserName() (string, error) { + user, err := config.CurrentUser() + if err != nil { + return "", err + } + return user.Name, nil +} + +func decodeUserFromJWT(accessToken string) (User, error) { + if accessToken == "" { + return User{}, nil + } + + token, err := jws.ParseJWT([]byte(accessToken[7:])) + if err != nil { + return User{}, err + } + + claims := token.Claims() + + var name, GUID, origin string + var isClient bool + if claims.Has("user_name") { + name = claims.Get("user_name").(string) + GUID = claims.Get("user_id").(string) + origin = claims.Get("origin").(string) + isClient = false + } else { + name = claims.Get("client_id").(string) + GUID = name + isClient = true + } + + return User{ + Name: name, + GUID: GUID, + Origin: origin, + IsClient: isClient, + }, nil +} diff --git a/util/configv3/default_user_config_test.go b/util/configv3/default_user_config_test.go new file mode 100644 index 00000000000..350a94b6ff0 --- /dev/null +++ b/util/configv3/default_user_config_test.go @@ -0,0 +1,98 @@ +package configv3_test + +import ( + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("DefaultUserConfig", func() { + var config configv3.DefaultUserConfig + + Describe("CurrentUser", func() { + When("using client credentials and the user token is set", func() { + It("returns the user", func() { + config = configv3.DefaultUserConfig{ + ConfigFile: &configv3.JSONConfig{ + AccessToken: AccessTokenForClientUsers, + }, + } + user, err := config.CurrentUser() + Expect(err).ToNot(HaveOccurred()) + Expect(user).To(Equal(configv3.User{ + Name: "potato-face", + GUID: "potato-face", + IsClient: true, + })) + }) + }) + + When("using user/password and the user token is set", func() { + It("returns the user", func() { + config = configv3.DefaultUserConfig{ + ConfigFile: &configv3.JSONConfig{ + AccessToken: AccessTokenForHumanUsers, + }, + } + + user, err := config.CurrentUser() + Expect(err).ToNot(HaveOccurred()) + Expect(user).To(Equal(configv3.User{ + Name: "admin", + GUID: "9519be3e-44d9-40d0-ab9a-f4ace11df159", + Origin: "uaa", + IsClient: false, + })) + }) + }) + + When("the user token is blank", func() { + It("returns the user", func() { + config = configv3.DefaultUserConfig{ConfigFile: &configv3.JSONConfig{}} + + user, err := config.CurrentUser() + Expect(err).ToNot(HaveOccurred()) + Expect(user).To(Equal(configv3.User{})) + }) + }) + }) + + Describe("CurrentUserName", func() { + When("using client credentials and the user token is set", func() { + It("returns the username", func() { + config = configv3.DefaultUserConfig{ + ConfigFile: &configv3.JSONConfig{ + AccessToken: AccessTokenForClientUsers, + }, + } + + username, err := config.CurrentUserName() + Expect(err).ToNot(HaveOccurred()) + Expect(username).To(Equal("potato-face")) + }) + }) + + When("using user/password and the user token is set", func() { + It("returns the username", func() { + config = configv3.DefaultUserConfig{ + ConfigFile: &configv3.JSONConfig{ + AccessToken: AccessTokenForHumanUsers, + }, + } + + username, err := config.CurrentUserName() + Expect(err).ToNot(HaveOccurred()) + Expect(username).To(Equal("admin")) + }) + }) + + When("the user token is blank", func() { + It("returns an empty string", func() { + config = configv3.DefaultUserConfig{ConfigFile: &configv3.JSONConfig{}} + username, err := config.CurrentUserName() + Expect(err).ToNot(HaveOccurred()) + Expect(username).To(BeEmpty()) + }) + }) + }) +}) diff --git a/util/configv3/dynamic_user_config.go b/util/configv3/dynamic_user_config.go new file mode 100644 index 00000000000..86c6ea538fb --- /dev/null +++ b/util/configv3/dynamic_user_config.go @@ -0,0 +1,22 @@ +package configv3 + +type DynamicUserConfig struct { + ConfigFile *JSONConfig + DefaultUserConfig UserConfig + KubernetesUserConfig UserConfig +} + +func (config DynamicUserConfig) CurrentUser() (User, error) { + return config.pickConfig().CurrentUser() +} + +func (config DynamicUserConfig) CurrentUserName() (string, error) { + return config.pickConfig().CurrentUserName() +} + +func (config DynamicUserConfig) pickConfig() UserConfig { + if config.ConfigFile.CFOnK8s.Enabled { + return config.KubernetesUserConfig + } + return config.DefaultUserConfig +} diff --git a/util/configv3/dynamic_user_config_test.go b/util/configv3/dynamic_user_config_test.go new file mode 100644 index 00000000000..907250acb10 --- /dev/null +++ b/util/configv3/dynamic_user_config_test.go @@ -0,0 +1,137 @@ +package configv3_test + +import ( + "errors" + + "code.cloudfoundry.org/cli/util/configv3" + "code.cloudfoundry.org/cli/util/configv3/configv3fakes" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("DynamicUserConfig", func() { + var ( + fakeDefaultUserConfig *configv3fakes.FakeUserConfig + fakeKubernetesUserConfig *configv3fakes.FakeUserConfig + jsonConfig *configv3.JSONConfig + dynamicUserConfig configv3.DynamicUserConfig + err error + ) + + BeforeEach(func() { + fakeDefaultUserConfig = new(configv3fakes.FakeUserConfig) + fakeDefaultUserConfig.CurrentUserReturns(configv3.User{Name: "default-user"}, nil) + fakeDefaultUserConfig.CurrentUserNameReturns("default-user", nil) + + fakeKubernetesUserConfig = new(configv3fakes.FakeUserConfig) + fakeKubernetesUserConfig.CurrentUserReturns(configv3.User{Name: "kubernetes-user"}, nil) + fakeKubernetesUserConfig.CurrentUserNameReturns("kubernetes-user", nil) + + jsonConfig = &configv3.JSONConfig{} + dynamicUserConfig = configv3.DynamicUserConfig{ + ConfigFile: jsonConfig, + DefaultUserConfig: fakeDefaultUserConfig, + KubernetesUserConfig: fakeKubernetesUserConfig, + } + }) + + Describe("CurrentUser", func() { + var currentUser configv3.User + + JustBeforeEach(func() { + currentUser, err = dynamicUserConfig.CurrentUser() + }) + + When("using a default config", func() { + BeforeEach(func() { + jsonConfig.CFOnK8s.Enabled = false + }) + + It("delegates to the default UserConfig", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(currentUser.Name).To(Equal("default-user")) + }) + + When("the default UserConfig fails", func() { + BeforeEach(func() { + fakeDefaultUserConfig.CurrentUserReturns(configv3.User{}, errors.New("current-user-err")) + }) + + It("returns the error", func() { + Expect(err).To(MatchError("current-user-err")) + }) + }) + }) + + When("using a Kubernetes config", func() { + BeforeEach(func() { + jsonConfig.CFOnK8s.Enabled = true + }) + + It("delegates to the Kubernetes UserConfig", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(currentUser.Name).To(Equal("kubernetes-user")) + }) + + When("the Kubernetes UserConfig fails", func() { + BeforeEach(func() { + fakeKubernetesUserConfig.CurrentUserReturns(configv3.User{}, errors.New("current-user-err")) + }) + + It("returns the error", func() { + Expect(err).To(MatchError("current-user-err")) + }) + }) + }) + }) + + Describe("CurrentUserName", func() { + var currentUserName string + + JustBeforeEach(func() { + currentUserName, err = dynamicUserConfig.CurrentUserName() + }) + + When("using a default config", func() { + BeforeEach(func() { + jsonConfig.CFOnK8s.Enabled = false + }) + + It("delegates to the default UserConfig", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(currentUserName).To(Equal("default-user")) + }) + + When("the default UserConfig fails", func() { + BeforeEach(func() { + fakeDefaultUserConfig.CurrentUserNameReturns("", errors.New("current-username-err")) + }) + + It("returns the error", func() { + Expect(err).To(MatchError("current-username-err")) + }) + }) + }) + + When("using a Kubernetes config", func() { + BeforeEach(func() { + jsonConfig.CFOnK8s.Enabled = true + }) + + It("delegates to the Kubernetes UserConfig", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(currentUserName).To(Equal("kubernetes-user")) + }) + + When("the Kubernetes UserConfig fails", func() { + BeforeEach(func() { + fakeKubernetesUserConfig.CurrentUserNameReturns("", errors.New("current-username-err")) + }) + + It("returns the error", func() { + Expect(err).To(MatchError("current-username-err")) + }) + }) + }) + }) +}) diff --git a/util/configv3/json_config.go b/util/configv3/json_config.go index ff147958810..c672de98ad9 100644 --- a/util/configv3/json_config.go +++ b/util/configv3/json_config.go @@ -2,8 +2,6 @@ package configv3 import ( "time" - - "github.com/SermoDigital/jose/jws" ) // JSONConfig represents .cf/config.json. @@ -12,6 +10,7 @@ type JSONConfig struct { APIVersion string `json:"APIVersion"` AsyncTimeout int `json:"AsyncTimeout"` AuthorizationEndpoint string `json:"AuthorizationEndpoint"` + CFOnK8s CFOnK8s `json:"CFOnK8s"` ColorEnabled string `json:"ColorEnabled"` ConfigVersion int `json:"ConfigVersion"` DopplerEndpoint string `json:"DopplerEndPoint"` @@ -71,21 +70,6 @@ func (config *Config) AuthorizationEndpoint() string { return config.ConfigFile.AuthorizationEndpoint } -// CurrentUser returns user information decoded from the JWT access token in -// .cf/config.json. -func (config *Config) CurrentUser() (User, error) { - return decodeUserFromJWT(config.ConfigFile.AccessToken) -} - -// CurrentUserName returns the name of a user as returned by CurrentUser() -func (config *Config) CurrentUserName() (string, error) { - user, err := config.CurrentUser() - if err != nil { - return "", err - } - return user.Name, nil -} - // HasTargetedOrganization returns true if the organization is set. func (config *Config) HasTargetedOrganization() bool { return config.ConfigFile.TargetedOrganization.GUID != "" @@ -192,6 +176,7 @@ type TargetInformationArgs struct { Routing string SkipSSLValidation bool UAA string + CFOnK8s bool } // SetTargetInformation sets the currently targeted CC API and related other @@ -213,6 +198,8 @@ func (config *Config) SetTargetInformation(args TargetInformationArgs) { // ever read from there. config.ConfigFile.AuthorizationEndpoint = args.Auth + config.ConfigFile.CFOnK8s.Enabled = args.CFOnK8s + config.UnsetOrganizationAndSpaceInformation() } @@ -317,9 +304,9 @@ func (config *Config) UnsetUserInformation() { config.SetRefreshToken("") config.SetUAAGrantType("") config.SetUAAClientCredentials(DefaultUAAOAuthClient, DefaultUAAOAuthClientSecret) + config.SetKubernetesAuthInfo("") config.UnsetOrganizationAndSpaceInformation() - } // V7SetSpaceInformation sets the currently targeted space. @@ -327,36 +314,3 @@ func (config *Config) V7SetSpaceInformation(guid string, name string) { config.ConfigFile.TargetedSpace.GUID = guid config.ConfigFile.TargetedSpace.Name = name } - -func decodeUserFromJWT(accessToken string) (User, error) { - if accessToken == "" { - return User{}, nil - } - - token, err := jws.ParseJWT([]byte(accessToken[7:])) - if err != nil { - return User{}, err - } - - claims := token.Claims() - - var name, GUID, origin string - var isClient bool - if claims.Has("user_name") { - name = claims.Get("user_name").(string) - GUID = claims.Get("user_id").(string) - origin = claims.Get("origin").(string) - isClient = false - } else { - name = claims.Get("client_id").(string) - GUID = name - isClient = true - } - - return User{ - Name: name, - GUID: GUID, - Origin: origin, - IsClient: isClient, - }, nil -} diff --git a/util/configv3/json_config_test.go b/util/configv3/json_config_test.go index 9662c878252..19c16b1c420 100644 --- a/util/configv3/json_config_test.go +++ b/util/configv3/json_config_test.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "code.cloudfoundry.org/cli/util/configv3" . "code.cloudfoundry.org/cli/util/configv3" . "github.com/onsi/ginkgo" @@ -50,92 +51,6 @@ var _ = Describe("JSONConfig", func() { }) }) - Describe("CurrentUser", func() { - When("using client credentials and the user token is set", func() { - It("returns the user", func() { - config = &Config{ - ConfigFile: JSONConfig{ - AccessToken: AccessTokenForClientUsers, - }, - } - user, err := config.CurrentUser() - Expect(err).ToNot(HaveOccurred()) - Expect(user).To(Equal(User{ - Name: "potato-face", - GUID: "potato-face", - IsClient: true, - })) - }) - }) - - When("using user/password and the user token is set", func() { - It("returns the user", func() { - config = &Config{ - ConfigFile: JSONConfig{ - AccessToken: AccessTokenForHumanUsers, - }, - } - - user, err := config.CurrentUser() - Expect(err).ToNot(HaveOccurred()) - Expect(user).To(Equal(User{ - Name: "admin", - GUID: "9519be3e-44d9-40d0-ab9a-f4ace11df159", - Origin: "uaa", - IsClient: false, - })) - }) - }) - - When("the user token is blank", func() { - It("returns the user", func() { - config = new(Config) - user, err := config.CurrentUser() - Expect(err).ToNot(HaveOccurred()) - Expect(user).To(Equal(User{})) - }) - }) - }) - - Describe("CurrentUserName", func() { - When("using client credentials and the user token is set", func() { - It("returns the username", func() { - config = &Config{ - ConfigFile: JSONConfig{ - AccessToken: AccessTokenForClientUsers, - }, - } - - username, err := config.CurrentUserName() - Expect(err).ToNot(HaveOccurred()) - Expect(username).To(Equal("potato-face")) - }) - }) - - When("using user/password and the user token is set", func() { - It("returns the username", func() { - config = &Config{ - ConfigFile: JSONConfig{ - AccessToken: AccessTokenForHumanUsers, - }, - } - - username, err := config.CurrentUserName() - Expect(err).ToNot(HaveOccurred()) - Expect(username).To(Equal("admin")) - }) - }) - - When("the user token is blank", func() { - It("returns an empty string", func() { - config = new(Config) - username, err := config.CurrentUserName() - Expect(err).ToNot(HaveOccurred()) - Expect(username).To(BeEmpty()) - }) - }) - }) - Describe("HasTargetedOrganization", func() { When("an organization is targeted", func() { It("returns true", func() { @@ -307,6 +222,7 @@ var _ = Describe("JSONConfig", func() { LogCache: "https://log-cache.foo.com", Routing: "https://api.foo.com/routing", SkipSSLValidation: true, + CFOnK8s: true, }) Expect(config.ConfigFile.Target).To(Equal("https://api.foo.com")) @@ -323,6 +239,8 @@ var _ = Describe("JSONConfig", func() { Expect(config.ConfigFile.TargetedSpace.GUID).To(BeEmpty()) Expect(config.ConfigFile.TargetedSpace.Name).To(BeEmpty()) Expect(config.ConfigFile.TargetedSpace.AllowSSH).To(BeFalse()) + + Expect(config.ConfigFile.CFOnK8s.Enabled).To(BeTrue()) }) }) @@ -561,6 +479,7 @@ var _ = Describe("JSONConfig", func() { config.SetUAAClientCredentials("some-client", "some-client-secret") config.SetOrganizationInformation("some-org-guid", "some-org") config.SetSpaceInformation("guid-value-1", "my-org-name", true) + config.SetKubernetesAuthInfo("some-auth-info") }) It("resets all user information", func() { @@ -576,6 +495,48 @@ var _ = Describe("JSONConfig", func() { Expect(config.ConfigFile.UAAGrantType).To(BeEmpty()) Expect(config.ConfigFile.UAAOAuthClient).To(Equal(DefaultUAAOAuthClient)) Expect(config.ConfigFile.UAAOAuthClientSecret).To(Equal(DefaultUAAOAuthClientSecret)) + Expect(config.ConfigFile.CFOnK8s.AuthInfo).To(BeEmpty()) + }) + }) + + When("using CF-on-K8s", func() { + var err error + + BeforeEach(func() { + rawConfig := fmt.Sprintf(`{ "CFOnK8s": {"Enabled": true, "AuthInfo": "auth-info-name"}, "ConfigVersion": %d }`, CurrentConfigVersion) + + setConfig(homeDir, rawConfig) + + config, err = LoadConfig() + Expect(err).ToNot(HaveOccurred()) + Expect(config).ToNot(BeNil()) + }) + + Describe("CurrentUser", func() { + var user configv3.User + + JustBeforeEach(func() { + user, err = config.CurrentUser() + }) + + It("returns a user with the auth-info name", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(user.Name).To(Equal("auth-info-name")) + Expect(user.GUID).To(BeEmpty()) + }) + }) + + Describe("CurrentUserName", func() { + var userName string + + JustBeforeEach(func() { + userName, err = config.CurrentUserName() + }) + + It("returns the auth-info name", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(userName).To(Equal("auth-info-name")) + }) }) }) }) diff --git a/util/configv3/k8s.go b/util/configv3/k8s.go new file mode 100644 index 00000000000..e7e69aab33c --- /dev/null +++ b/util/configv3/k8s.go @@ -0,0 +1,10 @@ +package configv3 + +type CFOnK8s struct { + Enabled bool `json:"Enabled"` + AuthInfo string `json:"AuthInfo"` +} + +func (config *Config) IsCFOnK8s() bool { + return config.ConfigFile.CFOnK8s.Enabled +} diff --git a/util/configv3/k8s_test.go b/util/configv3/k8s_test.go new file mode 100644 index 00000000000..2b6dfd6b209 --- /dev/null +++ b/util/configv3/k8s_test.go @@ -0,0 +1,34 @@ +package configv3_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "code.cloudfoundry.org/cli/util/configv3" +) + +var _ = Describe("K8s", func() { + var config configv3.Config + + BeforeEach(func() { + config = configv3.Config{} + }) + + Describe("IsCFOnK8s", func() { + It("returns false by default", func() { + Expect(config.IsCFOnK8s()).To(BeFalse()) + }) + + When("the config is pointed to cf-on-k8s", func() { + BeforeEach(func() { + config.ConfigFile.CFOnK8s = configv3.CFOnK8s{ + Enabled: true, + } + }) + + It("returns true", func() { + Expect(config.IsCFOnK8s()).To(BeTrue()) + }) + }) + }) +}) diff --git a/util/configv3/kubernetes_user_config.go b/util/configv3/kubernetes_user_config.go new file mode 100644 index 00000000000..0ae5f485cfa --- /dev/null +++ b/util/configv3/kubernetes_user_config.go @@ -0,0 +1,17 @@ +package configv3 + +type KubernetesUserConfig struct { + // ConfigFile stores the configuration from the .cf/config + ConfigFile *JSONConfig +} + +// CurrentUser returns user information decoded from the JWT access token in +// .cf/config.json. +func (config KubernetesUserConfig) CurrentUser() (User, error) { + return User{Name: config.ConfigFile.CFOnK8s.AuthInfo}, nil +} + +// CurrentUserName returns the name of a user as returned by CurrentUser() +func (config KubernetesUserConfig) CurrentUserName() (string, error) { + return config.ConfigFile.CFOnK8s.AuthInfo, nil +} diff --git a/util/configv3/kubernetes_user_config_test.go b/util/configv3/kubernetes_user_config_test.go new file mode 100644 index 00000000000..6229df54ebd --- /dev/null +++ b/util/configv3/kubernetes_user_config_test.go @@ -0,0 +1,50 @@ +package configv3_test + +import ( + "code.cloudfoundry.org/cli/util/configv3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("KubernetesUserConfig", func() { + var ( + config configv3.KubernetesUserConfig + err error + ) + + BeforeEach(func() { + config = configv3.KubernetesUserConfig{ + ConfigFile: &configv3.JSONConfig{ + CFOnK8s: configv3.CFOnK8s{ + AuthInfo: "kubernetes-user", + }, + }, + } + }) + + Describe("CurrentUser", func() { + var user configv3.User + + JustBeforeEach(func() { + user, err = config.CurrentUser() + }) + + It("returns the configured auth-info", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(user).To(Equal(configv3.User{Name: "kubernetes-user"})) + }) + }) + + Describe("CurrentUserName", func() { + var userName string + + JustBeforeEach(func() { + userName, err = config.CurrentUserName() + }) + + It("returns the configured auth-info", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(userName).To(Equal("kubernetes-user")) + }) + }) +}) diff --git a/util/configv3/load_config.go b/util/configv3/load_config.go index 73048820ab2..90470e2464d 100644 --- a/util/configv3/load_config.go +++ b/util/configv3/load_config.go @@ -166,6 +166,12 @@ func LoadConfig(flags ...FlagOverride) (*Config, error) { tty: isTTY, } + config.UserConfig = DynamicUserConfig{ + ConfigFile: &config.ConfigFile, + DefaultUserConfig: DefaultUserConfig{ConfigFile: &config.ConfigFile}, + KubernetesUserConfig: KubernetesUserConfig{ConfigFile: &config.ConfigFile}, + } + return &config, jsonError } From 7389313f12181d39ac574af612ac417d35fc0fcb Mon Sep 17 00:00:00 2001 From: MerricdeLauney Date: Mon, 20 Dec 2021 07:41:45 -0800 Subject: [PATCH 12/24] Add space supporter to space users command (#2235) Space supporter is only available on certain versions of CAPI. To ensure space user command behavior is always being tested at the integration level, we created a new test that only would be run on newer versions of CAPI where the space supporter is able to be created and retrieved by this command. [#179982523] Co-authored-by: Mona Mohebbi --- .../ccversion/minimum_version.go | 3 +- command/v7/space_users_command.go | 1 + command/v7/space_users_command_test.go | 9 ++++++ .../v7/isolated/space_users_command_test.go | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/api/cloudcontroller/ccversion/minimum_version.go b/api/cloudcontroller/ccversion/minimum_version.go index c6894444615..2f54e575fc0 100644 --- a/api/cloudcontroller/ccversion/minimum_version.go +++ b/api/cloudcontroller/ccversion/minimum_version.go @@ -11,5 +11,6 @@ const ( MinVersionCreateServiceBrokerV3 = "3.72.0" MinVersionCreateSpaceScopedServiceBrokerV3 = "3.75.0" - MinVersionHTTP2RoutingV3 = "3.104.0" + MinVersionHTTP2RoutingV3 = "3.104.0" + MinVersionSpaceSupporterV3 = "3.104.0" ) diff --git a/command/v7/space_users_command.go b/command/v7/space_users_command.go index d17029ec03c..149ddb9aa3a 100644 --- a/command/v7/space_users_command.go +++ b/command/v7/space_users_command.go @@ -58,6 +58,7 @@ func (cmd *SpaceUsersCommand) Execute(args []string) error { func (cmd SpaceUsersCommand) displaySpaceUsers(orgUsersByRoleType map[constant.RoleType][]resources.User) { cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceManagerRole], "SPACE MANAGER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceDeveloperRole], "SPACE DEVELOPER") + cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceSupporterRole], "SPACE SUPPORTER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceAuditorRole], "SPACE AUDITOR") } diff --git a/command/v7/space_users_command_test.go b/command/v7/space_users_command_test.go index 58b96fbca69..062e6ab69c8 100644 --- a/command/v7/space_users_command_test.go +++ b/command/v7/space_users_command_test.go @@ -167,6 +167,11 @@ var _ = Describe("space-users Command", func() { PresentationName: "billing-manager", GUID: "spaceDeveloper-guid", } + spaceSupporter := resources.User{ + Origin: "uaa", + PresentationName: "fred", + GUID: "spaceSupporter-guid", + } spaceAuditor := resources.User{ Origin: "uaa", PresentationName: "org-auditor", @@ -176,6 +181,7 @@ var _ = Describe("space-users Command", func() { spaceUsersByRole := map[constant.RoleType][]resources.User{ constant.SpaceManagerRole: {uaaAdmin, ldapAdmin, abbyUser, client}, constant.SpaceDeveloperRole: {spaceDeveloper}, + constant.SpaceSupporterRole: {spaceSupporter}, constant.SpaceAuditorRole: {spaceAuditor}, } @@ -199,6 +205,9 @@ var _ = Describe("space-users Command", func() { Expect(testUI.Out).To(Say(`\nSPACE DEVELOPER`)) Expect(testUI.Out).To(Say(`\n billing-manager \(uaa\)`)) Expect(testUI.Out).To(Say(`\n`)) + Expect(testUI.Out).To(Say(`\nSPACE SUPPORTER`)) + Expect(testUI.Out).To(Say(`\n fred \(uaa\)`)) + Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`\nSPACE AUDITOR`)) Expect(testUI.Out).To(Say(`\n org-auditor \(uaa\)`)) diff --git a/integration/v7/isolated/space_users_command_test.go b/integration/v7/isolated/space_users_command_test.go index c81293d4428..5d090b2f576 100644 --- a/integration/v7/isolated/space_users_command_test.go +++ b/integration/v7/isolated/space_users_command_test.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/gomega/gbytes" . "github.com/onsi/gomega/gexec" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" "code.cloudfoundry.org/cli/integration/helpers" ) @@ -91,5 +92,35 @@ var _ = Describe("space-users command", func() { Eventually(session).Should(Exit(0)) }) }) + When("capi provides space supporter", func() { + var ( + spaceManagerUser string + spaceDeveloperUser string + spaceSupporterUser string + spaceAuditorUser1 string + ) + + BeforeEach(func() { + helpers.SkipIfVersionLessThan(ccversion.MinVersionSpaceSupporterV3) + spaceManagerUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceManager") + spaceDeveloperUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceDeveloper") + spaceSupporterUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceSupporter") + spaceAuditorUser1, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceAuditor") + }) + + It("prints the users in the target space under their roles", func() { + session := helpers.CF("space-users", orgName, spaceName) + Eventually(session).Should(Say("Getting users in org %s / space %s as %s", orgName, spaceName, adminUsername)) + Eventually(session).Should(Say("SPACE MANAGER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceManagerUser)) + Eventually(session).Should(Say("SPACE DEVELOPER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceDeveloperUser)) + Eventually(session).Should(Say("SPACE SUPPORTER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceSupporterUser)) + Eventually(session).Should(Say("SPACE AUDITOR")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceAuditorUser1)) + Eventually(session).Should(Exit(0)) + }) + }) }) }) From 8eefb502f42174ca3bc9abddb57ae89a2a53261a Mon Sep 17 00:00:00 2001 From: Maria Shaldybin Date: Thu, 20 Jan 2022 00:35:24 +0000 Subject: [PATCH 13/24] Fix destination protocol flake in map-route test --- api/cloudcontroller/ccv3/route_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/cloudcontroller/ccv3/route_test.go b/api/cloudcontroller/ccv3/route_test.go index 351e27636d8..764b2787848 100644 --- a/api/cloudcontroller/ccv3/route_test.go +++ b/api/cloudcontroller/ccv3/route_test.go @@ -539,7 +539,7 @@ var _ = Describe("Route", func() { var ( routeGUID = "route-guid" appGUID = "app-guid" - destinationProtocol = "http2" + destinationProtocol string expectedBody string warnings Warnings executeErr error @@ -559,6 +559,7 @@ var _ = Describe("Route", func() { When("the request is successful", func() { BeforeEach(func() { + destinationProtocol = "http2" expectedBody = fmt.Sprintf(` { "destinations": [ From 4de3611788cd0d484ee7cbb846c49d64ac444d3e Mon Sep 17 00:00:00 2001 From: Sarah Weinstein Date: Tue, 30 Nov 2021 20:19:28 +0000 Subject: [PATCH 14/24] Consolidate version checking to use ccversion file We noticed the constant for minimum v3 versioning was not being used anywhere and also did not accurately reflect the minimum CAPI version required for the V8 CLI, which the CLI version that supports V3 only uses. We replaced it with the accurate minimum version based on a version checker that is being used in login and auth and consolidated references to only use the minimum version constant. Co-authored-by: Sarah Weinstein Co-authored-by: Mona Mohebbi --- api/cloudcontroller/ccversion/minimum_version.go | 2 +- command/v7/shared/version_checker.go | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/api/cloudcontroller/ccversion/minimum_version.go b/api/cloudcontroller/ccversion/minimum_version.go index 2f54e575fc0..524f740604f 100644 --- a/api/cloudcontroller/ccversion/minimum_version.go +++ b/api/cloudcontroller/ccversion/minimum_version.go @@ -2,7 +2,7 @@ package ccversion const ( MinSupportedV2ClientVersion = "2.128.0" - MinSupportedV3ClientVersion = "3.63.0" + MinSupportedClientVersionV8 = "3.99.0" MinVersionUpdateServiceNameWhenPlanNotVisibleV2 = "2.131.0" MinVersionUpdateServiceInstanceMaintenanceInfoV2 = "2.135.0" diff --git a/command/v7/shared/version_checker.go b/command/v7/shared/version_checker.go index 7a83be7c464..bfd35ec22e9 100644 --- a/command/v7/shared/version_checker.go +++ b/command/v7/shared/version_checker.go @@ -3,24 +3,23 @@ package shared import ( "fmt" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" "github.com/blang/semver" ) -const minimumCCAPIVersionForV8 = "3.99.0" - func CheckCCAPIVersion(currentAPIVersion string) (string, error) { currentSemver, err := semver.Make(currentAPIVersion) if err != nil { return "", err } - minimumSemver, err := semver.Make(minimumCCAPIVersionForV8) + minimumSemver, err := semver.Make(ccversion.MinSupportedClientVersionV8) if err != nil { return "", err } if currentSemver.LT(minimumSemver) { - return fmt.Sprintf("\nWarning: Your targeted API's version (%s) is less than the minimum supported API version (%s). Some commands may not function correctly.", currentAPIVersion, minimumCCAPIVersionForV8), nil + return fmt.Sprintf("\nWarning: Your targeted API's version (%s) is less than the minimum supported API version (%s). Some commands may not function correctly.", currentAPIVersion, ccversion.MinSupportedClientVersionV8), nil } return "", nil From b27bd40c7d9239410c709fd8333b07104164d261 Mon Sep 17 00:00:00 2001 From: Tom Viehman Date: Tue, 27 Jul 2021 11:48:40 -0700 Subject: [PATCH 15/24] Quote $PATH in Makefile to avoid word splitting If the $PATH contains a path with a space, `make` can fail due to the PATH being split into multiple words. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 195d9286aa3..eefff463f09 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SHELL := env PATH=$(PATH) /bin/bash +SHELL := env PATH="$(PATH)" /bin/bash CF_DIAL_TIMEOUT ?= 15 NODES ?= 10 PACKAGES ?= api actor command types util version integration/helpers From 8c55154ab47c609662cfbbf0147905656e99517a Mon Sep 17 00:00:00 2001 From: Al Berez Date: Tue, 25 Jan 2022 11:19:03 -0800 Subject: [PATCH 16/24] Revert "Quote $PATH in Makefile to avoid word splitting" This reverts commit b27bd40c7d9239410c709fd8333b07104164d261. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index eefff463f09..195d9286aa3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SHELL := env PATH="$(PATH)" /bin/bash +SHELL := env PATH=$(PATH) /bin/bash CF_DIAL_TIMEOUT ?= 15 NODES ?= 10 PACKAGES ?= api actor command types util version integration/helpers From dcf5ea61fd912a88a2447ea31390847b33215cff Mon Sep 17 00:00:00 2001 From: Alexander Berezovsky Date: Tue, 25 Jan 2022 19:07:29 +0000 Subject: [PATCH 17/24] Add GitHub Actions Code Quality and Units workflows --- .github/codeql/codeql-config.yml | 3 + .github/workflows/code-quality.yml | 35 +++++++++ .github/workflows/units.yml | 113 +++++++++++++++++++++++++++++ main.go | 1 + 4 files changed, 152 insertions(+) create mode 100644 .github/codeql/codeql-config.yml create mode 100644 .github/workflows/code-quality.yml create mode 100644 .github/workflows/units.yml diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml new file mode 100644 index 00000000000..62ead87b198 --- /dev/null +++ b/.github/codeql/codeql-config.yml @@ -0,0 +1,3 @@ +paths-ignore: + - cf + - util/ui/request_logger_terminal_display.go diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 00000000000..eb0e0323d1b --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,35 @@ +name: "Code Quality" + +on: + push: + branches: [ master, '*' ] + pull_request: + branches: [ master ] + schedule: + - cron: '45 5 * * *' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + steps: + + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: go + config-file: ./.github/codeql/codeql-config.yml + + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/units.yml b/.github/workflows/units.yml new file mode 100644 index 00000000000..5c6446e4f65 --- /dev/null +++ b/.github/workflows/units.yml @@ -0,0 +1,113 @@ +name: Units Tests + +on: + push: + branches: + - "*" + +permissions: + contents: write + +defaults: + run: + shell: bash + +jobs: + lint: + name: Lint code + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Run go fmt + run: go fmt && git diff --exit-code + + units-linux: + name: Units Linux + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Set up Test + run: | + go get -u github.com/onsi/ginkgo/ginkgo + go get github.com/onsi/gomega/matchers@v1.10.5 + - + name: Run Linux Units + run: make units + env: + ACK_GINKGO_RC: true + + units-macos: + name: Units OS X + runs-on: macos-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Set up Test + run: | + go get -u github.com/onsi/ginkgo/ginkgo + go get github.com/onsi/gomega/matchers@v1.10.5 + - + name: Run MacOS Units + run: make units + env: + ACK_GINKGO_RC: true + + units-windows: + name: Units Windows + runs-on: windows-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.17 + - + name: Set up Test + run: | + go get -u github.com/onsi/ginkgo/ginkgo + go get github.com/onsi/gomega/matchers@v1.10.5 + - + name: Run Windows Units + shell: pwsh + run: > + ginkgo -r -p + -randomizeAllSpecs + -randomizeSuites + -skipPackage integration,cf\ssh,plugin,cf\actors\plugin,cf\commands\plugin,cf\actors\plugin,util\randomword + -flakeAttempts=2 + env: + ACK_GINKGO_RC: true diff --git a/main.go b/main.go index db1dc04e287..be48a9b048c 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +//go:build go1.13 // +build go1.13 package main From d7135f357af3150743152679f68411bf4d072484 Mon Sep 17 00:00:00 2001 From: MerricdeLauney Date: Mon, 20 Dec 2021 07:41:45 -0800 Subject: [PATCH 18/24] Add space supporter to space users command (#2235) Space supporter is only available on certain versions of CAPI. To ensure space user command behavior is always being tested at the integration level, we created a new test that only would be run on newer versions of CAPI where the space supporter is able to be created and retrieved by this command. [#179982523] Co-authored-by: Mona Mohebbi --- .../ccversion/minimum_version.go | 3 +- command/v7/space_users_command.go | 1 + command/v7/space_users_command_test.go | 9 ++++++ .../v7/isolated/space_users_command_test.go | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/api/cloudcontroller/ccversion/minimum_version.go b/api/cloudcontroller/ccversion/minimum_version.go index c6894444615..2f54e575fc0 100644 --- a/api/cloudcontroller/ccversion/minimum_version.go +++ b/api/cloudcontroller/ccversion/minimum_version.go @@ -11,5 +11,6 @@ const ( MinVersionCreateServiceBrokerV3 = "3.72.0" MinVersionCreateSpaceScopedServiceBrokerV3 = "3.75.0" - MinVersionHTTP2RoutingV3 = "3.104.0" + MinVersionHTTP2RoutingV3 = "3.104.0" + MinVersionSpaceSupporterV3 = "3.104.0" ) diff --git a/command/v7/space_users_command.go b/command/v7/space_users_command.go index d17029ec03c..149ddb9aa3a 100644 --- a/command/v7/space_users_command.go +++ b/command/v7/space_users_command.go @@ -58,6 +58,7 @@ func (cmd *SpaceUsersCommand) Execute(args []string) error { func (cmd SpaceUsersCommand) displaySpaceUsers(orgUsersByRoleType map[constant.RoleType][]resources.User) { cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceManagerRole], "SPACE MANAGER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceDeveloperRole], "SPACE DEVELOPER") + cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceSupporterRole], "SPACE SUPPORTER") cmd.displayRoleGroup(orgUsersByRoleType[constant.SpaceAuditorRole], "SPACE AUDITOR") } diff --git a/command/v7/space_users_command_test.go b/command/v7/space_users_command_test.go index 58b96fbca69..062e6ab69c8 100644 --- a/command/v7/space_users_command_test.go +++ b/command/v7/space_users_command_test.go @@ -167,6 +167,11 @@ var _ = Describe("space-users Command", func() { PresentationName: "billing-manager", GUID: "spaceDeveloper-guid", } + spaceSupporter := resources.User{ + Origin: "uaa", + PresentationName: "fred", + GUID: "spaceSupporter-guid", + } spaceAuditor := resources.User{ Origin: "uaa", PresentationName: "org-auditor", @@ -176,6 +181,7 @@ var _ = Describe("space-users Command", func() { spaceUsersByRole := map[constant.RoleType][]resources.User{ constant.SpaceManagerRole: {uaaAdmin, ldapAdmin, abbyUser, client}, constant.SpaceDeveloperRole: {spaceDeveloper}, + constant.SpaceSupporterRole: {spaceSupporter}, constant.SpaceAuditorRole: {spaceAuditor}, } @@ -199,6 +205,9 @@ var _ = Describe("space-users Command", func() { Expect(testUI.Out).To(Say(`\nSPACE DEVELOPER`)) Expect(testUI.Out).To(Say(`\n billing-manager \(uaa\)`)) Expect(testUI.Out).To(Say(`\n`)) + Expect(testUI.Out).To(Say(`\nSPACE SUPPORTER`)) + Expect(testUI.Out).To(Say(`\n fred \(uaa\)`)) + Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`\nSPACE AUDITOR`)) Expect(testUI.Out).To(Say(`\n org-auditor \(uaa\)`)) diff --git a/integration/v7/isolated/space_users_command_test.go b/integration/v7/isolated/space_users_command_test.go index c81293d4428..5d090b2f576 100644 --- a/integration/v7/isolated/space_users_command_test.go +++ b/integration/v7/isolated/space_users_command_test.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/gomega/gbytes" . "github.com/onsi/gomega/gexec" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" "code.cloudfoundry.org/cli/integration/helpers" ) @@ -91,5 +92,35 @@ var _ = Describe("space-users command", func() { Eventually(session).Should(Exit(0)) }) }) + When("capi provides space supporter", func() { + var ( + spaceManagerUser string + spaceDeveloperUser string + spaceSupporterUser string + spaceAuditorUser1 string + ) + + BeforeEach(func() { + helpers.SkipIfVersionLessThan(ccversion.MinVersionSpaceSupporterV3) + spaceManagerUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceManager") + spaceDeveloperUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceDeveloper") + spaceSupporterUser, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceSupporter") + spaceAuditorUser1, _ = helpers.CreateUserInSpaceRole(orgName, spaceName, "SpaceAuditor") + }) + + It("prints the users in the target space under their roles", func() { + session := helpers.CF("space-users", orgName, spaceName) + Eventually(session).Should(Say("Getting users in org %s / space %s as %s", orgName, spaceName, adminUsername)) + Eventually(session).Should(Say("SPACE MANAGER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceManagerUser)) + Eventually(session).Should(Say("SPACE DEVELOPER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceDeveloperUser)) + Eventually(session).Should(Say("SPACE SUPPORTER")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceSupporterUser)) + Eventually(session).Should(Say("SPACE AUDITOR")) + Eventually(session).Should(Say(`\s+%s \(uaa\)`, spaceAuditorUser1)) + Eventually(session).Should(Exit(0)) + }) + }) }) }) From 17692758672b20abb843a73d0645ba889b8ca061 Mon Sep 17 00:00:00 2001 From: Maria Shaldybin Date: Thu, 20 Jan 2022 00:35:24 +0000 Subject: [PATCH 19/24] Fix destination protocol flake in map-route test --- api/cloudcontroller/ccv3/route_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/cloudcontroller/ccv3/route_test.go b/api/cloudcontroller/ccv3/route_test.go index 351e27636d8..764b2787848 100644 --- a/api/cloudcontroller/ccv3/route_test.go +++ b/api/cloudcontroller/ccv3/route_test.go @@ -539,7 +539,7 @@ var _ = Describe("Route", func() { var ( routeGUID = "route-guid" appGUID = "app-guid" - destinationProtocol = "http2" + destinationProtocol string expectedBody string warnings Warnings executeErr error @@ -559,6 +559,7 @@ var _ = Describe("Route", func() { When("the request is successful", func() { BeforeEach(func() { + destinationProtocol = "http2" expectedBody = fmt.Sprintf(` { "destinations": [ From f316ed6ec2dab73eb256ef25da5107789b131a30 Mon Sep 17 00:00:00 2001 From: Sarah Weinstein Date: Tue, 30 Nov 2021 20:19:28 +0000 Subject: [PATCH 20/24] Consolidate version checking to use ccversion file We noticed the constant for minimum v3 versioning was not being used anywhere and also did not accurately reflect the minimum CAPI version required for the V8 CLI, which the CLI version that supports V3 only uses. We replaced it with the accurate minimum version based on a version checker that is being used in login and auth and consolidated references to only use the minimum version constant. Co-authored-by: Sarah Weinstein Co-authored-by: Mona Mohebbi --- api/cloudcontroller/ccversion/minimum_version.go | 2 +- command/v7/shared/version_checker.go | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/api/cloudcontroller/ccversion/minimum_version.go b/api/cloudcontroller/ccversion/minimum_version.go index 2f54e575fc0..524f740604f 100644 --- a/api/cloudcontroller/ccversion/minimum_version.go +++ b/api/cloudcontroller/ccversion/minimum_version.go @@ -2,7 +2,7 @@ package ccversion const ( MinSupportedV2ClientVersion = "2.128.0" - MinSupportedV3ClientVersion = "3.63.0" + MinSupportedClientVersionV8 = "3.99.0" MinVersionUpdateServiceNameWhenPlanNotVisibleV2 = "2.131.0" MinVersionUpdateServiceInstanceMaintenanceInfoV2 = "2.135.0" diff --git a/command/v7/shared/version_checker.go b/command/v7/shared/version_checker.go index 7a83be7c464..bfd35ec22e9 100644 --- a/command/v7/shared/version_checker.go +++ b/command/v7/shared/version_checker.go @@ -3,24 +3,23 @@ package shared import ( "fmt" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" "github.com/blang/semver" ) -const minimumCCAPIVersionForV8 = "3.99.0" - func CheckCCAPIVersion(currentAPIVersion string) (string, error) { currentSemver, err := semver.Make(currentAPIVersion) if err != nil { return "", err } - minimumSemver, err := semver.Make(minimumCCAPIVersionForV8) + minimumSemver, err := semver.Make(ccversion.MinSupportedClientVersionV8) if err != nil { return "", err } if currentSemver.LT(minimumSemver) { - return fmt.Sprintf("\nWarning: Your targeted API's version (%s) is less than the minimum supported API version (%s). Some commands may not function correctly.", currentAPIVersion, minimumCCAPIVersionForV8), nil + return fmt.Sprintf("\nWarning: Your targeted API's version (%s) is less than the minimum supported API version (%s). Some commands may not function correctly.", currentAPIVersion, ccversion.MinSupportedClientVersionV8), nil } return "", nil From d5af40431b125d7f546ba521f4e39506afdeabf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Wed, 10 Nov 2021 15:51:24 -0500 Subject: [PATCH 21/24] [Feature] support HTTP/2 cf command (#2230) [reason] Renaming "protocol" column to "app-protocol" in the destination table of the cf route command Co-authored-by: Hector Calderon --- command/v7/route_command.go | 2 +- command/v7/route_command_test.go | 2 +- integration/v7/isolated/route_command_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/command/v7/route_command.go b/command/v7/route_command.go index 9e4aa0ba1a3..1ed64478ee6 100644 --- a/command/v7/route_command.go +++ b/command/v7/route_command.go @@ -116,7 +116,7 @@ func (cmd RouteCommand) displayDestinations(route resources.Route, appMap map[st cmd.UI.TranslateText("app"), cmd.UI.TranslateText("process"), cmd.UI.TranslateText("port"), - cmd.UI.TranslateText("protocol"), + cmd.UI.TranslateText("app-protocol"), }, } diff --git a/command/v7/route_command_test.go b/command/v7/route_command_test.go index 331ed929805..2249d13ee7a 100644 --- a/command/v7/route_command_test.go +++ b/command/v7/route_command_test.go @@ -220,7 +220,7 @@ var _ = Describe("route Command", func() { Expect(testUI.Out).To(Say(`protocol:\s+http`)) Expect(testUI.Out).To(Say(`\n`)) Expect(testUI.Out).To(Say(`Destinations:`)) - Expect(testUI.Out).To(Say(`\s+app\s+process\s+port\s+protocol`)) + Expect(testUI.Out).To(Say(`\s+app\s+process\s+port\s+app-protocol`)) Expect(testUI.Out).To(Say(`\s+app-name\s+web\s+8080\s+http1`)) Expect(testUI.Out).To(Say(`\s+other-app-name\s+web\s+1337\s+http2`)) diff --git a/integration/v7/isolated/route_command_test.go b/integration/v7/isolated/route_command_test.go index 4e8d109d2fc..85d50275c44 100644 --- a/integration/v7/isolated/route_command_test.go +++ b/integration/v7/isolated/route_command_test.go @@ -119,7 +119,7 @@ var _ = Describe("route command", func() { Eventually(session).Should(Say(`protocol:\s+http`)) Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`Destinations:`)) - Eventually(session).Should(Say(`\s+app\s+process\s+port\s+protocol`)) + Eventually(session).Should(Say(`\s+app\s+process\s+port\s+app-protocol`)) Eventually(session).Should(Exit(0)) }) @@ -167,7 +167,7 @@ var _ = Describe("route command", func() { Eventually(session).Should(Say(`protocol:\s+tcp`)) Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`Destinations:`)) - Eventually(session).Should(Say(`\s+app\s+process\s+port\s+protocol`)) + Eventually(session).Should(Say(`\s+app\s+process\s+port\s+app-protocol`)) Eventually(session).Should(Exit(0)) }) From a8b846e5893129f0adb0a6c8d186d442a84fc46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Fri, 12 Nov 2021 14:45:50 -0500 Subject: [PATCH 22/24] [Feature] Rename flag to app-protocol in map-route (#2231) Currently the cli already has a flag named destination-protocol and in order to have consistency we need to rename it to app-protocol Co-authored-by: Hector Calderon --- command/v7/map_route_command.go | 20 ++++++++-------- command/v7/map_route_command_test.go | 24 +++++++++---------- .../v7/isolated/map_route_command_test.go | 10 ++++---- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/command/v7/map_route_command.go b/command/v7/map_route_command.go index a9a4afe1bae..c9ca6b381ac 100644 --- a/command/v7/map_route_command.go +++ b/command/v7/map_route_command.go @@ -8,11 +8,11 @@ import ( type MapRouteCommand struct { BaseCommand - RequiredArgs flag.AppDomain `positional-args:"yes"` - Hostname string `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"` - Path flag.V7RoutePath `long:"path" description:"Path for the HTTP route"` - Port int `long:"port" description:"Port for the TCP route (default: random port)"` - DestinationProtocol string `long:"destination-protocol" description:"[Beta flag, subject to change] Protocol for the route destination (default: http1). Only applied to HTTP routes"` + RequiredArgs flag.AppDomain `positional-args:"yes"` + Hostname string `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"` + Path flag.V7RoutePath `long:"path" description:"Path for the HTTP route"` + Port int `long:"port" description:"Port for the TCP route (default: random port)"` + AppProtocol string `long:"app-protocol" description:"[Beta flag, subject to change] Protocol for the route destination (default: http1). Only applied to HTTP routes"` relatedCommands interface{} `related_commands:"create-route, routes, unmap-route"` } @@ -20,7 +20,7 @@ type MapRouteCommand struct { func (cmd MapRouteCommand) Usage() string { return ` Map an HTTP route: - CF_NAME map-route APP_NAME DOMAIN [--hostname HOSTNAME] [--path PATH] [--destination-protocol PROTOCOL] + CF_NAME map-route APP_NAME DOMAIN [--hostname HOSTNAME] [--path PATH] [--app-protocol PROTOCOL] Map a TCP route: CF_NAME map-route APP_NAME DOMAIN [--port PORT]` @@ -31,7 +31,7 @@ func (cmd MapRouteCommand) Examples() string { CF_NAME map-route my-app example.com # example.com CF_NAME map-route my-app example.com --hostname myhost # myhost.example.com CF_NAME map-route my-app example.com --hostname myhost --path foo # myhost.example.com/foo -CF_NAME map-route my-app example.com --hostname myhost --destination-protocol http2 # myhost.example.com +CF_NAME map-route my-app example.com --hostname myhost --app-protocol http2 # myhost.example.com CF_NAME map-route my-app example.com --port 5000 # example.com:5000` } @@ -88,14 +88,14 @@ func (cmd MapRouteCommand) Execute(args []string) error { cmd.UI.DisplayOK() } - if cmd.DestinationProtocol != "" { + if cmd.AppProtocol != "" { cmd.UI.DisplayTextWithFlavor("Mapping route {{.URL}} to app {{.AppName}} with protocol {{.Protocol}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", map[string]interface{}{ "URL": route.URL, "AppName": cmd.RequiredArgs.App, "User": user.Name, "SpaceName": cmd.Config.TargetedSpace().Name, "OrgName": cmd.Config.TargetedOrganization().Name, - "Protocol": cmd.DestinationProtocol, + "Protocol": cmd.AppProtocol, }) } else { @@ -121,7 +121,7 @@ func (cmd MapRouteCommand) Execute(args []string) error { cmd.UI.DisplayOK() return nil } - warnings, err = cmd.Actor.MapRoute(route.GUID, app.GUID, cmd.DestinationProtocol) + warnings, err = cmd.Actor.MapRoute(route.GUID, app.GUID, cmd.AppProtocol) cmd.UI.DisplayWarnings(warnings) if err != nil { return err diff --git a/command/v7/map_route_command_test.go b/command/v7/map_route_command_test.go index a2be30ebd57..3e7b111edeb 100644 --- a/command/v7/map_route_command_test.go +++ b/command/v7/map_route_command_test.go @@ -53,10 +53,10 @@ var _ = Describe("map-route Command", func() { spaceGUID = "some-space-guid" cmd = MapRouteCommand{ - RequiredArgs: flag.AppDomain{App: appName, Domain: domain}, - Hostname: hostname, - Path: flag.V7RoutePath{Path: path}, - DestinationProtocol: "http2", + RequiredArgs: flag.AppDomain{App: appName, Domain: domain}, + Hostname: hostname, + Path: flag.V7RoutePath{Path: path}, + AppProtocol: "http2", BaseCommand: BaseCommand{ UI: testUI, Config: fakeConfig, @@ -372,10 +372,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) @@ -411,10 +411,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) }) @@ -534,10 +534,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) @@ -573,10 +573,10 @@ var _ = Describe("map-route Command", func() { Expect(actualPort).To(Equal(cmd.Port)) Expect(fakeActor.MapRouteCallCount()).To(Equal(1)) - actualRouteGUID, actualAppGUID, actualDestinationProtocol := fakeActor.MapRouteArgsForCall(0) + actualRouteGUID, actualAppGUID, actualAppProtocol := fakeActor.MapRouteArgsForCall(0) Expect(actualRouteGUID).To(Equal("route-guid")) Expect(actualAppGUID).To(Equal("app-guid")) - Expect(actualDestinationProtocol).To(Equal("http2")) + Expect(actualAppProtocol).To(Equal("http2")) }) }) }) diff --git a/integration/v7/isolated/map_route_command_test.go b/integration/v7/isolated/map_route_command_test.go index ea734b65fb9..3aaec9b04e5 100644 --- a/integration/v7/isolated/map_route_command_test.go +++ b/integration/v7/isolated/map_route_command_test.go @@ -29,7 +29,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`USAGE:`)) Eventually(session).Should(Say(`Map an HTTP route:\n`)) - Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--hostname HOSTNAME\] \[--path PATH\] \[--destination-protocol PROTOCOL\]\n`)) + Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--hostname HOSTNAME\] \[--path PATH\] \[--app-protocol PROTOCOL\]\n`)) Eventually(session).Should(Say(`Map a TCP route:\n`)) Eventually(session).Should(Say(`cf map-route APP_NAME DOMAIN \[--port PORT]\n`)) Eventually(session).Should(Say(`\n`)) @@ -38,7 +38,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`cf map-route my-app example.com # example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost # myhost.example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --path foo # myhost.example.com/foo`)) - Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --destination-protocol http2 # myhost.example.com`)) + Eventually(session).Should(Say(`cf map-route my-app example.com --hostname myhost --app-protocol http2 # myhost.example.com`)) Eventually(session).Should(Say(`cf map-route my-app example.com --port 5000 # example.com:5000`)) Eventually(session).Should(Say(`\n`)) @@ -46,7 +46,7 @@ var _ = Describe("map-route command", func() { Eventually(session).Should(Say(`--hostname, -n\s+Hostname for the HTTP route \(required for shared domains\)`)) Eventually(session).Should(Say(`--path\s+Path for the HTTP route`)) Eventually(session).Should(Say(`--port\s+Port for the TCP route \(default: random port\)`)) - Eventually(session).Should(Say(`--destination-protocol\s+\[Beta flag, subject to change\] Protocol for the route destination \(default: http1\). Only applied to HTTP routes`)) + Eventually(session).Should(Say(`--app-protocol\s+\[Beta flag, subject to change\] Protocol for the route destination \(default: http1\). Only applied to HTTP routes`)) Eventually(session).Should(Say(`\n`)) @@ -133,7 +133,7 @@ var _ = Describe("map-route command", func() { }) It("maps the route to an app", func() { - session := helpers.CF("map-route", appName, domainName, "--hostname", route.Host, "--destination-protocol", "http2") + session := helpers.CF("map-route", appName, domainName, "--hostname", route.Host, "--app-protocol", "http2") Eventually(session).Should(Say(`Mapping route %s.%s to app %s with protocol http2 in org %s / space %s as %s\.\.\.`, hostName, domainName, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`OK`)) @@ -227,7 +227,7 @@ var _ = Describe("map-route command", func() { }) It("maps the route to an app", func() { - session := helpers.CF("map-route", appName, domainName, "--hostname", hostName, "--destination-protocol", "http2") + session := helpers.CF("map-route", appName, domainName, "--hostname", hostName, "--app-protocol", "http2") Eventually(session).Should(Say(`Creating route %s.%s for org %s / space %s as %s\.\.\.`, hostName, domainName, orgName, spaceName, userName)) Eventually(session).Should(Say(`OK`)) Eventually(session).Should(Say(`Mapping route %s.%s to app %s with protocol http2 in org %s / space %s as %s\.\.\.`, hostName, domainName, appName, orgName, spaceName, userName)) From e4464305d99ee67765b58f5c3642883965bdfe64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Diego=20Gonz=C3=A1lez?= <25335192+jdgonzaleza@users.noreply.github.com> Date: Mon, 22 Nov 2021 17:30:51 -0500 Subject: [PATCH 23/24] [Feature] Add app-protocol to cf routes command output (#2234) Currently we do not show the app-protocol in the output of the cf routes command, so a new column must be added to the output. Also, the apps mapped to the route should be displayed in the apps column and must be separated with commas. Co-authored-by: Hector Calderon --- actor/v7action/route.go | 13 +++ actor/v7action/route_test.go | 20 ++++- command/v7/routes_command.go | 2 + command/v7/routes_command_test.go | 29 +++++-- integration/helpers/version.go | 6 +- .../v7/isolated/routes_command_test.go | 85 +++++++++++++++---- 6 files changed, 126 insertions(+), 29 deletions(-) diff --git a/actor/v7action/route.go b/actor/v7action/route.go index 14bde2bf456..d59c318c61f 100644 --- a/actor/v7action/route.go +++ b/actor/v7action/route.go @@ -20,6 +20,7 @@ import ( type RouteSummary struct { resources.Route AppNames []string + AppProtocols []string DomainName string SpaceName string ServiceInstanceName string @@ -275,13 +276,25 @@ func (actor Actor) GetRouteSummaries(routes []resources.Route) ([]RouteSummary, for _, route := range routes { var appNames []string + protocolSet := map[string]bool{} for _, destination := range route.Destinations { appNames = append(appNames, appNamesByGUID[destination.App.GUID]) + protocolSet[destination.Protocol] = true + } + + var appProtocols []string + if len(protocolSet) > 0 { + appProtocols = make([]string, 0, len(protocolSet)) + for key := range protocolSet { + appProtocols = append(appProtocols, key) + } + sort.Strings(appProtocols) } routeSummaries = append(routeSummaries, RouteSummary{ Route: route, AppNames: appNames, + AppProtocols: appProtocols, SpaceName: spaceNamesByGUID[route.SpaceGUID], DomainName: getDomainName(route.URL, route.Host, route.Path, route.Port), ServiceInstanceName: serviceInstanceNameByRouteGUID[route.GUID], diff --git a/actor/v7action/route_test.go b/actor/v7action/route_test.go index 01eafeca46a..064b1863761 100644 --- a/actor/v7action/route_test.go +++ b/actor/v7action/route_test.go @@ -677,6 +677,7 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: "app-guid-1", }, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -692,11 +693,13 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: "app-guid-1", }, + Protocol: "http2", }, { App: resources.RouteDestinationApp{ GUID: "app-guid-2", }, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -797,7 +800,8 @@ var _ = Describe("Route Actions", func() { GUID: "route-guid-1", Destinations: []resources.RouteDestination{ { - App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -807,6 +811,7 @@ var _ = Describe("Route Actions", func() { Port: 1, }, AppNames: []string{"app-name-1"}, + AppProtocols: []string{"http1"}, DomainName: "fake-url-1/fake-path-1", SpaceName: "fake-space-1", ServiceInstanceName: "foo", @@ -816,10 +821,12 @@ var _ = Describe("Route Actions", func() { GUID: "route-guid-2", Destinations: []resources.RouteDestination{ { - App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + App: resources.RouteDestinationApp{GUID: "app-guid-1"}, + Protocol: "http2", }, { - App: resources.RouteDestinationApp{GUID: "app-guid-2"}, + App: resources.RouteDestinationApp{GUID: "app-guid-2"}, + Protocol: "http1", }, }, SpaceGUID: "fake-space-1-guid", @@ -829,6 +836,7 @@ var _ = Describe("Route Actions", func() { Port: 2, }, AppNames: []string{"app-name-1", "app-name-2"}, + AppProtocols: []string{"http1", "http2"}, DomainName: "fake-url-2/fake-path-2", SpaceName: "fake-space-1", ServiceInstanceName: "bar", @@ -928,6 +936,10 @@ var _ = Describe("Route Actions", func() { for i := 0; i < batcher.BatchSize*batches; i++ { port := i + 1000 + appProtocol := "http1" + if i%2 == 0 { + appProtocol = "http2" + } route := resources.Route{ GUID: fmt.Sprintf("route-guid-%d", i), Destinations: []resources.RouteDestination{ @@ -935,6 +947,7 @@ var _ = Describe("Route Actions", func() { App: resources.RouteDestinationApp{ GUID: fmt.Sprintf("fake-app-guid-%d", i), }, + Protocol: appProtocol, }, }, SpaceGUID: fmt.Sprintf("fake-space-guid-%d", i), @@ -968,6 +981,7 @@ var _ = Describe("Route Actions", func() { manyResults = append(manyResults, RouteSummary{ Route: route, + AppProtocols: []string{appProtocol}, AppNames: []string{fmt.Sprintf("fake-app-name-%d", i)}, DomainName: fmt.Sprintf("fake-url-%d/fake-path-%d", i, i), SpaceName: fmt.Sprintf("fake-space-name-%d", i), diff --git a/command/v7/routes_command.go b/command/v7/routes_command.go index 4edbd263f12..437704cdc8f 100644 --- a/command/v7/routes_command.go +++ b/command/v7/routes_command.go @@ -82,6 +82,7 @@ func (cmd RoutesCommand) displayRoutesTable(routeSummaries []v7action.RouteSumma cmd.UI.TranslateText("port"), cmd.UI.TranslateText("path"), cmd.UI.TranslateText("protocol"), + cmd.UI.TranslateText("app-protocol"), cmd.UI.TranslateText("apps"), cmd.UI.TranslateText("service instance"), }, @@ -99,6 +100,7 @@ func (cmd RoutesCommand) displayRoutesTable(routeSummaries []v7action.RouteSumma port, routeSummary.Path, routeSummary.Protocol, + strings.Join(routeSummary.AppProtocols, ", "), strings.Join(routeSummary.AppNames, ", "), routeSummary.ServiceInstanceName, }) diff --git a/command/v7/routes_command_test.go b/command/v7/routes_command_test.go index e1bcceacfe8..bc43f357733 100644 --- a/command/v7/routes_command_test.go +++ b/command/v7/routes_command_test.go @@ -29,7 +29,7 @@ var _ = Describe("routes Command", func() { binaryName string ) - const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance` + const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+app-protocol\s+apps\s+service instance` BeforeEach(func() { testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) @@ -144,10 +144,16 @@ var _ = Describe("routes Command", func() { Route: resources.Route{GUID: "route-guid-2", Host: "host-3", Path: "/path/2"}, }, { - DomainName: "domain3", - SpaceName: "space-3", - Route: resources.Route{GUID: "route-guid-3", Host: "host-1"}, + DomainName: "domain3", + SpaceName: "space-3", + Route: resources.Route{GUID: "route-guid-3", Host: "host-1", + Destinations: []resources.RouteDestination{ + {GUID: "app1-guid", Protocol: "http1"}, + {GUID: "app2-guid", Protocol: "http2"}, + }, + }, AppNames: []string{"app1", "app2"}, + AppProtocols: []string{"http1", "http2"}, ServiceInstanceName: "si-3", }, { @@ -156,6 +162,18 @@ var _ = Describe("routes Command", func() { Route: resources.Route{GUID: "route-guid-3", Port: 1024}, AppNames: []string{"app1", "app2"}, }, + { + DomainName: "domain4", + SpaceName: "space-3", + Route: resources.Route{GUID: "route-guid-3", Port: 1024, + Destinations: []resources.RouteDestination{ + {GUID: "app1-guid", Protocol: "http1"}, + {GUID: "app2-guid", Protocol: "http1"}, + }, + }, + AppNames: []string{"app1", "app2"}, + AppProtocols: []string{"http1"}, + }, } fakeActor.GetRouteSummariesReturns( @@ -174,8 +192,9 @@ var _ = Describe("routes Command", func() { Expect(testUI.Out).To(Say(tableHeaders)) Expect(testUI.Out).To(Say(`space-1\s+domain1\s+si-1\s+`)) Expect(testUI.Out).To(Say(`space-2\s+host-3\s+domain2\s+\/path\/2`)) - Expect(testUI.Out).To(Say(`space-3\s+host-1\s+domain3\s+app1, app2\s+si-3`)) + Expect(testUI.Out).To(Say(`space-3\s+host-1\s+domain3\s+http1, http2\s+app1, app2\s+si-3`)) Expect(testUI.Out).To(Say(`space-3\s+tcp\.domain\s+1024\s+app1, app2`)) + Expect(testUI.Out).To(Say(`space-3\s+domain4\s+1024\s+http1\s+app1, app2`)) }) }) diff --git a/integration/helpers/version.go b/integration/helpers/version.go index 57297bec1aa..bf9dd585711 100644 --- a/integration/helpers/version.go +++ b/integration/helpers/version.go @@ -87,11 +87,11 @@ func SkipIfUAAVersionAtLeast(version string) { } func matchMajorAPIVersion(minVersion string) string { - version := GetAPIVersionV2() if strings.HasPrefix(minVersion, "3") { - version = getAPIVersionV3() + return getAPIVersionV3() + } else { + return GetAPIVersionV2() } - return version } // GetAPIVersionV2 returns the V2 api version of the targeted API diff --git a/integration/v7/isolated/routes_command_test.go b/integration/v7/isolated/routes_command_test.go index fc2e70450c0..73813867368 100644 --- a/integration/v7/isolated/routes_command_test.go +++ b/integration/v7/isolated/routes_command_test.go @@ -1,6 +1,9 @@ package isolated import ( + "fmt" + + "code.cloudfoundry.org/cli/api/cloudcontroller/ccversion" . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" "code.cloudfoundry.org/cli/integration/helpers" @@ -11,6 +14,9 @@ import ( ) var _ = Describe("routes command", func() { + + appProtocolValue := "http1" + const tableHeaders = `space\s+host\s+domain\s+port\s+path\s+protocol\s+app-protocol\s+apps\s+service instance` Context("Help", func() { It("appears in cf help -a", func() { session := helpers.CF("help", "-a") @@ -60,6 +66,10 @@ var _ = Describe("routes command", func() { helpers.SetupCF(orgName, spaceName) userName, _ = helpers.GetCredentials() + if !helpers.IsVersionMet(ccversion.MinVersionHTTP2RoutingV3) { + appProtocolValue = "" + } + }) AfterEach(func() { @@ -110,38 +120,77 @@ var _ = Describe("routes command", func() { It("lists all the routes", func() { session := helpers.CF("routes") Eventually(session).Should(Exit(0)) - Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Expect(session).To(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName2)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).To(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName2)) }) It("lists all the routes by label", func() { session := helpers.CF("routes", "--labels", "env in (prod)") Eventually(session).Should(Exit(0)) Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Expect(session).ToNot(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Expect(session).ToNot(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName1)) - Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+\n`, spaceName, domainName, appName2)) + Expect(session).To(Say(tableHeaders)) + Expect(session).ToNot(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).ToNot(Say(`%s\s+route1a\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).To(Say(`%s\s+route1b\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName1)) + Expect(session).ToNot(Say(`%s\s+route2\s+%s\s+http\s+%s\s+%s\s+\n`, spaceName, domainName, appProtocolValue, appName2)) }) When("fetching routes by org", func() { It("lists all the routes in the org", func() { session := helpers.CF("routes", "--org-level") - Eventually(session).Should(Say(`Getting routes for org %s as %s\.\.\.`, orgName, userName)) - Eventually(session).Should(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps\s+service instance\n`)) - Eventually(session).Should(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\n`, spaceName, domainName, appName1, serviceInstanceName)) - Eventually(session).Should(Say(`%s\s+route2\s+%s\s+\/dodo\s+http\s+%s\s+\n`, otherSpaceName, domainName, appName2)) Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s as %s\.\.\.`, orgName, userName)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+%s\s+%s\s+%s\n`, spaceName, domainName, appProtocolValue, appName1, serviceInstanceName)) + Expect(session).To(Say(`%s\s+route2\s+%s\s+\/dodo\s+http\s+%s\s+%s\s+\n`, otherSpaceName, domainName, appProtocolValue, appName2)) }) }) }) + When("http1 and http2 routes exist", func() { + var ( + domainName string + domain helpers.Domain + ) + + BeforeEach(func() { + helpers.SkipIfVersionLessThan(ccversion.MinVersionHTTP2RoutingV3) + domainName = helpers.NewDomainName() + + domain = helpers.NewDomain(orgName, domainName) + + appName1 = helpers.NewAppName() + Eventually(helpers.CF("create-app", appName1)).Should(Exit(0)) + appName2 = helpers.NewAppName() + Eventually(helpers.CF("create-app", appName2)).Should(Exit(0)) + + domain.CreatePrivate() + + Eventually(helpers.CF("map-route", appName1, domainName, "--hostname", "route1")).Should(Exit(0)) + Eventually(helpers.CF("map-route", appName2, domainName, "--hostname", "route2")).Should(Exit(0)) + Eventually(helpers.CF("map-route", appName2, domainName, "--hostname", "route1", "--app-protocol", "http2")).Should(Exit(0)) + + helpers.SetupCF(orgName, spaceName) + }) + + AfterEach(func() { + domain.Delete() + }) + + It("lists all the routes", func() { + session := helpers.CF("routes") + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) + Expect(session).To(Say(tableHeaders)) + Expect(session).To(Say(`%s\s+route1\s+%s\s+http\s+http1, http2\s+%s\s+\n`, spaceName, domainName, fmt.Sprintf("%s, %s", appName1, appName2))) + Expect(session).To(Say(`%s\s+route2\s+%s\s+http\s+http1\s+%s\s+\n`, spaceName, domainName, appName2)) + }) + }) + When("when shared tcp routes exist", func() { var ( domainName string @@ -174,7 +223,7 @@ var _ = Describe("routes command", func() { Eventually(session).Should(Exit(0)) Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Expect(session).To(Say(`space\s+host\s+domain\s+port\s+path\s+protocol\s+apps`)) + Expect(session).To(Say(tableHeaders)) Expect(session).To(Say(`%s\s+%s[^:]\s+%d\s+tcp`, spaceName, domainName, 1028)) }) }) @@ -182,9 +231,9 @@ var _ = Describe("routes command", func() { When("no routes exist", func() { It("outputs a message about no routes existing", func() { session := helpers.CF("routes") - Eventually(session).Should(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) - Eventually(session).Should(Say("No routes found")) Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Getting routes for org %s / space %s as %s\.\.\.`, orgName, spaceName, userName)) + Expect(session).To(Say("No routes found")) }) }) }) From fd8fbca64b9333e48c394d6613871c033f9aea3e Mon Sep 17 00:00:00 2001 From: Alexander Berezovsky Date: Wed, 9 Feb 2022 23:34:51 +0000 Subject: [PATCH 24/24] Bump version to 8.2.0 --- BUILD_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD_VERSION b/BUILD_VERSION index 8104cabd36f..fbb9ea12de3 100644 --- a/BUILD_VERSION +++ b/BUILD_VERSION @@ -1 +1 @@ -8.1.0 +8.2.0