diff --git a/Gopkg.lock b/Gopkg.lock index 2a1e3a5af..c5eef70a0 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,34 +2,27 @@ [[projects]] - digest = "1:5ad08b0e14866764a6d7475eb11c9cf05cad9a52c442593bdfa544703ff77f61" name = "cloud.google.com/go" packages = ["compute/metadata"] - pruneopts = "UT" revision = "0ebda48a7f143b1cce9eb37a8c1106ac762a3430" version = "v0.34.0" [[projects]] - digest = "1:b92928b73320648b38c93cacb9082c0fe3f8ac3383ad9bd537eef62c380e0e7a" name = "contrib.go.opencensus.io/exporter/ocagent" packages = ["."] - pruneopts = "UT" revision = "00af367e65149ff1f2f4b93bbfbb84fd9297170d" version = "v0.2.0" [[projects]] branch = "master" - digest = "1:6da51e5ec493ad2b44cb04129e2d0a068c8fb9bd6cb5739d199573558696bb94" name = "github.com/Azure/go-ansiterm" packages = [ ".", - "winterm", + "winterm" ] - pruneopts = "UT" revision = "d6e3b3328b783f23731bc4d058875b0371ff8109" [[projects]] - digest = "1:1cd7c78615a24f1f886b7c23d9a1d323dee3c36e76c0a64a348ab72036be90bf" name = "github.com/Azure/go-autorest" packages = [ "autorest", @@ -37,158 +30,122 @@ "autorest/azure", "autorest/date", "logger", - "tracing", + "tracing" ] - pruneopts = "UT" revision = "f401b1ccc8eb505927fae7a0c7f6406d37ca1c7e" version = "v11.2.8" [[projects]] - digest = "1:9f3b30d9f8e0d7040f729b82dcbc8f0dead820a133b3147ce355fc451f32d761" name = "github.com/BurntSushi/toml" packages = ["."] - pruneopts = "UT" revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005" version = "v0.3.1" [[projects]] branch = "master" - digest = "1:9831b48eaba66c6eee6b8bc698d5a669088313cfee3c94435056e3522e4a53fb" name = "github.com/MakeNowJust/heredoc" packages = ["."] - pruneopts = "UT" revision = "e9091a26100e9cfb2b6a8f470085bfa541931a91" [[projects]] - digest = "1:3b10c6fd33854dc41de2cf78b7bae105da94c2789b6fa5b9ac9e593ea43484ac" name = "github.com/Masterminds/goutils" packages = ["."] - pruneopts = "UT" revision = "41ac8693c5c10a92ea1ff5ac3a7f95646f6123b0" version = "v1.1.0" [[projects]] - digest = "1:55388fd080150b9a072912f97b1f5891eb0b50df43401f8b75fb4273d3fec9fc" name = "github.com/Masterminds/semver" packages = ["."] - pruneopts = "UT" revision = "c7af12943936e8c39859482e61f0574c2fd7fc75" version = "v1.4.2" [[projects]] - digest = "1:ab506cfc00b11d6d406789c15abb0b341e8db076640e3f5255615a7e327398c1" name = "github.com/Masterminds/sprig" packages = ["."] - pruneopts = "UT" revision = "258b00ffa7318e8b109a141349980ffbd30a35db" version = "v2.20.0" [[projects]] - digest = "1:74334b154a542b15a7391df3db5428675fdaa56b4d3f3de7b750289b9500d70e" name = "github.com/Masterminds/vcs" packages = ["."] - pruneopts = "UT" revision = "b4f55832432b95a611cf1495272b5c8e24952a1a" version = "v1.13.0" [[projects]] - digest = "1:f9ae348e1f793dcf9ed930ed47136a67343dbd6809c5c91391322267f4476892" name = "github.com/Microsoft/go-winio" packages = ["."] - pruneopts = "UT" revision = "1a8911d1ed007260465c3bfbbc785ac6915a0bb8" version = "v0.4.12" [[projects]] branch = "master" - digest = "1:3721a10686511b80c052323423f0de17a8c06d417dbdd3b392b1578432a33aae" name = "github.com/Nvveen/Gotty" packages = ["."] - pruneopts = "UT" revision = "cd527374f1e5bff4938207604a14f2e38a9cf512" [[projects]] - digest = "1:d1665c44bd5db19aaee18d1b6233c99b0b9a986e8bccb24ef54747547a48027f" name = "github.com/PuerkitoBio/purell" packages = ["."] - pruneopts = "UT" revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" version = "v1.1.0" [[projects]] branch = "master" - digest = "1:c739832d67eb1e9cc478a19cc1a1ccd78df0397bf8a32978b759152e205f644b" name = "github.com/PuerkitoBio/urlesc" packages = ["."] - pruneopts = "UT" revision = "de5bf2ad457846296e2031421a34e2568e304e35" [[projects]] branch = "master" - digest = "1:5b8a3b9e8d146a93f6d0538d3be408c9adff07fd694d4094b814a376b4727b14" name = "github.com/Shopify/logrus-bugsnag" packages = ["."] - pruneopts = "UT" revision = "577dee27f20dd8f1a529f82210094af593be12bd" [[projects]] - digest = "1:320e7ead93de9fd2b0e59b50fd92a4d50c1f8ab455d96bc2eb083267453a9709" name = "github.com/asaskevich/govalidator" packages = ["."] - pruneopts = "UT" revision = "ccb8e960c48f04d6935e72476ae4a51028f9e22f" version = "v9" [[projects]] branch = "master" - digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] - pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] - digest = "1:7b81d2ed76bf960333a8020c4b8c22abd6072f0b54ad31c66e90e6a17a19315a" name = "github.com/bshuster-repo/logrus-logstash-hook" packages = ["."] - pruneopts = "UT" revision = "dbc1e22735aa6ed7bd9579a407c17bc7c4a4e046" version = "v0.4.1" [[projects]] - digest = "1:a9ef0c82c0459e56e52a374cff03bc7b21a2e76bd957cc368fafd23ca0ba0b45" name = "github.com/bugsnag/bugsnag-go" packages = [ ".", - "errors", + "errors" ] - pruneopts = "UT" revision = "3f5889f222e9c07aa1f62c5e8c202e402ce574cd" version = "v1.3.2" [[projects]] - digest = "1:3049c43c6d1cfaa347acd27d6342187f8f38d9f416bbba7b02b43f82848302d2" name = "github.com/bugsnag/panicwrap" packages = ["."] - pruneopts = "UT" revision = "4009b2b7c78d820cc4a2e42f035bb557ce4ae45b" version = "v1.2.0" [[projects]] - digest = "1:65b0d980b428a6ad4425f2df4cd5410edd81f044cf527bd1c345368444649e58" name = "github.com/census-instrumentation/opencensus-proto" packages = [ "gen-go/agent/common/v1", "gen-go/agent/trace/v1", "gen-go/resource/v1", - "gen-go/trace/v1", + "gen-go/trace/v1" ] - pruneopts = "UT" revision = "7f2434bc10da710debe5c4315ed6d4df454b4024" version = "v0.1.0" [[projects]] - digest = "1:37f8940c4d3c41536ea882b1ca3498e403c04892dfc34bd0d670ed9eafccda9a" name = "github.com/containerd/containerd" packages = [ "content", @@ -198,73 +155,59 @@ "platforms", "reference", "remotes", - "remotes/docker", + "remotes/docker" ] - pruneopts = "UT" revision = "894b81a4b802e4eb2a91d1ce216b8817763c29fb" version = "v1.2.6" [[projects]] branch = "master" - digest = "1:e48c63e818c67fbf3d7afe20bba33134ab1a5bf384847385384fd027652a5a96" name = "github.com/containerd/continuity" packages = ["pathdriver"] - pruneopts = "UT" revision = "004b46473808b3e7a4a3049c20e4376c91eb966d" [[projects]] - digest = "1:7cb4fdca4c251b3ef8027c90ea35f70c7b661a593b9eeae34753c65499098bb1" name = "github.com/cpuguy83/go-md2man" packages = ["md2man"] - pruneopts = "UT" revision = "20f5889cbdc3c73dbd2862796665e7c465ade7d1" version = "v1.0.8" [[projects]] - digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" name = "github.com/davecgh/go-spew" packages = ["spew"] - pruneopts = "UT" revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" [[projects]] - digest = "1:5bed34759ca1dd43ff92383caedd16f006d3b6c4b73c7690a24ae0a5627294fa" name = "github.com/deislabs/oras" packages = [ "pkg/auth", "pkg/auth/docker", "pkg/content", "pkg/context", - "pkg/oras", + "pkg/oras" ] - pruneopts = "UT" revision = "b3b6ce7eeb31a5c0d891d33f585c84ae3dcc9046" version = "v0.5.0" [[projects]] - digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55" name = "github.com/dgrijalva/jwt-go" packages = ["."] - pruneopts = "UT" revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" version = "v3.2.0" [[projects]] - digest = "1:238ba9f81f5f913de38bd4c5dab90c4b5eea90a5ee32a986e5416267adec4f67" name = "github.com/docker/cli" packages = [ "cli/config", "cli/config/configfile", "cli/config/credentials", - "cli/config/types", + "cli/config/types" ] - pruneopts = "UT" revision = "f28d9cc92972044feb72ab6833699102992d40a2" version = "v19.03.0-beta3" [[projects]] - digest = "1:feaf11ab67fe48ec2712bf9d44e2fb2d4ebdc5da8e5a47bd3ce05bae9f82825b" name = "github.com/docker/distribution" packages = [ ".", @@ -306,15 +249,13 @@ "registry/storage/driver/inmemory", "registry/storage/driver/middleware", "uuid", - "version", + "version" ] - pruneopts = "UT" revision = "40b7b5830a2337bb07627617740c0e39eb92800c" version = "v2.7.0" [[projects]] branch = "master" - digest = "1:b5be0d9940d8fa3ff7df4949a8e8c47a7f93ea8251239ad074e1a6b0db55876a" name = "github.com/docker/docker" packages = [ "api/types", @@ -341,157 +282,123 @@ "pkg/term", "pkg/term/windows", "registry", - "registry/resumable", + "registry/resumable" ] - pruneopts = "UT" revision = "2cb26cfe9cbf8a64c5046c74d65f4528b22e67f4" [[projects]] - digest = "1:8866486038791fe65ea1abf660041423954b1f3fb99ea6a0ad8424422e943458" name = "github.com/docker/docker-credential-helpers" packages = [ "client", - "credentials", + "credentials" ] - pruneopts = "UT" revision = "5241b46610f2491efdf9d1c85f1ddf5b02f6d962" version = "v0.6.1" [[projects]] - digest = "1:811c86996b1ca46729bad2724d4499014c4b9effd05ef8c71b852aad90deb0ce" name = "github.com/docker/go-connections" packages = [ "nat", "sockets", - "tlsconfig", + "tlsconfig" ] - pruneopts = "UT" revision = "7395e3f8aa162843a74ed6d48e79627d9792ac55" version = "v0.4.0" [[projects]] branch = "master" - digest = "1:2b126e77be4ab4b92cdb3924c87894dd76bf365ba282f358a13133e848aa0059" name = "github.com/docker/go-metrics" packages = ["."] - pruneopts = "UT" revision = "b84716841b82eab644a0c64fc8b42d480e49add5" [[projects]] - digest = "1:6f82cacd0af5921e99bf3f46748705239b36489464f4529a1589bc895764fb18" name = "github.com/docker/go-units" packages = ["."] - pruneopts = "UT" revision = "47565b4f722fb6ceae66b95f853feed578a4a51c" version = "v0.3.3" [[projects]] branch = "master" - digest = "1:4841e14252a2cecf11840bd05230412ad469709bbacfc12467e2ce5ad07f339b" name = "github.com/docker/libtrust" packages = ["."] - pruneopts = "UT" revision = "aabc10ec26b754e797f9028f4589c5b7bd90dc20" [[projects]] branch = "master" - digest = "1:ecdc8e0fe3bc7d549af1c9c36acf3820523b707d6c071b6d0c3860882c6f7b42" name = "github.com/docker/spdystream" packages = [ ".", - "spdy", + "spdy" ] - pruneopts = "UT" revision = "6480d4af844c189cf5dd913db24ddd339d3a4f85" [[projects]] - digest = "1:899234af23e5793c34e06fd397f86ba33af5307b959b6a7afd19b63db065a9d7" name = "github.com/emicklei/go-restful" packages = [ ".", - "log", + "log" ] - pruneopts = "UT" revision = "3eb9738c1697594ea6e71a7156a9bb32ed216cf0" version = "v2.8.0" [[projects]] - digest = "1:b48d19e79fa607e9e3715ff9a73cdd3777a9cac254b50b9af721466f687e850d" name = "github.com/evanphx/json-patch" packages = ["."] - pruneopts = "UT" revision = "afac545df32f2287a079e2dfb7ba2745a643747e" version = "v3.0.0" [[projects]] branch = "master" - digest = "1:5e0da1aba1a7b125f46e6ddca43e98b40cf6eaea3322b016c331cf6afe53c30a" name = "github.com/exponent-io/jsonpath" packages = ["."] - pruneopts = "UT" revision = "d6023ce2651d8eafb5c75bb0c7167536102ec9f5" [[projects]] - digest = "1:bbc4aacabe6880bdbce849c64cb061b7eddf39f132af4ea2853ddd32f85fbec3" name = "github.com/fatih/camelcase" packages = ["."] - pruneopts = "UT" revision = "44e46d280b43ec1531bb25252440e34f1b800b65" version = "v1.0.0" [[projects]] - digest = "1:0594af97b2f4cec6554086eeace6597e20a4b69466eb4ada25adf9f4300dddd2" name = "github.com/garyburd/redigo" packages = [ "internal", - "redis", + "redis" ] - pruneopts = "UT" revision = "a69d19351219b6dd56f274f96d85a7014a2ec34e" version = "v1.6.0" [[projects]] - digest = "1:2cd7915ab26ede7d95b8749e6b1f933f1c6d5398030684e6505940a10f31cfda" name = "github.com/ghodss/yaml" packages = ["."] - pruneopts = "UT" revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" version = "v1.0.0" [[projects]] - digest = "1:953a2628e4c5c72856b53f5470ed5e071c55eccf943d798d42908102af2a610f" name = "github.com/go-openapi/jsonpointer" packages = ["."] - pruneopts = "UT" revision = "ef5f0afec364d3b9396b7b77b43dbe26bf1f8004" version = "v0.17.2" [[projects]] - digest = "1:81210e0af657a0fb3638932ec68e645236bceefa4c839823db0c4d918f080895" name = "github.com/go-openapi/jsonreference" packages = ["."] - pruneopts = "UT" revision = "8483a886a90412cd6858df4ea3483dce9c8e35a3" version = "v0.17.2" [[projects]] - digest = "1:394fed5c0425fe01da3a34078adaa1682e4deaea6e5d232dde25c4034004c151" name = "github.com/go-openapi/spec" packages = ["."] - pruneopts = "UT" revision = "5bae59e25b21498baea7f9d46e9c147ec106a42e" version = "v0.17.2" [[projects]] - digest = "1:32f3d2e7f343de7263c550d696fb8a64d3c49d8df16b1ddfc8e80e1e4b3233ce" name = "github.com/go-openapi/swag" packages = ["."] - pruneopts = "UT" revision = "5899d5c5e619fda5fa86e14795a835f473ca284c" version = "v0.17.2" [[projects]] - digest = "1:9ae31ce33b4bab257668963e844d98765b44160be4ee98cafc44637a213e530d" name = "github.com/gobwas/glob" packages = [ ".", @@ -501,33 +408,27 @@ "syntax/ast", "syntax/lexer", "util/runes", - "util/strings", + "util/strings" ] - pruneopts = "UT" revision = "5ccd90ef52e1e632236f7326478d4faa74f99438" version = "v0.2.3" [[projects]] - digest = "1:b402bb9a24d108a9405a6f34675091b036c8b056aac843bf6ef2389a65c5cf48" name = "github.com/gogo/protobuf" packages = [ "proto", - "sortkeys", + "sortkeys" ] - pruneopts = "UT" revision = "4cbf7e384e768b4e01799441fdf2a706a5635ae7" version = "v1.2.0" [[projects]] branch = "master" - digest = "1:3fb07f8e222402962fa190eb060608b34eddfb64562a18e2167df2de0ece85d8" name = "github.com/golang/groupcache" packages = ["lru"] - pruneopts = "UT" revision = "c65c006176ff7ff98bb916961c7abbc6b0afc0aa" [[projects]] - digest = "1:8f0705fa33e8957018611cc81c65cb373b626c092d39931bb86882489fc4c3f4" name = "github.com/golang/protobuf" packages = [ "proto", @@ -535,51 +436,41 @@ "ptypes/any", "ptypes/duration", "ptypes/timestamp", - "ptypes/wrappers", + "ptypes/wrappers" ] - pruneopts = "UT" revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" version = "v1.2.0" [[projects]] branch = "master" - digest = "1:0bfbe13936953a98ae3cfe8ed6670d396ad81edf069a806d2f6515d7bb6950df" name = "github.com/google/btree" packages = ["."] - pruneopts = "UT" revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306" [[projects]] branch = "master" - digest = "1:3ee90c0d94da31b442dde97c99635aaafec68d0b8a3c12ee2075c6bdabeec6bb" name = "github.com/google/gofuzz" packages = ["."] - pruneopts = "UT" revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" [[projects]] - digest = "1:236d7e1bdb50d8f68559af37dbcf9d142d56b431c9b2176d41e2a009b664cda8" name = "github.com/google/uuid" packages = ["."] - pruneopts = "UT" revision = "9b3b1e0f5f99ae461456d768e7d301a7acdaa2d8" version = "v1.1.0" [[projects]] - digest = "1:65c4414eeb350c47b8de71110150d0ea8a281835b1f386eacaa3ad7325929c21" name = "github.com/googleapis/gnostic" packages = [ "OpenAPIv2", "compiler", - "extensions", + "extensions" ] - pruneopts = "UT" revision = "7c663266750e7d82587642f65e60bc4083f1f84e" version = "v0.2.0" [[projects]] branch = "master" - digest = "1:d47549022c929925679aec031329f59f250d704f69ee44a194998cdb8d873393" name = "github.com/gophercloud/gophercloud" packages = [ ".", @@ -588,383 +479,297 @@ "openstack/identity/v2/tokens", "openstack/identity/v3/tokens", "openstack/utils", - "pagination", + "pagination" ] - pruneopts = "UT" revision = "94924357ebf6c7d448c70d65082ff7ca6f78ddc5" [[projects]] - digest = "1:664d37ea261f0fc73dd17f4a1f5f46d01fbb0b0d75f6375af064824424109b7d" name = "github.com/gorilla/handlers" packages = ["."] - pruneopts = "UT" revision = "7e0847f9db758cdebd26c149d0ae9d5d0b9c98ce" version = "v1.4.0" [[projects]] - digest = "1:ca59b1175189b3f0e9f1793d2c350114be36eaabbe5b9f554b35edee1de50aea" name = "github.com/gorilla/mux" packages = ["."] - pruneopts = "UT" revision = "a7962380ca08b5a188038c69871b8d3fbdf31e89" version = "v1.7.0" [[projects]] branch = "master" - digest = "1:4e08dc2383a46b3107f0b34ca338c4459e8fc8ee90e46a60e728aa8a2b21d558" name = "github.com/gosuri/uitable" packages = [ ".", "util/strutil", - "util/wordwrap", + "util/wordwrap" ] - pruneopts = "UT" revision = "36ee7e946282a3fb1cfecd476ddc9b35d8847e42" [[projects]] branch = "master" - digest = "1:86c1210529e69d69860f2bb3ee9ccce0b595aa3f9165e7dd1388e5c612915888" name = "github.com/gregjones/httpcache" packages = [ ".", - "diskcache", + "diskcache" ] - pruneopts = "UT" revision = "c63ab54fda8f77302f8d414e19933f2b6026a089" [[projects]] - digest = "1:8ec8d88c248041a6df5f6574b87bc00e7e0b493881dad2e7ef47b11dc69093b5" name = "github.com/hashicorp/golang-lru" packages = [ ".", - "simplelru", + "simplelru" ] - pruneopts = "UT" revision = "20f1fb78b0740ba8c3cb143a61e86ba5c8669768" version = "v0.5.0" [[projects]] - digest = "1:f9a5e090336881be43cfc1cf468330c1bdd60abdc9dd194e0b1ab69f4b94dd7c" name = "github.com/huandu/xstrings" packages = ["."] - pruneopts = "UT" revision = "f02667b379e2fb5916c3cda2cf31e0eb885d79f8" version = "v1.2.0" [[projects]] - digest = "1:8eb1de8112c9924d59bf1d3e5c26f5eaa2bfc2a5fcbb92dc1c2e4546d695f277" name = "github.com/imdario/mergo" packages = ["."] - pruneopts = "UT" revision = "9f23e2d6bd2a77f959b2bf6acdbefd708a83a4a4" version = "v0.3.6" [[projects]] - digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] - pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] - digest = "1:3e551bbb3a7c0ab2a2bf4660e7fcad16db089fdcfbb44b0199e62838038623ea" name = "github.com/json-iterator/go" packages = ["."] - pruneopts = "UT" revision = "1624edc4454b8682399def8740d46db5e4362ba4" version = "v1.1.5" [[projects]] branch = "master" - digest = "1:caf6db28595425c0e0f2301a00257d11712f65c1878e12cffc42f6b9a9cf3f23" name = "github.com/kardianos/osext" packages = ["."] - pruneopts = "UT" revision = "ae77be60afb1dcacde03767a8c37337fad28ac14" [[projects]] - digest = "1:0a69a1c0db3591fcefb47f115b224592c8dfa4368b7ba9fae509d5e16cdc95c8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] - pruneopts = "UT" revision = "5c8c8bd35d3832f5d134ae1e1e375b69a4d25242" version = "v1.0.1" [[projects]] branch = "master" - digest = "1:84a5a2b67486d5d67060ac393aa255d05d24ed5ee41daecd5635ec22657b6492" name = "github.com/mailru/easyjson" packages = [ "buffer", "jlexer", - "jwriter", + "jwriter" ] - pruneopts = "UT" revision = "60711f1a8329503b04e1c88535f419d0bb440bff" [[projects]] - digest = "1:0356f3312c9bd1cbeda81505b7fd437501d8e778ab66998ef69f00d7f9b3a0d7" name = "github.com/mattn/go-runewidth" packages = ["."] - pruneopts = "UT" revision = "3ee7d812e62a0804a7d0a324e0249ca2db3476d3" version = "v0.0.4" [[projects]] - digest = "1:7efe48dea4db6b35dcc15e15394b627247e5b3fb814242de986b746ba8e0abf0" name = "github.com/mattn/go-shellwords" packages = ["."] - pruneopts = "UT" revision = "02e3cf038dcea8290e44424da473dd12be796a8a" version = "v1.0.3" [[projects]] - digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] - pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] - digest = "1:fac4398a5e6e7a30f0e5a13c47fd95f153fa0d94be371a6c01568d56808a9791" name = "github.com/miekg/dns" packages = ["."] - pruneopts = "UT" revision = "0d29b283ac0f967dd3a02739bf26a22702210d7a" [[projects]] - digest = "1:abf08734a6527df70ed361d7c369fb580e6840d8f7a6012e5f609fdfd93b4e48" name = "github.com/mitchellh/go-wordwrap" packages = ["."] - pruneopts = "UT" revision = "9e67c67572bc5dd02aef930e2b0ae3c02a4b5a5c" version = "v1.0.0" [[projects]] - digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" name = "github.com/modern-go/concurrent" packages = ["."] - pruneopts = "UT" revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" version = "1.0.3" [[projects]] - digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855" name = "github.com/modern-go/reflect2" packages = ["."] - pruneopts = "UT" revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" version = "1.0.1" [[projects]] - digest = "1:ee4d4af67d93cc7644157882329023ce9a7bcfce956a079069a9405521c7cc8d" name = "github.com/opencontainers/go-digest" packages = ["."] - pruneopts = "UT" revision = "279bed98673dd5bef374d3b6e4b09e2af76183bf" version = "v1.0.0-rc1" [[projects]] - digest = "1:11db38d694c130c800d0aefb502fb02519e514dc53d9804ce51d1ad25ec27db6" name = "github.com/opencontainers/image-spec" packages = [ "specs-go", - "specs-go/v1", + "specs-go/v1" ] - pruneopts = "UT" revision = "d60099175f88c47cd379c4738d158884749ed235" version = "v1.0.1" [[projects]] - digest = "1:38ee335aedf4626620f3cf8f605661e71abdcce7b40b38921962beb3980f0a20" name = "github.com/opencontainers/runc" packages = ["libcontainer/user"] - pruneopts = "UT" revision = "baf6536d6259209c3edfa2b22237af82942d3dfa" version = "v0.1.1" [[projects]] branch = "master" - digest = "1:3bf17a6e6eaa6ad24152148a631d18662f7212e21637c2699bff3369b7f00fa2" name = "github.com/petar/GoLLRB" packages = ["llrb"] - pruneopts = "UT" revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" [[projects]] - digest = "1:0e7775ebbcf00d8dd28ac663614af924411c868dca3d5aa762af0fae3808d852" name = "github.com/peterbourgon/diskv" packages = ["."] - pruneopts = "UT" revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" version = "v2.0.1" [[projects]] - digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] - pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] - pruneopts = "UT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] - digest = "1:93a746f1060a8acbcf69344862b2ceced80f854170e1caae089b2834c5fbf7f4" name = "github.com/prometheus/client_golang" packages = [ "prometheus", "prometheus/internal", - "prometheus/promhttp", + "prometheus/promhttp" ] - pruneopts = "UT" revision = "505eaef017263e299324067d40ca2c48f6a2cf50" version = "v0.9.2" [[projects]] branch = "master" - digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" name = "github.com/prometheus/client_model" packages = ["go"] - pruneopts = "UT" revision = "fd36f4220a901265f90734c3183c5f0c91daa0b8" [[projects]] - digest = "1:35cf6bdf68db765988baa9c4f10cc5d7dda1126a54bd62e252dbcd0b1fc8da90" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model", + "model" ] - pruneopts = "UT" revision = "cfeb6f9992ffa54aaa4f2170ade4067ee478b250" version = "v0.2.0" [[projects]] branch = "master" - digest = "1:5833c61ebbd625a6bad8e5a1ada2b3e13710cf3272046953a2c8915340fe60a3" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs", + "xfs" ] - pruneopts = "UT" revision = "316cf8ccfec56d206735d46333ca162eb374da8b" [[projects]] - digest = "1:b36a0ede02c4c2aef7df7f91cbbb7bb88a98b5d253509d4f997dda526e50c88c" name = "github.com/russross/blackfriday" packages = ["."] - pruneopts = "UT" revision = "05f3235734ad95d0016f6a23902f06461fcf567a" version = "v1.5.2" [[projects]] - digest = "1:fd61cf4ae1953d55df708acb6b91492d538f49c305b364a014049914495db426" name = "github.com/sirupsen/logrus" packages = ["."] - pruneopts = "UT" revision = "8bdbc7bcc01dcbb8ec23dc8a28e332258d25251f" version = "v1.4.1" [[projects]] - digest = "1:2e72f9cdc8b6f94a145fa1c97e305e1654d40507d04d2fbb0c37bf461a4b85f7" name = "github.com/spf13/cobra" packages = [ ".", - "doc", + "doc" ] - pruneopts = "UT" revision = "67fc4837d267bc9bfd6e47f77783fcc3dffc68de" version = "v0.0.4" [[projects]] - digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" name = "github.com/spf13/pflag" packages = ["."] - pruneopts = "UT" revision = "298182f68c66c05229eb03ac171abe6e309ee79a" version = "v1.0.3" [[projects]] - digest = "1:8ff03ccc603abb0d7cce94d34b613f5f6251a9e1931eba1a3f9888a9029b055c" name = "github.com/stretchr/testify" packages = [ "assert", "require", - "suite", + "suite" ] - pruneopts = "UT" revision = "ffdc059bfe9ce6a4e144ba849dbedead332c6053" version = "v1.3.0" [[projects]] branch = "master" - digest = "1:f4e5276a3b356f4692107047fd2890f2fe534f4feeb6b1fd2f6dfbd87f1ccf54" name = "github.com/xeipuuv/gojsonpointer" packages = ["."] - pruneopts = "UT" revision = "4e3ac2762d5f479393488629ee9370b50873b3a6" [[projects]] branch = "master" - digest = "1:dc6a6c28ca45d38cfce9f7cb61681ee38c5b99ec1425339bfc1e1a7ba769c807" name = "github.com/xeipuuv/gojsonreference" packages = ["."] - pruneopts = "UT" revision = "bd5ef7bd5415a7ac448318e64f11a24cd21e594b" [[projects]] - digest = "1:1c898ea6c30c16e8d55fdb6fe44c4bee5f9b7d68aa260cfdfc3024491dcc7bea" name = "github.com/xeipuuv/gojsonschema" packages = ["."] - pruneopts = "UT" revision = "f971f3cd73b2899de6923801c147f075263e0c50" version = "v1.1.0" [[projects]] - digest = "1:340553b2fdaab7d53e63fd40f8ed82203bdd3274253055bdb80a46828482ef81" name = "github.com/xenolf/lego" packages = ["acme"] - pruneopts = "UT" revision = "a9d8cec0e6563575e5868a005359ac97911b5985" [[projects]] branch = "master" - digest = "1:dcc3219685abd95a08e219859c5f0d80ad25d365b854849d04896ccde94e2422" name = "github.com/yvasiyarov/go-metrics" packages = ["."] - pruneopts = "UT" revision = "c25f46c4b94079672242ec48a545e7ca9ebe3aec" [[projects]] - digest = "1:c14faa3573c79c4a37d49b9081e062208ad1f27ec6e67c74c59eec45f17d9ae9" name = "github.com/yvasiyarov/gorelic" packages = ["."] - pruneopts = "UT" revision = "4dc1bb7ab951bc884feb2c009092b1a454152355" version = "v0.0.6" [[projects]] - digest = "1:140012d43042bb7748adc780c767abaab8cf6027fe8cb4bca5099d74e2292656" name = "github.com/yvasiyarov/newrelic_platform_go" packages = ["."] - pruneopts = "UT" revision = "b21fdbd4370f3717f3bbd2bf41c223bc273068e6" [[projects]] - digest = "1:2ae8314c44cd413cfdb5b1df082b350116dd8d2fff973e62c01b285b7affd89e" name = "go.opencensus.io" packages = [ ".", @@ -981,15 +786,13 @@ "trace", "trace/internal", "trace/propagation", - "trace/tracestate", + "trace/tracestate" ] - pruneopts = "UT" revision = "b7bf3cdb64150a8c8c53b769fdeb2ba581bd4d4b" version = "v0.18.0" [[projects]] branch = "master" - digest = "1:91e034b0c63a4c747c6e9dc8285f36dc5fe699a78d34de0a663895e52ff673dd" name = "golang.org/x/crypto" packages = [ "bcrypt", @@ -1007,14 +810,12 @@ "openpgp/s2k", "pbkdf2", "scrypt", - "ssh/terminal", + "ssh/terminal" ] - pruneopts = "UT" revision = "505ab145d0a99da450461ae2c1a9f6cd10d1f447" [[projects]] branch = "master" - digest = "1:80c256dfc14840e13293d6404b7774e497187bd15a53f943f99bfaef4bbb2e42" name = "golang.org/x/net" packages = [ "bpf", @@ -1032,49 +833,41 @@ "ipv6", "proxy", "publicsuffix", - "trace", + "trace" ] - pruneopts = "UT" revision = "927f97764cc334a6575f4b7a1584a147864d5723" [[projects]] branch = "master" - digest = "1:23443edff0740e348959763085df98400dcfd85528d7771bb0ce9f5f2754ff4a" name = "golang.org/x/oauth2" packages = [ ".", "google", "internal", "jws", - "jwt", + "jwt" ] - pruneopts = "UT" revision = "d668ce993890a79bda886613ee587a69dd5da7a6" [[projects]] branch = "master" - digest = "1:04a5b0e4138f98eef79ce12a955a420ee358e9f787044cc3a553ac3c3ade997e" name = "golang.org/x/sync" packages = [ "errgroup", - "semaphore", + "semaphore" ] - pruneopts = "UT" revision = "37e7f081c4d4c64e13b10787722085407fe5d15f" [[projects]] branch = "master" - digest = "1:3d5e79e10549fd9119cbefd614b6d351ef5bd0be2f2b103a4199788e784cbc68" name = "golang.org/x/sys" packages = [ "unix", - "windows", + "windows" ] - pruneopts = "UT" revision = "b4a75ba826a64a70990f11a225237acd6ef35c9f" [[projects]] - digest = "1:28756bf526c1af662d24519f2fa7abca7237bebb06e3e02941b2b6e5b6ceb7b9" name = "golang.org/x/text" packages = [ "collate", @@ -1097,30 +890,24 @@ "unicode/cldr", "unicode/norm", "unicode/rangetable", - "width", + "width" ] - pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] branch = "master" - digest = "1:9fdc2b55e8e0fafe4b41884091e51e77344f7dc511c5acedcfd98200003bff90" name = "golang.org/x/time" packages = ["rate"] - pruneopts = "UT" revision = "85acf8d2951cb2a3bde7632f9ff273ef0379bcbd" [[projects]] branch = "master" - digest = "1:5f003878aabe31d7f6b842d4de32b41c46c214bb629bb485387dbcce1edf5643" name = "google.golang.org/api" packages = ["support/bundler"] - pruneopts = "UT" revision = "65a46cafb132eff435c7d1e0f439cc73c8eebb85" [[projects]] - digest = "1:fa026a5c59bd2df343ec4a3538e6288dcf4e2ec5281d743ae82c120affe6926a" name = "google.golang.org/appengine" packages = [ ".", @@ -1132,22 +919,18 @@ "internal/modules", "internal/remote_api", "internal/urlfetch", - "urlfetch", + "urlfetch" ] - pruneopts = "UT" revision = "e9657d882bb81064595ca3b56cbe2546bbabf7b1" version = "v1.4.0" [[projects]] branch = "master" - digest = "1:077c1c599507b3b3e9156d17d36e1e61928ee9b53a5b420f10f28ebd4a0b275c" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - pruneopts = "UT" revision = "bd9b4fb69e2ffd37621a6caa54dcbead29b546f2" [[projects]] - digest = "1:9edd250a3c46675d0679d87540b30c9ed253b19bd1fd1af08f4f5fb3c79fc487" name = "google.golang.org/grpc" packages = [ ".", @@ -1180,60 +963,50 @@ "resolver/passthrough", "stats", "status", - "tap", + "tap" ] - pruneopts = "UT" revision = "df014850f6dee74ba2fc94874043a9f3f75fbfd8" version = "v1.17.0" [[projects]] - digest = "1:2d1fbdc6777e5408cabeb02bf336305e724b925ff4546ded0fa8715a7267922a" name = "gopkg.in/inf.v0" packages = ["."] - pruneopts = "UT" revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf" source = "https://github.com/go-inf/inf.git" version = "v0.9.1" [[projects]] - digest = "1:0c9d7630c981ff09c7d297db73b3a94358e6572e8de063853c38d1e2c500272e" name = "gopkg.in/square/go-jose.v1" packages = [ ".", "cipher", - "json", + "json" ] - pruneopts = "UT" revision = "56062818b5e15ee405eb8363f9498c7113e98337" source = "https://github.com/square/go-jose.git" version = "v1.1.2" [[projects]] - digest = "1:005cbf8b937fcb1694b9dbb845b0aef618627be7faf7bb330eb2490e3f506ef8" name = "gopkg.in/square/go-jose.v2" packages = [ ".", "cipher", "json", - "jwt", + "jwt" ] - pruneopts = "UT" revision = "628223f44a71f715d2881ea69afc795a1e9c01be" source = "https://github.com/square/go-jose.git" version = "v2.3.0" [[projects]] - digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" name = "gopkg.in/yaml.v2" packages = ["."] - pruneopts = "UT" revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" source = "https://github.com/go-yaml/yaml" version = "v2.2.2" [[projects]] branch = "release-1.14" - digest = "1:7b8963a5f5bb45d0b3c18806459c02b2284a4267c8c7e9444606e95b95b51fe3" name = "k8s.io/api" packages = [ "admission/v1beta1", @@ -1273,22 +1046,18 @@ "settings/v1alpha1", "storage/v1", "storage/v1alpha1", - "storage/v1beta1", + "storage/v1beta1" ] - pruneopts = "UT" revision = "40a48860b5abbba9aa891b02b32da429b08d96a0" [[projects]] branch = "release-1.14" - digest = "1:fa65856d5086d5338e962b3bd409e09cd70cb0ceb110167cdf565edd6920ed2e" name = "k8s.io/apiextensions-apiserver" packages = ["pkg/features"] - pruneopts = "UT" revision = "53c4693659ed354d76121458fb819202dd1635fa" [[projects]] branch = "release-1.14" - digest = "1:c10a6fffe98df81cdaaeef73a38e4d669d59d2b46a3fe18565d5eb7264d19255" name = "k8s.io/apimachinery" packages = [ "pkg/api/equality", @@ -1343,28 +1112,24 @@ "pkg/watch", "third_party/forked/golang/json", "third_party/forked/golang/netutil", - "third_party/forked/golang/reflect", + "third_party/forked/golang/reflect" ] - pruneopts = "UT" revision = "d7deff9243b165ee192f5551710ea4285dcfd615" [[projects]] branch = "release-1.14" - digest = "1:71c95d81a294dcee66147ff711896968d512b05df9bf6183cb289c6570c60b4f" name = "k8s.io/apiserver" packages = [ "pkg/authentication/authenticator", "pkg/authentication/serviceaccount", "pkg/authentication/user", "pkg/features", - "pkg/util/feature", + "pkg/util/feature" ] - pruneopts = "UT" revision = "8b27c41bdbb11ff103caa673315e097bf0289171" [[projects]] branch = "master" - digest = "1:1617a9d82f05ddcd88c9f3638359de6c12012f61f0fea110a37f5fc1861dc48b" name = "k8s.io/cli-runtime" packages = [ "pkg/genericclioptions", @@ -1378,57 +1143,93 @@ "pkg/kustomize/k8sdeps/transformer/patch", "pkg/kustomize/k8sdeps/validator", "pkg/printers", - "pkg/resource", + "pkg/resource" ] - pruneopts = "UT" revision = "44a48934c135b31e4f1c0d12e91d384e1cb2304c" [[projects]] - digest = "1:1ac7533fe6c10c68cb17d26bd44975d582cbe4dee89fd0e095d3133c7680416b" name = "k8s.io/client-go" packages = [ "discovery", "discovery/cached/disk", + "discovery/fake", "dynamic", "dynamic/fake", "kubernetes", + "kubernetes/fake", "kubernetes/scheme", "kubernetes/typed/admissionregistration/v1beta1", + "kubernetes/typed/admissionregistration/v1beta1/fake", "kubernetes/typed/apps/v1", + "kubernetes/typed/apps/v1/fake", "kubernetes/typed/apps/v1beta1", + "kubernetes/typed/apps/v1beta1/fake", "kubernetes/typed/apps/v1beta2", + "kubernetes/typed/apps/v1beta2/fake", "kubernetes/typed/auditregistration/v1alpha1", + "kubernetes/typed/auditregistration/v1alpha1/fake", "kubernetes/typed/authentication/v1", + "kubernetes/typed/authentication/v1/fake", "kubernetes/typed/authentication/v1beta1", + "kubernetes/typed/authentication/v1beta1/fake", "kubernetes/typed/authorization/v1", + "kubernetes/typed/authorization/v1/fake", "kubernetes/typed/authorization/v1beta1", + "kubernetes/typed/authorization/v1beta1/fake", "kubernetes/typed/autoscaling/v1", + "kubernetes/typed/autoscaling/v1/fake", "kubernetes/typed/autoscaling/v2beta1", + "kubernetes/typed/autoscaling/v2beta1/fake", "kubernetes/typed/autoscaling/v2beta2", + "kubernetes/typed/autoscaling/v2beta2/fake", "kubernetes/typed/batch/v1", + "kubernetes/typed/batch/v1/fake", "kubernetes/typed/batch/v1beta1", + "kubernetes/typed/batch/v1beta1/fake", "kubernetes/typed/batch/v2alpha1", + "kubernetes/typed/batch/v2alpha1/fake", "kubernetes/typed/certificates/v1beta1", + "kubernetes/typed/certificates/v1beta1/fake", "kubernetes/typed/coordination/v1", + "kubernetes/typed/coordination/v1/fake", "kubernetes/typed/coordination/v1beta1", + "kubernetes/typed/coordination/v1beta1/fake", "kubernetes/typed/core/v1", + "kubernetes/typed/core/v1/fake", "kubernetes/typed/events/v1beta1", + "kubernetes/typed/events/v1beta1/fake", "kubernetes/typed/extensions/v1beta1", + "kubernetes/typed/extensions/v1beta1/fake", "kubernetes/typed/networking/v1", + "kubernetes/typed/networking/v1/fake", "kubernetes/typed/networking/v1beta1", + "kubernetes/typed/networking/v1beta1/fake", "kubernetes/typed/node/v1alpha1", + "kubernetes/typed/node/v1alpha1/fake", "kubernetes/typed/node/v1beta1", + "kubernetes/typed/node/v1beta1/fake", "kubernetes/typed/policy/v1beta1", + "kubernetes/typed/policy/v1beta1/fake", "kubernetes/typed/rbac/v1", + "kubernetes/typed/rbac/v1/fake", "kubernetes/typed/rbac/v1alpha1", + "kubernetes/typed/rbac/v1alpha1/fake", "kubernetes/typed/rbac/v1beta1", + "kubernetes/typed/rbac/v1beta1/fake", "kubernetes/typed/scheduling/v1", + "kubernetes/typed/scheduling/v1/fake", "kubernetes/typed/scheduling/v1alpha1", + "kubernetes/typed/scheduling/v1alpha1/fake", "kubernetes/typed/scheduling/v1beta1", + "kubernetes/typed/scheduling/v1beta1/fake", "kubernetes/typed/settings/v1alpha1", + "kubernetes/typed/settings/v1alpha1/fake", "kubernetes/typed/storage/v1", + "kubernetes/typed/storage/v1/fake", "kubernetes/typed/storage/v1alpha1", + "kubernetes/typed/storage/v1alpha1/fake", "kubernetes/typed/storage/v1beta1", + "kubernetes/typed/storage/v1beta1/fake", "pkg/apis/clientauthentication", "pkg/apis/clientauthentication/v1alpha1", "pkg/apis/clientauthentication/v1beta1", @@ -1475,44 +1276,36 @@ "util/homedir", "util/jsonpath", "util/keyutil", - "util/retry", + "util/retry" ] - pruneopts = "UT" revision = "1a26190bd76a9017e289958b9fba936430aa3704" version = "kubernetes-1.14.1" [[projects]] branch = "master" - digest = "1:0b0a9bd556672d681837dab08c6b33d37c7f45f1916d9bbe8feca78e08383db3" name = "k8s.io/cloud-provider" packages = ["features"] - pruneopts = "UT" revision = "9c9d72d1bf90eb62005f5112f3eea019b272c44b" [[projects]] - digest = "1:e2999bf1bb6eddc2a6aa03fe5e6629120a53088926520ca3b4765f77d7ff7eab" name = "k8s.io/klog" packages = ["."] - pruneopts = "UT" revision = "a5bc97fbc634d635061f3146511332c7e313a55a" version = "v0.1.0" [[projects]] branch = "master" - digest = "1:d8f05387026197d55244f5866ea172e360c3f1602bea51ba90c72a7a43ecdce6" name = "k8s.io/kube-openapi" packages = [ "pkg/common", "pkg/util/proto", "pkg/util/proto/testing", - "pkg/util/proto/validation", + "pkg/util/proto/validation" ] - pruneopts = "UT" revision = "0317810137be915b9cf888946c6e115c1bfac693" [[projects]] branch = "release-1.14" - digest = "1:8e018df756b49f5fdc20e15041486520285829528df043457bb7a91886fa775b" name = "k8s.io/kubernetes" packages = [ "pkg/api/legacyscheme", @@ -1566,14 +1359,12 @@ "pkg/util/labels", "pkg/util/parsers", "pkg/util/taints", - "pkg/version", + "pkg/version" ] - pruneopts = "UT" revision = "a2e9891cd681b2682895dfd04f4cd31186cc2ac4" [[projects]] branch = "master" - digest = "1:97af0e3995afafd52fc0135efaa3290f1f3326fd184e0ef48060f76fab51c6ef" name = "k8s.io/utils" packages = [ "buffer", @@ -1582,22 +1373,18 @@ "net", "path", "pointer", - "trace", + "trace" ] - pruneopts = "UT" revision = "21c4ce38f2a793ec01e925ddc31216500183b773" [[projects]] branch = "master" - digest = "1:15fbb9f95a13abe2be748b1159b491369d46a2ccc3f378e0f93c391f89608929" name = "rsc.io/letsencrypt" packages = ["."] - pruneopts = "UT" revision = "1847a81d2087eba73081db43989e54dabe0768cd" source = "https://github.com/dmcgowan/letsencrypt.git" [[projects]] - digest = "1:cb422c75bab66a8339a38b64e837f3b28f3d5a8c06abd7b9048f420363baa18a" name = "sigs.k8s.io/kustomize" packages = [ "pkg/commands/build", @@ -1621,100 +1408,20 @@ "pkg/transformers", "pkg/transformers/config", "pkg/transformers/config/defaultconfig", - "pkg/types", + "pkg/types" ] - pruneopts = "UT" revision = "a6f65144121d1955266b0cd836ce954c04122dc8" version = "v2.0.3" [[projects]] - digest = "1:7719608fe0b52a4ece56c2dde37bedd95b938677d1ab0f84b8a7852e4c59f849" name = "sigs.k8s.io/yaml" packages = ["."] - pruneopts = "UT" revision = "fd68e9863619f6ec2fdd8625fe1f02e7c877e480" version = "v1.1.0" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/BurntSushi/toml", - "github.com/Masterminds/semver", - "github.com/Masterminds/sprig", - "github.com/Masterminds/vcs", - "github.com/asaskevich/govalidator", - "github.com/containerd/containerd/reference", - "github.com/containerd/containerd/remotes", - "github.com/deislabs/oras/pkg/auth", - "github.com/deislabs/oras/pkg/auth/docker", - "github.com/deislabs/oras/pkg/content", - "github.com/deislabs/oras/pkg/context", - "github.com/deislabs/oras/pkg/oras", - "github.com/docker/distribution/configuration", - "github.com/docker/distribution/registry", - "github.com/docker/distribution/registry/auth/htpasswd", - "github.com/docker/distribution/registry/storage/driver/inmemory", - "github.com/docker/docker/pkg/term", - "github.com/docker/go-units", - "github.com/evanphx/json-patch", - "github.com/ghodss/yaml", - "github.com/gobwas/glob", - "github.com/gosuri/uitable", - "github.com/gosuri/uitable/util/strutil", - "github.com/mattn/go-shellwords", - "github.com/opencontainers/go-digest", - "github.com/opencontainers/image-spec/specs-go/v1", - "github.com/pkg/errors", - "github.com/sirupsen/logrus", - "github.com/spf13/cobra", - "github.com/spf13/cobra/doc", - "github.com/spf13/pflag", - "github.com/stretchr/testify/assert", - "github.com/stretchr/testify/suite", - "github.com/xeipuuv/gojsonschema", - "golang.org/x/crypto/bcrypt", - "golang.org/x/crypto/openpgp", - "golang.org/x/crypto/openpgp/clearsign", - "golang.org/x/crypto/openpgp/errors", - "golang.org/x/crypto/openpgp/packet", - "golang.org/x/crypto/ssh/terminal", - "gopkg.in/yaml.v2", - "k8s.io/api/apps/v1", - "k8s.io/api/apps/v1beta1", - "k8s.io/api/apps/v1beta2", - "k8s.io/api/batch/v1", - "k8s.io/api/core/v1", - "k8s.io/api/extensions/v1beta1", - "k8s.io/apimachinery/pkg/api/equality", - "k8s.io/apimachinery/pkg/api/errors", - "k8s.io/apimachinery/pkg/api/meta", - "k8s.io/apimachinery/pkg/apis/meta/v1", - "k8s.io/apimachinery/pkg/labels", - "k8s.io/apimachinery/pkg/runtime", - "k8s.io/apimachinery/pkg/runtime/schema", - "k8s.io/apimachinery/pkg/types", - "k8s.io/apimachinery/pkg/util/strategicpatch", - "k8s.io/apimachinery/pkg/util/validation", - "k8s.io/apimachinery/pkg/util/wait", - "k8s.io/apimachinery/pkg/watch", - "k8s.io/cli-runtime/pkg/genericclioptions", - "k8s.io/cli-runtime/pkg/resource", - "k8s.io/client-go/discovery", - "k8s.io/client-go/kubernetes", - "k8s.io/client-go/kubernetes/scheme", - "k8s.io/client-go/kubernetes/typed/core/v1", - "k8s.io/client-go/plugin/pkg/client/auth", - "k8s.io/client-go/rest", - "k8s.io/client-go/rest/fake", - "k8s.io/client-go/tools/clientcmd", - "k8s.io/client-go/tools/watch", - "k8s.io/client-go/util/homedir", - "k8s.io/klog", - "k8s.io/kubernetes/pkg/controller/deployment/util", - "k8s.io/kubernetes/pkg/kubectl/cmd/testing", - "k8s.io/kubernetes/pkg/kubectl/cmd/util", - "k8s.io/kubernetes/pkg/kubectl/validation", - ] + inputs-digest = "0bf4bc57df33ddb87b99b50768bdd2b6ac9bc33cb34e19d84fb9d1a31d84c28c" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Makefile b/Makefile index 923becf05..796806ab6 100644 --- a/Makefile +++ b/Makefile @@ -113,11 +113,11 @@ $(GOIMPORTS): # install vendored dependencies vendor: Gopkg.lock - $(DEP) ensure -v --vendor-only + $(DEP) ensure --vendor-only # update vendored dependencies Gopkg.lock: Gopkg.toml - $(DEP) ensure -v --no-vendor + $(DEP) ensure --no-vendor Gopkg.toml: $(DEP) diff --git a/cmd/helm/helm_test.go b/cmd/helm/helm_test.go index c9013136e..bf5df52a1 100644 --- a/cmd/helm/helm_test.go +++ b/cmd/helm/helm_test.go @@ -31,7 +31,7 @@ import ( "helm.sh/helm/pkg/action" "helm.sh/helm/pkg/chartutil" "helm.sh/helm/pkg/helmpath" - "helm.sh/helm/pkg/kube" + kubefake "helm.sh/helm/pkg/kube/fake" "helm.sh/helm/pkg/release" "helm.sh/helm/pkg/repo" "helm.sh/helm/pkg/storage" @@ -116,7 +116,7 @@ func executeActionCommandC(store *storage.Storage, cmd string) (*cobra.Command, actionConfig := &action.Configuration{ Releases: store, - KubeClient: &kube.PrintingKubeClient{Out: ioutil.Discard}, + KubeClient: &kubefake.PrintingKubeClient{Out: ioutil.Discard}, Capabilities: chartutil.DefaultCapabilities, Log: func(format string, v ...interface{}) {}, } diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 40e810c4a..ca2ef037f 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -128,6 +128,7 @@ func addInstallFlags(f *pflag.FlagSet, client *action.Install) { f.StringVar(&client.NameTemplate, "name-template", "", "specify template used to name the release") f.BoolVar(&client.Devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") f.BoolVar(&client.DependencyUpdate, "dependency-update", false, "run helm dependency update before installing the chart") + f.BoolVar(&client.Atomic, "atomic", false, "if set, installation process purges chart on fail. The --wait flag will be set automatically if --atomic is used") addValueOptionsFlags(f, &client.ValueOptions) addChartPathOptionsFlags(f, &client.ChartPathOptions) } diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 5d770130c..ff8bc2963 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -28,7 +28,7 @@ import ( "helm.sh/helm/cmd/helm/require" "helm.sh/helm/pkg/action" "helm.sh/helm/pkg/chartutil" - "helm.sh/helm/pkg/kube" + kubefake "helm.sh/helm/pkg/kube/fake" "helm.sh/helm/pkg/storage" "helm.sh/helm/pkg/storage/driver" ) @@ -46,7 +46,7 @@ func newTemplateCmd(out io.Writer) *cobra.Command { customConfig := &action.Configuration{ // Add mock objects in here so it doesn't use Kube API server Releases: storage.Init(driver.NewMemory()), - KubeClient: &kube.PrintingKubeClient{Out: ioutil.Discard}, + KubeClient: &kubefake.PrintingKubeClient{Out: ioutil.Discard}, Capabilities: chartutil.DefaultCapabilities, Log: func(format string, v ...interface{}) { fmt.Fprintf(out, format, v...) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 4bbf46d4f..38c36485f 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -96,6 +96,7 @@ func newUpgradeCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { instClient.Wait = client.Wait instClient.Devel = client.Devel instClient.Namespace = client.Namespace + instClient.Atomic = client.Atomic _, err := runInstall(args, instClient, out) return err @@ -147,6 +148,7 @@ func newUpgradeCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { f.BoolVar(&client.ResetValues, "reset-values", false, "when upgrading, reset the values to the ones built into the chart") f.BoolVar(&client.ReuseValues, "reuse-values", false, "when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored.") f.BoolVar(&client.Wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") + f.BoolVar(&client.Atomic, "atomic", false, "if set, upgrade process rolls back changes made in case of failed upgrade. The --wait flag will be set automatically if --atomic is used") f.IntVar(&client.MaxHistory, "history-max", 0, "limit the maximum number of revisions saved per release. Use 0 for no limit.") addChartPathOptionsFlags(f, &client.ChartPathOptions) addValueOptionsFlags(f, &client.ValueOptions) diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go index 1c53e49fc..cb966dcb8 100644 --- a/pkg/action/action_test.go +++ b/pkg/action/action_test.go @@ -17,17 +17,15 @@ package action import ( "flag" - "io" "io/ioutil" "testing" "time" - "github.com/pkg/errors" fakeclientset "k8s.io/client-go/kubernetes/fake" "helm.sh/helm/pkg/chart" "helm.sh/helm/pkg/chartutil" - "helm.sh/helm/pkg/kube" + kubefake "helm.sh/helm/pkg/kube/fake" "helm.sh/helm/pkg/release" "helm.sh/helm/pkg/storage" "helm.sh/helm/pkg/storage/driver" @@ -40,7 +38,7 @@ func actionConfigFixture(t *testing.T) *Configuration { return &Configuration{ Releases: storage.Init(driver.NewMemory()), - KubeClient: &kube.PrintingKubeClient{Out: ioutil.Discard}, + KubeClient: &kubefake.FailingKubeClient{PrintingKubeClient: kubefake.PrintingKubeClient{Out: ioutil.Discard}}, Capabilities: chartutil.DefaultCapabilities, Log: func(format string, v ...interface{}) { t.Helper() @@ -55,7 +53,7 @@ var manifestWithHook = `kind: ConfigMap metadata: name: test-cm annotations: - "helm.sh/hook": post-install,pre-delete + "helm.sh/hook": post-install,pre-delete,post-upgrade data: name: value` @@ -210,20 +208,6 @@ func namedReleaseStub(name string, status release.Status) *release.Release { } } -func newHookFailingKubeClient() *hookFailingKubeClient { - return &hookFailingKubeClient{ - PrintingKubeClient: kube.PrintingKubeClient{Out: ioutil.Discard}, - } -} - -type hookFailingKubeClient struct { - kube.PrintingKubeClient -} - -func (h *hookFailingKubeClient) WatchUntilReady(r io.Reader, timeout time.Duration) error { - return errors.New("Failed watch") -} - func TestGetVersionSet(t *testing.T) { client := fakeclientset.NewSimpleClientset() diff --git a/pkg/action/install.go b/pkg/action/install.go index e64b218dd..797e9ce1f 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -82,6 +82,7 @@ type Install struct { GenerateName bool NameTemplate string OutputDir string + Atomic bool } type ValueOptions struct { @@ -118,6 +119,10 @@ func (i *Install) Run(chrt *chart.Chart) (*release.Release, error) { return nil, err } + // Make sure if Atomic is set, that wait is set as well. This makes it so + // the user doesn't have to specify both + i.Wait = i.Wait || i.Atomic + caps, err := i.cfg.getCapabilities() if err != nil { return nil, err @@ -178,9 +183,7 @@ func (i *Install) Run(chrt *chart.Chart) (*release.Release, error) { // pre-install hooks if !i.DisableHooks { if err := i.execHook(rel.Hooks, hooks.PreInstall); err != nil { - rel.SetStatus(release.StatusFailed, "failed pre-install: "+err.Error()) - _ = i.replaceRelease(rel) - return rel, err + return i.failRelease(rel, fmt.Errorf("failed pre-install: %s", err)) } } @@ -189,26 +192,20 @@ func (i *Install) Run(chrt *chart.Chart) (*release.Release, error) { // to true, since that is basically an upgrade operation. buf := bytes.NewBufferString(rel.Manifest) if err := i.cfg.KubeClient.Create(buf); err != nil { - rel.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", i.ReleaseName, err.Error())) - i.recordRelease(rel) // Ignore the error, since we have another error to deal with. - return rel, errors.Wrapf(err, "release %s failed", i.ReleaseName) + return i.failRelease(rel, err) } if i.Wait { buf := bytes.NewBufferString(rel.Manifest) if err := i.cfg.KubeClient.Wait(buf, i.Timeout); err != nil { - rel.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", i.ReleaseName, err.Error())) - i.recordRelease(rel) // Ignore the error, since we have another error to deal with. - return rel, errors.Wrapf(err, "release %s failed", i.ReleaseName) + return i.failRelease(rel, err) } } if !i.DisableHooks { if err := i.execHook(rel.Hooks, hooks.PostInstall); err != nil { - rel.SetStatus(release.StatusFailed, "failed post-install: "+err.Error()) - _ = i.replaceRelease(rel) - return rel, err + return i.failRelease(rel, fmt.Errorf("failed post-install: %s", err)) } } @@ -226,6 +223,23 @@ func (i *Install) Run(chrt *chart.Chart) (*release.Release, error) { return rel, nil } +func (i *Install) failRelease(rel *release.Release, err error) (*release.Release, error) { + rel.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", i.ReleaseName, err.Error())) + if i.Atomic { + i.cfg.Log("Install failed and atomic is set, uninstalling release") + uninstall := NewUninstall(i.cfg) + uninstall.DisableHooks = i.DisableHooks + uninstall.KeepHistory = false + uninstall.Timeout = i.Timeout + if _, uninstallErr := uninstall.Run(i.ReleaseName); uninstallErr != nil { + return rel, errors.Wrapf(uninstallErr, "an error occurred while uninstalling the release. original install error: %s", err) + } + return rel, errors.Wrapf(err, "release %s failed, and has been uninstalled due to atomic being set", i.ReleaseName) + } + i.recordRelease(rel) // Ignore the error, since we have another error to deal with. + return rel, err +} + // availableName tests whether a name is available // // Roughly, this will return an error if name is diff --git a/pkg/action/install_test.go b/pkg/action/install_test.go index d92204298..006c55f43 100644 --- a/pkg/action/install_test.go +++ b/pkg/action/install_test.go @@ -30,6 +30,8 @@ import ( "helm.sh/helm/internal/test" "helm.sh/helm/pkg/release" + "helm.sh/helm/pkg/storage/driver" + kubefake "helm.sh/helm/pkg/kube/fake" ) type nameTemplateTestCase struct { @@ -189,7 +191,9 @@ func TestInstallRelease_FailedHooks(t *testing.T) { is := assert.New(t) instAction := installAction(t) instAction.ReleaseName = "failed-hooks" - instAction.cfg.KubeClient = newHookFailingKubeClient() + failer := instAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.WatchUntilReadyError = fmt.Errorf("Failed watch") + instAction.cfg.KubeClient = failer instAction.rawValues = map[string]interface{}{} res, err := instAction.Run(buildChart()) @@ -236,6 +240,63 @@ func TestInstallRelease_KubeVersion(t *testing.T) { is.Contains(err.Error(), "chart requires kubernetesVersion") } +func TestInstallRelease_Wait(t *testing.T) { + is := assert.New(t) + instAction := installAction(t) + instAction.ReleaseName = "come-fail-away" + failer := instAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.WaitError = fmt.Errorf("I timed out") + instAction.cfg.KubeClient = failer + instAction.Wait = true + instAction.rawValues = map[string]interface{}{} + + res, err := instAction.Run(buildChart()) + is.Error(err) + is.Contains(res.Info.Description, "I timed out") + is.Equal(res.Info.Status, release.StatusFailed) +} + +func TestInstallRelease_Atomic(t *testing.T) { + is := assert.New(t) + + t.Run("atomic uninstall succeeds", func(t *testing.T) { + instAction := installAction(t) + instAction.ReleaseName = "come-fail-away" + failer := instAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.WaitError = fmt.Errorf("I timed out") + instAction.cfg.KubeClient = failer + instAction.Atomic = true + instAction.rawValues = map[string]interface{}{} + + res, err := instAction.Run(buildChart()) + is.Error(err) + is.Contains(err.Error(), "I timed out") + is.Contains(err.Error(), "atomic") + + // Now make sure it isn't in storage any more + _, err = instAction.cfg.Releases.Get(res.Name, res.Version) + is.Error(err) + is.Equal(err, driver.ErrReleaseNotFound) + }) + + t.Run("atomic uninstall fails", func(t *testing.T) { + instAction := installAction(t) + instAction.ReleaseName = "come-fail-away-with-me" + failer := instAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.WaitError = fmt.Errorf("I timed out") + failer.DeleteError = fmt.Errorf("uninstall fail") + instAction.cfg.KubeClient = failer + instAction.Atomic = true + instAction.rawValues = map[string]interface{}{} + + _, err := instAction.Run(buildChart()) + is.Error(err) + is.Contains(err.Error(), "I timed out") + is.Contains(err.Error(), "uninstall fail") + is.Contains(err.Error(), "an error occurred while uninstalling the release") + }) +} + func TestNameTemplate(t *testing.T) { testCases := []nameTemplateTestCase{ // Just a straight up nop please diff --git a/pkg/action/output.go b/pkg/action/output.go index 5346dc109..4948464b5 100644 --- a/pkg/action/output.go +++ b/pkg/action/output.go @@ -1,3 +1,19 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package action import ( diff --git a/pkg/action/uninstall.go b/pkg/action/uninstall.go index e3a1c1309..b5c87b475 100644 --- a/pkg/action/uninstall.go +++ b/pkg/action/uninstall.go @@ -122,7 +122,16 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error) if !u.KeepHistory { u.cfg.Log("purge requested for %s", name) err := u.purgeReleases(rels...) - return res, errors.Wrap(err, "uninstall: Failed to purge the release") + if err != nil { + errs = append(errs, errors.Wrap(err, "uninstall: Failed to purge the release")) + } + + // Return the errors that occurred while deleting the release, if any + if len(errs) > 0 { + return res, errors.Errorf("uninstallation completed with %d error(s): %s", len(errs), joinErrors(errs)) + } + + return res, nil } if err := u.cfg.Releases.Update(rel); err != nil { diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index 6c2c67a02..5863f9bc7 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -29,6 +29,7 @@ import ( "helm.sh/helm/pkg/hooks" "helm.sh/helm/pkg/kube" "helm.sh/helm/pkg/release" + "helm.sh/helm/pkg/releaseutil" ) // Upgrade is the action for upgrading releases. @@ -54,6 +55,7 @@ type Upgrade struct { Recreate bool // MaxHistory limits the maximum number of revisions saved per release MaxHistory int + Atomic bool } // NewUpgrade creates a new Upgrade object with the given configuration. @@ -69,6 +71,10 @@ func (u *Upgrade) Run(name string, chart *chart.Chart) (*release.Release, error) return nil, err } + // Make sure if Atomic is set, that wait is set as well. This makes it so + // the user doesn't have to specify both + u.Wait = u.Wait || u.Atomic + if err := validateReleaseName(name); err != nil { return nil, errors.Errorf("upgradeRelease: Release name is invalid: %s", name) } @@ -196,35 +202,28 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea // pre-upgrade hooks if !u.DisableHooks { if err := u.execHook(upgradedRelease.Hooks, hooks.PreUpgrade); err != nil { - return upgradedRelease, err + return u.failRelease(upgradedRelease, fmt.Errorf("pre-upgrade hooks failed: %s", err)) } } else { u.cfg.Log("upgrade hooks disabled for %s", upgradedRelease.Name) } if err := u.upgradeRelease(originalRelease, upgradedRelease); err != nil { - msg := fmt.Sprintf("Upgrade %q failed: %s", upgradedRelease.Name, err) - u.cfg.Log("warning: %s", msg) - upgradedRelease.Info.Status = release.StatusFailed - upgradedRelease.Info.Description = msg u.cfg.recordRelease(originalRelease) - u.cfg.recordRelease(upgradedRelease) - return upgradedRelease, err + return u.failRelease(upgradedRelease, err) } if u.Wait { buf := bytes.NewBufferString(upgradedRelease.Manifest) if err := u.cfg.KubeClient.Wait(buf, u.Timeout); err != nil { - upgradedRelease.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", upgradedRelease.Name, err.Error())) u.cfg.recordRelease(originalRelease) - u.cfg.recordRelease(upgradedRelease) - return upgradedRelease, errors.Wrapf(err, "release %s failed", upgradedRelease.Name) + return u.failRelease(upgradedRelease, err) } } // post-upgrade hooks if !u.DisableHooks { if err := u.execHook(upgradedRelease.Hooks, hooks.PostUpgrade); err != nil { - return upgradedRelease, err + return u.failRelease(upgradedRelease, fmt.Errorf("post-upgrade hooks failed: %s", err)) } } @@ -237,6 +236,52 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea return upgradedRelease, nil } +func (u *Upgrade) failRelease(rel *release.Release, err error) (*release.Release, error) { + msg := fmt.Sprintf("Upgrade %q failed: %s", rel.Name, err) + u.cfg.Log("warning: %s", msg) + + rel.Info.Status = release.StatusFailed + rel.Info.Description = msg + u.cfg.recordRelease(rel) + if u.Atomic { + u.cfg.Log("Upgrade failed and atomic is set, rolling back to last successful release") + + // As a protection, get the last successful release before rollback. + // If there are no successful releases, bail out + hist := NewHistory(u.cfg) + fullHistory, herr := hist.Run(rel.Name) + if herr != nil { + return rel, errors.Wrapf(herr, "an error occurred while finding last successful release. original upgrade error: %s", err) + } + + // There isn't a way to tell if a previous release was successful, but + // generally failed releases do not get superseded unless the next + // release is successful, so this should be relatively safe + filteredHistory := releaseutil.FilterFunc(func(r *release.Release) bool { + return r.Info.Status == release.StatusSuperseded || r.Info.Status == release.StatusDeployed + }).Filter(fullHistory) + if len(filteredHistory) == 0 { + return rel, errors.Wrap(err, "unable to find a previously successful release when attempting to rollback. original upgrade error") + } + + releaseutil.Reverse(filteredHistory, releaseutil.SortByRevision) + + rollin := NewRollback(u.cfg) + rollin.Version = filteredHistory[0].Version + rollin.Wait = true + rollin.DisableHooks = u.DisableHooks + rollin.Recreate = u.Recreate + rollin.Force = u.Force + rollin.Timeout = u.Timeout + if _, rollErr := rollin.Run(rel.Name); rollErr != nil { + return rel, errors.Wrapf(rollErr, "an error occurred while rolling back the release. original upgrade error: %s", err) + } + return rel, errors.Wrapf(err, "release %s failed, and has been rolled back due to atomic being set", rel.Name) + } + + return rel, err +} + // upgradeRelease performs an upgrade from current to target release func (u *Upgrade) upgradeRelease(current, target *release.Release) error { cm := bytes.NewBufferString(current.Manifest) @@ -303,7 +348,6 @@ func (u *Upgrade) execHook(hs []*release.Hook, hook string) error { } sort.Sort(hookByWeight(executingHooks)) - for _, h := range executingHooks { if err := deleteHookByPolicy(u.cfg, h, hooks.BeforeHookCreation); err != nil { return err diff --git a/pkg/action/upgrade_test.go b/pkg/action/upgrade_test.go new file mode 100644 index 000000000..92e9393fb --- /dev/null +++ b/pkg/action/upgrade_test.go @@ -0,0 +1,109 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package action + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + kubefake "helm.sh/helm/pkg/kube/fake" + "helm.sh/helm/pkg/release" +) + +func upgradeAction(t *testing.T) *Upgrade { + config := actionConfigFixture(t) + upAction := NewUpgrade(config) + upAction.Namespace = "spaced" + + return upAction +} + +func TestUpgradeRelease_Wait(t *testing.T) { + is := assert.New(t) + req := require.New(t) + + upAction := upgradeAction(t) + rel := releaseStub() + rel.Name = "come-fail-away" + rel.Info.Status = release.StatusDeployed + upAction.cfg.Releases.Create(rel) + + failer := upAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.WaitError = fmt.Errorf("I timed out") + upAction.cfg.KubeClient = failer + upAction.Wait = true + upAction.rawValues = map[string]interface{}{} + + res, err := upAction.Run(rel.Name, buildChart()) + req.Error(err) + is.Contains(res.Info.Description, "I timed out") + is.Equal(res.Info.Status, release.StatusFailed) +} + +func TestUpgradeRelease_Atomic(t *testing.T) { + is := assert.New(t) + req := require.New(t) + + t.Run("atomic rollback succeeds", func(t *testing.T) { + upAction := upgradeAction(t) + + rel := releaseStub() + rel.Name = "nuketown" + rel.Info.Status = release.StatusDeployed + upAction.cfg.Releases.Create(rel) + + failer := upAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + // We can't make Update error because then the rollback won't work + failer.WatchUntilReadyError = fmt.Errorf("arming key removed") + upAction.cfg.KubeClient = failer + upAction.Atomic = true + upAction.rawValues = map[string]interface{}{} + + res, err := upAction.Run(rel.Name, buildChart()) + req.Error(err) + is.Contains(err.Error(), "arming key removed") + is.Contains(err.Error(), "atomic") + + // Now make sure it is actually upgraded + updatedRes, err := upAction.cfg.Releases.Get(res.Name, 3) + is.NoError(err) + // Should have rolled back to the previous + is.Equal(updatedRes.Info.Status, release.StatusDeployed) + }) + + t.Run("atomic uninstall fails", func(t *testing.T) { + upAction := upgradeAction(t) + rel := releaseStub() + rel.Name = "fallout" + rel.Info.Status = release.StatusDeployed + upAction.cfg.Releases.Create(rel) + + failer := upAction.cfg.KubeClient.(*kubefake.FailingKubeClient) + failer.UpdateError = fmt.Errorf("update fail") + upAction.cfg.KubeClient = failer + upAction.Atomic = true + upAction.rawValues = map[string]interface{}{} + + _, err := upAction.Run(rel.Name, buildChart()) + req.Error(err) + is.Contains(err.Error(), "update fail") + is.Contains(err.Error(), "an error occurred while rolling back the release") + }) +} diff --git a/pkg/kube/fake/fake.go b/pkg/kube/fake/fake.go new file mode 100644 index 000000000..d2439f784 --- /dev/null +++ b/pkg/kube/fake/fake.go @@ -0,0 +1,116 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package fake implements various fake KubeClients for use in testing +package fake + +import ( + "io" + "time" + + v1 "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/resource" + + "helm.sh/helm/pkg/kube" +) + +// FailingKubeClient implements KubeClient for testing purposes. It also has +// additional errors you can set to fail different functions, otherwise it +// delegates all its calls to `PrintingKubeClient` +type FailingKubeClient struct { + PrintingKubeClient + CreateError error + WaitError error + GetError error + DeleteError error + WatchUntilReadyError error + UpdateError error + BuildError error + BuildUnstructuredError error + WaitAndGetCompletedPodPhaseError error +} + +// Create returns the configured error if set or prints +func (f *FailingKubeClient) Create(r io.Reader) error { + if f.CreateError != nil { + return f.CreateError + } + return f.PrintingKubeClient.Create(r) +} + +// Wait returns the configured error if set or prints +func (f *FailingKubeClient) Wait(r io.Reader, d time.Duration) error { + if f.WaitError != nil { + return f.WaitError + } + return f.PrintingKubeClient.Wait(r, d) +} + +// Create returns the configured error if set or prints +func (f *FailingKubeClient) Get(r io.Reader) (string, error) { + if f.GetError != nil { + return "", f.GetError + } + return f.PrintingKubeClient.Get(r) +} + +// Delete returns the configured error if set or prints +func (f *FailingKubeClient) Delete(r io.Reader) error { + if f.DeleteError != nil { + return f.DeleteError + } + return f.PrintingKubeClient.Delete(r) +} + +// WatchUntilReady returns the configured error if set or prints +func (f *FailingKubeClient) WatchUntilReady(r io.Reader, d time.Duration) error { + if f.WatchUntilReadyError != nil { + return f.WatchUntilReadyError + } + return f.PrintingKubeClient.WatchUntilReady(r, d) +} + +// Update returns the configured error if set or prints +func (f *FailingKubeClient) Update(r, modifiedReader io.Reader, not, needed bool) error { + if f.UpdateError != nil { + return f.UpdateError + } + return f.PrintingKubeClient.Update(r, modifiedReader, not, needed) +} + +// Build returns the configured error if set or prints +func (f *FailingKubeClient) Build(r io.Reader) (kube.Result, error) { + if f.BuildError != nil { + return []*resource.Info{}, f.BuildError + } + return f.PrintingKubeClient.Build(r) +} + +// BuildUnstructured returns the configured error if set or prints +func (f *FailingKubeClient) BuildUnstructured(r io.Reader) (kube.Result, error) { + if f.BuildUnstructuredError != nil { + return []*resource.Info{}, f.BuildUnstructuredError + } + return f.PrintingKubeClient.Build(r) +} + +// WaitAndGetCompletedPodPhase returns the configured error if set or prints +func (f *FailingKubeClient) WaitAndGetCompletedPodPhase(s string, d time.Duration) (v1.PodPhase, error) { + if f.WaitAndGetCompletedPodPhaseError != nil { + return v1.PodSucceeded, f.WaitAndGetCompletedPodPhaseError + } + return f.PrintingKubeClient.WaitAndGetCompletedPodPhase(s, d) +} \ No newline at end of file diff --git a/pkg/kube/printer.go b/pkg/kube/fake/printer.go similarity index 91% rename from pkg/kube/printer.go rename to pkg/kube/fake/printer.go index 7ad4f44ea..b8d927e8d 100644 --- a/pkg/kube/printer.go +++ b/pkg/kube/fake/printer.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kube +package fake import ( "io" @@ -22,6 +22,8 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/cli-runtime/pkg/resource" + + "helm.sh/helm/pkg/kube" ) // PrintingKubeClient implements KubeClient, but simply prints the reader to @@ -68,11 +70,11 @@ func (p *PrintingKubeClient) Update(_, modifiedReader io.Reader, _, _ bool) erro } // Build implements KubeClient Build. -func (p *PrintingKubeClient) Build(_ io.Reader) (Result, error) { +func (p *PrintingKubeClient) Build(_ io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } -func (p *PrintingKubeClient) BuildUnstructured(_ io.Reader) (Result, error) { +func (p *PrintingKubeClient) BuildUnstructured(_ io.Reader) (kube.Result, error) { return p.Build(nil) }