diff --git a/Gopkg.lock b/Gopkg.lock index 8e03c05b..2779def9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -803,7 +803,7 @@ version = "v2.2.2" [[projects]] - digest = "1:b84a6534f40032bc9c7aa97b3c577306e3d97b9a7752f285abb29bf15b4fcf9b" + digest = "1:a361d526b77e9f68ba9f5d6f2f24e58e00d87f837b1d4cfc977047a37a7522cf" name = "k8s.io/api" packages = [ "admission/v1beta1", @@ -841,22 +841,22 @@ "storage/v1beta1", ] pruneopts = "T" - revision = "74b699b93c15473932b89e3d1818ba8282f3b5ab" - version = "kubernetes-1.13.3" + revision = "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:33786f45cdfd217b9beff0a5da5751d3cf81ca64d53dae6771543e83f423e4f0" + digest = "1:3ffb40da648cab1795da29295604aef4575862d57973278104937d1cd40b5a5f" name = "k8s.io/apiextensions-apiserver" packages = [ "pkg/apis/apiextensions", "pkg/apis/apiextensions/v1beta1", ] pruneopts = "T" - revision = "d4288ab6494571219e781fa423db363247635942" - version = "kubernetes-1.13.3" + revision = "475668423e9f8feb5e3cc53f37bfeb1ce37f2ce5" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:a7b151b4238f885a02d292c665ce15407429d748619a9c5f29078f63db0b1f78" + digest = "1:82717527f44f2cb9a2a784a427a7ab9bd7f883848bdfabcf70bef8e300b69fa5" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -905,11 +905,11 @@ "third_party/forked/golang/reflect", ] pruneopts = "T" - revision = "572dfc7bdfcb4531361a17d27b92851f59acf0dc" - version = "kubernetes-1.13.3" + revision = "86fb29eff6288413d76bd8506874fddd9fccdff0" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:aed3bb8785aec725a564291f79abf365c5ba013e41c7c38c9287fb7d69e9affd" + digest = "1:2f627a97480c9cf291aabc20649c564cf26b2c666116a2e9a17d10c3aea4eae8" name = "k8s.io/client-go" packages = [ "discovery", @@ -986,8 +986,8 @@ "util/workqueue", ] pruneopts = "T" - revision = "6e4752048fde21176ab35eb54ec1117359830d8a" - version = "kubernetes-1.13.3" + revision = "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" + version = "kubernetes-1.13.5" [[projects]] branch = "master" @@ -1018,7 +1018,7 @@ ] pruneopts = "T" revision = "c2090bec4d9b1fb25de3812f868accc2bc9ecbae" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[projects]] branch = "master" @@ -1053,7 +1053,7 @@ revision = "d50a959ae76a85c7c262a9767ef29f37093c2b8a" [[projects]] - digest = "1:dc229e3d77af203b6b1c6b54c0112a75f2b04d91fe4698e70d9d83741a77a022" + digest = "1:bc04752ec8a48d212a0db41c2085bb468ae7c8c34bcb317f552b68f4fe34865b" name = "sigs.k8s.io/cluster-api" packages = [ "cmd/clusterctl/clientcmd", @@ -1081,7 +1081,7 @@ "pkg/util", ] pruneopts = "T" - revision = "c077c33e153abdff6b173d58bd548d059864e9c5" + revision = "0.1.0" [[projects]] digest = "1:5aa50779f75cc439edd3455a6dee7cf179b52f8dde764a47cc929693485d1afb" @@ -1169,7 +1169,6 @@ analyzer-version = 1 input-imports = [ "github.com/cenkalti/backoff", - "github.com/davecgh/go-spew/spew", "github.com/emicklei/go-restful", "github.com/exoscale/egoscale", "github.com/ghodss/yaml", diff --git a/Gopkg.toml b/Gopkg.toml index 53d87acf..1d4d1cb2 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -21,7 +21,7 @@ required = [ [[constraint]] name="sigs.k8s.io/cluster-api" - revision="c077c33e153abdff6b173d58bd548d059864e9c5" + revision="0.1.0" [[constraint]] name="github.com/exoscale/egoscale" @@ -37,23 +37,23 @@ required = [ [[override]] name = "k8s.io/code-generator" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/api" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/apimachinery" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/client-go" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" # For dependency below: Refer to issue https://github.com/golang/dep/issues/1799 [[override]] diff --git a/vendor/k8s.io/api/Godeps/Godeps.json b/vendor/k8s.io/api/Godeps/Godeps.json index ea12c92a..f600497a 100644 --- a/vendor/k8s.io/api/Godeps/Godeps.json +++ b/vendor/k8s.io/api/Godeps/Godeps.json @@ -96,151 +96,151 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 165aa2a2..b13a2db7 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -3156,6 +3156,7 @@ message PodSpec { // EnableServiceLinks indicates whether information about services should be injected into pod's // environment variables, matching the syntax of Docker links. + // Optional: Defaults to true. // +optional optional bool enableServiceLinks = 30; } diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index 43e70b9b..87f3f0c5 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -2920,6 +2920,7 @@ type PodSpec struct { RuntimeClassName *string `json:"runtimeClassName,omitempty" protobuf:"bytes,29,opt,name=runtimeClassName"` // EnableServiceLinks indicates whether information about services should be injected into pod's // environment variables, matching the syntax of Docker links. + // Optional: Defaults to true. // +optional EnableServiceLinks *bool `json:"enableServiceLinks,omitempty" protobuf:"varint,30,opt,name=enableServiceLinks"` } diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 71f90685..13ea6d22 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1540,7 +1540,7 @@ var map_PodSpec = map[string]string{ "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", "runtimeClassName": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.", - "enableServiceLinks": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links.", + "enableServiceLinks": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", } func (PodSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index f3bd56eb..4712c34d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -384,7 +384,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/ghodss/yaml", @@ -940,1371 +940,1371 @@ }, { "ImportPath": "k8s.io/api/admission/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta/table", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/duration", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/waitgroup", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apiserver/pkg/admission", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/configuration", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/initializer", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/initialization", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/errors", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/generic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/namespace", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/request", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/rules", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/util", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/validating", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/install", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/install", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1beta1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/validation", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/event", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/policy", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/util", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticator", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticatorfactory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/group", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/anonymous", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/bearertoken", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/headerrequest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/union", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/websocket", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/x509", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/cache", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/tokenfile", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/user", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizer", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizerfactory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/path", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/union", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/discovery", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/filters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/openapi", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/request", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/features", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/registry", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest/resttest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/filters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/healthz", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/httplog", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/mux", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/options", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/resourceconfig", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes/data/swagger", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/storage", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/cacher", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/errors", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/etcdtest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing/testingcert", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd3", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/names", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend/factory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/value", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/dryrun", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flag", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flushwriter", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/logs", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/openapi", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/proxy", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/trace", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/wsstream", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/buffered", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/dynamic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/dynamic/enforced", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/log", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/truncate", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authorizer/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/dynamic", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/coordination", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/restmapper", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsint", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/autoscalingv1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsint", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsv1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/third_party/forked/golang/template", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/connrotation", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/jsonpath", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/apimachinery/Godeps/Godeps.json b/vendor/k8s.io/apimachinery/Godeps/Godeps.json index 82e51c66..ecf1a2bc 100644 --- a/vendor/k8s.io/apimachinery/Godeps/Godeps.json +++ b/vendor/k8s.io/apimachinery/Godeps/Godeps.json @@ -24,7 +24,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go index e736a986..48c1104d 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go @@ -341,6 +341,17 @@ func NewTooManyRequestsError(message string) *StatusError { }} } +// NewRequestEntityTooLargeError returns an error indicating that the request +// entity was too large. +func NewRequestEntityTooLargeError(message string) *StatusError { + return &StatusError{metav1.Status{ + Status: metav1.StatusFailure, + Code: http.StatusRequestEntityTooLarge, + Reason: metav1.StatusReasonRequestEntityTooLarge, + Message: fmt.Sprintf("Request entity too large: %s", message), + }} +} + // NewGenericServerResponse returns a new error for server responses that are not in a recognizable form. func NewGenericServerResponse(code int, verb string, qualifiedResource schema.GroupResource, name, serverMessage string, retryAfterSeconds int, isUnexpectedResponse bool) *StatusError { reason := metav1.StatusReasonUnknown @@ -527,6 +538,19 @@ func IsTooManyRequests(err error) bool { return false } +// IsRequestEntityTooLargeError determines if err is an error which indicates +// the request entity is too large. +func IsRequestEntityTooLargeError(err error) bool { + if ReasonForError(err) == metav1.StatusReasonRequestEntityTooLarge { + return true + } + switch t := err.(type) { + case APIStatus: + return t.Status().Code == http.StatusRequestEntityTooLarge + } + return false +} + // IsUnexpectedServerError returns true if the server response was not in the expected API format, // and may be the result of another HTTP actor. func IsUnexpectedServerError(err error) bool { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 8f488ba7..65f87546 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -713,6 +713,10 @@ const ( // Status code 406 StatusReasonNotAcceptable StatusReason = "NotAcceptable" + // StatusReasonRequestEntityTooLarge means that the request entity is too large. + // Status code 413 + StatusReasonRequestEntityTooLarge StatusReason = "RequestEntityTooLarge" + // StatusReasonUnsupportedMediaType means that the content type sent by the client is not acceptable // to the server - for instance, attempting to send protobuf for a resource that supports only json and yaml. // API calls that return UnsupportedMediaType can never succeed. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go index 6b859b28..284e32bc 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go @@ -283,6 +283,7 @@ var _ GroupVersioner = multiGroupVersioner{} type multiGroupVersioner struct { target schema.GroupVersion acceptedGroupKinds []schema.GroupKind + coerce bool } // NewMultiGroupVersioner returns the provided group version for any kind that matches one of the provided group kinds. @@ -294,6 +295,22 @@ func NewMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKi return multiGroupVersioner{target: gv, acceptedGroupKinds: groupKinds} } +// NewCoercingMultiGroupVersioner returns the provided group version for any incoming kind. +// Incoming kinds that match the provided groupKinds are preferred. +// Kind may be empty in the provided group kind, in which case any kind will match. +// Examples: +// gv=mygroup/__internal, groupKinds=mygroup/Foo, anothergroup/Bar +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group/kind) +// +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group) +// +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, yetanother/v1/Bar) -> mygroup/__internal/Baz (no preferred group/kind match, uses first kind in list) +func NewCoercingMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKind) GroupVersioner { + return multiGroupVersioner{target: gv, acceptedGroupKinds: groupKinds, coerce: true} +} + // KindForGroupVersionKinds returns the target group version if any kind matches any of the original group kinds. It will // use the originating kind where possible. func (v multiGroupVersioner) KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (schema.GroupVersionKind, bool) { @@ -308,5 +325,8 @@ func (v multiGroupVersioner) KindForGroupVersionKinds(kinds []schema.GroupVersio return v.target.WithKind(src.Kind), true } } + if v.coerce && len(kinds) > 0 { + return v.target.WithKind(kinds[0].Kind), true + } return schema.GroupVersionKind{}, false } diff --git a/vendor/k8s.io/client-go/Godeps/Godeps.json b/vendor/k8s.io/client-go/Godeps/Godeps.json index 9c0a3329..c4aa0ad9 100644 --- a/vendor/k8s.io/client-go/Godeps/Godeps.json +++ b/vendor/k8s.io/client-go/Godeps/Godeps.json @@ -56,7 +56,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", @@ -272,339 +272,339 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/client-go/tools/cache/reflector.go b/vendor/k8s.io/client-go/tools/cache/reflector.go index 12e2a334..56d0f523 100644 --- a/vendor/k8s.io/client-go/tools/cache/reflector.go +++ b/vendor/k8s.io/client-go/tools/cache/reflector.go @@ -24,10 +24,8 @@ import ( "net" "net/url" "reflect" - "strconv" "strings" "sync" - "sync/atomic" "syscall" "time" @@ -95,17 +93,10 @@ func NewReflector(lw ListerWatcher, expectedType interface{}, store Store, resyn return NewNamedReflector(naming.GetNameFromCallsite(internalPackages...), lw, expectedType, store, resyncPeriod) } -// reflectorDisambiguator is used to disambiguate started reflectors. -// initialized to an unstable value to ensure meaning isn't attributed to the suffix. -var reflectorDisambiguator = int64(time.Now().UnixNano() % 12345) - // NewNamedReflector same as NewReflector, but with a specified name for logging func NewNamedReflector(name string, lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { - reflectorSuffix := atomic.AddInt64(&reflectorDisambiguator, 1) r := &Reflector{ - name: name, - // we need this to be unique per process (some names are still the same) but obvious who it belongs to - metrics: newReflectorMetrics(makeValidPrometheusMetricLabel(fmt.Sprintf("reflector_"+name+"_%d", reflectorSuffix))), + name: name, listerWatcher: lw, store: store, expectedType: reflect.TypeOf(expectedType), @@ -173,13 +164,10 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { // to be served from cache and potentially be delayed relative to // etcd contents. Reflector framework will catch up via Watch() eventually. options := metav1.ListOptions{ResourceVersion: "0"} - r.metrics.numberOfLists.Inc() - start := r.clock.Now() list, err := r.listerWatcher.List(options) if err != nil { return fmt.Errorf("%s: Failed to list %v: %v", r.name, r.expectedType, err) } - r.metrics.listDuration.Observe(time.Since(start).Seconds()) listMetaInterface, err := meta.ListAccessor(list) if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v: %v", r.name, list, err) @@ -189,7 +177,6 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v (%v)", r.name, list, err) } - r.metrics.numberOfItemsInList.Observe(float64(len(items))) if err := r.syncWith(items, resourceVersion); err != nil { return fmt.Errorf("%s: Unable to sync list result: %v", r.name, err) } @@ -239,7 +226,6 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { TimeoutSeconds: &timeoutSeconds, } - r.metrics.numberOfWatches.Inc() w, err := r.listerWatcher.Watch(options) if err != nil { switch err { @@ -291,11 +277,6 @@ func (r *Reflector) watchHandler(w watch.Interface, resourceVersion *string, err // Stopping the watcher should be idempotent and if we return from this function there's no way // we're coming back in with the same watch interface. defer w.Stop() - // update metrics - defer func() { - r.metrics.numberOfItemsInWatch.Observe(float64(eventCount)) - r.metrics.watchDuration.Observe(time.Since(start).Seconds()) - }() loop: for { @@ -351,7 +332,6 @@ loop: watchDuration := r.clock.Now().Sub(start) if watchDuration < 1*time.Second && eventCount == 0 { - r.metrics.numberOfShortWatches.Inc() return fmt.Errorf("very short watch: %s: Unexpected watch close - watch lasted less than a second and no items received", r.name) } klog.V(4).Infof("%s: Watch close - %v total %v items received", r.name, r.expectedType, eventCount) @@ -370,9 +350,4 @@ func (r *Reflector) setLastSyncResourceVersion(v string) { r.lastSyncResourceVersionMutex.Lock() defer r.lastSyncResourceVersionMutex.Unlock() r.lastSyncResourceVersion = v - - rv, err := strconv.Atoi(v) - if err == nil { - r.metrics.lastResourceVersion.Set(float64(rv)) - } } diff --git a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md index 3a7d08c6..ab086f02 100644 --- a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md +++ b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md @@ -20,5 +20,6 @@ about: Tell us about a problem you are experiencing **Environment:** - Cluster-api version: +- Minikube/KIND version: - Kubernetes version: (use `kubectl version`): - OS (e.g. from `/etc/os-release`): diff --git a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md index fc06aa71..ec7c001b 100644 --- a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md +++ b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md @@ -12,10 +12,3 @@ about: Suggest an idea for this project **Anything else you would like to add:** [Miscellaneous information that will assist in solving the issue.] - - -**Environment:** - -- Cluster-api version: -- Kubernetes version: (use `kubectl version`): -- OS (e.g. from `/etc/os-release`): diff --git a/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md b/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md index cc52280e..b0be9a45 100644 --- a/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md +++ b/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md @@ -26,6 +26,10 @@ All changes must be code reviewed. Coding conventions and standards are explaine Cluster API maintainers may add "LGTM" (Looks Good To Me) or an equivalent comment to indicate that a PR is acceptable. Any change requires at least one LGTM. No pull requests can be merged until at least one Cluster API maintainer signs off with an LGTM. +### Google Doc Viewing Permissions + +To gain viewing permissions to google docs in this project, please join either the [kubernetes-dev](https://groups.google.com/forum/#!forum/kubernetes-dev) or [kubernetes-sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) google group. + ## Cloud Provider Developer Guide ### Overview diff --git a/vendor/sigs.k8s.io/cluster-api/Dockerfile b/vendor/sigs.k8s.io/cluster-api/Dockerfile index f0d00be9..e89f319d 100644 --- a/vendor/sigs.k8s.io/cluster-api/Dockerfile +++ b/vendor/sigs.k8s.io/cluster-api/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. # Build the manager binary -FROM golang:1.11.5 as builder +FROM golang:1.11.6 as builder # Copy in the go src WORKDIR $GOPATH/src/sigs.k8s.io/cluster-api diff --git a/vendor/sigs.k8s.io/cluster-api/Gopkg.lock b/vendor/sigs.k8s.io/cluster-api/Gopkg.lock index 0abd842c..724e64ff 100644 --- a/vendor/sigs.k8s.io/cluster-api/Gopkg.lock +++ b/vendor/sigs.k8s.io/cluster-api/Gopkg.lock @@ -896,12 +896,58 @@ revision = "b6aa1175dafa586b8042c7bfdcd1585f9ecfaa08" [[projects]] - digest = "1:b5f3e4ddbaa665650519fb6379bc95291f50a0d5b022ff31e430741caacd5ea6" + digest = "1:9e2617b6420a04f67a7b63938a238f43dd401f90a6c4d0f1f2470cd066e38928" name = "k8s.io/client-go" packages = [ "discovery", "discovery/fake", "dynamic", + "informers", + "informers/admissionregistration", + "informers/admissionregistration/v1alpha1", + "informers/admissionregistration/v1beta1", + "informers/apps", + "informers/apps/v1", + "informers/apps/v1beta1", + "informers/apps/v1beta2", + "informers/auditregistration", + "informers/auditregistration/v1alpha1", + "informers/autoscaling", + "informers/autoscaling/v1", + "informers/autoscaling/v2beta1", + "informers/autoscaling/v2beta2", + "informers/batch", + "informers/batch/v1", + "informers/batch/v1beta1", + "informers/batch/v2alpha1", + "informers/certificates", + "informers/certificates/v1beta1", + "informers/coordination", + "informers/coordination/v1beta1", + "informers/core", + "informers/core/v1", + "informers/events", + "informers/events/v1beta1", + "informers/extensions", + "informers/extensions/v1beta1", + "informers/internalinterfaces", + "informers/networking", + "informers/networking/v1", + "informers/policy", + "informers/policy/v1beta1", + "informers/rbac", + "informers/rbac/v1", + "informers/rbac/v1alpha1", + "informers/rbac/v1beta1", + "informers/scheduling", + "informers/scheduling/v1alpha1", + "informers/scheduling/v1beta1", + "informers/settings", + "informers/settings/v1alpha1", + "informers/storage", + "informers/storage/v1", + "informers/storage/v1alpha1", + "informers/storage/v1beta1", "kubernetes", "kubernetes/scheme", "kubernetes/typed/admissionregistration/v1alpha1", @@ -936,6 +982,34 @@ "kubernetes/typed/storage/v1", "kubernetes/typed/storage/v1alpha1", "kubernetes/typed/storage/v1beta1", + "listers/admissionregistration/v1alpha1", + "listers/admissionregistration/v1beta1", + "listers/apps/v1", + "listers/apps/v1beta1", + "listers/apps/v1beta2", + "listers/auditregistration/v1alpha1", + "listers/autoscaling/v1", + "listers/autoscaling/v2beta1", + "listers/autoscaling/v2beta2", + "listers/batch/v1", + "listers/batch/v1beta1", + "listers/batch/v2alpha1", + "listers/certificates/v1beta1", + "listers/coordination/v1beta1", + "listers/core/v1", + "listers/events/v1beta1", + "listers/extensions/v1beta1", + "listers/networking/v1", + "listers/policy/v1beta1", + "listers/rbac/v1", + "listers/rbac/v1alpha1", + "listers/rbac/v1beta1", + "listers/scheduling/v1alpha1", + "listers/scheduling/v1beta1", + "listers/settings/v1alpha1", + "listers/storage/v1", + "listers/storage/v1alpha1", + "listers/storage/v1beta1", "pkg/apis/clientauthentication", "pkg/apis/clientauthentication/v1alpha1", "pkg/apis/clientauthentication/v1beta1", @@ -1127,11 +1201,15 @@ input-imports = [ "github.com/davecgh/go-spew/spew", "github.com/emicklei/go-restful", + "github.com/onsi/ginkgo", + "github.com/onsi/gomega", "github.com/pkg/errors", "github.com/sergi/go-diff/diffmatchpatch", "github.com/spf13/cobra", "github.com/spf13/pflag", "golang.org/x/net/context", + "k8s.io/api/apps/v1", + "k8s.io/api/autoscaling/v1", "k8s.io/api/core/v1", "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", "k8s.io/apimachinery/pkg/api/equality", @@ -1156,6 +1234,7 @@ "k8s.io/apiserver/pkg/storage/names", "k8s.io/client-go/discovery", "k8s.io/client-go/discovery/fake", + "k8s.io/client-go/informers", "k8s.io/client-go/kubernetes", "k8s.io/client-go/kubernetes/scheme", "k8s.io/client-go/kubernetes/typed/core/v1", diff --git a/vendor/sigs.k8s.io/cluster-api/Makefile b/vendor/sigs.k8s.io/cluster-api/Makefile index 7faece08..178bc617 100644 --- a/vendor/sigs.k8s.io/cluster-api/Makefile +++ b/vendor/sigs.k8s.io/cluster-api/Makefile @@ -22,7 +22,7 @@ export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT ?=60s export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?=60s # Image URL to use all building/pushing image targets -export CONTROLLER_IMG ?= gcr.io/k8s-cluster-api/cluster-api-controller:latest +export CONTROLLER_IMG ?= gcr.io/k8s-cluster-api/cluster-api-controller:0.1.0 export EXAMPLE_PROVIDER_IMG ?= gcr.io/k8s-cluster-api/example-provider-controller:latest all: test manager clusterctl @@ -84,6 +84,7 @@ lint-full: dep-ensure ## Run slower linters to detect possible issues .PHONY: generate generate: clientset dep-ensure ## Generate code go generate ./pkg/... ./cmd/... + $(MAKE) gazelle .PHONY: clientset clientset: ## Generate a typed clientset @@ -100,6 +101,7 @@ clientset: ## Generate a typed clientset --listers-package sigs.k8s.io/cluster-api/pkg/client/listers_generated \ --output-package sigs.k8s.io/cluster-api/pkg/client/informers_generated \ --go-header-file=./hack/boilerplate.go.txt + $(MAKE) gazelle .PHONY: clean clean: ## Remove all generated files diff --git a/vendor/sigs.k8s.io/cluster-api/README.md b/vendor/sigs.k8s.io/cluster-api/README.md index 91b12dcb..226ddd37 100644 --- a/vendor/sigs.k8s.io/cluster-api/README.md +++ b/vendor/sigs.k8s.io/cluster-api/README.md @@ -10,7 +10,7 @@ feedback on the API types themselves. All of the code here is to experiment with the API and demo its abilities, in order to drive more technical feedback to the API design. Because of this, all of the prototype code is rapidly changing. -![Cluster API Architecture](architecture.png "Cluster API Architecture") +![Cluster API Architecture](./docs/book/common_code/architecture.svg "Cluster API Architecture") To learn more, see the [Cluster API KEP][cluster-api-kep]. @@ -36,9 +36,9 @@ Provider specific code is being developed in separate repositories, some of whic are also sponsored by SIG-cluster-lifecycle: * AWS, https://github.com/kubernetes-sigs/cluster-api-provider-aws - * AWS/Openshift, https://github.com/openshift/cluster-operator * Azure, https://github.com/kubernetes-sigs/cluster-api-provider-azure * Baidu Cloud, https://github.com/baidu/cluster-api-provider-baiducloud + * Bare Metal, https://github.com/metalkube/cluster-api-provider-baremetal * DigitalOcean, https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean * GCE, https://github.com/kubernetes-sigs/cluster-api-provider-gcp * OpenStack, https://github.com/kubernetes-sigs/cluster-api-provider-openstack @@ -54,6 +54,11 @@ Following are the implementations managed by third-parties adopting the standard * Machine-controller-manager, https://github.com/gardener/machine-controller-manager/tree/cluster-api ## Getting Started + +### Resources + +* GitBook: [kubernetes-sigs.github.io/cluster-api](https://kubernetes-sigs.github.io/cluster-api) + ### Prerequisites * `kubectl` is required, see [here](http://kubernetes.io/docs/user-guide/prereqs/). * `clusterctl` is a SIG-cluster-lifecycle sponsored tool to manage Cluster API clusters. See [here](cmd/clusterctl) diff --git a/vendor/sigs.k8s.io/cluster-api/WORKSPACE b/vendor/sigs.k8s.io/cluster-api/WORKSPACE index 4de6ef87..710510fb 100644 --- a/vendor/sigs.k8s.io/cluster-api/WORKSPACE +++ b/vendor/sigs.k8s.io/cluster-api/WORKSPACE @@ -3,22 +3,22 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") http_archive( name = "io_bazel_rules_go", - sha256 = "ade51a315fa17347e5c31201fdc55aa5ffb913377aa315dceb56ee9725e620ee", - url = "https://github.com/bazelbuild/rules_go/releases/download/0.16.6/rules_go-0.16.6.tar.gz", + sha256 = "77dfd303492f2634de7a660445ee2d3de2960cbd52f97d8c0dffa9362d3ddef9", + url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.1/rules_go-0.18.1.tar.gz", ) http_archive( name = "bazel_gazelle", - sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d", - urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"], + sha256 = "3c681998538231a2d24d0c07ed5a7658cb72bfb5fd4bf9911157c0e9ac6a2687", + urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.17.0/bazel-gazelle-0.17.0.tar.gz"], ) -load("@io_bazel_rules_go//go:def.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") go_rules_dependencies() go_register_toolchains( - go_version = "1.11.5", + go_version = "1.11.6", ) load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") @@ -35,5 +35,5 @@ go_repository( name = "com_github_golangci_golangci-lint", build_file_generation = "on", importpath = "github.com/golangci/golangci-lint", - tag = "v1.13", + tag = "v1.15.0", ) diff --git a/vendor/sigs.k8s.io/cluster-api/architecture.png b/vendor/sigs.k8s.io/cluster-api/architecture.png deleted file mode 100644 index 8fe44100..00000000 Binary files a/vendor/sigs.k8s.io/cluster-api/architecture.png and /dev/null differ diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md index 9499ef26..33f2baba 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md @@ -2,7 +2,7 @@ `clusterctl` is the SIG-cluster-lifecycle sponsored tool that implements the Cluster API. -Read the [experience doc here](https://docs.google.com/document/d/1-sYb3EdkRga49nULH1kSwuQFf1o6GvAw_POrsNo5d8c/edit#). +Read the [experience doc here](https://docs.google.com/document/d/1-sYb3EdkRga49nULH1kSwuQFf1o6GvAw_POrsNo5d8c/edit#). To gain viewing permissions, please join either the [kubernetes-dev](https://groups.google.com/forum/#!forum/kubernetes-dev) or [kubernetes-sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) google group. ## Getting Started @@ -13,8 +13,8 @@ this repository.** ### Prerequisites -1. Install [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) -2. Install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) for minikube. For Linux, we recommend kvm2. For MacOS, we recommend VirtualBox. +1. Install [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) or [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/). [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) is preferred. +2. If you are using kind, go to step 3; If you are using minikube, install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) for minikube. For Linux, we recommend kvm2. For MacOS, we recommend VirtualBox. 2. Build the `clusterctl` tool ```bash @@ -41,10 +41,12 @@ https://github.com/kubernetes-sigs/cluster-api/issues/158 and https://github.com 1. Create a cluster: ```shell - ./clusterctl create cluster --provider -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml + ./clusterctl create cluster --provider --bootstrap-type -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml ``` -To choose a specific minikube driver, please use the `--vm-driver` command line parameter. For example to use the kvm2 driver with clusterctl you would add `--vm-driver kvm2` +Currently two `bootstrap-type` options are supported - `kind` and `minikube`. + +If you are using minikube, to choose a specific minikube driver, please use the `--bootstrap-flags vm-driver=xxx` command line parameter. For example to use the kvm2 driver with clusterctl you woud add `--bootstrap-flags vm-driver=kvm2`. Additional advanced flags can be found via help. @@ -54,6 +56,12 @@ Additional advanced flags can be found via help. ### Interacting with your cluster +If you are using kind, set the `KUBECONFIG` environment variable first before using kubectl: + +``` +export KUBECONFIG="$(kind get kubeconfig-path --name="clusterapi")" +``` + Once you have created a cluster, you can interact with the cluster and machine resources using kubectl: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel index c8bbe34b..0fdbfaaf 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel @@ -15,7 +15,6 @@ go_library( "//cmd/clusterctl/phases:go_default_library", "//cmd/clusterctl/providercomponents:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", - "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go index 24fec4b6..dcf1538a 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go @@ -32,7 +32,7 @@ const ( var ( // ignoredOptions lists the options not supported by delete and kubeconfig-path. - ignoredOptions = []string{"config", "image", "retain"} + ignoredOptions = []string{"config", "image", "retain", "wait"} ) type Kind struct { @@ -46,9 +46,21 @@ func New() *Kind { } func WithOptions(options []string) *Kind { + // Set name if it is not provided. + if func() bool { + for _, opt := range options { + if strings.HasPrefix(opt, "name=") { + return false + } + } + return true + }() { + options = append(options, fmt.Sprintf("name=%s", kindClusterName)) + } + return &Kind{ execFunc: execFunc, - options: append(options, fmt.Sprintf("name=%s", kindClusterName)), + options: options, } } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go index fceb4df3..272bb939 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go @@ -27,6 +27,10 @@ import ( "k8s.io/klog" ) +const ( + minikubeClusterName = "clusterapi" +) + type Minikube struct { kubeconfigpath string options []string @@ -47,6 +51,19 @@ func WithOptionsAndKubeConfigPath(options []string, kubeconfigpath string) *Mini // Arbitrary file name. Can potentially be randomly generated. kubeconfigpath = "minikube.kubeconfig" } + + // Set profile if it is not provided. + if func() bool { + for _, opt := range options { + if strings.HasPrefix(opt, "p=") { + return false + } + } + return true + }() { + options = append(options, fmt.Sprintf("p=%s", minikubeClusterName)) + } + return &Minikube{ minikubeExec: minikubeExec, options: options, diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel index dcfccba8..69dad459 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel @@ -14,6 +14,7 @@ go_library( "//pkg/client/clientset_generated/clientset:go_default_library", "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go index 12681a35..9bdd7a9f 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go @@ -17,16 +17,20 @@ limitations under the License. package clusterclient import ( + "fmt" + "io" "io/ioutil" "net" "os" "os/exec" + "reflect" "strconv" "strings" "sync" "time" "github.com/pkg/errors" + autoscalingv1 "k8s.io/api/autoscaling/v1" apiv1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -48,38 +52,49 @@ const ( timeoutResourceReady = 15 * time.Minute timeoutMachineReady = 30 * time.Minute timeoutResourceDelete = 15 * time.Minute + machineClusterLabelName = "cluster.k8s.io/cluster-name" ) // Provides interaction with a cluster type Client interface { - GetContextNamespace() string Apply(string) error + Close() error + CreateClusterObject(*clusterv1.Cluster) error + CreateMachineClass(*clusterv1.MachineClass) error + CreateMachineDeployments([]*clusterv1.MachineDeployment, string) error + CreateMachineSets([]*clusterv1.MachineSet, string) error + CreateMachines([]*clusterv1.Machine, string) error Delete(string) error + DeleteClusters(string) error + DeleteNamespace(string) error + DeleteMachineClasses(string) error + DeleteMachineClass(namespace, name string) error + DeleteMachineDeployments(string) error + DeleteMachineSets(string) error + DeleteMachines(string) error + ForceDeleteCluster(namespace, name string) error + ForceDeleteMachine(namespace, name string) error + ForceDeleteMachineSet(namespace, name string) error + ForceDeleteMachineDeployment(namespace, name string) error + EnsureNamespace(string) error + GetClusters(string) ([]*clusterv1.Cluster, error) + GetCluster(string, string) (*clusterv1.Cluster, error) + GetContextNamespace() string + GetMachineClasses(namespace string) ([]*clusterv1.MachineClass, error) + GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) + GetMachineDeploymentsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) + GetMachineDeployments(string) ([]*clusterv1.MachineDeployment, error) + GetMachineSet(namespace, name string) (*clusterv1.MachineSet, error) + GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) + GetMachineSetsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineSet, error) + GetMachineSetsForMachineDeployment(*clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) + GetMachines(namespace string) ([]*clusterv1.Machine, error) + GetMachinesForCluster(*clusterv1.Cluster) ([]*clusterv1.Machine, error) + GetMachinesForMachineSet(*clusterv1.MachineSet) ([]*clusterv1.Machine, error) + ScaleStatefulSet(namespace, name string, scale int32) error WaitForClusterV1alpha1Ready() error - GetClusterObjectsInNamespace(string) ([]*clusterv1.Cluster, error) - GetClusterObject(string, string) (*clusterv1.Cluster, error) - GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) - GetMachineDeploymentObjectsInNamespace(string) ([]*clusterv1.MachineDeployment, error) - GetMachineSetObjects() ([]*clusterv1.MachineSet, error) - GetMachineSetObjectsInNamespace(string) ([]*clusterv1.MachineSet, error) - GetMachineObjects() ([]*clusterv1.Machine, error) - GetMachineObjectsInNamespace(ns string) ([]*clusterv1.Machine, error) - CreateClusterObject(*clusterv1.Cluster) error - CreateMachineDeploymentObjects([]*clusterv1.MachineDeployment, string) error - CreateMachineSetObjects([]*clusterv1.MachineSet, string) error - CreateMachineObjects([]*clusterv1.Machine, string) error - DeleteClusterObjectsInNamespace(string) error - DeleteClusterObjects() error - DeleteMachineDeploymentObjectsInNamespace(string) error - DeleteMachineDeploymentObjects() error - DeleteMachineSetObjectsInNamespace(string) error - DeleteMachineSetObjects() error - DeleteMachineObjectsInNamespace(string) error - DeleteMachineObjects() error UpdateClusterObjectEndpoint(string, string, string) error - EnsureNamespace(string) error - DeleteNamespace(string) error - Close() error + WaitForResourceStatuses() error } type client struct { @@ -127,6 +142,27 @@ func (c *client) EnsureNamespace(namespaceName string) error { return nil } +func (c *client) ScaleStatefulSet(ns string, name string, scale int32) error { + clientset, err := clientcmd.NewCoreClientSetForDefaultSearchPath(c.kubeconfigFile, clientcmd.NewConfigOverrides()) + if err != nil { + return errors.Wrap(err, "error creating core clientset") + } + + _, err = clientset.AppsV1().StatefulSets(ns).UpdateScale(name, &autoscalingv1.Scale{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: name, + }, + Spec: autoscalingv1.ScaleSpec{ + Replicas: scale, + }, + }) + if err != nil && !apierrors.IsNotFound(err) { + return err + } + return nil +} + func (c *client) DeleteNamespace(namespaceName string) error { if namespaceName == apiv1.NamespaceDefault { return nil @@ -181,8 +217,8 @@ func (c *client) GetContextNamespace() string { return c.configOverrides.Context.Namespace } -func (c *client) GetClusterObject(name, ns string) (*clusterv1.Cluster, error) { - clustersInNamespace, err := c.GetClusterObjectsInNamespace(ns) +func (c *client) GetCluster(name, ns string) (*clusterv1.Cluster, error) { + clustersInNamespace, err := c.GetClusters(ns) if err != nil { return nil, err } @@ -196,7 +232,27 @@ func (c *client) GetClusterObject(name, ns string) (*clusterv1.Cluster, error) { return cluster, nil } -func (c *client) GetClusterObjectsInNamespace(namespace string) ([]*clusterv1.Cluster, error) { +// ForceDeleteCluster removes the finalizer for a Cluster prior to deleting, this is used during pivot +func (c *client) ForceDeleteCluster(namespace, name string) error { + cluster, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return errors.Wrapf(err, "error getting cluster %s/%s", namespace, name) + } + + cluster.ObjectMeta.SetFinalizers([]string{}) + + if _, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Update(cluster); err != nil { + return errors.Wrapf(err, "error removing finalizer on cluster %s/%s", namespace, name) + } + + if err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Delete(name, &metav1.DeleteOptions{}); err != nil { + return errors.Wrapf(err, "error deleting cluster %s/%s", namespace, name) + } + + return nil +} + +func (c *client) GetClusters(namespace string) ([]*clusterv1.Cluster, error) { clusters := []*clusterv1.Cluster{} clusterlist, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).List(metav1.ListOptions{}) if err != nil { @@ -209,7 +265,46 @@ func (c *client) GetClusterObjectsInNamespace(namespace string) ([]*clusterv1.Cl return clusters, nil } -func (c *client) GetMachineDeploymentObjectsInNamespace(namespace string) ([]*clusterv1.MachineDeployment, error) { +func (c *client) GetMachineClasses(namespace string) ([]*clusterv1.MachineClass, error) { + machineClassesList, err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).List(metav1.ListOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineClasses in namespace %q", namespace) + } + var machineClasses []*clusterv1.MachineClass + for i := 0; i < len(machineClassesList.Items); i++ { + machineClasses = append(machineClasses, &machineClassesList.Items[i]) + } + return machineClasses, nil +} + +func (c *client) GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) { + machineDeployment, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error getting MachineDeployment: %s/%s", namespace, name) + } + return machineDeployment, nil +} + +func (c *client) GetMachineDeploymentsForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) { + machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineDeployments for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machineDeployments []*clusterv1.MachineDeployment + for _, md := range machineDeploymentList.Items { + for _, or := range md.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machineDeployments = append(machineDeployments, &md) + continue + } + } + } + return machineDeployments, nil +} + +func (c *client) GetMachineDeployments(namespace string) ([]*clusterv1.MachineDeployment, error) { machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).List(metav1.ListOptions{}) if err != nil { return nil, errors.Wrapf(err, "error listing machine deployment objects in namespace %q", namespace) @@ -221,16 +316,18 @@ func (c *client) GetMachineDeploymentObjectsInNamespace(namespace string) ([]*cl return machineDeployments, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) { - klog.V(2).Info("GetMachineDeploymentObjects API is deprecated, use GetMachineDeploymentObjectsInNamespace instead") - return c.GetMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachineSet(namespace, name string) (*clusterv1.MachineSet, error) { + machineSet, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error getting MachineSet: %s/%s", namespace, name) + } + return machineSet, nil } -func (c *client) GetMachineSetObjectsInNamespace(namespace string) ([]*clusterv1.MachineSet, error) { +func (c *client) GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) { machineSetList, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).List(metav1.ListOptions{}) if err != nil { - return nil, errors.Wrapf(err, "error listing machine set objects in namespace %q", namespace) + return nil, errors.Wrapf(err, "error listing MachineSets in namespace %q", namespace) } var machineSets []*clusterv1.MachineSet for i := 0; i < len(machineSetList.Items); i++ { @@ -239,17 +336,44 @@ func (c *client) GetMachineSetObjectsInNamespace(namespace string) ([]*clusterv1 return machineSets, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineSetObjects() ([]*clusterv1.MachineSet, error) { - klog.V(2).Info("GetMachineSetObjects API is deprecated, use GetMachineSetObjectsInNamespace instead") - return c.GetMachineSetObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachineSetsForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.MachineSet, error) { + machineSetList, err := c.clientSet.ClusterV1alpha1().MachineSets(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineSets for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machineSets []*clusterv1.MachineSet + for _, ms := range machineSetList.Items { + for _, or := range ms.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machineSets = append(machineSets, &ms) + continue + } + } + } + return machineSets, nil } -func (c *client) GetMachineObjectsInNamespace(namespace string) ([]*clusterv1.Machine, error) { +func (c *client) GetMachineSetsForMachineDeployment(md *clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) { + machineSets, err := c.GetMachineSets(md.Namespace) + if err != nil { + return nil, err + } + var controlledMachineSets []*clusterv1.MachineSet + for _, ms := range machineSets { + if metav1.GetControllerOf(ms) != nil && metav1.IsControlledBy(ms, md) { + controlledMachineSets = append(controlledMachineSets, ms) + } + } + return controlledMachineSets, nil +} + +func (c *client) GetMachines(namespace string) ([]*clusterv1.Machine, error) { machines := []*clusterv1.Machine{} machineslist, err := c.clientSet.ClusterV1alpha1().Machines(namespace).List(metav1.ListOptions{}) if err != nil { - return nil, errors.Wrapf(err, "error listing machine objects in namespace %q", namespace) + return nil, errors.Wrapf(err, "error listing Machines in namespace %q", namespace) } for i := 0; i < len(machineslist.Items); i++ { @@ -258,10 +382,56 @@ func (c *client) GetMachineObjectsInNamespace(namespace string) ([]*clusterv1.Ma return machines, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineObjects() ([]*clusterv1.Machine, error) { - klog.V(2).Info("GetMachineObjects API is deprecated, use GetMachineObjectsInNamespace instead") - return c.GetMachineObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachinesForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.Machine, error) { + machineslist, err := c.clientSet.ClusterV1alpha1().Machines(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing Machines for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machines []*clusterv1.Machine + + for i := 0; i < len(machineslist.Items); i++ { + m := &machineslist.Items[i] + + for _, or := range m.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machines = append(machines, m) + break + } + } + } + + return machines, nil +} + +func (c *client) GetMachinesForMachineSet(ms *clusterv1.MachineSet) ([]*clusterv1.Machine, error) { + machines, err := c.GetMachines(ms.Namespace) + if err != nil { + return nil, err + } + var controlledMachines []*clusterv1.Machine + for _, m := range machines { + if metav1.GetControllerOf(m) != nil && metav1.IsControlledBy(m, ms) { + controlledMachines = append(controlledMachines, m) + } + } + return controlledMachines, nil +} + +func (c *client) CreateMachineClass(machineClass *clusterv1.MachineClass) error { + _, err := c.clientSet.ClusterV1alpha1().MachineClasses(machineClass.Namespace).Create(machineClass) + if err != nil { + return errors.Wrapf(err, "error creating MachineClass %s/%s", machineClass.Namespace, machineClass.Name) + } + return nil +} + +func (c *client) DeleteMachineClass(namespace, name string) error { + if err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineClass %s/%s", namespace, name) + } + return nil } func (c *client) CreateClusterObject(cluster *clusterv1.Cluster) error { @@ -274,10 +444,10 @@ func (c *client) CreateClusterObject(cluster *clusterv1.Cluster) error { if err != nil { return errors.Wrapf(err, "error creating cluster in namespace %v", namespace) } - return err + return nil } -func (c *client) CreateMachineDeploymentObjects(deployments []*clusterv1.MachineDeployment, namespace string) error { +func (c *client) CreateMachineDeployments(deployments []*clusterv1.MachineDeployment, namespace string) error { for _, deploy := range deployments { // TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258 _, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Create(deploy) @@ -288,7 +458,7 @@ func (c *client) CreateMachineDeploymentObjects(deployments []*clusterv1.Machine return nil } -func (c *client) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet, namespace string) error { +func (c *client) CreateMachineSets(machineSets []*clusterv1.MachineSet, namespace string) error { for _, ms := range machineSets { // TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258 _, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Create(ms) @@ -299,7 +469,7 @@ func (c *client) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet, na return nil } -func (c *client) CreateMachineObjects(machines []*clusterv1.Machine, namespace string) error { +func (c *client) CreateMachines(machines []*clusterv1.Machine, namespace string) error { var ( wg sync.WaitGroup errOnce sync.Once @@ -329,74 +499,206 @@ func (c *client) CreateMachineObjects(machines []*clusterv1.Machine, namespace s return gerr } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteClusterObjects() error { - klog.V(2).Info("DeleteClusterObjects API is deprecated, use DeleteClusterObjectsInNamespace instead") - return c.DeleteClusterObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteClusters deletes all Clusters in a namespace. If the namespace is empty then all Clusters in all namespaces are deleted. +func (c *client) DeleteClusters(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + clusters, err := c.clientSet.ClusterV1alpha1().Clusters("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing Clusters in all namespaces") + } + for _, cluster := range clusters.Items { + if _, ok := seen[cluster.Namespace]; !ok { + seen[cluster.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().Clusters(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting Clusters in namespace %q", ns) + } + err = c.waitForClusterDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for Cluster(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteClusterObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().Clusters(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) - if err != nil { - return errors.Wrapf(err, "error deleting cluster objects in namespace %q", namespace) +// DeleteMachineClasses deletes all MachineClasses in a namespace. If the namespace is empty then all MachineClasses in all namespaces are deleted. +func (c *client) DeleteMachineClasses(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineClasses, err := c.clientSet.ClusterV1alpha1().MachineClasses("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineClasses in all namespaces") + } + for _, mc := range machineClasses.Items { + if _, ok := seen[mc.Namespace]; !ok { + seen[mc.Namespace] = true + } + } } - err = c.waitForClusterDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for cluster(s) deletion to complete in namespace %q", namespace) + + for ns := range seen { + if err := c.DeleteMachineClasses(ns); err != nil { + return err + } + err := c.clientSet.ClusterV1alpha1().MachineClasses(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineClasses in namespace %q", ns) + } + err = c.waitForMachineClassesDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineClass(es) deletion to complete in ns %q", ns) + } } + return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineDeploymentObjects() error { - klog.V(2).Info("DeleteMachineDeploymentObjects API is deprecated, use DeleteMachineDeploymentObjectsInNamespace instead") - return c.DeleteMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteMachineDeployments deletes all MachineDeployments in a namespace. If the namespace is empty then all MachineDeployments in all namespaces are deleted. +func (c *client) DeleteMachineDeployments(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineDeployments, err := c.clientSet.ClusterV1alpha1().MachineDeployments("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineDeployments in all namespaces") + } + for _, md := range machineDeployments.Items { + if _, ok := seen[md.Namespace]; !ok { + seen[md.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().MachineDeployments(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineDeployments in namespace %q", ns) + } + err = c.waitForMachineDeploymentsDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineDeployment(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteMachineDeploymentObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) - if err != nil { - return errors.Wrapf(err, "error deleting machine deployment objects in namespace %q", namespace) +// DeleteMachineSets deletes all MachineSets in a namespace. If the namespace is empty then all MachineSets in all namespaces are deleted. +func (c *client) DeleteMachineSets(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineSets, err := c.clientSet.ClusterV1alpha1().MachineSets("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineSets in all namespaces") + } + for _, ms := range machineSets.Items { + if _, ok := seen[ms.Namespace]; !ok { + seen[ms.Namespace] = true + } + } } - err = c.waitForMachineDeploymentsDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine deployment(s) deletion to complete in namespace %q", namespace) + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().MachineSets(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineSets in namespace %q", ns) + } + err = c.waitForMachineSetsDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineSet(s) deletion to complete in namespace %q", ns) + } } + return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineSetObjects() error { - klog.V(2).Info("DeleteMachineSetObjects API is deprecated, use DeleteMachineSetObjectsInNamespace instead") - return c.DeleteMachineSetObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteMachines deletes all Machines in a namespace. If the namespace is empty then all Machines in all namespaces are deleted. +func (c *client) DeleteMachines(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machines, err := c.clientSet.ClusterV1alpha1().Machines("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing Machines in all namespaces") + } + for _, m := range machines.Items { + if _, ok := seen[m.Namespace]; !ok { + seen[m.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().Machines(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting Machines in namespace %q", ns) + } + err = c.waitForMachinesDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for Machine(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteMachineSetObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) +func (c *client) ForceDeleteMachine(namespace, name string) error { + machine, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Get(name, metav1.GetOptions{}) if err != nil { - return errors.Wrapf(err, "error deleting machine set objects in namespace %q", namespace) + return errors.Wrapf(err, "error getting Machine %s/%s", namespace, name) } - err = c.waitForMachineSetsDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine set(s) deletion to complete in namespace %q", namespace) + machine.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Update(machine); err != nil { + return errors.Wrapf(err, "error removing finalizer for Machine %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().Machines(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting Machine %s/%s", namespace, name) } return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineObjects() error { - klog.V(2).Info("DeleteMachineObjects API is deprecated, use DeleteMachineObjectsInNamespace instead") - return c.DeleteMachineObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) ForceDeleteMachineSet(namespace, name string) error { + ms, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return errors.Wrapf(err, "error getting MachineSet %s/%s", namespace, name) + } + ms.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Update(ms); err != nil { + return errors.Wrapf(err, "error removing finalizer for MachineSet %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineSet %s/%s", namespace, name) + } + return nil } -func (c *client) DeleteMachineObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().Machines(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) +func (c *client) ForceDeleteMachineDeployment(namespace, name string) error { + md, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Get(name, metav1.GetOptions{}) if err != nil { - return errors.Wrapf(err, "error deleting machine objects in namespace %q", namespace) + return errors.Wrapf(err, "error getting MachineDeployment %s/%s", namespace, name) } - err = c.waitForMachinesDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine(s) deletion to complete in namespace %q", namespace) + md.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Update(md); err != nil { + return errors.Wrapf(err, "error removing finalizer for MachineDeployment %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineDeployment %s/%s", namespace, name) } return nil } @@ -412,7 +714,7 @@ func newDeleteOptions() *metav1.DeleteOptions { // can be passed as hostname or hostname:port, if port is not present the default port 443 is applied. // TODO: Test this function func (c *client) UpdateClusterObjectEndpoint(clusterEndpoint, clusterName, namespace string) error { - cluster, err := c.GetClusterObject(clusterName, namespace) + cluster, err := c.GetCluster(clusterName, namespace) if err != nil { return err } @@ -440,9 +742,62 @@ func (c *client) WaitForClusterV1alpha1Ready() error { return waitForClusterResourceReady(c.clientSet) } +func (c *client) WaitForResourceStatuses() error { + deadline := time.Now().Add(timeoutResourceReady) + + timeout := time.Until(deadline) + return util.PollImmediate(retryIntervalResourceReady, timeout, func() (bool, error) { + klog.V(2).Info("Waiting for Cluster API resources to have statuses...") + clusters, err := c.clientSet.ClusterV1alpha1().Clusters("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, cluster := range clusters.Items { + if reflect.DeepEqual(clusterv1.ClusterStatus{}, cluster.Status) { + return false, nil + } + if cluster.Status.ProviderStatus == nil { + return false, nil + } + } + machineDeployments, err := c.clientSet.ClusterV1alpha1().MachineDeployments("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, md := range machineDeployments.Items { + if reflect.DeepEqual(clusterv1.MachineDeploymentStatus{}, md.Status) { + return false, nil + } + } + machineSets, err := c.clientSet.ClusterV1alpha1().MachineSets("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, ms := range machineSets.Items { + if reflect.DeepEqual(clusterv1.MachineSetStatus{}, ms.Status) { + return false, nil + } + } + machines, err := c.clientSet.ClusterV1alpha1().Machines("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, m := range machines.Items { + if reflect.DeepEqual(clusterv1.MachineStatus{}, m.Status) { + return false, nil + } + if m.Status.ProviderStatus == nil { + return false, nil + } + } + + return true, nil + }) +} + func (c *client) waitForClusterDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for cluster objects to be deleted...") + klog.V(2).Infof("Waiting for Clusters to be deleted...") response, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -454,9 +809,23 @@ func (c *client) waitForClusterDelete(namespace string) error { }) } +func (c *client) waitForMachineClassesDelete(namespace string) error { + return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { + klog.V(2).Infof("Waiting for MachineClasses to be deleted...") + response, err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + if len(response.Items) > 0 { + return false, nil + } + return true, nil + }) +} + func (c *client) waitForMachineDeploymentsDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine deployment objects to be deleted...") + klog.V(2).Infof("Waiting for MachineDeployments to be deleted...") response, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -470,7 +839,7 @@ func (c *client) waitForMachineDeploymentsDelete(namespace string) error { func (c *client) waitForMachineSetsDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine set objects to be deleted...") + klog.V(2).Infof("Waiting for MachineSets to be deleted...") response, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -484,7 +853,7 @@ func (c *client) waitForMachineSetsDelete(namespace string) error { func (c *client) waitForMachinesDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine objects to be deleted...") + klog.V(2).Infof("Waiting for Machines to be deleted...") response, err := c.clientSet.ClusterV1alpha1().Machines(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -496,6 +865,20 @@ func (c *client) waitForMachinesDelete(namespace string) error { }) } +func (c *client) waitForMachineDelete(namespace, name string) error { + return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { + klog.V(2).Infof("Waiting for Machine %s/%s to be deleted...", namespace, name) + response, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return false, nil + } + if response != nil { + return false, nil + } + return true, nil + }) +} + func (c *client) kubectlDelete(manifest string) error { return c.kubectlManifestCmd("delete", manifest) } @@ -536,7 +919,7 @@ func (c *client) waitForKubectlApply(manifest string) error { klog.V(2).Infof("Waiting for kubectl apply...") err := c.kubectlApply(manifest) if err != nil { - if strings.Contains(err.Error(), "refused") { + if strings.Contains(err.Error(), io.EOF.Error()) || strings.Contains(err.Error(), "refused") { // Connection was refused, probably because the API server is not ready yet. klog.V(4).Infof("Waiting for kubectl apply... server not yet available: %v", err) return false, nil @@ -627,11 +1010,11 @@ func ifErrRemove(pErr *error, path string) { } func GetClusterAPIObject(client Client, clusterName, namespace string) (*clusterv1.Cluster, *clusterv1.Machine, []*clusterv1.Machine, error) { - machines, err := client.GetMachineObjectsInNamespace(namespace) + machines, err := client.GetMachines(namespace) if err != nil { return nil, nil, nil, errors.Wrap(err, "unable to fetch machines") } - cluster, err := client.GetClusterObject(clusterName, namespace) + cluster, err := client.GetCluster(clusterName, namespace) if err != nil { return nil, nil, nil, errors.Wrapf(err, "unable to fetch cluster %s/%s", namespace, clusterName) } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go index 272a8ad2..73d17b3e 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go @@ -27,7 +27,6 @@ import ( "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/provider" "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/cluster-api/pkg/util" ) type ClusterDeployer struct { @@ -35,6 +34,7 @@ type ClusterDeployer struct { clientFactory clusterclient.Factory providerComponents string addonComponents string + bootstrapComponents string cleanupBootstrapCluster bool } @@ -43,12 +43,14 @@ func New( clientFactory clusterclient.Factory, providerComponents string, addonComponents string, + bootstrapComponents string, cleanupBootstrapCluster bool) *ClusterDeployer { return &ClusterDeployer{ bootstrapProvisioner: bootstrapProvisioner, clientFactory: clientFactory, providerComponents: providerComponents, addonComponents: addonComponents, + bootstrapComponents: bootstrapComponents, cleanupBootstrapCluster: cleanupBootstrapCluster, } } @@ -67,6 +69,12 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster } defer closeClient(bootstrapClient, "bootstrap") + if d.bootstrapComponents != "" { + if err := phases.ApplyBootstrapComponents(bootstrapClient, d.bootstrapComponents); err != nil { + return errors.Wrap(err, "unable to apply bootstrap components to bootstrap cluster") + } + } + klog.Info("Applying Cluster API stack to bootstrap cluster") if err := phases.ApplyClusterAPIComponents(bootstrapClient, d.providerComponents); err != nil { return errors.Wrap(err, "unable to apply cluster api stack to bootstrap cluster") @@ -109,22 +117,9 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster } } - klog.Infof("Creating namespace %q on target cluster", cluster.Namespace) - addNamespaceToTarget := func() (bool, error) { - err = targetClient.EnsureNamespace(cluster.Namespace) - if err != nil { - return false, nil - } - return true, nil - } - - if err := util.Retry(addNamespaceToTarget, 0); err != nil { - return errors.Wrapf(err, "unable to ensure namespace %q in target cluster", cluster.Namespace) - } - - klog.Info("Applying Cluster API stack to target cluster") - if err := d.applyClusterAPIComponentsWithPivoting(targetClient, bootstrapClient, cluster.Namespace); err != nil { - return errors.Wrap(err, "unable to apply cluster api stack to target cluster") + klog.Info("Pivoting Cluster API stack to target cluster") + if err := phases.Pivot(bootstrapClient, targetClient, d.providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot cluster api stack to target cluster") } klog.Info("Saving provider components to the target cluster") @@ -150,7 +145,7 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster return nil } -func (d *ClusterDeployer) Delete(targetClient clusterclient.Client, namespace string) error { +func (d *ClusterDeployer) Delete(targetClient clusterclient.Client) error { klog.Info("Creating bootstrap cluster") bootstrapClient, cleanupBootstrapCluster, err := phases.CreateBootstrapCluster(d.bootstrapProvisioner, d.cleanupBootstrapCluster, d.clientFactory) defer cleanupBootstrapCluster() @@ -159,24 +154,18 @@ func (d *ClusterDeployer) Delete(targetClient clusterclient.Client, namespace st } defer closeClient(bootstrapClient, "bootstrap") - klog.Info("Applying Cluster API stack to bootstrap cluster") - if err := phases.ApplyClusterAPIComponents(bootstrapClient, d.providerComponents); err != nil { - return errors.Wrap(err, "unable to apply cluster api stack to bootstrap cluster") + klog.Info("Pivoting Cluster API stack to bootstrap cluster") + if err := phases.Pivot(targetClient, bootstrapClient, d.providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot Cluster API stack to bootstrap cluster") } - klog.Info("Deleting Cluster API Provider Components from target cluster") - if err = targetClient.Delete(d.providerComponents); err != nil { - klog.Infof("error while removing provider components from target cluster: %v", err) - klog.Infof("Continuing with a best effort delete") - } - - klog.Info("Copying objects from target cluster to bootstrap cluster") - if err = pivotNamespace(targetClient, bootstrapClient, namespace); err != nil { - return errors.Wrap(err, "unable to copy objects from target to bootstrap cluster") + // Verify that all pivoted resources have a status + if err := bootstrapClient.WaitForResourceStatuses(); err != nil { + return errors.Wrap(err, "error while waiting for Cluster API resources to contain statuses") } klog.Info("Deleting objects from bootstrap cluster") - if err = deleteObjectsInNamespace(bootstrapClient, namespace); err != nil { + if err := deleteClusterAPIObjectsInAllNamespaces(bootstrapClient); err != nil { return errors.Wrap(err, "unable to finish deleting objects in bootstrap cluster, resources may have been leaked") } @@ -220,112 +209,31 @@ func (d *ClusterDeployer) saveProviderComponentsToCluster(factory provider.Compo return nil } -func (d *ClusterDeployer) applyClusterAPIComponentsWithPivoting(client, source clusterclient.Client, namespace string) error { - klog.Info("Applying Cluster API Provider Components") - if err := client.Apply(d.providerComponents); err != nil { - return errors.Wrap(err, "unable to apply cluster api controllers") - } - - klog.Info("Pivoting Cluster API objects from bootstrap to target cluster.") - err := pivotNamespace(source, client, namespace) - if err != nil { - return errors.Wrap(err, "unable to pivot cluster API objects") - } - - return nil -} - -func pivotNamespace(from, to clusterclient.Client, namespace string) error { - if err := from.WaitForClusterV1alpha1Ready(); err != nil { - return errors.New("cluster v1alpha1 resource not ready on source cluster") - } - - if err := to.WaitForClusterV1alpha1Ready(); err != nil { - return errors.New("cluster v1alpha1 resource not ready on target cluster") - } - - clusters, err := from.GetClusterObjectsInNamespace(namespace) - if err != nil { - return err - } - - for _, cluster := range clusters { - // New objects cannot have a specified resource version. Clear it out. - cluster.SetResourceVersion("") - if err = to.CreateClusterObject(cluster); err != nil { - return errors.Wrapf(err, "error moving Cluster %q", cluster.GetName()) - } - klog.Infof("Moved Cluster '%s'", cluster.GetName()) - } - - fromDeployments, err := from.GetMachineDeploymentObjectsInNamespace(namespace) - if err != nil { - return err - } - for _, deployment := range fromDeployments { - // New objects cannot have a specified resource version. Clear it out. - deployment.SetResourceVersion("") - if err = to.CreateMachineDeploymentObjects([]*clusterv1.MachineDeployment{deployment}, namespace); err != nil { - return errors.Wrapf(err, "error moving MachineDeployment %q", deployment.GetName()) - } - klog.Infof("Moved MachineDeployment %v", deployment.GetName()) - } - - fromMachineSets, err := from.GetMachineSetObjectsInNamespace(namespace) - if err != nil { - return err - } - for _, machineSet := range fromMachineSets { - // New objects cannot have a specified resource version. Clear it out. - machineSet.SetResourceVersion("") - if err := to.CreateMachineSetObjects([]*clusterv1.MachineSet{machineSet}, namespace); err != nil { - return errors.Wrapf(err, "error moving MachineSet %q", machineSet.GetName()) - } - klog.Infof("Moved MachineSet %v", machineSet.GetName()) - } - - machines, err := from.GetMachineObjectsInNamespace(namespace) - if err != nil { - return err - } - - for _, machine := range machines { - // New objects cannot have a specified resource version. Clear it out. - machine.SetResourceVersion("") - machine.SetOwnerReferences(nil) - if err = to.CreateMachineObjects([]*clusterv1.Machine{machine}, namespace); err != nil { - return errors.Wrapf(err, "error moving Machine %q", machine.GetName()) - } - klog.Infof("Moved Machine '%s'", machine.GetName()) - } - return nil -} - -func deleteObjectsInNamespace(client clusterclient.Client, namespace string) error { +func deleteClusterAPIObjectsInAllNamespaces(client clusterclient.Client) error { var errorList []string - klog.Infof("Deleting machine deployments in namespace %q", namespace) - if err := client.DeleteMachineDeploymentObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machine deployments") + klog.Infof("Deleting MachineDeployments in all namespaces") + if err := client.DeleteMachineDeployments(""); err != nil { + err = errors.Wrap(err, "error deleting MachineDeployments") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting machine sets in namespace %q", namespace) - if err := client.DeleteMachineSetObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machine sets") + klog.Infof("Deleting MachineSets in all namespaces") + if err := client.DeleteMachineSets(""); err != nil { + err = errors.Wrap(err, "error deleting MachineSets") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting machines in namespace %q", namespace) - if err := client.DeleteMachineObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machines") + klog.Infof("Deleting Machines in all namespaces") + if err := client.DeleteMachines(""); err != nil { + err = errors.Wrap(err, "error deleting Machines") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting clusters in namespace %q", namespace) - if err := client.DeleteClusterObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting clusters") + klog.Infof("Deleting MachineClasses in all namespaces") + if err := client.DeleteMachineClasses(""); err != nil { + err = errors.Wrap(err, "error deleting MachineClasses") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting namespace %q", namespace) - if err := client.DeleteNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting namespace") + klog.Infof("Deleting Clusters in all namespaces") + if err := client.DeleteClusters(""); err != nil { + err = errors.Wrap(err, "error deleting Clusters") errorList = append(errorList, err.Error()) } if len(errorList) > 0 { diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel index da6d6d15..b215680d 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel @@ -5,11 +5,13 @@ go_library( srcs = [ "alpha.go", "alpha_phase_apply_addons.go", + "alpha_phase_apply_boostrap_components.go", "alpha_phase_apply_cluster.go", "alpha_phase_apply_cluster_api_components.go", "alpha_phase_apply_machines.go", "alpha_phase_create_bootstrap_cluster.go", "alpha_phase_get_kubeconfig.go", + "alpha_phase_pivot.go", "alpha_phases.go", "create.go", "create_cluster.go", @@ -38,6 +40,7 @@ go_library( "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go new file mode 100644 index 00000000..0f4a42d0 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go @@ -0,0 +1,80 @@ +/* +Copyright 2019 The Kubernetes 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 cmd + +import ( + "io/ioutil" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" + "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" +) + +type AlphaPhaseApplyBootstrapComponentsOptions struct { + Kubeconfig string + BootstrapComponents string +} + +var pabco = &AlphaPhaseApplyBootstrapComponentsOptions{} + +var alphaPhaseApplyBootstrapComponentsCmd = &cobra.Command{ + Use: "apply-bootstrap-components", + Short: "Apply boostrap components", + Long: `Apply bootstrap components`, + Run: func(cmd *cobra.Command, args []string) { + if pabco.BootstrapComponents == "" { + exitWithHelp(cmd, "Please provide yaml file for bootstrap component definition.") + } + + if pabco.Kubeconfig == "" { + exitWithHelp(cmd, "Please provide a kubeconfig file.") + } + + if err := RunAlphaPhaseApplyBootstrapComponents(pabco); err != nil { + klog.Exit(err) + } + }, +} + +func RunAlphaPhaseApplyBootstrapComponents(pabco *AlphaPhaseApplyBootstrapComponentsOptions) error { + kubeconfig, err := ioutil.ReadFile(pabco.Kubeconfig) + if err != nil { + return err + } + + pc, err := ioutil.ReadFile(pabco.BootstrapComponents) + if err != nil { + return errors.Wrapf(err, "error loading provider components file %q", pabco.BootstrapComponents) + } + + clientFactory := clusterclient.NewFactory() + client, err := clientFactory.NewClientFromKubeconfig(string(kubeconfig)) + if err != nil { + return errors.Wrap(err, "unable to create cluster client") + } + + return phases.ApplyBootstrapComponents(client, string(pc)) +} + +func init() { + // Required flags + alphaPhaseApplyBootstrapComponentsCmd.Flags().StringVarP(&pabco.Kubeconfig, "kubeconfig", "", "", "Path for the kubeconfig file to use") + alphaPhaseApplyBootstrapComponentsCmd.Flags().StringVarP(&pabco.BootstrapComponents, "bootstrap-components", "b", "", "A yaml file containing bootstrap cluster components") + alphaPhasesCmd.AddCommand(alphaPhaseApplyBootstrapComponentsCmd) +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go index eb0decda..5dac0147 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go @@ -88,7 +88,7 @@ func init() { alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Kubeconfig, "kubeconfig", "", "", "Path for the kubeconfig file to use") alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.ClusterName, "cluster-name", "", "", "Cluster Name") // TODO: Remove as soon as code allows https://github.com/kubernetes-sigs/cluster-api/issues/157 - alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Provider, "provider", "", "", "Which provider deployment logic to use (google/vsphere/azure)") + alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Provider, "provider", "", "", "Which provider deployment logic to use") // Optional flags alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.KubeconfigOutput, "kubeconfig-out", "", "kubeconfig", "Where to output the kubeconfig for the provisioned cluster") diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go new file mode 100644 index 00000000..9f1984b2 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go @@ -0,0 +1,100 @@ +/* +Copyright 2019 The Kubernetes 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 cmd + +import ( + "fmt" + "io/ioutil" + + "github.com/spf13/cobra" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" + "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" +) + +type AlphaPhasePivotOptions struct { + SourceKubeconfig string + TargetKubeconfig string + ProviderComponents string +} + +var ppo = &AlphaPhasePivotOptions{} + +var alphaPhasePivotCmd = &cobra.Command{ + Use: "pivot", + Short: "Pivot", + Long: `Pivot`, + Run: func(cmd *cobra.Command, args []string) { + if ppo.ProviderComponents == "" { + exitWithHelp(cmd, "Please provide yaml file for provider components definition.") + } + + if ppo.SourceKubeconfig == "" { + exitWithHelp(cmd, "Please provide a source kubeconfig file.") + } + + if ppo.TargetKubeconfig == "" { + exitWithHelp(cmd, "Please provide a target kubeconfig file.") + } + + if err := RunAlphaPhasePivot(ppo); err != nil { + klog.Exit(err) + } + }, +} + +func RunAlphaPhasePivot(ppo *AlphaPhasePivotOptions) error { + sourceKubeconfig, err := ioutil.ReadFile(ppo.SourceKubeconfig) + if err != nil { + return err + } + + targetKubeconfig, err := ioutil.ReadFile(ppo.TargetKubeconfig) + if err != nil { + return err + } + + providerComponents, err := ioutil.ReadFile(ppo.ProviderComponents) + if err != nil { + return fmt.Errorf("error loading addons file '%v': %v", ppo.ProviderComponents, err) + } + + clientFactory := clusterclient.NewFactory() + sourceClient, err := clientFactory.NewClientFromKubeconfig(string(sourceKubeconfig)) + if err != nil { + return fmt.Errorf("unable to create source cluster client: %v", err) + } + + targetClient, err := clientFactory.NewClientFromKubeconfig(string(targetKubeconfig)) + if err != nil { + return fmt.Errorf("unable to create target cluster client: %v", err) + } + + if err := phases.Pivot(sourceClient, targetClient, string(providerComponents)); err != nil { + return fmt.Errorf("unable to pivot Cluster API Components: %v", err) + } + + return nil +} + +func init() { + // Required flags + alphaPhasePivotCmd.Flags().StringVarP(&ppo.SourceKubeconfig, "source-kubeconfig", "s", "", "Path for the source kubeconfig file to use") + alphaPhasePivotCmd.Flags().StringVarP(&ppo.TargetKubeconfig, "target-kubeconfig", "t", "", "Path for the target kubeconfig file to use") + alphaPhasePivotCmd.Flags().StringVarP(&ppo.ProviderComponents, "provider-components", "p", "", "A yaml file containing provider components to apply to the cluster") + alphaPhasesCmd.AddCommand(alphaPhasePivotCmd) +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go index c2aa0c3e..a46bd4ef 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go @@ -31,13 +31,14 @@ import ( ) type CreateOptions struct { - Cluster string - Machine string - ProviderComponents string - AddonComponents string - Provider string - KubeconfigOutput string - BootstrapFlags bootstrap.Options + Cluster string + Machine string + ProviderComponents string + AddonComponents string + BootstrapOnlyComponents string + Provider string + KubeconfigOutput string + BootstrapFlags bootstrap.Options } var co = &CreateOptions{} @@ -92,6 +93,12 @@ func RunCreate(co *CreateOptions) error { return errors.Wrapf(err, "error loading addons file %q", co.AddonComponents) } } + var bc []byte + if co.BootstrapOnlyComponents != "" { + if bc, err = ioutil.ReadFile(co.BootstrapOnlyComponents); err != nil { + return errors.Wrapf(err, "error loading bootstrap only component file %q", co.BootstrapOnlyComponents) + } + } pcsFactory := clusterdeployer.NewProviderComponentsStoreFactory() d := clusterdeployer.New( @@ -99,6 +106,7 @@ func RunCreate(co *CreateOptions) error { clusterclient.NewFactory(), string(pc), string(ac), + string(bc), co.BootstrapFlags.Cleanup) return d.Create(c, m, pd, co.KubeconfigOutput, pcsFactory) @@ -113,11 +121,12 @@ func init() { createClusterCmd.Flags().StringVarP(&co.ProviderComponents, "provider-components", "p", "", "A yaml file containing cluster api provider controllers and supporting objects. Required.") createClusterCmd.MarkFlagRequired("provider-components") // TODO: Remove as soon as code allows https://github.com/kubernetes-sigs/cluster-api/issues/157 - createClusterCmd.Flags().StringVarP(&co.Provider, "provider", "", "", "Which provider deployment logic to use (google/vsphere/azure). Required.") + createClusterCmd.Flags().StringVarP(&co.Provider, "provider", "", "", "Which provider deployment logic to use. Required.") createClusterCmd.MarkFlagRequired("provider") // Optional flags createClusterCmd.Flags().StringVarP(&co.AddonComponents, "addon-components", "a", "", "A yaml file containing cluster addons to apply to the internal cluster") + createClusterCmd.Flags().StringVarP(&co.BootstrapOnlyComponents, "bootstrap-only-components", "", "", "A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster") createClusterCmd.Flags().StringVarP(&co.KubeconfigOutput, "kubeconfig-out", "", "kubeconfig", "Where to output the kubeconfig for the provisioned cluster") co.BootstrapFlags.AddFlags(createClusterCmd.Flags()) diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go index 087e6e8a..1b683431 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go @@ -32,7 +32,6 @@ import ( type DeleteOptions struct { KubeconfigPath string ProviderComponents string - ClusterNamespace string KubeconfigOverrides tcmd.ConfigOverrides BootstrapFlags bootstrap.Options } @@ -61,9 +60,6 @@ func init() { deleteClusterCmd.Flags().StringVarP(&do.KubeconfigPath, "kubeconfig", "", "", "Path to the kubeconfig file to use for connecting to the cluster to be deleted, if empty, the default KUBECONFIG load path is used.") deleteClusterCmd.Flags().StringVarP(&do.ProviderComponents, "provider-components", "p", "", "A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store.") - // Optional flags - deleteClusterCmd.Flags().StringVarP(&do.ClusterNamespace, "cluster-namespace", "", v1.NamespaceDefault, "Namespace where the cluster to be deleted resides") - // BindContextFlags will bind the flags cluster, namespace, and user tcmd.BindContextFlags(&do.KubeconfigOverrides.Context, deleteClusterCmd.Flags(), tcmd.RecommendedContextOverrideFlags("")) @@ -92,9 +88,10 @@ func RunDelete() error { clusterclient.NewFactory(), providerComponents, "", + "", do.BootstrapFlags.Cleanup) - return deployer.Delete(clusterClient, do.ClusterNamespace) + return deployer.Delete(clusterClient) } func loadProviderComponents() (string, error) { diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel index af6dc871..716245bf 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel @@ -1,14 +1,16 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ "applyaddons.go", + "applybootstrapcomponents.go", "applycluster.go", "applyclusterapicomponents.go", "applymachines.go", "createbootstrapcluster.go", "getkubeconfig.go", + "pivot.go", ], importpath = "sigs.k8s.io/cluster-api/cmd/clusterctl/phases", visibility = ["//visibility:public"], @@ -19,6 +21,18 @@ go_library( "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/apps/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) + +go_test( + name = "go_default_test", + srcs = ["pivot_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/apis/cluster/v1alpha1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + ], +) diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go new file mode 100644 index 00000000..20508526 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go @@ -0,0 +1,32 @@ +/* +Copyright 2019 The Kubernetes 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 phases + +import ( + "github.com/pkg/errors" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" +) + +func ApplyBootstrapComponents(client clusterclient.Client, components string) error { + klog.Info("Applying Bootstrap-only Components") + if err := client.Apply(components); err != nil { + return errors.Wrap(err, "unable to apply bootstrap-only components") + } + + return nil +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go index 2c11ccc0..ffc8f1af 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go @@ -34,7 +34,7 @@ func ApplyMachines(client clusterclient.Client, namespace string, machines []*cl } klog.Infof("Creating machines in namespace %q", namespace) - if err := client.CreateMachineObjects(machines, namespace); err != nil { + if err := client.CreateMachines(machines, namespace); err != nil { return err } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go index fe5feee1..a119a883 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go @@ -25,7 +25,6 @@ import ( "k8s.io/klog" "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/provider" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/cluster-api/pkg/util" ) @@ -36,13 +35,8 @@ const ( // GetKubeconfig returns a kubeconfig for the target cluster func GetKubeconfig(bootstrapClient clusterclient.Client, provider provider.Deployer, kubeconfigOutput string, clusterName, namespace string) (string, error) { - cluster, controlPlane, _, err := clusterclient.GetClusterAPIObject(bootstrapClient, clusterName, namespace) - if err != nil { - return "", err - } - klog.V(1).Info("Getting target cluster kubeconfig.") - targetKubeconfig, err := waitForKubeconfigReady(provider, cluster, controlPlane) + targetKubeconfig, err := waitForKubeconfigReady(bootstrapClient, provider, clusterName, namespace) if err != nil { return "", fmt.Errorf("unable to get target cluster kubeconfig: %v", err) } @@ -54,11 +48,16 @@ func GetKubeconfig(bootstrapClient clusterclient.Client, provider provider.Deplo return targetKubeconfig, nil } -func waitForKubeconfigReady(provider provider.Deployer, cluster *clusterv1.Cluster, machine *clusterv1.Machine) (string, error) { +func waitForKubeconfigReady(bootstrapClient clusterclient.Client, provider provider.Deployer, clusterName, namespace string) (string, error) { kubeconfig := "" err := util.PollImmediate(retryKubeConfigReady, timeoutKubeconfigReady, func() (bool, error) { - klog.V(2).Infof("Waiting for kubeconfig on %v to become ready...", machine.Name) - k, err := provider.GetKubeConfig(cluster, machine) + cluster, controlPlane, _, err := clusterclient.GetClusterAPIObject(bootstrapClient, clusterName, namespace) + if err != nil { + return false, err + } + + klog.V(2).Infof("Waiting for kubeconfig on %v to become ready...", controlPlane.Name) + k, err := provider.GetKubeConfig(cluster, controlPlane) if err != nil { klog.V(4).Infof("error getting kubeconfig: %v", err) return false, nil diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go new file mode 100644 index 00000000..5ed41057 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go @@ -0,0 +1,424 @@ +/* +Copyright 2019 The Kubernetes 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 phases + +import ( + "io" + "strings" + + "github.com/pkg/errors" + appsv1 "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/klog" + clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" +) + +type sourceClient interface { + Delete(string) error + DeleteMachineClass(namespace, name string) error + ForceDeleteCluster(string, string) error + ForceDeleteMachine(string, string) error + ForceDeleteMachineDeployment(string, string) error + ForceDeleteMachineSet(namespace, name string) error + GetClusters(string) ([]*clusterv1.Cluster, error) + GetMachineClasses(string) ([]*clusterv1.MachineClass, error) + GetMachineDeployments(string) ([]*clusterv1.MachineDeployment, error) + GetMachineDeploymentsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) + GetMachines(namespace string) ([]*clusterv1.Machine, error) + GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) + GetMachineSetsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineSet, error) + GetMachineSetsForMachineDeployment(*clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) + GetMachinesForCluster(*clusterv1.Cluster) ([]*clusterv1.Machine, error) + GetMachinesForMachineSet(*clusterv1.MachineSet) ([]*clusterv1.Machine, error) + ScaleStatefulSet(string, string, int32) error + WaitForClusterV1alpha1Ready() error +} + +type targetClient interface { + Apply(string) error + CreateClusterObject(*clusterv1.Cluster) error + CreateMachineClass(*clusterv1.MachineClass) error + CreateMachineDeployments([]*clusterv1.MachineDeployment, string) error + CreateMachines([]*clusterv1.Machine, string) error + CreateMachineSets([]*clusterv1.MachineSet, string) error + EnsureNamespace(string) error + GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) + GetMachineSet(string, string) (*clusterv1.MachineSet, error) + WaitForClusterV1alpha1Ready() error +} + +// Pivot deploys the provided provider components to a target cluster and then migrates +// all cluster-api resources from the source cluster to the target cluster +func Pivot(source sourceClient, target targetClient, providerComponents string) error { + klog.Info("Applying Cluster API Provider Components to Target Cluster") + if err := target.Apply(providerComponents); err != nil { + return errors.Wrap(err, "unable to apply cluster api controllers") + } + + klog.Info("Pivoting Cluster API objects from bootstrap to target cluster.") + if err := pivot(source, target, providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot cluster API objects") + } + + return nil +} + +func pivot(from sourceClient, to targetClient, providerComponents string) error { + // TODO: Attempt to handle rollback in case of pivot failure + + klog.V(4).Info("Ensuring cluster v1alpha1 resources are available on the source cluster") + if err := from.WaitForClusterV1alpha1Ready(); err != nil { + return errors.New("cluster v1alpha1 resource not ready on source cluster") + } + + klog.V(4).Info("Ensuring cluster v1alpha1 resources are available on the target cluster") + if err := to.WaitForClusterV1alpha1Ready(); err != nil { + return errors.New("cluster v1alpha1 resource not ready on target cluster") + } + + klog.V(4).Info("Parsing list of cluster-api controllers from provider components") + controllers, err := parseControllers(providerComponents) + if err != nil { + return errors.Wrap(err, "Failed to extract Cluster API Controllers from the provider components") + } + + // Scale down the controller managers in the source cluster + for _, controller := range controllers { + klog.V(4).Infof("Scaling down controller %s/%s", controller.Namespace, controller.Name) + if err := from.ScaleStatefulSet(controller.Namespace, controller.Name, 0); err != nil { + return errors.Wrapf(err, "Failed to scale down %s/%s", controller.Namespace, controller.Name) + } + } + + klog.V(4).Info("Retrieving list of MachineClasses to move") + machineClasses, err := from.GetMachineClasses("") + if err != nil { + return err + } + + if err := copyMachineClasses(from, to, machineClasses); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of Clusters to move") + clusters, err := from.GetClusters("") + if err != nil { + return err + } + + if err := moveClusters(from, to, clusters); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of MachineDeployments not associated with a Cluster to move") + machineDeployments, err := from.GetMachineDeployments("") + if err != nil { + return err + } + if err := moveMachineDeployments(from, to, machineDeployments); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of MachineSets not associated with a MachineDeployment or a Cluster to move") + machineSets, err := from.GetMachineSets("") + if err != nil { + return err + } + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of Machines not associated with a MachineSet or a Cluster to move") + machines, err := from.GetMachines("") + if err != nil { + return err + } + if err := moveMachines(from, to, machines); err != nil { + return err + } + + if err := deleteMachineClasses(from, machineClasses); err != nil { + return err + } + + klog.V(4).Infof("Deleting provider components from source cluster") + if err := from.Delete(providerComponents); err != nil { + klog.Warningf("Could not delete the provider components from the source cluster: %v", err) + } + + return nil +} + +func moveClusters(from sourceClient, to targetClient, clusters []*clusterv1.Cluster) error { + clusterNames := make([]string, 0, len(clusters)) + for _, c := range clusters { + clusterNames = append(clusterNames, c.Name) + } + klog.V(4).Infof("Preparing to move Clusters: %v", clusterNames) + + for _, c := range clusters { + if err := moveCluster(from, to, c); err != nil { + return errors.Wrapf(err, "Failed to move cluster: %s/%s", c.Namespace, c.Name) + } + } + return nil +} + +func deleteMachineClasses(client sourceClient, machineClasses []*clusterv1.MachineClass) error { + machineClassNames := make([]string, 0, len(machineClasses)) + for _, mc := range machineClasses { + machineClassNames = append(machineClassNames, mc.Name) + } + klog.V(4).Infof("Preparing to delete MachineClasses: %v", machineClassNames) + + for _, mc := range machineClasses { + if err := deleteMachineClass(client, mc); err != nil { + return errors.Wrapf(err, "failed to delete MachineClass %s:%s", mc.Namespace, mc.Name) + } + } + return nil +} + +func deleteMachineClass(client sourceClient, machineClass *clusterv1.MachineClass) error { + // New objects cannot have a specified resource version. Clear it out. + machineClass.SetResourceVersion("") + if err := client.DeleteMachineClass(machineClass.Namespace, machineClass.Name); err != nil { + return errors.Wrapf(err, "error deleting MachineClass %s/%s from source cluster", machineClass.Namespace, machineClass.Name) + } + + klog.V(4).Infof("Successfully deleted MachineClass %s/%s from source cluster", machineClass.Namespace, machineClass.Name) + return nil +} + +func copyMachineClasses(from sourceClient, to targetClient, machineClasses []*clusterv1.MachineClass) error { + machineClassNames := make([]string, 0, len(machineClasses)) + for _, mc := range machineClasses { + machineClassNames = append(machineClassNames, mc.Name) + } + klog.V(4).Infof("Preparing to copy MachineClasses: %v", machineClassNames) + + for _, mc := range machineClasses { + if err := copyMachineClass(from, to, mc); err != nil { + return errors.Wrapf(err, "failed to copy MachineClass %s:%s", mc.Namespace, mc.Name) + } + } + return nil +} + +func copyMachineClass(from sourceClient, to targetClient, machineClass *clusterv1.MachineClass) error { + // New objects cannot have a specified resource version. Clear it out. + machineClass.SetResourceVersion("") + if err := to.CreateMachineClass(machineClass); err != nil { + return errors.Wrapf(err, "error copying MachineClass %s/%s to target cluster", machineClass.Namespace, machineClass.Name) + } + + klog.V(4).Infof("Successfully copied MachineClass %s/%s", machineClass.Namespace, machineClass.Name) + return nil +} + +func moveCluster(from sourceClient, to targetClient, cluster *clusterv1.Cluster) error { + klog.V(4).Infof("Moving Cluster %s/%s", cluster.Namespace, cluster.Name) + + klog.V(4).Infof("Ensuring namespace %q exists on target cluster", cluster.Namespace) + if err := to.EnsureNamespace(cluster.Namespace); err != nil { + return errors.Wrapf(err, "unable to ensure namespace %q in target cluster", cluster.Namespace) + } + + // New objects cannot have a specified resource version. Clear it out. + cluster.SetResourceVersion("") + if err := to.CreateClusterObject(cluster); err != nil { + return errors.Wrapf(err, "error copying Cluster %s/%s to target cluster", cluster.Namespace, cluster.Name) + } + + klog.V(4).Infof("Retrieving list of MachineDeployments to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machineDeployments, err := from.GetMachineDeploymentsForCluster(cluster) + if err != nil { + return err + } + if err := moveMachineDeployments(from, to, machineDeployments); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of MachineSets not associated with a MachineDeployment to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machineSets, err := from.GetMachineSetsForCluster(cluster) + if err != nil { + return err + } + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of Machines not associated with a MachineSet to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machines, err := from.GetMachinesForCluster(cluster) + if err != nil { + return err + } + if err := moveMachines(from, to, machines); err != nil { + return err + } + + if err := from.ForceDeleteCluster(cluster.Namespace, cluster.Name); err != nil { + return errors.Wrapf(err, "error force deleting cluster %s/%s", cluster.Namespace, cluster.Name) + } + + klog.V(4).Infof("Successfully moved Cluster %s/%s", cluster.Namespace, cluster.Name) + return nil +} + +func moveMachineDeployments(from sourceClient, to targetClient, machineDeployments []*clusterv1.MachineDeployment) error { + machineDeploymentNames := make([]string, 0, len(machineDeployments)) + for _, md := range machineDeployments { + machineDeploymentNames = append(machineDeploymentNames, md.Name) + } + klog.V(4).Infof("Preparing to move MachineDeployments: %v", machineDeploymentNames) + + for _, md := range machineDeployments { + if err := moveMachineDeployment(from, to, md); err != nil { + return errors.Wrapf(err, "failed to move MachineDeployment %s:%s", md.Namespace, md.Name) + } + } + return nil +} + +func moveMachineDeployment(from sourceClient, to targetClient, md *clusterv1.MachineDeployment) error { + klog.V(4).Infof("Moving MachineDeployment %s/%s", md.Namespace, md.Name) + klog.V(4).Infof("Retrieving list of MachineSets for MachineDeployment %s/%s", md.Namespace, md.Name) + machineSets, err := from.GetMachineSetsForMachineDeployment(md) + if err != nil { + return err + } + + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + // New objects cannot have a specified resource version. Clear it out. + md.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner reference would be a Cluster. + md.SetOwnerReferences(nil) + + if err := to.CreateMachineDeployments([]*clusterv1.MachineDeployment{md}, md.Namespace); err != nil { + return errors.Wrapf(err, "error copying MachineDeployment %s/%s to target cluster", md.Namespace, md.Name) + } + + if err := from.ForceDeleteMachineDeployment(md.Namespace, md.Name); err != nil { + return errors.Wrapf(err, "error force deleting MachineDeployment %s/%s from source cluster", md.Namespace, md.Name) + } + klog.V(4).Infof("Successfully moved MachineDeployment %s/%s", md.Namespace, md.Name) + return nil +} + +func moveMachineSets(from sourceClient, to targetClient, machineSets []*clusterv1.MachineSet) error { + machineSetNames := make([]string, 0, len(machineSets)) + for _, ms := range machineSets { + machineSetNames = append(machineSetNames, ms.Name) + } + klog.V(4).Infof("Preparing to move MachineSets: %v", machineSetNames) + + for _, ms := range machineSets { + if err := moveMachineSet(from, to, ms); err != nil { + return errors.Wrapf(err, "failed to move MachineSet %s:%s", ms.Namespace, ms.Name) + } + } + return nil +} + +func moveMachineSet(from sourceClient, to targetClient, ms *clusterv1.MachineSet) error { + klog.V(4).Infof("Moving MachineSet %s/%s", ms.Namespace, ms.Name) + klog.V(4).Infof("Retrieving list of Machines for MachineSet %s/%s", ms.Namespace, ms.Name) + machines, err := from.GetMachinesForMachineSet(ms) + if err != nil { + return err + } + + if err := moveMachines(from, to, machines); err != nil { + return err + } + + // New objects cannot have a specified resource version. Clear it out. + ms.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner references would be a MachineDeployment and/or a Cluster. + ms.SetOwnerReferences(nil) + + if err := to.CreateMachineSets([]*clusterv1.MachineSet{ms}, ms.Namespace); err != nil { + return errors.Wrapf(err, "error copying MachineSet %s/%s to target cluster", ms.Namespace, ms.Name) + } + if err := from.ForceDeleteMachineSet(ms.Namespace, ms.Name); err != nil { + return errors.Wrapf(err, "error force deleting MachineSet %s/%s from source cluster", ms.Namespace, ms.Name) + } + klog.V(4).Infof("Successfully moved MachineSet %s/%s", ms.Namespace, ms.Name) + return nil +} + +func moveMachines(from sourceClient, to targetClient, machines []*clusterv1.Machine) error { + machineNames := make([]string, 0, len(machines)) + for _, m := range machines { + machineNames = append(machineNames, m.Name) + } + klog.V(4).Infof("Preparing to move Machines: %v", machineNames) + + for _, m := range machines { + if err := moveMachine(from, to, m); err != nil { + return errors.Wrapf(err, "failed to move Machine %s:%s", m.Namespace, m.Name) + } + } + return nil +} + +func moveMachine(from sourceClient, to targetClient, m *clusterv1.Machine) error { + klog.V(4).Infof("Moving Machine %s/%s", m.Namespace, m.Name) + + // New objects cannot have a specified resource version. Clear it out. + m.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner references would be a MachineSet and/or a Cluster. + m.SetOwnerReferences(nil) + + if err := to.CreateMachines([]*clusterv1.Machine{m}, m.Namespace); err != nil { + return errors.Wrapf(err, "error copying Machine %s/%s to target cluster", m.Namespace, m.Name) + } + if err := from.ForceDeleteMachine(m.Namespace, m.Name); err != nil { + return errors.Wrapf(err, "error force deleting Machine %s/%s from source cluster", m.Namespace, m.Name) + } + klog.V(4).Infof("Successfully moved Machine %s/%s", m.Namespace, m.Name) + return nil +} + +func parseControllers(providerComponents string) ([]*appsv1.StatefulSet, error) { + decoder := yaml.NewYAMLOrJSONDecoder(strings.NewReader(providerComponents), 32) + + controllers := []*appsv1.StatefulSet{} + + for { + var out appsv1.StatefulSet + err := decoder.Decode(&out) + + if err == io.EOF { + break + } else if err != nil { + return nil, err + } + + if out.TypeMeta.Kind == "StatefulSet" { + controllers = append(controllers, &out) + } + } + + return controllers, nil +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden index 034ee658..d1dae531 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden @@ -7,12 +7,13 @@ Flags: --bootstrap-cluster-cleanup Whether to cleanup the bootstrap cluster after bootstrap. (default true) -e, --bootstrap-cluster-kubeconfig string Sets the bootstrap cluster to be an existing Kubernetes cluster. --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper + --bootstrap-only-components string A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster --bootstrap-type string The cluster bootstrapper to use. (default "none") -c, --cluster string A yaml file containing cluster object definition. Required. -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s). Required. - --provider string Which provider deployment logic to use (google/vsphere/azure). Required. + --provider string Which provider deployment logic to use. Required. -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects. Required. Global Flags: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden index d5357360..520a03db 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden @@ -7,12 +7,13 @@ Flags: --bootstrap-cluster-cleanup Whether to cleanup the bootstrap cluster after bootstrap. (default true) -e, --bootstrap-cluster-kubeconfig string Sets the bootstrap cluster to be an existing Kubernetes cluster. --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper + --bootstrap-only-components string A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster --bootstrap-type string The cluster bootstrapper to use. (default "none") -c, --cluster string A yaml file containing cluster object definition. Required. -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s). Required. - --provider string Which provider deployment logic to use (google/vsphere/azure). Required. + --provider string Which provider deployment logic to use. Required. -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects. Required. Global Flags: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden index 9c0f8312..dc7a15fb 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden @@ -8,7 +8,6 @@ Flags: --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper --bootstrap-type string The cluster bootstrapper to use. (default "none") --cluster string The name of the kubeconfig cluster to use - --cluster-namespace string Namespace where the cluster to be deleted resides (default "default") -h, --help help for cluster -n, --namespace string If present, the namespace scope for this CLI request -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store. diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden index 40891e90..3eaea4c8 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden @@ -10,7 +10,6 @@ Flags: --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper --bootstrap-type string The cluster bootstrapper to use. (default "none") --cluster string The name of the kubeconfig cluster to use - --cluster-namespace string Namespace where the cluster to be deleted resides (default "default") -h, --help help for cluster -n, --namespace string If present, the namespace scope for this CLI request -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store. diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel index 6077c3a8..20bc2c58 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel @@ -13,7 +13,6 @@ go_library( "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/controller/noderefutil:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", @@ -34,7 +33,6 @@ go_test( "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/apis/cluster/v1alpha1/testutil:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go b/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go index 85baa98a..e46e7cbd 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go @@ -19,6 +19,7 @@ package main import ( "flag" "log" + "time" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/klog" @@ -41,7 +42,10 @@ func main() { } // Create a new Cmd to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{}) + syncPeriod := 10 * time.Minute + mgr, err := manager.New(cfg, manager.Options{ + SyncPeriod: &syncPeriod, + }) if err != nil { log.Fatal(err) } diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml index d513c9c1..8b77b8ff 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml @@ -6,6 +6,15 @@ metadata: controller-tools.k8s.io: "1.0" name: machines.cluster.k8s.io spec: + additionalPrinterColumns: + - JSONPath: .spec.providerID + description: Provider ID + name: ProviderID + type: string + - JSONPath: .status.phase + description: Machine status such as Terminating/Pending/Running/Failed etc + name: Phase + type: string group: cluster.k8s.io names: kind: Machine @@ -47,15 +56,15 @@ spec: by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster - autoscaler with cluster-api as provider. Clean-up login in the autoscaler - compares machines v/s nodes to find out machines at provider which + autoscaler with cluster-api as provider. Clean-up logic in the autoscaler + compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. - Another list of nodes is queries from the k8s apiserver and then comparison + Another list of nodes is queried from the k8s apiserver and then comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level - entities like autoscaler who will be interfacing with cluster-api + entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml index f0d5bf73..488d76a3 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml @@ -142,16 +142,16 @@ spec: ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as - provider. Clean-up login in the autoscaler compares machines - v/s nodes to find out machines at provider which could not + provider. Clean-up logic in the autoscaler compares machines + to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view - of the list of machines. Another list of nodes is queries - from the k8s apiserver and then comparison is done to find + of the list of machines. Another list of nodes is queried + from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher - level entities like autoscaler who will be interfacing with + level entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml index dcc20f00..fb69e275 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml @@ -34,6 +34,15 @@ spec: type: object spec: properties: + deletePolicy: + description: DeletePolicy defines the policy used to identify nodes + to delete when downscaling. Defaults to "Random". Valid values are + "Random, "Newest", "Oldest" + enum: + - Random + - Newest + - Oldest + type: string minReadySeconds: description: MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will @@ -82,16 +91,16 @@ spec: ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as - provider. Clean-up login in the autoscaler compares machines - v/s nodes to find out machines at provider which could not + provider. Clean-up logic in the autoscaler compares machines + to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view - of the list of machines. Another list of nodes is queries - from the k8s apiserver and then comparison is done to find + of the list of machines. Another list of nodes is queried + from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher - level entities like autoscaler who will be interfacing with + level entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml b/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml index 3996dded..194878cf 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml @@ -7,5 +7,5 @@ spec: template: spec: containers: - - image: gcr.io/k8s-cluster-api/cluster-api-controller:latest + - image: gcr.io/k8s-cluster-api/cluster-api-controller:0.1.0 name: manager diff --git a/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml b/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml index e20560a6..f47b0616 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml @@ -29,6 +29,7 @@ rules: - cluster.k8s.io resources: - machines + - machines/status verbs: - get - list diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md b/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md index dfdf2b3a..30ada6bd 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md @@ -14,6 +14,7 @@ * [Machine Controller](common_code/machine_controller.md) * [MachineSet Controller](common_code/machineset_controller.md) * [MachineDeployment Controller](common_code/machinedeployment_controller.md) +* [Node Controller](common_code/node_controller.md) ## Creating a New Provider diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md index 83070fec..cc88459c 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md @@ -12,7 +12,7 @@ book in order to better understand this section. We need a new simple diagram here reflecting the move to CRDs. {% endpanel %} -![Architecture](architecture.png) +![Architecture](architecture.svg) ## Cluster API Resources diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png deleted file mode 100644 index 8fe44100..00000000 Binary files a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png and /dev/null differ diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg new file mode 100644 index 00000000..04ee410d --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg @@ -0,0 +1 @@ +KubernetesClusterBKubernetesClusterABootstrappingCLI,WebPortal,etc.AutoscalingUpgradetriggercluster.yamlmachines.yamlBootstrappingMachineCRDsControlPlaneMachinesWorkerMachinesManageClustersandMachineskubeadmkubeadmControlPlaneMachinesWorkerMachinesControllerManagerMachineControllerProviderConfigProviderMachineActuatorProvisionsBootstrappingMachineStatusUpdatesCreates,Upgrades,DeletesCluster/MachinesBareMetalInfrastructureProvidersProviderconfigMachineCRsOptionalPivotCRDsCRskubeadmkubeadm \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md index e24bfd82..32a248f4 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md @@ -87,13 +87,6 @@ If a `Cluster` resource is deleted, the controller will call the actuator's ## Cluster Controller Semantics -{% panel style="info", title="Logic sequence" %} -We need a diagram tracing the logic from resource creation through updates -and finally deletion. This was done using the sequences GitBook plugin. -Unfortunately there are (possibly personal) problems with phantomjs which -are making this difficult. -{% endpanel %} - 0. If the `Cluster` hasn't been deleted and doesn't have a finalizer, add one. - If the `Cluster` is being deleted, and there is no finalizer, we're done. - Call the provider specific `Delete()` method. @@ -101,3 +94,15 @@ are making this difficult. - If the `Cluster` has not been deleted, call the `Reconcile()` method. [cluster_source]: https://github.com/kubernetes-sigs/cluster-api/blob/master/pkg/apis/cluster/v1alpha1/cluster_types.go + +#### cluster object reconciliation logic + +![cluster object reconciliation logic](images/activity_cluster_reconciliation.svg) + +#### cluster object creation sequence + +![Cluster object creation](images/sequence_cluster_creation.svg) + +#### cluster object deletion sequence + +![Cluster object deletion](images/sequence_cluster_deletion.svg) diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio new file mode 100644 index 00000000..6d4d90f0 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio @@ -0,0 +1 @@ +7VvLcqM4FP0aL9OFkQBnmc5rNj011anqxxKDMMwAcssitvvrW4olAxK2SQzC9jibwJV43XuOdHTAI3CfrZ6JP4+/4BClI9sKVyPwMLLt8fh2wv7xyFpErAncRGYkCUWsDLwkv5HsKKJFEqJFrSPFOKXJvB4McJ6jgNZiPiF4We8W4bR+1bk/Q1rgJfBTPfo9CWm8iU4cq4z/hZJZLK88tkRL5svOIrCI/RAvKyHwOAL3BGO62cpW9yjl2ZN52Rz3tKN1e2ME5bTNAbk1Bd9u7p7S5Muvr+sfxe+/89nN2Nmc5tVPC/HE4m7pWqaAnYZlm+18jmmWstiYbbKnmfP2BfUJfaE+5e1Rkqb3OMXk7UBgvf3xzpTg/1ClJYpEi/4Q4rleEaFoVQmJh3pGOEOUrFkX2WqJZxAQgyLfy7JcQITiSqVkzBcAmW1PXOaQbYg0vielbouUhgxkYhcTGuMZzv30sYxWU81TkTBE3qXJLGexKaYUZ6wB5eEdhzg/yRzlm4ig0ORjaV/gggSoBWD4E+ytDkGpT5PXOo2aki0O/Qcn7F7KqkrayIHDVerFcDdDVByllGx7G0dU0dOq+Iz4/QVpsaCIsC08/ZePOGptCS7yEIWieMs4oehl7r8ldckGyXptfRKIgkFelwjntIlACrEi9hf0TixXqYCtE2sbqzIL9sasyekzi6WbrH+woPXJkbs/+a7ceVjV9tZi7whGCqRuCLGv4+0w1NUA0Td1bzWYMFmCaILzke2mLEWfp4y/7oxv0SRDbA7L5vz+8lDvECUMP6zyRG/SqR/jbFosDtN+ED57SlmsBj5bDXz2+uKzxEmlUDk+jtG+YHKKIto3wWv0LtnePcFvWxJcDocHCS4AcSPu4Ei+b/ktgQUco3zfMqGE0ZotGfrEEcXzc5slWoOorcBTQKSo747nENByDtFOdFNfHGzHHHkeHEUL1A8sbQ2WfhjyNWg5o1yqdNSGBLlsGEw72uCMtOPY1NQik3BwVHCgGe0ILIX343a8Zxn315Vuc95hsfs6nqpRxZy1axhR+3terT/b2NxBtyOIbs6UQtbiypUK6aoqU7RKWJM+vpyTPgVN602z+lR3cq76dDdMDw4i0nIzrU+BAizHsD7VraSrPv0wiGDbmahbEKmCFBr2I23d+/IDWvgUk08PfFJAl6smFSPScRsmBrNiUneYTldMmqPwpC2FPTNiUuWsa3jgB7q/teXsVxTgPEjSC6atuggEYOhFINCdohPmrSn9JmF6WL8ZeoGgLgKh+q62b97qw/uiCALESfmk8/WkF1VwfGqrKqiPitdV1W4QHp5N7Zas7FYQO+py3fDkCq+uf4cgau3vNbv+0mU/ElNQUfpQdevbuv5O49317/lLLlZASdCvAhUXLPPUgcB1h5Z58Or178HmyXj9LlBlXrsZ5L1ev3odI969tKkqGIzZDVff/p2dllSIDhu+tGyUkqpV1h3R9Rck5yQlTakAicXeVEDHH5BAde3Rt5TU3/NcpeSHQSRtwIENesfwV4dQf8tztqaBquicwT0D/e3HOQ30xiRe20+BB/IMbNWQn/Sj+BzQfJ2dy8X9/XtSiLrLeD6zzskh2hl/DNHdGhgqwL2JIQPjvQxRZ0sjayJHt+wIyjDL9v/yo0jPGdoocXS76rjx5yJmUQnTkzFK1PdhnuFvTxzdy9Bhsu9HorzWQ/5EFEKnOYHd/0aU7ZY/6d0UoPxlNHj8Aw== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg new file mode 100644 index 00000000..2e41c5df --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get cluster object
Get cluster object
deletion
timestamp and
finalizer
[Not supported by viewer]
no
no
yes
yes
add finalizer
add finalizer
deletion timetstamp
exitst
deletion timetstamp<br>exitst
no
no
yes
yes
actuator.Delete
actuator.Delete
actuator.Reconcile
actuator.Reconcile
succeed?
succeed?
no
no
yes
yes
requeue
requeue
has finalizer?
has finalizer?
no
no
yes
yes
succeed?
succeed?
no
no
yes
yes
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio new file mode 100644 index 00000000..c9cebce8 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio @@ -0,0 +1 @@ +7V1bk5s2GP01+7gd7pfHxMluJ0mbTreZNo8sCJsWIy+WY3t/fSUjGZDAlm0Q2Nk8JCCEwJ/O+e5M7szJfPOYB4vZbzAC6Z2hRZs788OdYei67+F/yMiWjmieVYxM8ySiY+XAU/IK2EQ6ukoisKxNRBCmKFnUB0OYZSBEtbEgz+G6Pi2Gaf2pi2AKhIGnMEjF0b+TCM2KUc/WyvFfQTKdsSfrGr0yD9hkOrCcBRFcV4bMj3fmJIcQFUfzzQSkRHpMLsV9Dy1X9y+WgwzJ3LD9PXyJ/5rEz+uXl+UncP85C5/u6So/gnRFfzB9WbRlEsCrYGHjk/czNE/xmI4P8Y9ZkOtLFOToCQWIXI+TNJ3AFOa7G01t94dMRjn8D1SuxDG9Iv4G9kIgR2BTGaK/6RHAOUD5Fk9hVzW7uIUizHJ/oQPrcr9MugezylaxsYAiZLpfuhQiPqByPEGmhoRMIwwyegpzNINTmAXpx3K0KmsiiwQj8l2aTDM89gwRgnN8AWTROwJxssgCZMUIpZB3UO5Y3Pn2HzyoYWHR0+/klJ182NTOtvSsdb+WcJWH4DjQMFymAB2YZxbziIAO7n4O0gAlP+osbdpKeusfMMGvXKKGsZLpJWcPG7ZI8ar0Pg4S+xc5HyWmgJJHgHZ6I5wlGcBH8PlfotF47ORwlUUgouBYzxIEnhbBTvhrrITr2AnykALCIvsXwww1MZRjboz/hL0z1+G2QDcamLvfqCp1rb6oa71RtxWpx6mrD8NdowSOIu7aAkyw3wNQArM7w0mxjN4/5/hoSo5QMgfYSs4X4iWR2jM4f14tj9N6EL66dbGbRpOl3fs/Vb66ffHVETYig5cxNqBMTUGM+iZwjb4lmzsnsC1JYObUHiUwBQQz6hfyea/OGbAc1Xx2BRhtcczRJ44QXFyZFZAFkSdrBTgQMfdd6wRTvI2wNU0KUcJC9/Xo4t7g1oFxvAT9OIiahDNyKDYjWBoyMjPcuux8pl+GCsxMMdoN09USgZzgdZMsyb5j40yMNWbw7m/hVIPrDOR/grg6l5pzArLbMvK6P7yRN8WA+s3Kt6P7uJ9ujcLMYwdSdcgtxtxjt/OXw2FcdrgSNFyRJRbTAkEU4YHSeiBYswy3mrLZ22Yx9B4sZ2OKQeBllO7DGmwSVPHW8dl3+jByXJoCctKBJZBV8OMht84BS7eEpYqfLSyFdyTYVqYtyITlATPkcxCmJarWN+OzTfX5+KB4g041juW3aJwyOxwnGMEYe0T7JMQZzSB560UOliC74awxr4KsxoKPWhVki6EaH1iYD+KWjDoQELIyI0j32WIA9xYJtMPxeMJPttrWbSRgaRy0bNXFN1sMKcceCQyQ8ZOFEbNW54YaVieo4g27ZcjGl2KoYdVWutfd+jr9hRq2GKIWhn9XYAK7A4ybCOx8nJ/WCbB0ToNYw8chruiz7b21hwxGgO3irkyovf/ydfL5dneIK+67TOyDbY8nk04fOkxU7iow0B5PGsrWBjuOKT0eEC06/NQwkH+O79gcxHoI6zzRfy0DugyAaFnVEVcXMnC1A8ds4LzSeMET3by3eKEdlt0pgY4rB5y1dxw5v+7k1JDW/Jw2N5Gfr0aH/ExFjHE2E7iSNmlEJQxPLGGUlqfMUF158ZoPC2xj6IyVJ7YKvlmgdngetUD+MBbI9jhgOXIaoDP6ijWusSt99fkqaRB57hisisWFyI51dYVxT2ycDEK0ChDMf/m2iEjv2c0mOPgktmMOnYDyPGE3LtMQN/H1AsNoVSvEX16/xuHjt+jpAbx7/fbJeE3hva4ow8Hz3jX7iWYE/eJz3wdy8x0+yqrP7yeaYfa8SYNMcnDTGkRwKgbPkfoyn4P+dBqEYXQ0GsSxzvMcTtUgwnNGqUHEfMhlmB2pX6y2haylpCtBAuOgzuvJleaAZzmeFCE6cKWFJUyONLbOrXFyH1vXXrvf9Veub4ypVO5775bohjIO5x1afApMIWUsvnOD/1iro9ZPiytQMbXRmt/n30tXYc/EjGEOXlZgdcOeMB9Le02VQ7We8DU0lTO9qKtK0/qyH4Gq6hbgGe3x3w72FEsrqfT5YkPRchWGgDD+2loD+G5i12hguNLKzP5p11WaoT4N82IqjG/1aQaImGW7iphCUVzOMf2u1Ua7b8Nn+zw536YrJaJrYk5n9KWjMxz3EYP83K6ZbtujXQ7z5zcxnNwcfeknWr52mp/Oza9b56N3e5IB+xkMbU+Y1PhZ7eoOIuLhj6AxQ7D1DayRNv9KGzMapS5mDa/A+F/UlyGk8o4ovUNgPV5it1TYcT5u7LEto1EaYiJt9Kb1IjPZHYQUZ7t4He9I1lyH6bVoFJtY3F/RDovqV0AjzhBdZkDMlg1UkSFq3A8xOL+M+KMrlQpkP8psr1UpHA8E/ebtvzTQa0s7KDIQuphjqKZwrtyrs/nYVmVSp1neV/2B+Fl53E5sMsOpZMKmb7/O5bS9a/f2eXizOMSY7GocuysAUbG7il1Ak+sR8NUVPE/uu+Ff9bJqAz4t/5eBYnr5nzWYH/8H \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg new file mode 100644 index 00000000..4b58fed4 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machine object
Get machine object
deletion
timestamp
[Not supported by viewer]
no
no
yes
yes
cluster exist && ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
add cluster to ownerRef
add cluster to ownerRef
add machine finalizer if not present
add machine finalizer if not present
cluster exist?
cluster exist?
no
no
yes
yes
add delete dependents finalizer if not present
add delete dependents finalizer if not present
machine/node deletion BLOCK
machine/node deletion BLOCK
machine needs deletion?
machine needs deletion?
no
no
yes
yes
machine exist?
machine exist?<br>
no
no
yes
yes
actuator.Update
actuator.Update
actuator.Create
actuator.Create
requeue
requeue
succeed?
succeed?
no
no
yes
yes
finalizer added
finalizer added<br>
no
no
yes
yes
update finalizer
update finalizer
succeed?
succeed?<br>
no
no
yes
yes
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio new file mode 100644 index 00000000..8461762e --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio @@ -0,0 +1 @@ +7VxLc6M4EP41PiYFAhs4ZvKsqZ2a2aR2MzkqIBvNAvKAnNjz61cKEhiEbWLzTCWXSI2QRPfXD3UrmRiX4fo2hkv/G/FQMAGat54YVxMAdN2x2S9O2QiKZpspZRFjT9BywgP+g+RAQV1hDyWFgZSQgOJlkeiSKEIuLdBgHJPX4rA5CYqrLuECKYQHFwYq9RF71E+p9lTL6XcIL3y5sq6JJyGUgwUh8aFHXrdIxvXEuIwJoWkrXF+igHNP8iV972bH02xjMYponRdmf99dBNfW7ebfv+bm958/fv15QGdilhcYrMQHMwkiiknEGY1DlFAYLidgFrA1vjzHrLXgLbTGCft9Iz6NbiS/Yp+EzyvG9C+vPqboYQld/uSVwYPRfBoGrKez5hwHwSUJSPz2njFnP67G6AmNyX+o8ERjP+yJ+sFy9yimaL1FEgy4RSRENN6wIeKpI2Qh0Ti1zqcp5TUXbiZCf0uwlqBBgadFNnfOctYQXH+HBIAigYgoXEUeA6Xokpj6ZEEiGFzn1G3OwgAvItYO0JyLinMHM0BfCPIzoZSEXIaRd8E1hM+5RFFKERpo75UEE0C8+SmWe+s8sY7GeCm6V5zf2cirjejtlGBCVrGLDuOUwniB6J5xhpEO5AyrAwg5cYwCSPFLUemrZC1m+kEw+4RsGsMsAcsxilOkGxdv5Yhh/IebrWFLPiDZvc60DGCxzk3N8Y5ZGM8a6Q5y+GYsOh7RZgWiPXSP5lwu47QbtlNgoyW9U29WYzpmq6F1ZTXMmlZD78dqMPUswsqc1rIaTSnqTAHRBiWtooiSZUMQylHzVABNXxCyj0PQRtrpRgClG0VA2Xo9QCkTnRmFec5AyY6R+TxBrWDS+sTkYXM1SLABC5x3BrfDuwFWeTeprrdmTW0FuW9HKcRoPP5RIx6yijzkCZAeiHpg7Aowmhw7cxLRLSxqmsBiL8GRVTI6oPJQBSrCI7Ot8MhRZHGaCWk1GurKldl1zYtW07w0bEAcVWVbDoDkl27hJFm5LuJaOfIjiqP1n9rQ1ezS5yllNwq3FfPpcUq+/fP8iL9+de49evd0ZwXSjXd9SrGrcwidKamaIRtPSNgQhlo7wTYdEtqFaXUN9BsTFrfjWHVjwvfm5dQP17S9W2Mx22kvyFxBq5k8iaot1btHIXnhMW0IXR9HvDXHTNGYWsSqx/woIa5Z5j7oO8LV1SzraSbxQ4S4ErDN1QlOtIhTrWhobaOuQWxMh9UsnwqUIMDLpASIxIdL/jxhG6QPFFKkal+mla1qny61LWOionxGhe4ZrememqQanO6doEOzblRDL9fMZiV5ta0YasLGZ0tXe7axHwezQ15/h0E1JzOiw2B3he66WZqeKt3lmpWh1XNnp1a65TqDqnQDNX80nqNpZzFZXUSDI/Mb7ZY1DNuuBfAB1dCAmndzIb/QJQoSY3dmhm317MxkwPfpzPaqfu301UCcmSnl2rIzk+sMy5mpyZ5PZ3Y0ooE5RGc2rRmtDcmZqYku6NIVpCQ+vxIF9o+adixV1k3H7r2yDtSbh6eZiA+Rd5QgPWwWukqulBU/h05H6RWg5h1lbX3UwWfmm/sLPtX044iCz87K6hKAh3XSOc5VNxx8zuSGu1JQNf859HivAzAMMmyztLo3o4YUuKkJ3xj9XqEVz6xj/scgEXMGVe7go4Rv5arxTOs7ejPUhOVwo7d3pinQGtPsNdbeeov18pd4pwHv4tQ0KF1Vms1SzsDS6pXTTs1lzMAAE/OGmstQcb6v6M3B2mfJ27SKJW+n8lJ1W1XvfbcPq8z5gA24wvIKweyUgnL1Eag3D1oz4JVCACOy30dF+iUzWbTE+3B5zK3J1Ew0boqVvwbWQFNXZlk3/48B6fD8Hy8Y1/8D \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg new file mode 100644 index 00000000..3af105cb --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg @@ -0,0 +1,2 @@ + +
deletion timestamp
exist?
deletion timestamp<br>exist?
no
no
nodeRef exist?
nodeRef exist?
no
no
yes
yes
yes
yes
delete node
delete node
succeed?
succeed?
no
no
yes
yes
Remove machine finalizer
Remove machine finalizer
has machine finalizer?
has machine finalizer?
no
no
yes
yes
can delete?
can delete?
no
no
yes
yes
actuator.Delete
actuator.Delete
succeed
succeed
no
no
yes
yes
requeue if needed
requeue if needed
requeue
requeue
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio new file mode 100644 index 00000000..ef43b944 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio @@ -0,0 +1 @@ +7Vxbc6M2GP01eUwGJDD4MZvbbmfSbjfT2fSpg42waTDyCnlt+usrgTAXQUwwBsw6D4klJMCfznfOkVC4gner3ROx1stnbCPvCij27greXwGgqlOT/eE1oahRTC2uWRDXFnVpxYv7H0oaitqNa6Mg15Bi7FF3na+cY99Hc5qrswjB23wzB3v5q66tBZIqXuaWJ9d+d226jGtNXUnrPyN3sUyurCriyMpKGouKYGnZeJupgg9X8I5gTONPq90d8nj0krjE/R4rju5vjCCf1umAfvv88uVx8+XRv//hE4q9tfPntTjLT8vbiC8sbpaGSQTYWViwWeHTkq48Vqeyj+zLrPnxgFqEvlCL8uOO63l32MMk6giV6Ic3pgS/ocwRxxFH5O+Q3BAiFO0yVeI7PSG8QpSErElyVNHjLgJhE1HcpqMFxQgsMwOV1FkCH4v9idMQsg8iih+IKKgRUZtBTBQxoUu8wL7lPaS12UjzSLgMj7eeu/BZ3QxTilfsAPLtWw5wfpI18uMakUDmu1FnwSbhK6tUbvSk+DcvJoX7Xa4UilLlaAV4Q+boMMwYWBaIvtMOxu14gN4de4I8i7o/8zlaNpSi61fsslveY8ZUcpBRJwUwxPcpOqV4YOG2wkyzNW8QVF9GBYXrADOfoR9rzz7Ed5CCcx+S5niFEl6fEI34a750fWSjtYfDFYruE8/+5RxbxDPBG99GtgDsdulS9LK2IkBsmSzk8WyRuQCpxjHlYJ+WcUaBSxz2Mz85l0wK8dfAjcwm+1HK0ol2KjrRLnRSidmDdKJ3QyfFvAUpbg4wSltJrEso8axZZMUC5LGUZWMWOZL5knupxysw8VjcPs1Y9WRB92ORzeklXs02weF87iVRjULAYWmiKiWJapwqUSfSEIQoOC5XLZGjHnJoSepSvD6zvNVr5q1RM28FGhJ7Eea5+Oiszp8W1s5q6VTXeYt6DQogxI4ToJMQgyGhchGp+9zbBBSRaEZEUrVP7uJXUHeo96/u5kXdKzF7kCWm/ai7pnet7lMJJWn6op0b8JtlQm6teDLGv6uK/iyIywre+oh8Q062r7ACXDfHZRA0aPRuEJIVrcww+vikBqHV7M/lfkoFrWf/tGb2q6CZSTiSDfZakCDL6JoNVHnNbqxOMyp9RcRlMUOkO2gNxH/mkabr5rm5zyRHM1CNrlQqPhXCpcQ9Zh6ev/3Bu92zGS11sT9eoypxzACcqiqvE16s6h7g7VFKT6Tx0aVtqBSu88Glbb2LpW1Vnv22YJy5aVNsTkKIjzzXJt5kZI5ZT2bL/flleXJ88cvVID9IQUBr5mpaNsz6VO/aMMvz57Ea5i5gpDSD0WnN8aRIQ8M3x0BeD7BsO6stNmKosVEkxIrjMjQy7HDtcp1Ih/jXWBMUIP/XWbWdmP17YSDPwI9jk1EIUTIEh5/K1mWQljnCMOtxxNHbPBSoFzB2AnObyHkGhNmHOOK5Tnb7RtGgxg54BE+DJYvRu3cF8gP5c/KuXZmOBMPtUUa73lVTJe9ai0Fay/HLpoIWQQTVZiBq17mCadHQwFqYGpBzhbL/EdLzzPRASE9RUw4o0SiFqMKsdipFEJyhFDVngwSb5yIphlpvgba13JXX8S+S0hhEsOGa2mklxVTqLrENSVTk+QxBls2DR3GZnPBFEnuMqmEqoG/NOO/pS1crHrCu89SGoTVmuguqK7W5TGDahNFkiGozBWenNUkkMrB0g2j0NsE4NEVK/d41RZMnjRdNGYxU6GbfUqHJ89SLVFSh40ykQpucv1TI82UGCIuiRSiLxJuPt/4Y5EOig/7lQ54eDl8+jkj02v/i2o9eGHrveiHPUS960RhGmjkEvZjA89cLecaLdmi+iTb0BKE/l5VgLDt1ICiOXslj+E436mjyBuDjCGIcU4xJ29pyZNrD4vtYlGK+trVrXbpQFzt1NHkjc0oJuferpM5yrByhG4PjCHl38OA44ohcNweW60WJP1muyxfqIteTMDZ+oRqHRJ+vUzO0qvHp4IVqof5N/2f1bNqb3e8K/esVfNrdlryijqAfG8QKQ2ZJKeIl41L7iSBI0rgLliwdBHlxbnAkedzsqsB7eWp9D5cl2VaTbNv3UYV/yoPayfaWlEZEnvoMf4mmqf3mW9ZexV3yz5lerJR24oUDSGvpTUrVID31YhAoLAZpTbc0qsb0Bpi6oWriN3j/vHGYGuCZFdMXr8bN0/fXwof/AQ== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg new file mode 100644 index 00000000..16f73843 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machinedeployment object
Get machinedeployment object
label selector matches?
label selector matches?<br>
yes
yes
get cluster for machineset
get cluster for machineset
cluster exist &&  ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
set ownerRef && set blockOwnerDeletion
set ownerRef && set blockOwnerDeletion
cluster exist &&  no delete timetamp
[Not supported by viewer]
no
no
yes
yes
add delete dependents finalizer if not present
add delete dependents finalizer if not present
machineset for deployment
exist?
machineset for deployment<br>exist?<br>
no
no
yes
yes
machineMap for
deployment
exit?
[Not supported by viewer]
no
no
yes
yes
ready to
deleted?
[Not supported by viewer]
no
no
yes
yes
is paused?
is paused?<br>
no
no
yes
yes
strategy
known?
[Not supported by viewer]
no
no
yes
yes
execute sync
execute sync
execute deployment strategy
execute deployment strategy
requeue
requeue
no
no
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio new file mode 100644 index 00000000..eafd93bf --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio @@ -0,0 +1 @@ +7Vxbd5s4EP41fkwPSNz82FyantNmu5s8bPOIQRgajFyQa3t//UogDEi+yDbG2EkeWjRIgEffzHwzjD2Ad5PFY+pOwyfso3gANH8xgPcDAHR96ND/mGTJJZpjFJJxGvlcVgleov9QOZFLZ5GPssZEgnFMomlT6OEkQR5pyNw0xfPmtADHzbtO3TGSBC+eG8vSfyOfhIXUMbVK/hVF47C8s67xMxO3nMwFWej6eF4TwYcBvEsxJsXRZHGHYqa9Ui/Fui8bzq4eLEUJUVlg/lq8jn6Gnh/85d7+kz49v35f3PCr/HHjGf/A/GHJstQAvQpVNh3chmQSU5lOD+mHmbLzGXFT8kJcws4HURzf4Rin+UKo5X9sMknxG6qdCQJ+Rv4M5QOhlKBFTcQ/0yPCE0TSJZ1SntXMYglHmMWH82q3IN+BsLZRpczl+BivLlypkB5wLe6hUaCgUZ9CjA9xSkI8xokbP1TSuqaZJiKKx89xNE6obIQJwRN6AiX+ZwZwdpEpSgoJNyBnq9apstPlTyrUPpnl8JUNy8H9ojFa8tHG3crwLPXQbphRsIwR2TIPFvOYgrbufYpil0R/mja6biv50r9xRB95hRlHa0BGtwQwFM/JF1V4oOp2l7VpUzYh23wbHQj3AU7TQvebTw+KJ6jAuVLJ4XiFEl4fEcn9lxdGCcryAR79Ys5VBHKKZ4mPfI7UeRgR9DJ1cyTMaTxoAtlNPY5Og4EpwAlZ5ywEJxLQP+/kTsQSFG+AT7IbWW1P3Y8Yp/Ijxocf2QjWnX7E7MaPiAYLKtzscCVtWa8poSR2RzkHy1BMTZbuWU5FvJCRqC8DYMVUb7cjKrbGZLUXdZsO8WQ0y3bb81kM1RYUrtvrDFVbY6j2qQzVkrYgwceZqstNNEYBObHl6g27rcy4dcs1FS23dHM7TZcDoqQWR1qyJVICTT8NJ7A0AcEm3MoJxPm6BjsgBbaE6SXKTgpqgqcXFotUEe0cBuhlk18cHamal4XAVoxU0qVumvnWDRAMBQdBThrbD3aOhMpxzk69eJYRlObpfSpQ13fCWCE4N18dSptznL+4Cr7qKPqIMth0TVgN0C1dLT9nDSWV8aJFlLFnpdTUnTBTLP7dNExGWTHW8DxB6TMK6ms5uWXR87oor1Hq8GyEV5eLhhfEeLVBR4y33Kfdxq+arbZLeVehoASW0bEvkCulHyTzYBDBYT9oZhNTplhm7z/J1OWSCq+BrokyGyKUVqwYxdh7+8GW3aMYkQgn18tHJW9ydkKqy4WZD0a6gnd7DuVIlwGFAoepSEn3LbxI99E0ngGrvo45YAUAzRWnqdbocmJMfUBBqnkuTI9uv/+4+/Z+HJBpOud2QFecEtNcjdSW0dErf0h2XC1igxaclmoeDTrKo6FQfjEteGg5TeFShX7a94BDsMOf7VxxGn8G5CpBtkw8KnlG05hawPvzZpaxJuvv1JsBOeu/Gm92uGcCqvkZ6Ki1RTRZ29A6fiVd4uLgnjK22+fsKDPMZvKpa2BdO0i3XWVym85s6jMlCZ06GdXcTK6iXK1jtIF29lYdcFG9Ol3VP4Fqsw6wunGNhpCdWUNT0TVuZlqtO0+5aJHNPA9R07309xii+m3NPHvvDpAbHS7oVcaezTtlzlZmabVVJ8jZSiT3tePHdoS+cUfVG+zkXI4uca6WUjixG8g29K1Pdp7uISDXo671zU63dRB1m+rF2yBLKG3Ypmou0qP3QUCu4gWYbRNTDy9LuEFRbH2Kkmfk+ssX5OHELxpuLytGS54MyhHaWBOhaY50ohAN5WLQR4huyZ0M+x2iHdhEo2FAJe+xb1Q1hZzSsbaXRcWouu/8bqIwlAt21xqFOzABaPcxojq2cIn+x1Mop1wp+j1DdHC1RatVzx5X99A8//fLoEzSj/MNV1HPL9HZXkhsOwZCtRjYmrnK9JfRLy2Okrf1Ralme27V3ruzaSq/rs86pRi5JtEEZYSdvCwKbTU9qwnWVrn0tRza3IyO475LetEcurOKNVQlA/qB3+k5tmNXbC+yun63Z3xwSnUYCehQwJUBzsApxaY1C6p+iblHrNIAEjBd36/HEx9R3Pgof9wgonCk4GFhKWINvQlCjGheLQEVC3E9eGlqyG+0e8w/uwpBJY57wz9F72BD1Zhz9K+laNA+rtuMDqufVyqmV79SBR/+Bw== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg new file mode 100644 index 00000000..0df75714 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machineset object
Get machineset object
label selector matches?
label selector matches?<br>
no
no
yes
yes
get cluster for machineset
get cluster for machineset
cluster exist &&  ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
set ownerRef && set blockOwnerDeletion
set ownerRef && set blockOwnerDeletion
filter machine BLOCK
filter machine BLOCK
sync Replica BLOCK
sync Replica BLOCK
update machineset status
update machineset status
succeed
succeed<br>
no
no
yes
yes
force resync after MinReadySeconds?
force resync after MinReadySeconds?
no
no
yes
yes
requeue
requeue
no linked
 cluster && no delete timestamp
[Not supported by viewer]
no
no
yes
yes
add delete dependent finalizer if needed
add delete dependent finalizer if needed
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio new file mode 100644 index 00000000..9a4b3992 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio @@ -0,0 +1 @@ +7VnLcpswFP0aL5PhYRyydBwnmU47k9aLtkvZCFAjECPk2OTre2WEQcgPkphx29QbpKMn955zJa4H7iRZ33OUxV9YgOnAsYL1wL0dOI5tX/vwkEhRIa5bIhEngcJqYEZesAIthS5JgHOto2CMCpLp4IKlKV4IDUOcs5XeLWRUXzVDETaA2QJRE/1OAhGXqO9ZNf6ASRRXK9uWaklQ1VkBeYwCtmpA7nTgTjhjoiwl6wmm0nqVXcpxd3tatxvjOBVdBoz56vk+v/35IKbfxh55+fz46euFmuUZ0aV6YbVZUVQWgFnA2FC5iUVCAbOhCC+TyfZcIC5mAgnZHhJKJ4wyvhnoWpuf7Cw4e8KNljBULWp1zAVe730te2ssoBlmCRa8gC7VAMsrhyiGjVR1VXvLVR6IG46qMKT4EW0nrk0IBWXFV1jU6WDRACimqoyLmEUsRXRao01LS+MQ4OOYkigFbM6EYAk04DQYS4LLSTKclogSkH/Q6mBZXvwA0Lr0qupPWa0qt2utVqha+SJy94d9BS/LlnyBj/MO2BNhcaCfu9v3HFMkyLO+j12uVEMfGYEdbjnjWxpl7FGLDOW21KCaD2BuVDS6ZbJDvn8Z22mt4/i6Ql/XHwrlDmpybk3ydr66Bl/vsdxTCrEcHmz+S4bVNoU5W6YBDhRHVzEReJahjctXcBLoFEZ8oXg5lDQKWSp2hYlW+Ajht+g9fIxaJh86l2YA2TqmGUGGfUWQ4f8I0iGCuB0jiNdLBGlL1amuNUdCyKlU6xkcgZsXFoSlA2dEwR43cw6lSJYESTCc00lmNuE1yeF5Z7aYio9ZMl/mx9V+FhlftdxRibMpYmuHiK/6EvHIcFDK3idjpORLcSj6VrWm6Vri/ava66hq/yAbquvFO0W+ZVHFqjZbehb5lcGhAue9kkiw7G8/F7oyyLY6UajQD/sTHxtux5unMdGF/tFz4bTmYWGY415I6RukpCR9qi+Mgm0+fhcxSfG/e200QoN37lvj9Ye7NR4NBf7eKHI8OvTz4elab9P/qcRbZdUaLFmmun5DDl7+AAoe7fHE2QRsd8nF/TEKPskN8XiayNrj1vNJuH2ED3tKHhkE9Vvp3df17yd5ZJvZI5Ozh/LHknjnzB47vn6RcvtLH0O1TvaXDqj/M3GnvwE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg new file mode 100644 index 00000000..2ea20cdf --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get node object
Get node object
deletion
timestamp
exist?
[Not supported by viewer]
no
no
yes
yes
link node to machine
link node to machine
unlink node from machine
unlink node from machine
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio new file mode 100644 index 00000000..d9af4752 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio @@ -0,0 +1 @@ +5VrLdtsgEP0aL9tjCcmPZeKm6aI9SZtFz+kOSyOLBgkFodju1xci9MSxHMcP5XhlcYEZmHs9jLAHaBatbjlOwh/MBzqwh/5qgL4MbNuyphP5oZB1gSCUIwtOfI1VwAP5BxocajQjPqSNgYIxKkjSBD0Wx+CJBoY5Z8vmsIDRptcEL8AAHjxMTfQ38UWYoxN3WOHfgCzCwrM11D0RLgZrIA2xz5Y1CN0M0IwzJvKnaDUDqqJXxCWf9/WV3nJhHGKxy4S7u/vnWXR3NUVB8icIHq2fT9YnbeUZ00xv+DGbyzhSvWaxLgIhl5+oxyyi30kAlMSydZ0AJxEI4LKHavi+wq6XIRHwkGBPTV1KjUgsFBGVLUs+StYEllN42aYUJymZv3gdSoSDl/GUPMMvSHNxKJRlQnmalaQr0AxIsTvgAlY1SAfoFphcJ1/LIbrX0VxptU50c1kxX/Ib1lh3ChBrtS1KyxUh8kFz8gZ+bJOfSaocJSQFLjd2mTxZo74RhQyiPJqlKrgvuUlwGbFLZauMem/YcrawxeZ/1e4vkinX7htT7hamsCcyLNiFfqtGvTusxiZXHLAAlQJz0j6vcWSWFrUgq+0TWX1dUbKIJTZnQrBIdkDsX6lyTmGUeY/bYpiyjHvQXfUIzBcguk9f8Bs1oslILeQFCxwoFlIKzYJ0Q8S1tXtG5C6qA85qklseeIWJfI96Vr3qaxuadhjKg2AYksHG69qwRA1Ityz4FT+VnnKLlbrK+O0vuIkhOIifMpCNs0vM3lFi07NJzEZNxux2XthVYmjcYehAEis33vJzVIlNDYltFthFHDltBs5/5BRpssaPDz1JAaj/KaBVQpS3Lu9OAc5xUoDTzlnOCVKAZV6SYN+XQEBiTOW3zixAe6s152xac1sVTWn3rVpz3Q5Dr2jtYHIw72RkFmaxR+gHSjpub4SA7D2FMHY6DB0o6YzszX6Om3TMC6Us8fOXqVRgkaXn15rb+6Qzap0Xzt5aG3cYOpTWWq9R6BSvUZZ5HcZBZDx+r8RYArLr2sdpCL6eJ7v1rzyTk4gP7Si+9yqtdSNtlLw7K83qMHQopTmb/RxXaeZ1Hi/K9SEJXmgoj9JhgOWnf/481/9CHrXIdPe9LnImHYaOVMg7JynkRx8wz9mnyV92uzxvv8HtqqBph529q3PZrH4sz4dX/zlAN/8B \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg new file mode 100644 index 00000000..c6a3e796 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
cluster controller
cluster controller
cluster object
cluster object
cluster actuator
cluster actuator
create cluster.yaml
create cluster.yaml
enqueue
enqueue
queue
queue
dequeue
dequeue
add finalizer
add finalizer
reconcile
reconcile
update status
update status
return
return
requeue if reconcile failed
requeue if reconcile failed
return
return
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio new file mode 100644 index 00000000..1230c4e9 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio @@ -0,0 +1 @@ +7VrLcpswFP0az7SLZHg6sEycR2faTtJkkZnsZJCNGoGIEH706ysZAQbZBts4dsddBY6kK+mew71XinvmIJw9UBAHP4kPcc/Q/FnPvO0Zhq67Dv8jkLlENMfKkDFFvsRK4AX9gXlHiabIh0mlIyMEMxRXQY9EEfRYBQOUkmm124jg6qwxGEMFePEAVtFX5LMgQx1bK/FvEI2DfGZdky0hyDtLIAmAT6ZLkHnXMweUEJY9hbMBxMJ7uV+ycfdrWouFURixNgMeH58mg/Dx2jVH8dto9K7/+tAvpJUJwKnc8Hs65H7Ecs1snjuCLz8Wj2mIf6ARxCjibzcxpCiEDFLegiX8VGI30wAx+BIDTwydco1wLGAh5m86f+SsMcCH0OIdYxAnaLiYVeMIhV5KEzSBzzDJxCFQkjIx06AgXYCqQ/LdQcrgbAmSDnqAhK+TznkX2WpJrqRaHfk6LZkv+A2WWLfycUCqbVxYLgnhD5KTLfgxVH6cREwUowRSvrHz5EnvnxpRpkKUh9NEOHcRmxjlHjtXtiztiGw9T0bgYqYxE+lv9y4dJq/h94u+wtYtxNy5X74qDC35VewY8dRwjdE44tiQMEZC3gAj/1rkGoFh4r2vdNsm2TBAx3BTPzvrB/1KtlI9vuTS3MsUYsA41dXUuMKj0toTQXzJBXl2lTvTqHGSkJR6UA5aTj81O7rZYCjzgWJowW+xw90/UGvDB0qGv4Xgz/LjtI1TC6X2BqaAx1LAyJkG0v7J1SdXClf+IpCKrJeRdjkHoVpNdhZVpQ+zKNRc6DYGWuNogVbXq+QWNc7WkdZtMLQm0nJng/lSt1h0SDYseM08pZ4yi52GcUcRnODz6PIyWsrLPZq8jFr+NbQd5WVeNRjqSF7FxmvzHFReriKvjxTyx7NMN3UGjp9udLWKo5ClNNo3ApAY8qYbHyQB9OU43izvo5y9YoPdMjaYLWPDnoGgXzs7W7sGgiu9wVBHgaBfO4Lk8lq3Ltvd2P8wgUNXj5Snr8y2WUv/HGUaNUEZ9TjSugKqXTi0PWtuXQGtORx3pbSVdxfqlW0iKiBtUXgjEglCecZJGAjjfcX3eYWR1VJi3RdGptWR6iy7wVBHquNx9tJeOdNBdWcouktjHzC1NjpZjR2x+K5dshR2ty6+tQZDXRXfdS07n6Awtbg7ibNd2zvaI8rLbch3reVVN2QfRl7KPJ+RONV7xQCI/6WNUAQwL6f4sev+31Hb8RKmVTsWmrsmTLvfYKgjtdm1DG92fFG1Um3qzSiFIZnAiuD+q61ZbfXjqtuR2hRDXZVnrl6dZ7/UyV/L34hk3cuf2ph3fwE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg new file mode 100644 index 00000000..316ece5b --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
cluster controller
cluster controller
Delete()
Delete()
cluster object
cluster object
cluster actuator
cluster actuator
delete cluster.yaml
delete cluster.yaml
get
get
queue
queue
return
return
return
return
set deletion timestamp
set deletion timestamp
update
update
get
get
has finalizer?
has finalizer?
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio new file mode 100644 index 00000000..86cbf774 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio @@ -0,0 +1 @@ +5VpRc6IwEP41PvZGCCg+Xm17Nzd3M53rzN1zhFVyDYSGULW//pYSQIhWa9Hq+FT4kuwm+31u1rU9Mo4W3yRNwl8iAN6z+8GiR256tm1ZIw//5MiyRAgpkJlkgcZq4IG9gAb7Gs1YAGljohKCK5Y0QV/EMfiqgVEpxbw5bSp402tCZ2AADz7lJvqXBSosUM/t1/h3YLOw9Gz19UhEy8kaSEMaiPkKRG57ZCyFUMVTtBgDz6NXxqVYd7dhtNqYhFjtssC1Bt7dy9Xkyem//PizCIHcqCtt5ZnyTB/4MZtgHLnes1qWgcDtJ/ljFvGfbAqcxfh2nYBkESiQOMI1fF9j1/OQKXhIqJ8vnaNGEAtVxPHNwkdkTVFcIqt3zmmSssmr1z4iEvxMpuwZfkNaiCNHRaZyT+OK9BzURwGpYLExRlYVedQsCNynXOIUvcDRXC2br/Oa+YrfcIV1pwSpVtusslwTgg+ak3fwY5v8eGnuKGEpSDzrZfJkDU6NKGIQFVE/zIP/mpuUxIhdKltV1E+GLecNtsTkX376i2TKtU+NKfcNpqivMqrEhX6qBid3WQ0MrnwJVMFrNfRK2pcljczSYiXIeUQYVl9fOZvFiE2EUiLCAYiDr3k5l2Nc+I9VDCEwCrhWBNGXyKQP28sgReUM1Lbr2GRkJeSeDq4EThVKoVmQrom4tnYvGG66vuCsJrmW3SKtOJJetVr1tQ2NthgqzmwYwmDT5cq0JJ+QvrHhDX5qPRUWa3VV8dtfcENDcBA/ZYAvpycxe0eJeceSmE1ajA32lBgZbjHUkcSqg7f8HFRiniGx9QK7iCunzcDnXzkjg54ATjUDkJPLAK0Kwhp2lAHsNt8dZQCHrPdz0AxQ3sQrGqNBgMCUxZTjh86sP89Ha86xtOa2CppKe+/VmutuMbRBa53JwWyZwYKlGOS7M9aB+2k68PbUwdDZYqijnDOw1/s5bM4x20kSVCbjj0pMJIBD1wFNQwj0OhzWfXevW/G5O4qPrBffB5U2aPUIyb717dDaYqgrpTnr/RxWaWYrTJYVVJ9N82uOMo5aOd/cdrR6irQIdPf90u54WwwdqJ5yjlJPmS29M8xtGzpBH63I27dju5DeVUGj/Qryzjg2W4FZEhStwLxf2y8bg2ebVI5WMDmt71Zk36TSLpwNQ11dY2S9nz2TCr7Wv5EX0+t/NSC3/wE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg new file mode 100644 index 00000000..98e16510 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
machine controller
machine controller
machine object
machine object
machine actuator
machine actuator
create machine.yaml
create machine.yaml
enqueue
enqueue
queue
queue
get
get
add finalizer
add finalizer
exist?
exist?
return
return
requeue if failed
requeue if failed
return
return
update or create
update or create
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio new file mode 100644 index 00000000..52183cde --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio @@ -0,0 +1 @@ +5Zpbc6IwGIZ/jZftcBDEy609XWxnO9uZ3esIUbINhIbgYX/9fpEgh1ilVtGuV8KbkJDvfUi+ZOzZo2jxwFESPrEA055lBIuefduzLNMcevAjlaVSDK+fK1NOAqWVwgv5i4uKSs1IgNNaRcEYFSSpiz6LY+yLmoY4Z/N6tQmj9V4TNMWa8OIjqqu/SSDCXPUco9QfMZmGRc+moUoiVFRWQhqigM0rkn3Xs0ecMZFfRYsRpjJ6RVzy5+7fKV2/GMexaPPA46/Jj+VDvFiQq+XUdvy3p8n9lTJjhmimBvyajSGOVL2zWBaBgNdP5GUW0e9kgimJ4e4mwZxEWGAOJVTJz6V2Mw+JwC8J8uWjc2AEtFBEFO5MuATXBIJH+PqeUpSkZLzq1QCFYz/jKZnhnzjN4ZAqy4TsabQ2XYp6QFSMZpgLvKhIKkAPmMF78iVUUaV95dWyfjsvnV/7G1Zc7xcVkaJtum65NAQulCcf8MfR/fFS2VFCUsxhYJfpk+mem1GuZlSE/FAGfzU3CQ4Ru1S3+sa5uTXY4hYb/5Gjv0inHOvcnPK2OIV8kSHBLvSrcs9usRpqXkE6CMFdZUMr066XKNJTi0qQ5fAJZF/fKJnGoI2ZECyCAhwH32Q6JzXK/NdtMUxZxn28O+sRiE+x2L364qCWI+qOVELuqeByTJEAFOoJ6YaIq9aeGYFRlAucWTfXtBqm5WNUT1WzvmZDwx0N5UHQGoJgo2WlWiIrpFte+J1+Sp7yFku61vHbH7giSBXipKEn58tpyZdpngwwy2745e4JmD3Y0dCBAFsPvNHPcQErZuUSsLcMw+VFrjhNC06/4pjWeU4A7heYABrpgzk40ARgGceZAJq7iCIQx50AbA2wEMkN+ITEiMInB9/m/dfhbXAy3JxGQmM154S2uDnOjoYOhFuzH7uThEY/j7tVKfRXQcw7H8S8PREb9Hc0dCDE3MZu2+4kpdGPFDkWGY8/ixhLMBTdBCgNcaCeg2J1pO99Cj6vJXxuS/g+SZrrbjbu46SZOxo6FGnaCVwXpOmnbOdPWtutW78b0qzmnNZMrtqSNuwmSTObyWA9Sdt5ztFNUqcfVKVy12CsjqsIiyUAsElLBYqSo6+8DYTaMtrFimrbB6LP6WyPYG7s56g4Fat4BacsCVAHSdspto2HyuM1to6Ux8PAr52NPR0XCv3kiOOIzXBt7/gfAtJv7Ju0w5995wytoQ8DUjtq2uox3JZ/zMirl/9vse/+AQ== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg new file mode 100644 index 00000000..ce600d79 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
machine controller
machine controller
machine object
machine object
machine actuator
machine actuator
delete machine.yaml
delete machine.yaml
get
get
queue
queue
get
get
has finalizer?
has finalizer?
Delete
Delete
return
return
return
return
set deletion timestamp
set deletion timestamp
update
update
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md index 198b3bae..b4770eeb 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md @@ -109,11 +109,6 @@ The definition of `Exists()` is determined by the provider. ## Machine Controller Semantics -{% panel style="info", title="Logic sequence" %} -We need a diagram tracing the logic from resource creation through updates -and finally deletion. -{% endpanel %} - 0. Determine the `Cluster` associated with the `Machine` from its `cluster.k8s.io/cluster-name` label. - If the `Machine` hasn't been deleted and doesn't have a finalizer, add one. - If the `Machine` is being deleted, and there is no finalizer, we're done @@ -142,6 +137,20 @@ There are two consequences of this: delete the `Machine`. Therefore `Machine`s must be deleted before `Cluster`s. {% endpanel %} +#### machine reconciliation logic +![machine reconciliation logic](images/activity_machine_controller_reconciliation.svg) + +#### machine deletion block +![machine deletion block](images/activity_machine_deletion_block.svg) + +#### machine object creation sequence + +![machine object creation](images/sequence_machine_creation.svg) + +#### machine object deletion sequence + +![machine object deletion](images/sequence_machine_deletion.svg) + --- [^1] One reason a `Machine` may not be deleted is if it corresponds to the diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md index e8d868ce..510ec510 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md @@ -15,8 +15,28 @@ {% endmethod %} {% method %} +## MachineDeploymentStrategy + +{% sample lang="go" %} +[import:'MachineDeploymentStrategy'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) +{% endmethod %} + +{% method %} +## MachineRollingUpdateDeployment + +{% sample lang="go" %} +[import:'MachineRollingUpdateDeployment'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) +{% endmethod %} + +{% method %} + ## MachineDeploymentStatus {% sample lang="go" %} [import:'MachineDeploymentStatus'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) {% endmethod %} + +## MachineDeployment Controller Semantics + +![machinedeployment object reconciliation logic](images/activity_machinedeployment_reconciliation.svg) + diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md index c4ca6014..37cbeea9 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md @@ -32,3 +32,24 @@ which implement their intent by modifying provider-specific `Cluster` and {% sample lang="go" %} [import:'MachineSetStatus'](../../../pkg/apis/cluster/v1alpha1/machineset_types.go) {% endmethod %} + +## MachineSet Controller Semantics + +![machineset object reconciliation logic](images/activity_machineset_reconciliation.svg) + +#### filter machine BLOCK + +This code block examines all machines in the namespace of the machineset and filters out machines that do NOT +have all the following conditions (in this order): + +1. The machine has a controller and is controlled by the machineset. +2. The machine is not scheduled for deletion. +3. The machine's label selector matches that of the machineset. + +For machines that fails condition 1, an attempt is made to adopt the machine into the machineset. The result +of this code block is a filtered list of machines that will be processed in the next code block. + +#### sync replica BLOCK + +This code block looks at the filtered machine list and determines whether to scale up or down the number of +machines to match the replica count defined in the machineset. diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md new file mode 100644 index 00000000..d18d4994 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md @@ -0,0 +1,22 @@ +# Node Controller + +The node controller has one simple job. It links or unlinks a `Machine` to the underlying +core k8s `Node` object if an optional annotation `cluster.k8s.io/machine` is present on the `Node`. The +decision to add the annotation is left to each infrastructure-specific provider. When the +controller links a `Machine`, it assigns the machine's `Status.NodeRef` to the `Node`'s +objectRef. + +The simplest way for Infrastructure-specific providers to add this support is to annotate +nodes in their node bootup script as part of the `kubeadm join` operation (via a commandline +parameter). + +## Node Controller Semantics + +The node controller is very simple. In the current design, a `Machine` will exist before the +backing `Node` is created. When a node is created and ready, the controller checks if the +annotation exist. If it does, it links `Node` to the `Machine`. If the `Node` is slated for +deletion, it unlinks the `Node` from the `Machine`. + +#### node reconciliation logic + +![node object reconciliation logic](images/activity_node_reconciliation.svg) \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md b/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md index c75a1c85..9949c905 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md @@ -3,7 +3,6 @@ A great way to become acquainted with the Cluster API is to start using it. There are multiple implementations of the Cluster API for different environments. These implementations are called _providers_. To find a partial list of the -existing providers see the Cluster API [Provider Implementations List][provider-implementations-list] +existing providers see the Cluster API [Provider Implementations List][provider-implementations-list]. [provider-implementations-list]: https://github.com/kubernetes-sigs/cluster-api/blob/master/README.md#provider-implementations -. diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md index 6ccb13b9..47bc0ef5 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md @@ -6,24 +6,24 @@ Apply the following patch: ```bash diff --git a/Makefile b/Makefile -index ac12c7e..9b4f945 100644 +index ac12c7e..cf44312 100644 --- a/Makefile +++ b/Makefile -@@ -22,12 +22,14 @@ install: manifests +@@ -22,12 +22,15 @@ install: manifests # Deploy controller in the configured Kubernetes cluster in ~/.kube/config deploy: manifests -- kubectl apply -f config/crds -- kustomize build config/default | kubectl apply -f - -+ cat provider-components.yaml | kubectl apply -f - +- kubectl apply -f config/crds +- kustomize build config/default | kubectl apply -f - ++ cat provider-components.yaml | kubectl apply -f - # Generate manifests e.g. CRD, RBAC etc. manifests: -- go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all -+ go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go crd -+ kustomize build config/default/ > provider-components.yaml -+ echo "---" >> provider-components.yaml -+ kustomize build vendor/sigs.k8s.io/cluster-api/config/default/ >> provider-components.yaml + go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all ++ sed -i'' -e 's@^- manager_auth_proxy_patch.yaml.*@#&@' config/default/kustomization.yaml ++ kustomize build config/default/ > provider-components.yaml ++ echo "---" >> provider-components.yaml ++ kustomize build vendor/sigs.k8s.io/cluster-api/config/default/ >> provider-components.yaml # Run go fmt against code fmt: diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md index b6478594..50b53264 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md @@ -28,6 +28,7 @@ import ( "fmt" "os" + "k8s.io/klog" "sigs.k8s.io/cluster-api-provider-solas/pkg/apis" "sigs.k8s.io/cluster-api-provider-solas/pkg/cloud/solas/actuators/cluster" "sigs.k8s.io/cluster-api-provider-solas/pkg/cloud/solas/actuators/machine" @@ -43,18 +44,22 @@ import ( ) func main() { + klog.InitFlags(nil) + cfg := config.GetConfigOrDie() if cfg == nil { panic(fmt.Errorf("GetConfigOrDie didn't die")) } + metricsAddr := flag.String("metrics-addr", ":8080", "The address the metric endpoint binds to.") flag.Parse() + log := logf.Log.WithName("solas-controller-manager") logf.SetLogger(logf.ZapLogger(false)) entryLog := log.WithName("entrypoint") // Setup a Manager - mgr, err := manager.New(cfg, manager.Options{}) + mgr, err := manager.New(cfg, manager.Options{MetricsBindAddress: *metricsAddr}) if err != nil { entryLog.Error(err, "unable to set up overall controller manager") os.Exit(1) diff --git a/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md b/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md new file mode 100644 index 00000000..979d82f7 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md @@ -0,0 +1,44 @@ +# Releasing + +## Output + +### Expected artifacts + +1. A container image of the shared cluster-api controller manager +2. A git tag for providers to use + +### Artifact locations + +1. The container image is found in the registry `gcr.io/k8s-cluster-api` with an + image name of `cluster-api-controller` and a tag that matches the release + version. For example, in the `0.0.0-alpha.4` release, the container image + location is `gcr.io/k8s-cluster-api/cluster-api-controller:0.0.0-alpha.4` + +## Process + +1. Create a pull request that contains two changes: + 1. Change [the cluster api controller manager image + tag][managerimg] from `:latest` to whatever version is being released + 2. Change the `CONTROLLER_IMAGE` variable in the [Makefile][makefile] to the + version being released +2. Get the pull request merged +3. From the commit in step 1 (that is now in the master branch), build and push + the container image with `make docker-push` +4. Create a tag from this same commit and push the tag to the github repository +5. Revert the commit made in step 1 +6. Open a pull request with the revert change +7. Get that pull request merged +8. Create a release in github based on the tag created above +9. Manually create the release notes by going through the merged PRs since the + last release + +[managerimg]: https://github.com/kubernetes-sigs/cluster-api/blob/fab4c07ea9fb0f124a5abe3dd7fcfffc23f2a1b3/config/default/manager_image_patch.yaml +[makefile]: https://github.com/kubernetes-sigs/cluster-api/blob/fab4c07ea9fb0f124a5abe3dd7fcfffc23f2a1b3/Makefile + +### Permissions + +Releasing requires a particular set of permissions. + +* push access to the gcr bucket +* tag push access to the github repository +* release creation diff --git a/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh b/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh index 05a3d67b..0518bbca 100755 --- a/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh +++ b/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh @@ -16,7 +16,6 @@ set -o errexit set -o nounset set -o pipefail -set -o verbose if ! which bazel &>/dev/null; then echo "Bazel not available, skipping validation"; exit; fi diff --git a/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh b/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh index c8d36fb6..939c8734 100755 --- a/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh +++ b/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh @@ -39,7 +39,6 @@ make clientset echo "diffing ${DIFFROOT} against freshly generated codegen" ret=0 diff -Naupr "${DIFFROOT}" "${TMP_DIFFROOT}" -x '*.bazel' -x 'BUILD' || ret=$? -cp -a "${TMP_DIFFROOT}"/* "${DIFFROOT}" if [[ $ret -eq 0 ]] then echo "${DIFFROOT} up to date." diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go index 28748025..dfa87062 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go @@ -51,6 +51,13 @@ const ( // Example: timeout trying to connect to GCE. CreateMachineError MachineStatusError = "CreateError" + // There was an error while trying to update a Node that this + // Machine represents. This may indicate a transient problem that will be + // fixed automatically with time, such as a service outage, + // + // Example: error updating load balancers + UpdateMachineError MachineStatusError = "UpdateError" + // An error was encountered while trying to delete the Node that this // Machine represents. This could be a transient or terminal error, but // will only be observable if the provider's Machine controller has diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go index 60fd59ab..427e7a30 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go @@ -38,6 +38,8 @@ const ( // Machine is the Schema for the machines API // +k8s:openapi-gen=true // +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="ProviderID",type="string",JSONPath=".spec.providerID",description="Provider ID" +// +kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase",description="Machine status such as Terminating/Pending/Running/Failed etc" type Machine struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -57,9 +59,12 @@ type MachineSpec struct { // +optional metav1.ObjectMeta `json:"metadata,omitempty"` - // Taints is the full, authoritative list of taints to apply to the corresponding - // Node. This list will overwrite any modifications made to the Node on - // an ongoing basis. + // The list of the taints to be applied to the corresponding Node in additive + // manner. This list will not overwrite any other taints added to the Node on + // an ongoing basis by other entities. These taints should be actively reconciled + // e.g. if you ask the machine controller to apply a taint and then manually remove + // the taint the machine controller will put it back) but not have the machine controller + // remove any taints // +optional Taints []corev1.Taint `json:"taints,omitempty"` @@ -87,12 +92,12 @@ type MachineSpec struct { // ProviderID is the identification ID of the machine provided by the provider. // This field must match the provider ID as seen on the node object corresponding to this machine. // This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler - // with cluster-api as provider. Clean-up login in the autoscaler compares machines v/s nodes to find out + // with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out // machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a // generic out-of-tree provider for autoscaler, this field is required by autoscaler to be - // able to have a provider view of the list of machines. Another list of nodes is queries from the k8s apiserver - // and then comparison is done to find out unregistered machines and are marked for delete. - // This field will be set by the actuators and consumed by higher level entities like autoscaler who will + // able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver + // and then a comparison is done to find out unregistered machines and are marked for delete. + // This field will be set by the actuators and consumed by higher level entities like autoscaler that will // be interfacing with cluster-api as generic provider. // +optional ProviderID *string `json:"providerID,omitempty"` diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go index ded87688..6f907702 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go @@ -58,6 +58,11 @@ type MachineSetSpec struct { // +optional MinReadySeconds int32 `json:"minReadySeconds,omitempty"` + // DeletePolicy defines the policy used to identify nodes to delete when downscaling. + // Defaults to "Random". Valid values are "Random, "Newest", "Oldest" + // +kubebuilder:validation:Enum=Random,Newest,Oldest + DeletePolicy string `json:"deletePolicy,omitempty"` + // Selector is a label query over machines that should match the replica count. // Label keys and values that must match in order to be controlled by this MachineSet. // It must match the machine template's labels. @@ -70,6 +75,30 @@ type MachineSetSpec struct { Template MachineTemplateSpec `json:"template,omitempty"` } +// MachineSetDeletePolicy defines how priority is assigned to nodes to delete when +// downscaling a MachineSet. Defaults to "Random". +type MachineSetDeletePolicy string + +const ( + // RandomMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // Finally, it picks Machines at random to delete. + RandomMachineSetDeletePolicy MachineSetDeletePolicy = "Random" + + // NewestMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // It then prioritizes the newest Machines for deletion based on the Machine's CreationTimestamp. + NewestMachineSetDeletePolicy MachineSetDeletePolicy = "Newest" + + // OldestMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // It then prioritizes the oldest Machines for deletion based on the Machine's CreationTimestamp. + OldestMachineSetDeletePolicy MachineSetDeletePolicy = "Oldest" +) + /// [MachineSetSpec] // doxygen marker /// [MachineTemplateSpec] // doxygen marker @@ -170,6 +199,12 @@ func (m *MachineSet) Default() { if len(m.Namespace) == 0 { m.Namespace = metav1.NamespaceDefault } + + if m.Spec.DeletePolicy == "" { + randomPolicy := string(RandomMachineSetDeletePolicy) + log.Printf("Defaulting to %s\n", randomPolicy) + m.Spec.DeletePolicy = randomPolicy + } } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go index d9399446..3b657c1c 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go @@ -90,7 +90,7 @@ type ReconcileMachine struct { // Reconcile reads that state of the cluster for a Machine object and makes changes based on the state read // and what is in the Machine.Spec -// +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines;machines/status,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Result, error) { // TODO(mvladev): Can context be passed from Kubebuilder? ctx := context.TODO() @@ -178,6 +178,14 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{}, err } + if m.Status.NodeRef != nil { + klog.Infof("Deleting node %q for machine %q", m.Status.NodeRef.Name, m.Name) + if err := r.deleteNode(ctx, m.Status.NodeRef.Name); err != nil { + klog.Errorf("Error deleting node %q for machine %q", name, err) + return reconcile.Result{}, err + } + } + // Remove finalizer on successful deletion. m.ObjectMeta.Finalizers = util.Filter(m.ObjectMeta.Finalizers, clusterv1.MachineFinalizer) if err := r.Client.Update(context.Background(), m); err != nil { @@ -203,6 +211,7 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil } + klog.Errorf(`Error updating machine "%s/%s": %v`, m.Namespace, name, err) return reconcile.Result{}, err } @@ -263,3 +272,16 @@ func (r *ReconcileMachine) isDeleteAllowed(machine *clusterv1.Machine) bool { // own machine. return node.UID != machine.Status.NodeRef.UID } + +func (r *ReconcileMachine) deleteNode(ctx context.Context, name string) error { + var node corev1.Node + if err := r.Client.Get(ctx, client.ObjectKey{Name: name}, &node); err != nil { + if apierrors.IsNotFound(err) { + klog.V(2).Infof("Node %q not found", name) + return nil + } + klog.Errorf("Failed to get node %q: %v", name, err) + return err + } + return r.Client.Delete(ctx, &node) +} diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel index 6901a984..44b74899 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel @@ -13,7 +13,9 @@ go_library( "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/controller/machinedeployment/util:go_default_library", + "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -21,6 +23,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/client-go/util/integer:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go index 31ecdeb0..939dea58 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go @@ -21,14 +21,17 @@ import ( "reflect" "github.com/pkg/errors" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" "k8s.io/klog" "sigs.k8s.io/cluster-api/pkg/apis/cluster/common" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/cluster-api/pkg/util" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -42,15 +45,19 @@ var ( controllerKind = v1alpha1.SchemeGroupVersion.WithKind("MachineDeployment") ) +// controllerName is the name of this controller +const controllerName = "machinedeployment-controller" + // ReconcileMachineDeployment reconciles a MachineDeployment object. type ReconcileMachineDeployment struct { client.Client - scheme *runtime.Scheme + scheme *runtime.Scheme + recorder record.EventRecorder } // newReconciler returns a new reconcile.Reconciler. func newReconciler(mgr manager.Manager) *ReconcileMachineDeployment { - return &ReconcileMachineDeployment{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcileMachineDeployment{Client: mgr.GetClient(), scheme: mgr.GetScheme(), recorder: mgr.GetRecorder(controllerName)} } // Add creates a new MachineDeployment Controller and adds it to the Manager with default RBAC. @@ -62,7 +69,7 @@ func Add(mgr manager.Manager) error { // add adds a new Controller to mgr with r as the reconcile.Reconciler. func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFunc) error { // Create a new controller. - c, err := controller.New("machinedeployment-controller", mgr, controller.Options{Reconciler: r}) + c, err := controller.New(controllerName, mgr, controller.Options{Reconciler: r}) if err != nil { return err } @@ -106,15 +113,9 @@ func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.Mac return nil, err } - // TODO: flush out machine set adoption. - filteredMS := make([]*v1alpha1.MachineSet, 0, len(machineSets.Items)) for idx := range machineSets.Items { ms := &machineSets.Items[idx] - if metav1.GetControllerOf(ms) == nil || (metav1.GetControllerOf(ms) != nil && !metav1.IsControlledBy(ms, d)) { - klog.V(4).Infof("%s not controlled by %v", ms.Name, d.Name) - continue - } selector, err := metav1.LabelSelectorAsSelector(&d.Spec.Selector) if err != nil { @@ -133,18 +134,37 @@ func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.Mac continue } + // Attempt to adopt machine if it meets previous conditions and it has no controller references. + if metav1.GetControllerOf(ms) == nil { + if err := r.adoptOrphan(d, ms); err != nil { + klog.Warningf("Failed to adopt MachineSet %q into MachineDeployment %q: %v", ms.Name, d.Name, err) + continue + } + } + + if !metav1.IsControlledBy(ms, d) { + continue + } + filteredMS = append(filteredMS, ms) } return filteredMS, nil } +func (r *ReconcileMachineDeployment) adoptOrphan(deployment *v1alpha1.MachineDeployment, machineSet *v1alpha1.MachineSet) error { + newRef := *metav1.NewControllerRef(deployment, controllerKind) + machineSet.OwnerReferences = append(machineSet.OwnerReferences, newRef) + return r.Client.Update(context.Background(), machineSet) +} + // Reconcile reads that state of the cluster for a MachineDeployment object and makes changes based on the state read // and what is in the MachineDeployment.Spec // +kubebuilder:rbac:groups=cluster.k8s.io,resources=machinedeployments,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (reconcile.Result, error) { // Fetch the MachineDeployment instance d := &v1alpha1.MachineDeployment{} + ctx := context.TODO() if err := r.Get(context.TODO(), request.NamespacedName, d); err != nil { if apierrors.IsNotFound(err) { // Object not found, return. Created objects are automatically garbage collected. @@ -154,7 +174,16 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon // Error reading the object - requeue the request. return reconcile.Result{}, err } + result, err := r.reconcile(ctx, d) + if err != nil { + klog.Errorf("Failed to reconcile MachineDeployment %q: %v", request.NamespacedName, err) + r.recorder.Eventf(d, corev1.EventTypeWarning, "ReconcileError", "%v", err) + } + return result, err +} + +func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1.MachineDeployment) (reconcile.Result, error) { v1alpha1.PopulateDefaultsMachineDeployment(d) everything := metav1.LabelSelector{} @@ -180,6 +209,41 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon return reconcile.Result{}, errors.Errorf("failed validation on MachineDeployment %q label selector, cannot match any machines ", d.Name) } + // Cluster might be nil as some providers might not require a cluster object + // for machine management. + cluster, err := r.getCluster(d) + if err != nil { + return reconcile.Result{}, err + } + + // Set the ownerRef with foreground deletion if there is a linked cluster. + if cluster != nil && len(d.OwnerReferences) == 0 { + blockOwnerDeletion := true + d.OwnerReferences = append(d.OwnerReferences, metav1.OwnerReference{ + APIVersion: cluster.APIVersion, + Kind: cluster.Kind, + Name: cluster.Name, + UID: cluster.UID, + BlockOwnerDeletion: &blockOwnerDeletion, + }) + } + + // Add foregroundDeletion finalizer if MachineDeployment isn't deleted and linked to a cluster. + if cluster != nil && + d.ObjectMeta.DeletionTimestamp.IsZero() && + !util.Contains(d.Finalizers, metav1.FinalizerDeleteDependents) { + + d.Finalizers = append(d.ObjectMeta.Finalizers, metav1.FinalizerDeleteDependents) + + if err := r.Client.Update(context.Background(), d); err != nil { + klog.Infof("Failed to add finalizers to MachineSet %q: %v", d.Name, err) + return reconcile.Result{}, err + } + + // Since adding the finalizer updates the object return to avoid later update issues + return reconcile.Result{}, nil + } + msList, err := r.getMachineSetsForDeployment(d) if err != nil { return reconcile.Result{}, err @@ -206,6 +270,25 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon return reconcile.Result{}, errors.Errorf("unexpected deployment strategy type: %s", d.Spec.Strategy.Type) } +func (r *ReconcileMachineDeployment) getCluster(d *v1alpha1.MachineDeployment) (*v1alpha1.Cluster, error) { + if d.Spec.Template.Labels[v1alpha1.MachineClusterLabelName] == "" { + klog.Infof("Deployment %q in namespace %q doesn't specify %q label, assuming nil cluster", d.Name, v1alpha1.MachineClusterLabelName, d.Namespace) + return nil, nil + } + + cluster := &v1alpha1.Cluster{} + key := client.ObjectKey{ + Namespace: d.Namespace, + Name: d.Spec.Template.Labels[v1alpha1.MachineClusterLabelName], + } + + if err := r.Client.Get(context.Background(), key, cluster); err != nil { + return nil, err + } + + return cluster, nil +} + // getMachineDeploymentsForMachineSet returns a list of Deployments that potentially // match a MachineSet. func (r *ReconcileMachineDeployment) getMachineDeploymentsForMachineSet(ms *v1alpha1.MachineSet) []*v1alpha1.MachineDeployment { diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel index ea0b6ee3..dabadbad 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel @@ -20,6 +20,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/controller:go_default_library", @@ -42,6 +43,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis:go_default_library", + "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go index c42be30f..b61030c5 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go @@ -24,10 +24,12 @@ import ( "time" "github.com/pkg/errors" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/tools/record" "k8s.io/klog" clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/cluster-api/pkg/util" @@ -48,6 +50,9 @@ var ( // stateConfirmationInterval is the amount of time between polling for the desired state. // The polling is against a local memory cache. stateConfirmationInterval = 100 * time.Millisecond + + // controllerName is the name of this controller + controllerName = "machineset-controller" ) // Add creates a new MachineSet Controller and adds it to the Manager with default RBAC. @@ -59,13 +64,13 @@ func Add(mgr manager.Manager) error { // newReconciler returns a new reconcile.Reconciler. func newReconciler(mgr manager.Manager) *ReconcileMachineSet { - return &ReconcileMachineSet{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcileMachineSet{Client: mgr.GetClient(), scheme: mgr.GetScheme(), recorder: mgr.GetRecorder(controllerName)} } // add adds a new Controller to mgr with r as the reconcile.Reconciler. func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFunc) error { // Create a new controller. - c, err := controller.New("machineset-controller", mgr, controller.Options{Reconciler: r}) + c, err := controller.New(controllerName, mgr, controller.Options{Reconciler: r}) if err != nil { return err } @@ -98,7 +103,8 @@ func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFu // ReconcileMachineSet reconciles a MachineSet object type ReconcileMachineSet struct { client.Client - scheme *runtime.Scheme + scheme *runtime.Scheme + recorder record.EventRecorder } func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconcile.Request { @@ -138,8 +144,9 @@ func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconc // +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Result, error) { // Fetch the MachineSet instance + ctx := context.TODO() machineSet := &clusterv1alpha1.MachineSet{} - if err := r.Get(context.TODO(), request.NamespacedName, machineSet); err != nil { + if err := r.Get(ctx, request.NamespacedName, machineSet); err != nil { if apierrors.IsNotFound(err) { // Object not found, return. Created objects are automatically garbage collected. // For additional cleanup logic use finalizers. @@ -149,6 +156,15 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, err } + result, err := r.reconcile(ctx, machineSet) + if err != nil { + klog.Errorf("Failed to reconcile MachineSet %q: %v", request.NamespacedName, err) + r.recorder.Eventf(machineSet, corev1.EventTypeWarning, "ReconcileError", "%v", err) + } + return result, err +} + +func (r *ReconcileMachineSet) reconcile(ctx context.Context, machineSet *clusterv1alpha1.MachineSet) (reconcile.Result, error) { klog.V(4).Infof("Reconcile machineset %v", machineSet.Name) allMachines := &clusterv1alpha1.MachineList{} @@ -167,6 +183,41 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, errors.Errorf("failed validation on MachineSet %q label selector, cannot match any machines ", machineSet.Name) } + // Cluster might be nil as some providers might not require a cluster object + // for machine management. + cluster, err := r.getCluster(machineSet) + if err != nil { + return reconcile.Result{}, err + } + + // Set the ownerRef with foreground deletion if there is a linked cluster. + if cluster != nil && len(machineSet.OwnerReferences) == 0 { + blockOwnerDeletion := true + machineSet.OwnerReferences = append(machineSet.OwnerReferences, metav1.OwnerReference{ + APIVersion: cluster.APIVersion, + Kind: cluster.Kind, + Name: cluster.Name, + UID: cluster.UID, + BlockOwnerDeletion: &blockOwnerDeletion, + }) + } + + // Add foregroundDeletion finalizer if MachineSet isn't deleted and linked to a cluster. + if cluster != nil && + machineSet.ObjectMeta.DeletionTimestamp.IsZero() && + !util.Contains(machineSet.Finalizers, metav1.FinalizerDeleteDependents) { + + machineSet.Finalizers = append(machineSet.ObjectMeta.Finalizers, metav1.FinalizerDeleteDependents) + + if err := r.Client.Update(context.Background(), machineSet); err != nil { + klog.Infof("Failed to add finalizers to MachineSet %q: %v", machineSet.Name, err) + return reconcile.Result{}, err + } + + // Since adding the finalizer updates the object return to avoid later update issues + return reconcile.Result{}, nil + } + // Filter out irrelevant machines (deleting/mismatch labels) and claim orphaned machines. filteredMachines := make([]*clusterv1alpha1.Machine, 0, len(allMachines.Items)) for idx := range allMachines.Items { @@ -175,10 +226,10 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re continue } - // Attempt to adopt machine if it meets previous conditions and it has no controller ref. + // Attempt to adopt machine if it meets previous conditions and it has no controller references. if metav1.GetControllerOf(machine) == nil { if err := r.adoptOrphan(machineSet, machine); err != nil { - klog.Warningf("failed to adopt machine %v into machineset %v. %v", machine.Name, machineSet.Name, err) + klog.Warningf("Failed to adopt MachineSet %q into MachineSet %q: %v", machine.Name, machineSet.Name, err) continue } } @@ -222,6 +273,25 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, nil } +func (r *ReconcileMachineSet) getCluster(ms *clusterv1alpha1.MachineSet) (*clusterv1alpha1.Cluster, error) { + if ms.Spec.Template.Labels[clusterv1alpha1.MachineClusterLabelName] == "" { + klog.Infof("MachineSet %q in namespace %q doesn't specify %q label, assuming nil cluster", ms.Name, clusterv1alpha1.MachineClusterLabelName, ms.Namespace) + return nil, nil + } + + cluster := &clusterv1alpha1.Cluster{} + key := client.ObjectKey{ + Namespace: ms.Namespace, + Name: ms.Spec.Template.Labels[clusterv1alpha1.MachineClusterLabelName], + } + + if err := r.Client.Get(context.Background(), key, cluster); err != nil { + return nil, err + } + + return cluster, nil +} + // syncReplicas essentially scales machine resources up and down. func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machines []*clusterv1alpha1.Machine) error { if ms.Spec.Replicas == nil { @@ -238,12 +308,12 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi var machineList []*clusterv1alpha1.Machine var errstrings []string for i := 0; i < diff; i++ { - klog.Infof("creating machine %d of %d, ( spec.replicas(%d) > currentMachineCount(%d) )", + klog.Infof("Creating machine %d of %d, ( spec.replicas(%d) > currentMachineCount(%d) )", i+1, diff, *(ms.Spec.Replicas), len(machines)) machine := r.createMachine(ms) if err := r.Client.Create(context.Background(), machine); err != nil { - klog.Errorf("unable to create a machine = %s, due to %v", machine.Name, err) + klog.Errorf("Unable to create Machine %q: %v", machine.Name, err) errstrings = append(errstrings, err.Error()) continue } @@ -260,8 +330,13 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi klog.Infof("Too many replicas for %v %s/%s, need %d, deleting %d", controllerKind, ms.Namespace, ms.Name, *(ms.Spec.Replicas), diff) + deletePriorityFunc, err := getDeletePriorityFunc(ms) + if err != nil { + return err + } + klog.Infof("Found %s delete policy", ms.Spec.DeletePolicy) // Choose which Machines to delete. - machinesToDelete := getMachinesToDeletePrioritized(machines, diff, simpleDeletePriority) + machinesToDelete := getMachinesToDeletePrioritized(machines, diff, deletePriorityFunc) // TODO: Add cap to limit concurrent delete calls. errCh := make(chan error, diff) @@ -272,7 +347,7 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi defer wg.Done() err := r.Client.Delete(context.Background(), targetMachine) if err != nil { - klog.Errorf("unable to delete a machine = %s, due to %v", targetMachine.Name, err) + klog.Errorf("Unable to delete Machine %s: %v", targetMachine.Name, err) errCh <- err } }(machine) @@ -333,22 +408,9 @@ func shouldExcludeMachine(machineSet *clusterv1alpha1.MachineSet, machine *clust } func (r *ReconcileMachineSet) adoptOrphan(machineSet *clusterv1alpha1.MachineSet, machine *clusterv1alpha1.Machine) error { - // Add controller reference. - ownerRefs := machine.ObjectMeta.GetOwnerReferences() - if ownerRefs == nil { - ownerRefs = []metav1.OwnerReference{} - } - newRef := *metav1.NewControllerRef(machineSet, controllerKind) - ownerRefs = append(ownerRefs, newRef) - machine.ObjectMeta.SetOwnerReferences(ownerRefs) - - if err := r.Client.Update(context.Background(), machine); err != nil { - klog.Warningf("Failed to update machine owner reference. %v", err) - return err - } - - return nil + machine.OwnerReferences = append(machine.OwnerReferences, newRef) + return r.Client.Update(context.Background(), machine) } func (r *ReconcileMachineSet) waitForMachineCreation(machineList []*clusterv1alpha1.Machine) error { diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go index b2d5acbc..91b79de0 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go @@ -17,32 +17,90 @@ limitations under the License. package machineset import ( + "math" + "sort" + + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) -type deletePriority int +type deletePriority float64 const ( - mustDelete deletePriority = 100 - betterDelete deletePriority = 50 - couldDelete deletePriority = 20 - // mustNotDelete deletePriority = 0 + + // DeleteNodeAnnotation marks nodes that will be given priority for deletion + // when a machineset scales down. This annotation is given top priority on all delete policies. + DeleteNodeAnnotation = "cluster.k8s.io/delete-machine" + + mustDelete deletePriority = 100.0 + betterDelete deletePriority = 50.0 + couldDelete deletePriority = 20.0 + mustNotDelete deletePriority = 0.0 + + secondsPerTenDays float64 = 864000 ) type deletePriorityFunc func(machine *v1alpha1.Machine) deletePriority -func simpleDeletePriority(machine *v1alpha1.Machine) deletePriority { +// maps the creation timestamp onto the 0-100 priority range +func oldestDeletePriority(machine *v1alpha1.Machine) deletePriority { + if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { + return mustDelete + } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return mustDelete + } + if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { + return mustDelete + } + if machine.ObjectMeta.CreationTimestamp.Time.IsZero() { + return mustNotDelete + } + d := metav1.Now().Sub(machine.ObjectMeta.CreationTimestamp.Time) + if d.Seconds() < 0 { + return mustNotDelete + } + return deletePriority(float64(mustDelete) * (1.0 - math.Exp(-d.Seconds()/secondsPerTenDays))) +} + +func newestDeletePriority(machine *v1alpha1.Machine) deletePriority { + if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { + return mustDelete + } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return mustDelete + } + if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { + return mustDelete + } + return mustDelete - oldestDeletePriority(machine) +} + +func randomDeletePolicy(machine *v1alpha1.Machine) deletePriority { if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { return mustDelete } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return betterDelete + } if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { return betterDelete } return couldDelete } -// TODO: Define machines deletion policies. -// see: https://github.com/kubernetes/kube-deploy/issues/625 +type sortableMachines struct { + machines []*v1alpha1.Machine + priority deletePriorityFunc +} + +func (m sortableMachines) Len() int { return len(m.machines) } +func (m sortableMachines) Swap(i, j int) { m.machines[i], m.machines[j] = m.machines[j], m.machines[i] } +func (m sortableMachines) Less(i, j int) bool { + return m.priority(m.machines[j]) < m.priority(m.machines[i]) // high to low +} + func getMachinesToDeletePrioritized(filteredMachines []*v1alpha1.Machine, diff int, fun deletePriorityFunc) []*v1alpha1.Machine { if diff >= len(filteredMachines) { return filteredMachines @@ -50,24 +108,27 @@ func getMachinesToDeletePrioritized(filteredMachines []*v1alpha1.Machine, diff i return []*v1alpha1.Machine{} } - machines := make(map[deletePriority][]*v1alpha1.Machine) - - for _, machine := range filteredMachines { - priority := fun(machine) - machines[priority] = append(machines[priority], machine) + sortable := sortableMachines{ + machines: filteredMachines, + priority: fun, } + sort.Sort(sortable) - result := []*v1alpha1.Machine{} - for _, priority := range []deletePriority{ - mustDelete, - betterDelete, - couldDelete, - } { - result = append(result, machines[priority]...) - if len(result) >= diff { - break - } - } + return sortable.machines[:diff] +} - return result[:diff] +func getDeletePriorityFunc(ms *v1alpha1.MachineSet) (deletePriorityFunc, error) { + // Map the Spec.DeletePolicy value to the appropriate delete priority function + switch msdp := v1alpha1.MachineSetDeletePolicy(ms.Spec.DeletePolicy); msdp { + case v1alpha1.RandomMachineSetDeletePolicy: + return randomDeletePolicy, nil + case v1alpha1.NewestMachineSetDeletePolicy: + return newestDeletePriority, nil + case v1alpha1.OldestMachineSetDeletePolicy: + return oldestDeletePriority, nil + case "": + return randomDeletePolicy, nil + default: + return nil, errors.Errorf("Unsupported delete policy %s. Must be one of 'Random', 'Newest', or 'Oldest'", msdp) + } } diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go index 7776a7a8..c421da74 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go @@ -60,14 +60,17 @@ func hasMatchingLabels(machineSet *v1alpha1.MachineSet, machine *v1alpha1.Machin klog.Warningf("unable to convert selector: %v", err) return false } + // If a deployment with a nil or empty selector creeps in, it should match nothing, not everything. if selector.Empty() { klog.V(2).Infof("%v machineset has empty selector", machineSet.Name) return false } + if !selector.Matches(labels.Set(machine.Labels)) { klog.V(4).Infof("%v machine has mismatch labels", machine.Name) return false } + return true } diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go b/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go index fcd50f9f..b78877b3 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go @@ -53,6 +53,13 @@ func CreateMachine(msg string, args ...interface{}) *MachineError { } } +func UpdateMachine(msg string, args ...interface{}) *MachineError { + return &MachineError{ + Reason: commonerrors.UpdateMachineError, + Message: fmt.Sprintf(msg, args...), + } +} + func DeleteMachine(msg string, args ...interface{}) *MachineError { return &MachineError{ Reason: commonerrors.DeleteMachineError, diff --git a/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh b/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh index 15c665eb..5d664c33 100755 --- a/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh +++ b/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh @@ -25,6 +25,7 @@ CRD_YAML="crd.yaml" BOOTSTRAP_CLUSTER_NAME="clusterapi-bootstrap" CONTROLLER_REPO="controller-ci" # use arbitrary repo name since we don't need to publish it EXAMPLE_PROVIDER_REPO="example-provider-ci" +INTEGRATION_TEST_DIR="./test/integration" install_kustomize() { go get sigs.k8s.io/kustomize @@ -67,12 +68,33 @@ delete_bootstrap() { kind delete cluster --name "${BOOTSTRAP_CLUSTER_NAME}" } -verify_cluster_api() { - echo "not implemented" - #TODO: verify cluster-api CRD on bootstrap cluster +wait_pod_running() { + retry=30 + INTERVAL=6 + until kubectl get pods "$1" -n "$2" --no-headers | awk -F" " '{s+=($3!="Running")} END {exit s}' + do + sleep ${INTERVAL}; + retry=$((retry - 1)) + if [ $retry -lt 0 ]; + then + kubectl describe pod "$1" -n "$2" + kubectl logs "$1" -n "$2" + exit 1 + fi; + kubectl get pods "$1" -n "$2" --no-headers; + done; +} + +ensure_docker_in_docker() { + if [ -z "${PROW_JOB_ID}" ] ; then + # start docker service in setup other than Prow + service docker start + fi + # DinD is configured at Prow } main() { + ensure_docker_in_docker build_containers install_kustomize @@ -81,9 +103,16 @@ main() { install_kubectl create_bootstrap - "${KUBECTL}" create -f "${CRD_YAML}" + "${KUBECTL}" create -f "${CRD_YAML}" + + set +e + wait_pod_running "cluster-api-controller-manager-0" "cluster-api-system" + wait_pod_running "provider-controller-manager-0" "provider-system" + set -e - verify_cluster_api + if [ -d "${INTEGRATION_TEST_DIR}" ] ; then + go test -v "${INTEGRATION_TEST_DIR}"/... + fi delete_bootstrap diff --git a/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh b/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh index 4dc2c389..7b0f2917 100755 --- a/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh +++ b/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh @@ -31,7 +31,7 @@ k8s_version=1.11.0 goarch=amd64 goos="unknown" -if [[ "$OSTYPE" == "linux-gnu" ]]; then +if [[ "$OSTYPE" == "linux"* ]]; then goos="linux" elif [[ "$OSTYPE" == "darwin"* ]]; then goos="darwin" diff --git a/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel new file mode 100644 index 00000000..8cc7fbe9 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel @@ -0,0 +1,19 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "go_default_test", + srcs = ["cluster_test.go"], + deps = [ + "//pkg/apis/cluster/v1alpha1:go_default_library", + "//pkg/client/clientset_generated/clientset:go_default_library", + "//pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1:go_default_library", + "//vendor/github.com/onsi/ginkgo:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/client-go/informers:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", + ], +)