From 67693171ac848954095178155a1ce99d300a2b19 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 20 Apr 2020 15:50:17 +0000 Subject: [PATCH 01/72] Update ClusterAPI from v1alpha1 to v1alpha3: basic types --- go.mod | 99 ++- go.sum | 738 ++++++++++++++---- pkg/apis/wksprovider/machine/os/os.go | 17 +- .../doc.go | 0 pkg/baremetal/v1alpha3/doc.go | 5 + pkg/baremetal/v1alpha3/register.go | 44 ++ pkg/baremetal/v1alpha3/types.go | 128 +++ .../v1alpha3/zz_generated.deepcopy.go | 335 ++++++++ pkg/baremetalproviderspec/register.go | 38 - pkg/baremetalproviderspec/types.go | 83 -- .../v1alpha1/register.go | 115 --- .../zz_generated.deepcopy.go | 222 ------ pkg/specs/specs.go | 6 +- pkg/specs/validation.go | 4 +- pkg/specs/validation_test.go | 2 +- pkg/utilities/manifest/manifest.go | 22 +- 16 files changed, 1195 insertions(+), 663 deletions(-) rename pkg/{baremetalproviderspec => baremetal}/doc.go (100%) create mode 100644 pkg/baremetal/v1alpha3/doc.go create mode 100644 pkg/baremetal/v1alpha3/register.go create mode 100644 pkg/baremetal/v1alpha3/types.go create mode 100644 pkg/baremetal/v1alpha3/zz_generated.deepcopy.go delete mode 100644 pkg/baremetalproviderspec/register.go delete mode 100644 pkg/baremetalproviderspec/types.go delete mode 100644 pkg/baremetalproviderspec/v1alpha1/register.go delete mode 100644 pkg/baremetalproviderspec/zz_generated.deepcopy.go diff --git a/go.mod b/go.mod index a56c0852..3767467d 100644 --- a/go.mod +++ b/go.mod @@ -3,71 +3,84 @@ module github.com/weaveworks/wksctl go 1.12 require ( - github.com/appscode/jsonpatch v0.0.0-00010101000000-000000000000 // indirect - github.com/bitnami-labs/sealed-secrets v0.7.0 + github.com/bitnami-labs/sealed-secrets v0.12.1 github.com/blang/semver v3.5.1+incompatible github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e github.com/chanwit/plandiff v1.0.0 - github.com/dlespiau/kube-test-harness v0.0.0-20180712150055-7eab798dff48 + github.com/dlespiau/kube-test-harness v0.0.0-20190930170435-ec3f93e1a754 github.com/fatih/structs v1.1.0 github.com/ghodss/yaml v1.0.0 github.com/go-logr/zapr v0.1.1 // indirect - github.com/gogo/protobuf v1.3.0 // indirect - github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect - github.com/google/btree v1.0.0 // indirect + github.com/golang/protobuf v1.4.0 // indirect github.com/google/go-jsonnet v0.11.2 - github.com/googleapis/gnostic v0.3.1 // indirect - github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/googleapis/gnostic v0.4.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.1 // indirect - github.com/hashicorp/golang-lru v0.5.3 // indirect - github.com/imdario/mergo v0.3.7 // indirect + github.com/imdario/mergo v0.3.9 // indirect github.com/oleiade/reflections v1.0.0 // indirect - github.com/pelletier/go-toml v1.2.0 - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pkg/errors v0.8.1 - github.com/prometheus/client_golang v0.9.3 // indirect + github.com/pelletier/go-toml v1.6.0 + github.com/pkg/errors v0.9.1 + github.com/prometheus/client_golang v1.5.1 // indirect + github.com/prometheus/procfs v0.0.11 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd github.com/sirupsen/logrus v1.4.2 - github.com/spf13/cobra v0.0.5 - github.com/spf13/pflag v1.0.3 + github.com/spf13/cobra v0.0.6 + github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 github.com/thanhpk/randstr v0.0.0-20190104161604-ac5b2d62bffb github.com/weaveworks/footloose v0.0.0-20190903132036-efbcbb7a6390 github.com/weaveworks/go-checkpoint v0.0.0-20170503165305-ebbb8b0518ab github.com/weaveworks/launcher v0.0.0-20180824102238-59a4fcc32c9c github.com/whilp/git-urls v0.0.0-20160530060445-31bac0d230fa - go.uber.org/atomic v1.4.0 // indirect - go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.10.0 // indirect - golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - gomodules.xyz/jsonpatch/v2 v2.0.1 // indirect - google.golang.org/appengine v1.4.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect + golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 + golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect + golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 // indirect + golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect + gomodules.xyz/jsonpatch/v2 v2.1.0 // indirect + google.golang.org/appengine v1.6.5 // indirect gopkg.in/oleiade/reflections.v1 v1.0.0 gopkg.in/src-d/go-git.v4 v4.10.0 - k8s.io/api v0.0.0-20190831074750-7364b6bdad65 - k8s.io/apiextensions-apiserver v0.0.0-20190831115834-b8e250c992fa // indirect - k8s.io/apimachinery v0.0.0-20190831074630-461753078381 - k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible - k8s.io/cluster-bootstrap v0.0.0-20190205054431-5627c5c14d7e - k8s.io/kube-proxy v0.0.0-20190208174132-30e63035f31f - k8s.io/kubernetes v0.0.0-20190201210629-c6d339953bd4 - k8s.io/utils v0.0.0-20190801114015-581e00157fb1 - sigs.k8s.io/cluster-api v0.0.0-20181211193542-3547f8dd9307 - sigs.k8s.io/controller-runtime v0.1.12 - sigs.k8s.io/testing_frameworks v0.1.1 // indirect - sigs.k8s.io/yaml v1.1.0 + k8s.io/api v0.18.2 + k8s.io/apimachinery v0.18.2 + k8s.io/client-go v11.0.0+incompatible + k8s.io/cluster-bootstrap v0.17.2 + k8s.io/kube-openapi v0.0.0-20200403204345-e1beb1bd0f35 // indirect + k8s.io/kube-proxy v0.0.0 + k8s.io/kubernetes v1.18.1 + k8s.io/utils v0.0.0-20200414100711-2df71ebbae66 + sigs.k8s.io/cluster-api v0.3.3 + sigs.k8s.io/controller-runtime v0.5.2 + sigs.k8s.io/yaml v1.2.0 ) replace ( github.com/appscode/jsonpatch => gomodules.xyz/jsonpatch/v2 v2.0.0+incompatible - github.com/dlespiau/kube-test-harness => github.com/dlespiau/kube-test-harness v0.0.0-20180712150055-7eab798dff48 - github.com/json-iterator/go => github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3 - k8s.io/api => k8s.io/api v0.0.0-20190704094930-781da4e7b28a - k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190704094625-facf06a8f4b8 - k8s.io/client-go => k8s.io/client-go v0.0.0-20190202011228-6e4752048fde - k8s.io/kubernetes => k8s.io/kubernetes v1.13.9-beta.0.0.20190726214758-e065364bfbf4 - sigs.k8s.io/kind => sigs.k8s.io/kind v0.0.0-20190204012257-d1773a79317d + github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.1.0 + github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha3/baremetalproviderspec/v1alpha3 => ./pkg/baremetalproviderspec/v1alpha3/baremetalproviderspec/v1alpha3 + k8s.io/api => k8s.io/api v0.17.2 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.17.2 + k8s.io/apimachinery => k8s.io/apimachinery v0.17.2 + k8s.io/apiserver => k8s.io/apiserver v0.17.2 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.17.2 + k8s.io/client-go => k8s.io/client-go v0.17.2 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.17.2 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.17.2 + k8s.io/code-generator => k8s.io/code-generator v0.17.2 + k8s.io/component-base => k8s.io/component-base v0.17.2 + k8s.io/cri-api => k8s.io/cri-api v0.17.2 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.17.2 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.17.2 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.17.2 + k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c + k8s.io/kube-proxy => k8s.io/kube-proxy v0.17.2 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.17.2 + k8s.io/kubectl => k8s.io/kubectl v0.17.2 + k8s.io/kubelet => k8s.io/kubelet v0.17.2 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.17.2 + k8s.io/metrics => k8s.io/metrics v0.17.2 + k8s.io/node-api => k8s.io/node-api v0.17.2 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.17.2 + k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.17.2 + k8s.io/sample-controller => k8s.io/sample-controller v0.17.2 ) diff --git a/go.sum b/go.sum index 78bd6188..38488fce 100644 --- a/go.sum +++ b/go.sum @@ -1,76 +1,165 @@ +bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alessio/shellescape v0.0.0-20190409004728-b115ca0f9053/go.mod h1:xW8sBma2LE3QxFSzCnH9qe6gAE2yO9GvQaWwX89HxbE= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= +github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0= +github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= +github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bitnami-labs/sealed-secrets v0.7.0 h1:tNNvQdtO2vYIgqatgv9TVwO4NBk2pJC0LKR5iEQLXeU= -github.com/bitnami-labs/sealed-secrets v0.7.0/go.mod h1:8VirDPcpH07JeOMgxcZkP/Fa8DlrLK6MUc8I0F+hhgY= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +github.com/bitnami-labs/flagenv v0.0.0-20190607135054-a87af7a1d6fc/go.mod h1:OeW4NPgFPO7+t8q1Vn2Yv+rkO+4kEQzlDskwm7C7PXs= +github.com/bitnami-labs/pflagenv v0.0.0-20190702160147-b4d9f048d98f/go.mod h1:Lw3ejf6HTt4DqBIAXlkOIvFjnpj8Zq+zD/UtH29ILFA= +github.com/bitnami-labs/sealed-secrets v0.12.1 h1:O1ATQD0t0pERGYmZugTHci5474DZSZQ51dC2LdA7YxA= +github.com/bitnami-labs/sealed-secrets v0.12.1/go.mod h1:iafXGNUD1Sk/qEfZnjpSQ+BrymPpYoxAzEHXeqUVsso= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e h1:Gbx+iVCXG/1m5WSnidDGuHgN+vbIwl+6fR092ANU+Y8= github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e/go.mod h1:AZIh1CCnMrcVm6afFf96PBvE2MRpWFco91z8ObJtgDY= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chanwit/plandiff v1.0.0 h1:Asf660tDkLPaHhKkqbE/fFn+GGzKrxdWvYbSIToPzzY= github.com/chanwit/plandiff v1.0.0/go.mod h1:anHayKFTcAXn3/zrIhvwW9FbhgkWKzDI24UJCSFJXK4= +github.com/checkpoint-restore/go-criu v0.0.0-20181120144056-17b0214f6c48/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= +github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= +github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/coredns/corefile-migration v1.0.6/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= +github.com/coredns/corefile-migration v1.0.7/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlespiau/kube-test-harness v0.0.0-20180712150055-7eab798dff48 h1:TD9AaFzupkOrwzWdo0dzfq1LdaBKRg9iehdQ7TJrDEg= -github.com/dlespiau/kube-test-harness v0.0.0-20180712150055-7eab798dff48/go.mod h1:rTr8X4qZPRmQKsyAjhECPi+zPnmlcmv5W9s1F11oBSo= +github.com/dlespiau/kube-test-harness v0.0.0-20190930170435-ec3f93e1a754 h1:Qd6djMDE2KFeLwuKQ4B316XYt101DFoymbgoxFHeKCY= +github.com/dlespiau/kube-test-harness v0.0.0-20190930170435-ec3f93e1a754/go.mod h1:rTr8X4qZPRmQKsyAjhECPi+zPnmlcmv5W9s1F11oBSo= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo= github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20190925143933-c8a5fca4a652/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo= github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -80,17 +169,25 @@ github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= +github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= @@ -98,212 +195,425 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.18.0/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg= +github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/cadvisor v0.35.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v24 v24.0.1/go.mod h1:CRqaW1Uns1TCkP0wqTpxYyRxRjxwvKU/XSS44u6X74M= github.com/google/go-jsonnet v0.11.2 h1:oSCkvGPE72ouWJLOajr4p0clGFCOFmwhqo52faGsudk= github.com/google/go-jsonnet v0.11.2/go.mod h1:gVu3UVSfOt5fRFq+dh9duBqXa5905QY8S1QvMNcEIVs= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= -github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3 h1:/UewZcckqhvnnS0C6r3Sher2hSEbVmM6Ogpcjen08+Y= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8= github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= +github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= +github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= +github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= +github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= +github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= +github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mkmik/multierror v0.3.0 h1:FHr3n5BEVlzlTz8GRbuwimkL2zbdD2gTPcSh0wpRpUg= +github.com/mkmik/multierror v0.3.0/go.mod h1:wjBYXRpDhh+8mIp+iLBOq0kZ3Y4ICTncojwvP8LUYLQ= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oleiade/reflections v1.0.0 h1:0ir4pc6v8/PJ0yw5AEtMddfXpWBXg9cnG7SgSoJuCgY= github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= +github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v0.0.0-20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/thanhpk/randstr v0.0.0-20190104161604-ac5b2d62bffb h1:Ih4dkfHqv5m1/CH8jFhRq83P/z1AKCKrTuWDFUmw2LY= github.com/thanhpk/randstr v0.0.0-20190104161604-ac5b2d62bffb/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U= +github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= +github.com/throttled/throttled v2.2.2+incompatible/go.mod h1:0BjlrEGQmvxps+HuXLsyRdqpSRvJpq0PNIsOtqP9Nos= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/weaveworks/footloose v0.0.0-20190903132036-efbcbb7a6390 h1:kFi0CaTblX4lM4Oi9KeZmcz3eo7NsmwNEXgQrVkVXHw= github.com/weaveworks/footloose v0.0.0-20190903132036-efbcbb7a6390/go.mod h1:nOh5HQLDNC5MgZTPXbfnp+ChzAGRSkKopJmSNIGvi6w= github.com/weaveworks/go-checkpoint v0.0.0-20170503165305-ebbb8b0518ab h1:mW+hgchD9qUUBqnuaDBj7BkcpFPk/FxeFcUFI5lvvUw= @@ -314,122 +624,236 @@ github.com/whilp/git-urls v0.0.0-20160530060445-31bac0d230fa h1:rW+Lu6281ed/4XGu github.com/whilp/git-urls v0.0.0-20160530060445-31bac0d230fa/go.mod h1:2rx5KE5FLD0HRfkkpyn8JwbVLBdhgeiOb2D2D9LLKM4= github.com/xanzy/ssh-agent v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro= github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8= -github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569 h1:nSQar3Y0E3VQF/VdZ8PTAilaXpER+d7ypdABCrpwMdg= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df h1:shvkWr0NAZkg4nPuE3XrKP0VuBPijjk3TfX6Y6acFNg= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15 h1:Z2sc4+v0JHV6Mn4kX1f2a5nruNjmV+Th32sugE8zwz8= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= +golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 h1:IhZPbxNd1UjBCaD5AfpSSbJTRlp+ZSuyuH5uoksNS04= +golang.org/x/crypto v0.0.0-20200420104511-884d27f42877/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180824143301-4910a1d54f87/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190122202912-9c309ee22fab/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 h1:QjA/9ArTfVTLfEhClDCG7SGrZkZixxWpwNCDiwJfh88= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac h1:MQEvx39qSf8vyrx3XRaOe+j1UDIzKwkYOVObRgGPVqI= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -gomodules.xyz/jsonpatch/v2 v2.0.0+incompatible h1:/5U+rwN6awI6kctzQHJw7uQDimOwO+v/LsLPQDfcLuM= -gomodules.xyz/jsonpatch/v2 v2.0.0+incompatible/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= +golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/oleiade/reflections.v1 v1.0.0 h1:nV9NFaFd5bXKjilVvPvA+/V/tNQk1pOEEc9gGWDkj+s= gopkg.in/oleiade/reflections.v1 v1.0.0/go.mod h1:SpA8pv+LUnF0FbB2hyRxc8XSng78D6iLBZ11PDb8Z5g= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.2.1 h1:omN5CrMrMcQ+4I8bJ0wEhOBPanIRWzFC953IiXKdYzo= gopkg.in/src-d/go-billy.v4 v4.2.1/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= @@ -437,56 +861,98 @@ gopkg.in/src-d/go-git-fixtures.v3 v3.1.1 h1:XWW/s5W18RaJpmo1l0IYGqXKuJITWRFuA45i gopkg.in/src-d/go-git-fixtures.v3 v3.1.1/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= gopkg.in/src-d/go-git.v4 v4.10.0 h1:NWjTJTQnk8UpIGlssuefyDZ6JruEjo5s88vm88uASbw= gopkg.in/src-d/go-git.v4 v4.10.0/go.mod h1:Vtut8izDyrM8BUVQnzJ+YvmNcem2J89EmfZYCkLokZk= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.0.0-20190704094930-781da4e7b28a h1:jq6/cGYCOiB5MQW4/Dgc/OWaVLcJIiIctAf4P2RqnV0= -k8s.io/api v0.0.0-20190704094930-781da4e7b28a/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/apiextensions-apiserver v0.0.0-20190831115834-b8e250c992fa h1:kG5ih6XhQG6Vx7oyY5bToudz4LkABUKB3+aJrJBdmmk= -k8s.io/apiextensions-apiserver v0.0.0-20190831115834-b8e250c992fa/go.mod h1:9FTbLIoJaLvP5UTqkjnAU1nZLN2XeOulgP3QD4tZEEM= -k8s.io/apimachinery v0.0.0-20190704094625-facf06a8f4b8 h1:qGiV44JLTV1j0Kf5kdk9B/yHmGVPc+3Z1gk7u6LGpDY= -k8s.io/apimachinery v0.0.0-20190704094625-facf06a8f4b8/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apiserver v0.0.0-20190831115305-fa157b05a9eb/go.mod h1:pb8Ww+F7exOqlBY9MM3sgsEItwqbmpurIAoI3zk55rs= -k8s.io/client-go v0.0.0-20190202011228-6e4752048fde h1:mYiUumopdeEXDygcdIbVQm/3IIvPIbgaETJmqNuSDz4= -k8s.io/client-go v0.0.0-20190202011228-6e4752048fde/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/cluster-bootstrap v0.0.0-20190205054431-5627c5c14d7e h1:LseOYyq/t6tCtlMB7ugoZsZ5M7AuQ6VtlgzbING0No4= -k8s.io/cluster-bootstrap v0.0.0-20190205054431-5627c5c14d7e/go.mod h1:iBSm2nwo3OaiuW8VDvc3ySDXK5SKfUrxwPvBloKG7zg= -k8s.io/code-generator v0.0.0-20190831074504-732c9ca86353/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= -k8s.io/component-base v0.0.0-20190831075413-37a093468564 h1:mY4AxuX1h/hbjrwVkBBiTGnWeh41YGfEcFIFGb9Iabs= -k8s.io/component-base v0.0.0-20190831075413-37a093468564/go.mod h1:pB3zmhcOR5xextKMKdxRr2XUCERS2UNFA/6Tr2WmSJs= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= +honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/apiextensions-apiserver v0.17.2 h1:cP579D2hSZNuO/rZj9XFRzwJNYb41DbNANJb6Kolpss= +k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= +k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= +k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= +k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= +k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/cloud-provider v0.17.2/go.mod h1:9rEcGqEsUFHxC83oMUGBcsXTBpRVNVPX/U+nyQJTvHU= +k8s.io/cluster-bootstrap v0.17.2 h1:KVjK1WviylwbBwC+3L51xKmGN3A+WmzW8rhtcfWdUqQ= +k8s.io/cluster-bootstrap v0.17.2/go.mod h1:qiazpAM05fjAc+PEkrY8HSUhKlJSMBuLnVUSO6nvZL4= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/component-base v0.17.2 h1:0XHf+cerTvL9I5Xwn9v+0jmqzGAZI7zNydv4tL6Cw6A= +k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= +k8s.io/cri-api v0.17.2/go.mod h1:BzAkbBHHp81d+aXzbiIcUbilLkbXa40B8mUHOk6EX3s= +k8s.io/csi-translation-lib v0.17.2/go.mod h1:NrhnhXJg/V6cHRTdPbmxvBuV3rJSqXsdLBE5JSRzcVI= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0 h1:0VPpR+sizsiivjIfIAQH/rl8tan6jvWkS7lU+0di3lE= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-proxy v0.0.0-20190208174132-30e63035f31f h1:KM6Mory6jt7aNvUe0PBoHrwLQ/k0px9aTgpgMSWewaU= -k8s.io/kube-proxy v0.0.0-20190208174132-30e63035f31f/go.mod h1:wYVhqAVLhGBLbGzgb9GsBakzIddI81JxSUHANQvzZZs= -k8s.io/kubernetes v1.13.9-beta.0.0.20190726214758-e065364bfbf4 h1:AhWe+8Zwy9YVsFwpVslb27wYYMhD/Hj23Yi8cX0ElfQ= -k8s.io/kubernetes v1.13.9-beta.0.0.20190726214758-e065364bfbf4/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/kube-aggregator v0.17.2/go.mod h1:8xQTzaH0GrcKPiSB4YYWwWbeQ0j/4zRsbQt8usEMbRg= +k8s.io/kube-controller-manager v0.17.2/go.mod h1:xznSbCHdVODF5StxiBMh3s6HenyCBdsedazlsh6/J3M= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-proxy v0.17.2 h1:DuZwJ9bdsANZ9DEa5dBkPU9KpR0HU4wFkDOAWQvOpIs= +k8s.io/kube-proxy v0.17.2/go.mod h1:PVY+Cqds8qa/TLEqiSgDPgwWBiRHYjeS4kvp/C5dYjc= +k8s.io/kube-scheduler v0.17.2/go.mod h1:BlP/p3YDLgsEIshEj4gbGjV11j4BQjNx7vbwRcLGnI8= +k8s.io/kubectl v0.17.2/go.mod h1:y4rfLV0n6aPmvbRCqZQjvOp3ezxsFgpqL+zF5jH/lxk= +k8s.io/kubelet v0.17.2/go.mod h1:XUOu5Fcnkx44FP13w5etBrn2GhK4D02CUcFA8tLtUKU= +k8s.io/kubernetes v1.18.1 h1:qW6zgSY96X/NO+ueIIfsFSbHl/e0Txio62XcA4cxpIk= +k8s.io/kubernetes v1.18.1/go.mod h1:z8xjOOO1Ljz+TaHpOxVGC7cxtF32TesIamoQ+BZrVS0= +k8s.io/legacy-cloud-providers v0.17.2/go.mod h1:a/qbE67VbTzWOemWfqH0wlcX31zxt4UOxFqZuBltY9Q= +k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw= +k8s.io/repo-infra v0.0.1-alpha.1/go.mod h1:wO1t9WaB99V80ljbeENTnayuEEwNZt7gECYh/CEyOJ8= +k8s.io/sample-apiserver v0.17.2/go.mod h1:JLhi1DSBMlKAckfVdV1YNuz49EKNlfSflW+6LVDf1Mo= +k8s.io/system-validators v1.0.4/go.mod h1:HgSgTg4NAGNoYYjKsUyk52gdNi2PVDswQ9Iyn66R7NI= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200229041039-0a110f9eb7ab/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200414100711-2df71ebbae66 h1:Ly1Oxdu5p5ZFmiVT71LFgeZETvMfZ1iBIGeOenT2JeM= +k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -sigs.k8s.io/cluster-api v0.0.0-20181211193542-3547f8dd9307 h1:JZJOppRhof1HiN8OBmn7DWZKjI0QhqpOCZePcyDWP3o= -sigs.k8s.io/cluster-api v0.0.0-20181211193542-3547f8dd9307/go.mod h1:aEXstFx3krpj6/AOcV/rOP2VLKdrtSNUMDR2Kmt6YSs= -sigs.k8s.io/controller-runtime v0.1.12 h1:ovDq28E64PeY1yR+6H7DthakIC09soiDCrKvfP2tPYo= -sigs.k8s.io/controller-runtime v0.1.12/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHEHHRdJMf2jMX8= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/testing_frameworks v0.1.1 h1:cP2l8fkA3O9vekpy5Ks8mmA0NW/F7yBdXf8brkWhVrs= -sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/cluster-api v0.3.3 h1:pNuvC6cm67SbxOaPriK8ZfLl1RSjmu/KX2GJiNQH3dU= +sigs.k8s.io/cluster-api v0.3.3/go.mod h1:lgztyeCWCve8YB4DN6QeLR0blNYBvFX9+ATHrxs+zKU= +sigs.k8s.io/cluster-api v0.3.6 h1:Md//qVTwPvJFIBzQ8Mnsro1510x4UFtOyx4t6sPoDnM= +sigs.k8s.io/controller-runtime v0.5.2 h1:pyXbUfoTo+HA3jeIfr0vgi+1WtmNh0CwlcnQGLXwsSw= +sigs.k8s.io/controller-runtime v0.5.2/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= +sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802/go.mod h1:HIZ3PWUezpklcjkqpFbnYOqaqsAE1JeCTEwkgvPLXjk= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index eddc1abb..7e13c95e 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -23,7 +23,7 @@ import ( "github.com/weaveworks/wksctl/pkg/apis/wksprovider/controller/manifests" "github.com/weaveworks/wksctl/pkg/apis/wksprovider/machine/config" "github.com/weaveworks/wksctl/pkg/apis/wksprovider/machine/crds" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/plan" "github.com/weaveworks/wksctl/pkg/plan/recipe" @@ -43,8 +43,7 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" certUtil "k8s.io/client-go/util/cert" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/yaml" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) const ( @@ -535,7 +534,7 @@ func storeIfNotEmpty(vals map[string]string, key, value string) { } } -func getAPIServerArgs(providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, pemSecretResources map[string]*secretResourceSpec) map[string]string { +func getAPIServerArgs(providerSpec *baremetalspecv1.BareMetalCluster, pemSecretResources map[string]*secretResourceSpec) map[string]string { result := map[string]string{} authnResourceSpec := pemSecretResources["authentication"] if authnResourceSpec != nil { @@ -572,7 +571,7 @@ func addClusterAPICRDs(b *plan.Builder) ([]string, error) { return crdIDs, nil } -func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion string) ([]byte, error) { +func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalCluster, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion string) ([]byte, error) { nodeParams := NodeParams{ IsMaster: true, MasterIP: params.PrivateIP, @@ -621,7 +620,7 @@ func (o OS) applySeedNodePlan(p *plan.Plan) error { return nil } -func getClusterProviderSpec(manifestPath string) (*baremetalspecv1.BareMetalClusterProviderSpec, error) { +func getClusterProviderSpec(manifestPath string) (*baremetalspecv1.BareMetalCluster, error) { cluster, err := parseCluster(manifestPath) if err != nil { return nil, err @@ -646,7 +645,7 @@ func planParametersToConfigMapManifest(plan []byte, ns string) ([]byte, error) { return yaml.Marshal(cm) } -func createConfigFileResourcesFromFiles(providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, configDir, namespace string) (map[string][]byte, map[string]*v1.ConfigMap, []*resource.File, error) { +func createConfigFileResourcesFromFiles(providerSpec *baremetalspecv1.BareMetalCluster, configDir, namespace string) (map[string][]byte, map[string]*v1.ConfigMap, []*resource.File, error) { fileSpecs := providerSpec.OS.Files configMapManifests, err := getConfigMapManifests(fileSpecs, configDir, namespace) if err != nil { @@ -740,7 +739,7 @@ type secretResourceSpec struct { // directory, decrypts it using the GitHub deploy key, creates file // resources for .pem files stored in the secret, and creates a SealedSecret resource // for them that can be used by the machine actuator -func processPemFilesIfAny(builder *plan.Builder, providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, configDir string, ns, privateKeyPath, certPath string) (map[string]*secretResourceSpec, *v1.ConfigMap, []byte, error) { +func processPemFilesIfAny(builder *plan.Builder, providerSpec *baremetalspecv1.BareMetalCluster, configDir string, ns, privateKeyPath, certPath string) (map[string]*secretResourceSpec, *v1.ConfigMap, []byte, error) { if err := checkPemValues(providerSpec, privateKeyPath, certPath); err != nil { return nil, nil, nil, err } @@ -804,7 +803,7 @@ func getPrivateKey(privateKeyPath string) (*rsa.PrivateKey, error) { return privateKey, nil } -func checkPemValues(providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, privateKeyPath, certPath string) error { +func checkPemValues(providerSpec *baremetalspecv1.BareMetalCluster, privateKeyPath, certPath string) error { if privateKeyPath == "" || certPath == "" { if providerSpec.Authentication != nil || providerSpec.Authorization != nil { return errors.New("Encryption keys not specified; cannot process authentication and authorization specifications.") diff --git a/pkg/baremetalproviderspec/doc.go b/pkg/baremetal/doc.go similarity index 100% rename from pkg/baremetalproviderspec/doc.go rename to pkg/baremetal/doc.go diff --git a/pkg/baremetal/v1alpha3/doc.go b/pkg/baremetal/v1alpha3/doc.go new file mode 100644 index 00000000..0c66503c --- /dev/null +++ b/pkg/baremetal/v1alpha3/doc.go @@ -0,0 +1,5 @@ +// +k8s:deepcopy-gen=package,register +// +k8s:openapi-gen=true +// +k8s:defaulter-gen=TypeMeta + +package v1alpha3 diff --git a/pkg/baremetal/v1alpha3/register.go b/pkg/baremetal/v1alpha3/register.go new file mode 100644 index 00000000..7aa051d7 --- /dev/null +++ b/pkg/baremetal/v1alpha3/register.go @@ -0,0 +1,44 @@ +package v1alpha3 + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// +k8s:deepcopy-gen=false +type BareMetalProviderSpecCodec struct { + encoder runtime.Encoder + decoder runtime.Decoder +} + +const GroupName = "cluster.weave.works" + +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha3"} + +var ( + SchemeBuilder runtime.SchemeBuilder + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + localSchemeBuilder.Register(addKnownTypes) +} + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &BareMetalMachine{}, + &BareMetalMachineList{}, + &BareMetalCluster{}, + &BareMetalClusterList{}, + ) + return nil +} + +func NewScheme() (*runtime.Scheme, error) { + scheme := runtime.NewScheme() + if err := AddToScheme(scheme); err != nil { + return nil, err + } + return scheme, nil +} diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go new file mode 100644 index 00000000..b6051435 --- /dev/null +++ b/pkg/baremetal/v1alpha3/types.go @@ -0,0 +1,128 @@ +package v1alpha3 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +kubebuilder:object:generate=true +// +groupName=cluster.weave.works + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BareMetalCluster struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec BareMetalClusterSpec `json:"spec,omitempty"` +} + +type BareMetalClusterSpec struct { + User string `json:"user"` + DeprecatedSSHKeyPath string `json:"sshKeyPath"` + HTTPProxy string `json:"httpProxy,omitempty"` + + Authentication *AuthenticationWebhook `json:"authenticationWebhook,omitempty"` + Authorization *AuthorizationWebhook `json:"authorizationWebhook,omitempty"` + + OS OSConfig `json:"os,omitempty"` + CRI ContainerRuntime `json:"cri"` + ImageRepository string `json:"imageRepository,omitempty"` + + APIServer APIServer `json:"apiServer,omitempty"` + + KubeletArguments []ServerArgument `json:"kubeletArguments,omitempty"` + + Addons []Addon `json:"addons,omitempty"` + + CloudProvider string `json:"cloudProvider,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BareMetalClusterList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []BareMetalCluster `json:"items"` +} + +type OSConfig struct { + Files []FileSpec `json:"files,omitempty"` +} + +type FileSpec struct { + Source SourceSpec `json:"source"` + Destination string `json:"destination"` + // XXX: maybe later -- Permissions string `json:"permissions"` +} + +type SourceSpec struct { + ConfigMap string `json:"configmap"` + Key string `json:"key"` +} + +type ContainerRuntime struct { + Kind string `json:"kind"` + Package string `json:"package"` + Version string `json:"version"` +} + +type APIServer struct { + ExternalLoadBalancer string `json:"externalLoadBalancer"` + AdditionalSANs []string `json:"additionalSANs,omitempty"` + ExtraArguments []ServerArgument `json:"extraArguments,omitempty"` +} + +type ServerArgument struct { + Name string `json:"name"` + Value string `json:"value"` +} + +type AuthenticationWebhook struct { + CacheTTL string `json:"cacheTTL,omitempty"` + URL string `json:"url"` + SecretFile string `json:"secretFile"` +} + +type AuthorizationWebhook struct { + CacheAuthorizedTTL string `json:"cacheAuthorizedTTL,omitempty"` + CacheUnauthorizedTTL string `json:"cacheUnauthorizedTTL,omitempty"` + URL string `json:"url"` + SecretFile string `json:"secretFile"` +} + +// Addon describes an addon to install on the cluster. +type Addon struct { + Name string `json:"name"` + Params map[string]string `json:"params,omitempty"` + Deps []string `json:"deps,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +type BareMetalMachine struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec BareMetalMachineSpec `json:"spec,omitempty"` +} + +type BareMetalMachineSpec struct { + Address string `json:"address"` + Port uint16 `json:"port,omitempty"` + PrivateAddress string `json:"privateAddress,omitempty"` + PrivateInterface string `json:"privateInterface,omitempty"` + Private EndPoint `json:"private,omitempty"` + Public EndPoint `json:"public,omitempty"` +} + +// BareMetalMachineList contains a list of Machine +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type BareMetalMachineList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []BareMetalMachine `json:"items"` +} + +// EndPoint groups the details required to establish a connection. +type EndPoint struct { + Address string `json:"address"` + Port uint16 `json:"port"` +} diff --git a/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go new file mode 100644 index 00000000..24ca3b4d --- /dev/null +++ b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go @@ -0,0 +1,335 @@ +// +build !ignore_autogenerated + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha3 + +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServer) DeepCopyInto(out *APIServer) { + *out = *in + if in.AdditionalSANs != nil { + in, out := &in.AdditionalSANs, &out.AdditionalSANs + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServer. +func (in *APIServer) DeepCopy() *APIServer { + if in == nil { + return nil + } + out := new(APIServer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Addon) DeepCopyInto(out *Addon) { + *out = *in + if in.Params != nil { + in, out := &in.Params, &out.Params + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Deps != nil { + in, out := &in.Deps, &out.Deps + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Addon. +func (in *Addon) DeepCopy() *Addon { + if in == nil { + return nil + } + out := new(Addon) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuthenticationWebhook) DeepCopyInto(out *AuthenticationWebhook) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthenticationWebhook. +func (in *AuthenticationWebhook) DeepCopy() *AuthenticationWebhook { + if in == nil { + return nil + } + out := new(AuthenticationWebhook) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuthorizationWebhook) DeepCopyInto(out *AuthorizationWebhook) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthorizationWebhook. +func (in *AuthorizationWebhook) DeepCopy() *AuthorizationWebhook { + if in == nil { + return nil + } + out := new(AuthorizationWebhook) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalCluster) DeepCopyInto(out *BareMetalCluster) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalCluster. +func (in *BareMetalCluster) DeepCopy() *BareMetalCluster { + if in == nil { + return nil + } + out := new(BareMetalCluster) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BareMetalCluster) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalClusterList) DeepCopyInto(out *BareMetalClusterList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]BareMetalCluster, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalClusterList. +func (in *BareMetalClusterList) DeepCopy() *BareMetalClusterList { + if in == nil { + return nil + } + out := new(BareMetalClusterList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BareMetalClusterList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalClusterSpec) DeepCopyInto(out *BareMetalClusterSpec) { + *out = *in + if in.Authentication != nil { + in, out := &in.Authentication, &out.Authentication + *out = new(AuthenticationWebhook) + **out = **in + } + if in.Authorization != nil { + in, out := &in.Authorization, &out.Authorization + *out = new(AuthorizationWebhook) + **out = **in + } + in.OS.DeepCopyInto(&out.OS) + out.CRI = in.CRI + in.APIServer.DeepCopyInto(&out.APIServer) + if in.Addons != nil { + in, out := &in.Addons, &out.Addons + *out = make([]Addon, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalClusterSpec. +func (in *BareMetalClusterSpec) DeepCopy() *BareMetalClusterSpec { + if in == nil { + return nil + } + out := new(BareMetalClusterSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalMachine) DeepCopyInto(out *BareMetalMachine) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachine. +func (in *BareMetalMachine) DeepCopy() *BareMetalMachine { + if in == nil { + return nil + } + out := new(BareMetalMachine) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BareMetalMachine) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalMachineList) DeepCopyInto(out *BareMetalMachineList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]BareMetalMachine, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachineList. +func (in *BareMetalMachineList) DeepCopy() *BareMetalMachineList { + if in == nil { + return nil + } + out := new(BareMetalMachineList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BareMetalMachineList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalMachineSpec) DeepCopyInto(out *BareMetalMachineSpec) { + *out = *in + out.Private = in.Private + out.Public = in.Public +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachineSpec. +func (in *BareMetalMachineSpec) DeepCopy() *BareMetalMachineSpec { + if in == nil { + return nil + } + out := new(BareMetalMachineSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerRuntime) DeepCopyInto(out *ContainerRuntime) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerRuntime. +func (in *ContainerRuntime) DeepCopy() *ContainerRuntime { + if in == nil { + return nil + } + out := new(ContainerRuntime) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndPoint) DeepCopyInto(out *EndPoint) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndPoint. +func (in *EndPoint) DeepCopy() *EndPoint { + if in == nil { + return nil + } + out := new(EndPoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FileSpec) DeepCopyInto(out *FileSpec) { + *out = *in + out.Source = in.Source +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FileSpec. +func (in *FileSpec) DeepCopy() *FileSpec { + if in == nil { + return nil + } + out := new(FileSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OSConfig) DeepCopyInto(out *OSConfig) { + *out = *in + if in.Files != nil { + in, out := &in.Files, &out.Files + *out = make([]FileSpec, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSConfig. +func (in *OSConfig) DeepCopy() *OSConfig { + if in == nil { + return nil + } + out := new(OSConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SourceSpec) DeepCopyInto(out *SourceSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SourceSpec. +func (in *SourceSpec) DeepCopy() *SourceSpec { + if in == nil { + return nil + } + out := new(SourceSpec) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/baremetalproviderspec/register.go b/pkg/baremetalproviderspec/register.go deleted file mode 100644 index 8c46bede..00000000 --- a/pkg/baremetalproviderspec/register.go +++ /dev/null @@ -1,38 +0,0 @@ -package baremetalproviderspec - -import ( - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -var ( - SchemeBuilder runtime.SchemeBuilder - AddToScheme = SchemeBuilder.AddToScheme - localSchemeBuilder = &SchemeBuilder -) - -func init() { - localSchemeBuilder.Register(addKnownTypes) -} - -const GroupName = "baremetalproviderspec" - -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} - -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} - -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &BareMetalMachineProviderSpec{}, - ) - scheme.AddKnownTypes(SchemeGroupVersion, - &BareMetalClusterProviderSpec{}, - ) - return nil -} diff --git a/pkg/baremetalproviderspec/types.go b/pkg/baremetalproviderspec/types.go deleted file mode 100644 index 52dde18d..00000000 --- a/pkg/baremetalproviderspec/types.go +++ /dev/null @@ -1,83 +0,0 @@ -package baremetalproviderspec - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type BareMetalClusterProviderSpec struct { - metav1.TypeMeta `json:",inline"` - - User string `json:"user"` - DeprecatedSSHKeyPath string `json:"sshKeyPath"` - HTTPProxy string `json:"httpProxy,omitempty"` - - Authentication *AuthenticationWebhook `json:"authenticationWebhook,omitempty"` - Authorization *AuthorizationWebhook `json:"authorizationWebhook,omitempty"` - - ImageRepository string `json:"imageRepository,omitempty"` - - APIServer APIServer `json:"apiServer,omitempty"` - - KubeletArguments []ServerArgument `json:"kubeletArguments,omitempty"` - - Addons []Addon `json:"addons,omitempty"` -} - -type AuthenticationWebhook struct { - CacheTTL string `json:"cacheTTL,omitempty"` - WebhookClient WebhookClient `json:"client"` - WebhookServer WebhookServer `json:"server"` -} - -type AuthorizationWebhook struct { - CacheAuthorizedTTL string `json:"cacheAuthorizedTTL,omitempty"` - CacheUnauthorizedTTL string `json:"cacheUnauthorizedTTL,omitempty"` - WebhookClient WebhookClient `json:"client"` - WebhookServer WebhookServer `json:"server"` -} - -type APIServer struct { - ExternalLoadBalancer string `json:"externalLoadBalancer"` - AdditionalSANs []string `json:"additionalSANs,omitempty"` - ExtraArguments []ServerArgument `json:"extraArguments,omitempty"` -} - -type ServerArgument struct { - Name string `json:"name"` - Value string `json:"value"` -} - -type WebhookClient struct { - KeyData []byte `json:"keyData,omitempty"` - CertificateData []byte `json:"certificateData,omitempty"` -} - -type WebhookServer struct { - URL string `json:"url"` - CertificateAuthorityData []byte `json:"certificateAuthorityData,omitempty"` -} - -// Addon describes an addon to install on the cluster. -type Addon struct { - Name string `json:"name"` - Params map[string]string `json:"params,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type BareMetalMachineProviderSpec struct { - metav1.TypeMeta `json:",inline"` - - Address string `json:"address"` - Port uint16 `json:"port,omitempty"` - PrivateAddress string `json:"privateAddress,omitempty"` - PrivateInterface string `json:"privateInterface,omitempty"` - Private EndPoint `json:"private,omitempty"` - Public EndPoint `json:"public,omitempty"` -} - -// EndPoint groups the details required to establish a connection. -type EndPoint struct { - Address string `json:"address"` - Port uint16 `json:"port"` -} diff --git a/pkg/baremetalproviderspec/v1alpha1/register.go b/pkg/baremetalproviderspec/v1alpha1/register.go deleted file mode 100644 index fdf6bc33..00000000 --- a/pkg/baremetalproviderspec/v1alpha1/register.go +++ /dev/null @@ -1,115 +0,0 @@ -package v1alpha1 - -import ( - "bytes" - "fmt" - - "github.com/weaveworks/wksctl/pkg/baremetalproviderspec" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" -) - -// +k8s:deepcopy-gen=false -type BareMetalProviderSpecCodec struct { - encoder runtime.Encoder - decoder runtime.Decoder -} - -const GroupName = "baremetalproviderspec" - -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} - -var ( - SchemeBuilder runtime.SchemeBuilder - localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme -) - -func init() { - localSchemeBuilder.Register(addKnownTypes) -} - -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &BareMetalMachineProviderSpec{}, - ) - scheme.AddKnownTypes(SchemeGroupVersion, - &BareMetalClusterProviderSpec{}, - ) - return nil -} - -func NewScheme() (*runtime.Scheme, error) { - scheme := runtime.NewScheme() - if err := AddToScheme(scheme); err != nil { - return nil, err - } - if err := baremetalproviderspec.AddToScheme(scheme); err != nil { - return nil, err - } - return scheme, nil -} - -func NewCodec() (*BareMetalProviderSpecCodec, error) { - scheme, err := NewScheme() - if err != nil { - return nil, err - } - codecFactory := serializer.NewCodecFactory(scheme) - encoder, err := newEncoder(&codecFactory) - if err != nil { - return nil, err - } - codec := BareMetalProviderSpecCodec{ - encoder: encoder, - decoder: codecFactory.UniversalDecoder(SchemeGroupVersion), - } - return &codec, nil -} - -func (codec *BareMetalProviderSpecCodec) ClusterProviderFromProviderSpec(providerSpec clusterv1.ProviderSpec) (*BareMetalClusterProviderSpec, error) { - var spec BareMetalClusterProviderSpec - err := codec.DecodeFromProviderSpec(providerSpec, &spec) - if err != nil { - return nil, err - } - return &spec, nil -} - -func (codec *BareMetalProviderSpecCodec) MachineProviderFromProviderSpec(providerSpec clusterv1.ProviderSpec) (*BareMetalMachineProviderSpec, error) { - var spec BareMetalMachineProviderSpec - err := codec.DecodeFromProviderSpec(providerSpec, &spec) - if err != nil { - return nil, err - } - return &spec, nil -} - -func (codec *BareMetalProviderSpecCodec) DecodeFromProviderSpec(providerSpec clusterv1.ProviderSpec, out runtime.Object) error { - _, _, err := codec.decoder.Decode(providerSpec.Value.Raw, nil, out) - if err != nil { - return fmt.Errorf("decoding failure: %v", err) - } - return nil -} - -func (codec *BareMetalProviderSpecCodec) EncodeToProviderSpec(in runtime.Object) (*clusterv1.ProviderSpec, error) { - var buf bytes.Buffer - if err := codec.encoder.Encode(in, &buf); err != nil { - return nil, fmt.Errorf("encoding failed: %v", err) - } - return &clusterv1.ProviderSpec{ - Value: &runtime.RawExtension{Raw: buf.Bytes()}, - }, nil -} - -func newEncoder(codecFactory *serializer.CodecFactory) (runtime.Encoder, error) { - serializerInfos := codecFactory.SupportedMediaTypes() - if len(serializerInfos) == 0 { - return nil, fmt.Errorf("unable to find any serlializers") - } - encoder := codecFactory.EncoderForVersion(serializerInfos[0].Serializer, SchemeGroupVersion) - return encoder, nil -} diff --git a/pkg/baremetalproviderspec/zz_generated.deepcopy.go b/pkg/baremetalproviderspec/zz_generated.deepcopy.go deleted file mode 100644 index 294b4f35..00000000 --- a/pkg/baremetalproviderspec/zz_generated.deepcopy.go +++ /dev/null @@ -1,222 +0,0 @@ -// +build !ignore_autogenerated - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package baremetalproviderspec - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *APIServer) DeepCopyInto(out *APIServer) { - *out = *in - if in.AdditionalSANs != nil { - in, out := &in.AdditionalSANs, &out.AdditionalSANs - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServer. -func (in *APIServer) DeepCopy() *APIServer { - if in == nil { - return nil - } - out := new(APIServer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Addon) DeepCopyInto(out *Addon) { - *out = *in - if in.Params != nil { - in, out := &in.Params, &out.Params - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Addon. -func (in *Addon) DeepCopy() *Addon { - if in == nil { - return nil - } - out := new(Addon) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AuthenticationWebhook) DeepCopyInto(out *AuthenticationWebhook) { - *out = *in - in.WebhookClient.DeepCopyInto(&out.WebhookClient) - in.WebhookServer.DeepCopyInto(&out.WebhookServer) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthenticationWebhook. -func (in *AuthenticationWebhook) DeepCopy() *AuthenticationWebhook { - if in == nil { - return nil - } - out := new(AuthenticationWebhook) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AuthorizationWebhook) DeepCopyInto(out *AuthorizationWebhook) { - *out = *in - in.WebhookClient.DeepCopyInto(&out.WebhookClient) - in.WebhookServer.DeepCopyInto(&out.WebhookServer) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthorizationWebhook. -func (in *AuthorizationWebhook) DeepCopy() *AuthorizationWebhook { - if in == nil { - return nil - } - out := new(AuthorizationWebhook) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BareMetalClusterProviderSpec) DeepCopyInto(out *BareMetalClusterProviderSpec) { - *out = *in - out.TypeMeta = in.TypeMeta - if in.Authentication != nil { - in, out := &in.Authentication, &out.Authentication - *out = new(AuthenticationWebhook) - (*in).DeepCopyInto(*out) - } - if in.Authorization != nil { - in, out := &in.Authorization, &out.Authorization - *out = new(AuthorizationWebhook) - (*in).DeepCopyInto(*out) - } - in.APIServer.DeepCopyInto(&out.APIServer) - if in.Addons != nil { - in, out := &in.Addons, &out.Addons - *out = make([]Addon, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalClusterProviderSpec. -func (in *BareMetalClusterProviderSpec) DeepCopy() *BareMetalClusterProviderSpec { - if in == nil { - return nil - } - out := new(BareMetalClusterProviderSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *BareMetalClusterProviderSpec) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BareMetalMachineProviderSpec) DeepCopyInto(out *BareMetalMachineProviderSpec) { - *out = *in - out.TypeMeta = in.TypeMeta - out.Private = in.Private - out.Public = in.Public - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachineProviderSpec. -func (in *BareMetalMachineProviderSpec) DeepCopy() *BareMetalMachineProviderSpec { - if in == nil { - return nil - } - out := new(BareMetalMachineProviderSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *BareMetalMachineProviderSpec) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndPoint) DeepCopyInto(out *EndPoint) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndPoint. -func (in *EndPoint) DeepCopy() *EndPoint { - if in == nil { - return nil - } - out := new(EndPoint) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WebhookClient) DeepCopyInto(out *WebhookClient) { - *out = *in - if in.KeyData != nil { - in, out := &in.KeyData, &out.KeyData - *out = make([]byte, len(*in)) - copy(*out, *in) - } - if in.CertificateData != nil { - in, out := &in.CertificateData, &out.CertificateData - *out = make([]byte, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookClient. -func (in *WebhookClient) DeepCopy() *WebhookClient { - if in == nil { - return nil - } - out := new(WebhookClient) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *WebhookServer) DeepCopyInto(out *WebhookServer) { - *out = *in - if in.CertificateAuthorityData != nil { - in, out := &in.CertificateAuthorityData, &out.CertificateAuthorityData - *out = make([]byte, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookServer. -func (in *WebhookServer) DeepCopy() *WebhookServer { - if in == nil { - return nil - } - out := new(WebhookServer) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/specs/specs.go b/pkg/specs/specs.go index fd302de2..9e00b4c3 100644 --- a/pkg/specs/specs.go +++ b/pkg/specs/specs.go @@ -7,12 +7,12 @@ import ( yaml "github.com/ghodss/yaml" log "github.com/sirupsen/logrus" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/utilities" "k8s.io/apimachinery/pkg/util/validation/field" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - apierrors "sigs.k8s.io/cluster-api/pkg/errors" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + apierrors "sigs.k8s.io/cluster-api/errors" ) // Utilities for managing cluster and machine specs. diff --git a/pkg/specs/validation.go b/pkg/specs/validation.go index 484aabe4..2f88ac5e 100644 --- a/pkg/specs/validation.go +++ b/pkg/specs/validation.go @@ -10,9 +10,9 @@ import ( log "github.com/sirupsen/logrus" "github.com/weaveworks/launcher/pkg/kubectl" "github.com/weaveworks/wksctl/pkg/addons" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "k8s.io/apimachinery/pkg/util/validation/field" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) func clusterPath(args ...string) *field.Path { diff --git a/pkg/specs/validation_test.go b/pkg/specs/validation_test.go index 6107f776..4413cc7b 100644 --- a/pkg/specs/validation_test.go +++ b/pkg/specs/validation_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/assert" "k8s.io/apimachinery/pkg/util/validation/field" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) const clusterMinimumValid = ` diff --git a/pkg/utilities/manifest/manifest.go b/pkg/utilities/manifest/manifest.go index 45c860cb..cfacbc11 100644 --- a/pkg/utilities/manifest/manifest.go +++ b/pkg/utilities/manifest/manifest.go @@ -9,7 +9,7 @@ import ( "sync" "github.com/pkg/errors" - bmv1alpha1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + bmv1alpha3 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "gopkg.in/oleiade/reflections.v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/client-go/kubernetes/scheme" - clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" "sigs.k8s.io/yaml" ) @@ -26,7 +26,7 @@ var mutex *sync.Mutex = &sync.Mutex{} // cluster-api types const ( GroupName = "sigs.k8s.io" - GroupVersion = "v1alpha1" + GroupVersion = "v1alpha3" DefaultNamespace = `weavek8sops` ) @@ -38,14 +38,14 @@ var AddToScheme = SchemeBuilder.AddToScheme func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, - &clusterv1alpha1.Cluster{}, - &clusterv1alpha1.ClusterList{}, - &clusterv1alpha1.Machine{}, - &clusterv1alpha1.MachineList{}, + &clusterv1alpha3.Cluster{}, + &clusterv1alpha3.ClusterList{}, + &clusterv1alpha3.Machine{}, + &clusterv1alpha3.MachineList{}, ) - scheme.AddKnownTypes(bmv1alpha1.SchemeGroupVersion, - &bmv1alpha1.BareMetalClusterProviderSpec{}, - &bmv1alpha1.BareMetalMachineProviderSpec{}, + scheme.AddKnownTypes(bmv1alpha3.SchemeGroupVersion, + &bmv1alpha3.BareMetalCluster{}, + &bmv1alpha3.BareMetalMachine{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil @@ -56,7 +56,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { //Returns the updated manifest or an error if there was a problem updating the manifest. func WithNamespace(fileOrString, namespace string) (string, error) { mutex.Lock() - clusterv1alpha1.AddToScheme(scheme.Scheme) + clusterv1alpha3.AddToScheme(scheme.Scheme) mutex.Unlock() content, err := Content(fileOrString) From ee1264f80b42e86d8546456b3ceaacbe5e6524d1 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:44:31 +0000 Subject: [PATCH 02/72] Update install_plans for v1alpha3 --- pkg/plan/recipe/install_plans.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/plan/recipe/install_plans.go b/pkg/plan/recipe/install_plans.go index b2f698a9..7e1f733b 100644 --- a/pkg/plan/recipe/install_plans.go +++ b/pkg/plan/recipe/install_plans.go @@ -7,7 +7,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/weaveworks/wksctl/pkg/apis/wksprovider/controller/manifests" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/plan" "github.com/weaveworks/wksctl/pkg/plan/resource" "github.com/weaveworks/wksctl/pkg/utilities/envcfg" From ac67cd8d8f4a26e9f96c15727b7725fe9e3c58eb Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:21:36 +0000 Subject: [PATCH 03/72] Update runners/ssh for v1alpha3 --- pkg/plan/runners/ssh/ssh.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/plan/runners/ssh/ssh.go b/pkg/plan/runners/ssh/ssh.go index 97b534a1..ec77d99d 100644 --- a/pkg/plan/runners/ssh/ssh.go +++ b/pkg/plan/runners/ssh/ssh.go @@ -9,7 +9,7 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" - "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/plan" sshutil "github.com/weaveworks/wksctl/pkg/utilities/ssh" "golang.org/x/crypto/ssh" @@ -36,7 +36,7 @@ var _ plan.Runner = &Client{} const tcp = "tcp" -func NewClientForMachine(m *v1alpha1.BareMetalMachineProviderSpec, user, keyPath string, printOutputs bool) (*Client, error) { +func NewClientForMachine(m *v1alpha3.BareMetalMachineSpec, user, keyPath string, printOutputs bool) (*Client, error) { var ip string var port uint16 if m.Public.Address != "" { From be9f1bdce54ce5a5d4667537a25d7ab902b08614 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 23 Apr 2020 10:56:19 +0000 Subject: [PATCH 04/72] Deal with changes in upstream Sealed Secrets API --- pkg/apis/wksprovider/machine/os/os.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index 7e13c95e..2d9e8f2c 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -17,6 +17,7 @@ import ( "time" ssv1alpha1 "github.com/bitnami-labs/sealed-secrets/pkg/apis/sealed-secrets/v1alpha1" + "github.com/bitnami-labs/sealed-secrets/pkg/crypto" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/weaveworks/wksctl/pkg/addons" @@ -41,7 +42,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - certUtil "k8s.io/client-go/util/cert" + "k8s.io/client-go/util/keyutil" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) @@ -792,7 +793,7 @@ func getPrivateKey(privateKeyPath string) (*rsa.PrivateKey, error) { if err != nil { return nil, errors.Wrap(err, "Could not read private key") } - privateKeyData, err := certUtil.ParsePrivateKeyPEM(privateKeyBytes) + privateKeyData, err := keyutil.ParsePrivateKeyPEM(privateKeyBytes) if err != nil { return nil, err } @@ -858,9 +859,14 @@ func processSecret(b *plan.Builder, key *rsa.PrivateKey, configDir, secretFileNa if err != nil { return nil, "", nil, err } + fingerprint, err := crypto.PublicKeyFingerprint(&key.PublicKey) + if err != nil { + return nil, "", nil, err + } + keys := map[string]*rsa.PrivateKey{fingerprint: key} switch s := object.(type) { case *ssv1alpha1.SealedSecret: - secret, err := s.Unseal(scheme.Codecs, key) + secret, err := s.Unseal(scheme.Codecs, keys) if err != nil { return nil, "", nil, errors.Wrap(err, "Could not unseal auth secret") } From 37ec1de24c9a8c8d1fec67d5cbd6b213c525c55f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 23 Apr 2020 11:01:20 +0000 Subject: [PATCH 05/72] Deal with upstream change in kube-proxy config --- pkg/apis/wksprovider/machine/config/kubeproxy/kubeproxy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/wksprovider/machine/config/kubeproxy/kubeproxy.go b/pkg/apis/wksprovider/machine/config/kubeproxy/kubeproxy.go index a060139f..c13afa09 100644 --- a/pkg/apis/wksprovider/machine/config/kubeproxy/kubeproxy.go +++ b/pkg/apis/wksprovider/machine/config/kubeproxy/kubeproxy.go @@ -17,7 +17,7 @@ func NewConfig(conntrackMax int32) *kubeproxycfg.KubeProxyConfiguration { APIVersion: kubeproxycfg.SchemeGroupVersion.String(), }, Conntrack: kubeproxycfg.KubeProxyConntrackConfiguration{ - Max: pointer.Int32Ptr(conntrackMax), + MaxPerCore: pointer.Int32Ptr(conntrackMax), }, } } From 0db4f1864c17acc2e293cd663240262528286d5e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 23 Apr 2020 11:03:18 +0000 Subject: [PATCH 06/72] Deal with upstream changes in cordon helper --- pkg/kubernetes/drain/cordon.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubernetes/drain/cordon.go b/pkg/kubernetes/drain/cordon.go index 9415859b..1acd42cf 100644 --- a/pkg/kubernetes/drain/cordon.go +++ b/pkg/kubernetes/drain/cordon.go @@ -85,7 +85,7 @@ func (c *CordonHelper) IsUpdateRequired() bool { // JSON, or if either patch or update calls fail; it will also return a second error // whenever creating a patch has failed func (c *CordonHelper) PatchOrReplace(clientset kubernetes.Interface) (error, error) { - client := clientset.Core().Nodes() + client := clientset.CoreV1().Nodes() oldData, err := json.Marshal(c.node) if err != nil { From 02065fd51062d631e96dcf65a3a3b8051176bb8e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:13:13 +0000 Subject: [PATCH 07/72] Update os handling for extra 'spec' struct --- pkg/apis/wksprovider/machine/os/os.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index 2d9e8f2c..919cdeeb 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -234,7 +234,7 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { return nil, err } // Get configuration file resources from config map manifests referenced by the cluster spec - configMapManifests, configMaps, configFileResources, err := createConfigFileResourcesFromFiles(providerSpec, params.ConfigDirectory, params.Namespace) + configMapManifests, configMaps, configFileResources, err := createConfigFileResourcesFromFiles(&cluster.Spec, params.ConfigDirectory, params.Namespace) if err != nil { return nil, err } @@ -247,18 +247,18 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { configRes := recipe.BuildConfigPlan(configFileResources) b.AddResource("install:config", configRes, plan.DependOn("install:base")) - pemSecretResources, authConfigMap, authConfigManifest, err := processPemFilesIfAny(b, providerSpec, params.ConfigDirectory, params.Namespace, params.SealedSecretKeyPath, params.SealedSecretCertPath) + pemSecretResources, authConfigMap, authConfigManifest, err := processPemFilesIfAny(b, &cluster.Spec, params.ConfigDirectory, params.Namespace, params.SealedSecretKeyPath, params.SealedSecretCertPath) if err != nil { return nil, err } - criRes := recipe.BuildCRIPlan(&providerSpec.CRI, cfg, o.PkgType) + criRes := recipe.BuildCRIPlan(&cluster.Spec.CRI, cfg, o.PkgType) b.AddResource("install:cri", criRes, plan.DependOn("install:config")) k8sRes := recipe.BuildK8SPlan(kubernetesVersion, params.KubeletConfig.NodeIP, cfg.SELinuxInstalled, cfg.SetSELinuxPermissive, cfg.DisableSwap, cfg.LockYUMPkgs, o.PkgType, params.KubeletConfig.CloudProvider, params.KubeletConfig.ExtraArguments) b.AddResource("install:k8s", k8sRes, plan.DependOn("install:cri")) - apiServerArgs := getAPIServerArgs(providerSpec, pemSecretResources) + apiServerArgs := getAPIServerArgs(&cluster.Spec, pemSecretResources) controlPlaneEndpointIP := params.ExternalLoadBalancer if controlPlaneEndpointIP == "" { @@ -337,7 +337,7 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { // Create a config map containing a standard node plan for the seed node so the controller can add it // to the seed node as an annotation. Otherwise, we won't be able to determine if the seed node is changed // in a later update (this removes a dependency on flux) - seedNodePlanConfigMapManifest, err := o.createSeedNodePlanConfigMapManifest(params, providerSpec, configMaps, authConfigMap, kubernetesVersion) + seedNodePlanConfigMapManifest, err := o.createSeedNodePlanConfigMapManifest(params, &cluster.Spec, configMaps, authConfigMap, kubernetesVersion, kubernetesNamespace) if err != nil { return nil, err } @@ -535,7 +535,7 @@ func storeIfNotEmpty(vals map[string]string, key, value string) { } } -func getAPIServerArgs(providerSpec *baremetalspecv1.BareMetalCluster, pemSecretResources map[string]*secretResourceSpec) map[string]string { +func getAPIServerArgs(providerSpec *baremetalspecv1.BareMetalClusterSpec, pemSecretResources map[string]*secretResourceSpec) map[string]string { result := map[string]string{} authnResourceSpec := pemSecretResources["authentication"] if authnResourceSpec != nil { @@ -572,7 +572,7 @@ func addClusterAPICRDs(b *plan.Builder) ([]string, error) { return crdIDs, nil } -func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalCluster, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion string) ([]byte, error) { +func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalClusterSpec, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion, kubernetesNamespace string) ([]byte, error) { nodeParams := NodeParams{ IsMaster: true, MasterIP: params.PrivateIP, @@ -646,7 +646,7 @@ func planParametersToConfigMapManifest(plan []byte, ns string) ([]byte, error) { return yaml.Marshal(cm) } -func createConfigFileResourcesFromFiles(providerSpec *baremetalspecv1.BareMetalCluster, configDir, namespace string) (map[string][]byte, map[string]*v1.ConfigMap, []*resource.File, error) { +func createConfigFileResourcesFromFiles(providerSpec *baremetalspecv1.BareMetalClusterSpec, configDir, namespace string) (map[string][]byte, map[string]*v1.ConfigMap, []*resource.File, error) { fileSpecs := providerSpec.OS.Files configMapManifests, err := getConfigMapManifests(fileSpecs, configDir, namespace) if err != nil { @@ -740,7 +740,7 @@ type secretResourceSpec struct { // directory, decrypts it using the GitHub deploy key, creates file // resources for .pem files stored in the secret, and creates a SealedSecret resource // for them that can be used by the machine actuator -func processPemFilesIfAny(builder *plan.Builder, providerSpec *baremetalspecv1.BareMetalCluster, configDir string, ns, privateKeyPath, certPath string) (map[string]*secretResourceSpec, *v1.ConfigMap, []byte, error) { +func processPemFilesIfAny(builder *plan.Builder, providerSpec *baremetalspecv1.BareMetalClusterSpec, configDir string, ns, privateKeyPath, certPath string) (map[string]*secretResourceSpec, *v1.ConfigMap, []byte, error) { if err := checkPemValues(providerSpec, privateKeyPath, certPath); err != nil { return nil, nil, nil, err } @@ -804,7 +804,7 @@ func getPrivateKey(privateKeyPath string) (*rsa.PrivateKey, error) { return privateKey, nil } -func checkPemValues(providerSpec *baremetalspecv1.BareMetalCluster, privateKeyPath, certPath string) error { +func checkPemValues(providerSpec *baremetalspecv1.BareMetalClusterSpec, privateKeyPath, certPath string) error { if privateKeyPath == "" || certPath == "" { if providerSpec.Authentication != nil || providerSpec.Authorization != nil { return errors.New("Encryption keys not specified; cannot process authentication and authorization specifications.") @@ -1321,13 +1321,13 @@ func parseAddons(ClusterManifestPath, namespace string, addonNamespaces map[stri log.Fatal("Failed to parse cluster manifest: ", err) } ret := make(map[string][][]byte) - for _, addonDesc := range clusterSpec.Addons { + for _, addonDesc := range cluster.Spec.Addons { log.WithField("addon", addonDesc.Name).Debug("building addon") addonNs := namespace if ns, ok := addonNamespaces[addonDesc.Name]; ok { addonNs = ns } - retManifests, err := buildAddon(addonDesc, clusterSpec.ImageRepository, ClusterManifestPath, addonNs) + retManifests, err := buildAddon(addonDesc, cluster.Spec.ImageRepository, ClusterManifestPath, addonNs) if err != nil { return nil, err } From 8058852362997410966c2df6d06a4d08a0466b3e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 21 Apr 2020 14:29:45 +0000 Subject: [PATCH 08/72] Update machine package to v1alpha3 Many things have changed: - Where we had a List of Machine, we now have a YAML stream, i.e. multiple documents separated by --- - Where we had a single struct, we must deal with a ClusterAPI struct and a provider-specific struct Fix up ParseAndDefaultAndValidate to return both cluster structs --- pkg/cluster/machine/machine.go | 225 ++++++----- pkg/cluster/machine/machine_test.go | 371 ++++++++---------- pkg/cluster/machine/machines_manifest.go | 4 +- pkg/cluster/machine/machines_manifest_test.go | 6 +- 4 files changed, 296 insertions(+), 310 deletions(-) diff --git a/pkg/cluster/machine/machine.go b/pkg/cluster/machine/machine.go index bc8728fd..8e07d4a0 100644 --- a/pkg/cluster/machine/machine.go +++ b/pkg/cluster/machine/machine.go @@ -1,24 +1,20 @@ package machine import ( - "errors" + "context" "fmt" "io" - "io/ioutil" "os" "github.com/blang/semver" - yaml "github.com/ghodss/yaml" log "github.com/sirupsen/logrus" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/kubernetes" "github.com/weaveworks/wksctl/pkg/utilities/manifest" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation/field" - clientcmd "sigs.k8s.io/cluster-api/cmd/clusterctl/clientcmd" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - apierrors "sigs.k8s.io/cluster-api/pkg/errors" - clusterutil "sigs.k8s.io/cluster-api/pkg/util" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + clusteryaml "sigs.k8s.io/cluster-api/util/yaml" + "sigs.k8s.io/controller-runtime/pkg/client" ) // IsMaster returns true if the provided machine is a "Master", and false @@ -43,13 +39,15 @@ func IsNode(machine *clusterv1.Machine) bool { // FirstMaster scans the provided array of machines and return the first // one which is a "Master" or nil if none. -func FirstMaster(machines []*clusterv1.Machine) *clusterv1.Machine { - for _, machine := range machines { +// Machines and BareMetalMachines must be in the same order +func FirstMaster(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) (*clusterv1.Machine, *baremetalspecv1.BareMetalMachine) { + // TODO: validate size and ordering of lists + for i, machine := range machines { if IsMaster(machine) { - return machine + return machine, bl[i] } } - return nil + return nil, nil } // FirstMasterInArray scans the provided array of machines and return the first @@ -63,52 +61,49 @@ func FirstMasterInArray(machines []clusterv1.Machine) *clusterv1.Machine { return nil } -// Config returns the provided machine's configuration. -func Config(machine *clusterv1.Machine) (*baremetalspecv1.BareMetalMachineProviderSpec, error) { - codec, err := baremetalspecv1.NewCodec() - if err != nil { - return nil, err - } - machineSpec, err := codec.MachineProviderFromProviderSpec(machine.Spec.ProviderSpec) - if err != nil { - return nil, apierrors.InvalidMachineConfiguration("Cannot unmarshal machine's providerSpec field: %v", err) - } - return machineSpec, err -} - // ParseManifest parses the provided machines manifest file. -func ParseManifest(file string) ([]*clusterv1.Machine, error) { +func ParseManifest(file string) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine, err error) { f, err := os.Open(file) if err != nil { - return nil, err + return nil, nil, err } return Parse(f) } // Parse parses the provided machines io.Reader. -func Parse(r io.Reader) ([]*clusterv1.Machine, error) { - bytes, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - - list := &clusterv1.MachineList{} - err = yaml.Unmarshal(bytes, &list) - if err != nil { - return nil, err - } +func Parse(r io.ReadCloser) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine, err error) { + decoder := clusteryaml.NewYAMLDecoder(r) + defer decoder.Close() + + for { + obj, _, err := decoder.Decode(nil, nil) + if err == io.EOF { + break + } else if err != nil { + return nil, nil, err + } - if list == nil { - return []*clusterv1.Machine{}, nil + switch v := obj.(type) { + case *clusterv1.Machine: + ml = append(ml, v) + case *baremetalspecv1.BareMetalMachine: + bl = append(bl, v) + default: + return nil, nil, fmt.Errorf("unexpected type %T", v) + } } - return clusterutil.MachineP(list.Items), nil + return ml, bl, nil } type machineValidationFunc func(int, *clusterv1.Machine) field.ErrorList // Validate validates the provided machines. -func Validate(machines []*clusterv1.Machine) field.ErrorList { +func Validate(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) field.ErrorList { + if len(machines) == 0 { // Some other validations crash on empty list + return field.ErrorList{nonFieldError("no machines")} + } + var errors field.ErrorList // Run global validation functions that operate on the full list of machines. @@ -120,9 +115,28 @@ func Validate(machines []*clusterv1.Machine) field.ErrorList { errors = append(errors, f(machines)...) } + // Check 1-1 correspondence between lists + if len(machines) != len(bl) { + errors = append(errors, nonFieldError("mismatch: %d Machines and %d BareMetalMachines", len(machines), len(bl))) + } else { + // TODO: what if the user has a mixture of our machines and someone else's? + for i, m := range machines { + ref := m.Spec.InfrastructureRef + if ref.Name != bl[i].ObjectMeta.Name { + errors = append(errors, nonFieldError("mismatch [%d]: reference %q != %q", i, ref.Name, bl[i].ObjectMeta.Name)) + } + } + } + return errors } +// Map an error which can't be expressed as a single-field error into one, +// TODO: fix the rest of the code which assumes all errors are field errors +func nonFieldError(format string, args ...interface{}) *field.Error { + return field.Invalid(field.NewPath("spec"), "[...]", fmt.Sprintf(format, args...)) +} + func machinePath(i int, args ...string) *field.Path { return field.NewPath(fmt.Sprintf("machines[%d]", i), args...) } @@ -142,8 +156,8 @@ func validateAtLeastOneMaster(machines []*clusterv1.Machine) field.ErrorList { if numMasters == 0 { return field.ErrorList{ field.Invalid( - field.NewPath("spec", "versions", "controlPlane"), - machines[0].Spec.Versions.ControlPlane, + field.NewPath("metadata", "labels", "set"), + "", "no master node defined, need at least one master"), } } @@ -159,22 +173,28 @@ func validateAtLeastOneMaster(machines []*clusterv1.Machine) field.ErrorList { // (and they can't be left empty) func validateVersions(machines []*clusterv1.Machine) field.ErrorList { var errors field.ErrorList - reference := machines[0].Spec.Versions.Kubelet + reference := machines[0].Spec.Version for i, m := range machines { - if m.Spec.Versions.Kubelet != reference { - errors = append(errors, field.Invalid( - machinePath(i, "spec", "versions", "kubelet"), - m.Spec.Versions.Kubelet, - fmt.Sprintf("inconsistent kubelet version, expected \"%s\"", reference))) - } - - controlPlaneVersion := m.Spec.Versions.ControlPlane - if IsMaster(m) && controlPlaneVersion != "" && controlPlaneVersion != reference { - errors = append(errors, field.Invalid( - machinePath(i, "spec", "versions", "controlPlane"), - m.Spec.Versions.ControlPlane, - fmt.Sprintf("inconsistent controlPlane version, expected \"%s\"", reference))) + if reference == nil { + if m.Spec.Version != nil { + errors = append(errors, field.Invalid( + machinePath(i, "spec", "version"), + m.Spec.Version, + fmt.Sprintf("inconsistent kubernetes version, expected nil"))) + } + } else { + if m.Spec.Version == nil { + errors = append(errors, field.Invalid( + machinePath(i, "spec", "version"), + nil, + fmt.Sprintf("inconsistent kubernetes version, expected %q", *reference))) + } else if *reference != *m.Spec.Version { + errors = append(errors, field.Invalid( + machinePath(i, "spec", "version"), + *m.Spec.Version, + fmt.Sprintf("inconsistent kubernetes version, expected %q", *reference))) + } } } @@ -186,17 +206,17 @@ func validateVersions(machines []*clusterv1.Machine) field.ErrorList { // per-machine test to not repeat the validation errors many times if the // specified versions don't match the ranges. func validateKubernetesVersion(machines []*clusterv1.Machine) field.ErrorList { - s := machines[0].Spec.Versions.Kubelet - if s == "" { + s := machines[0].Spec.Version + if s == nil { return field.ErrorList{} } - version, err := semver.ParseTolerant(s) + version, err := semver.ParseTolerant(*s) if err != nil { return field.ErrorList{ field.Invalid( - machinePath(0, "spec", "versions", "kubelet"), - machines[0].Spec.Versions.Kubelet, + machinePath(0, "spec", "version"), + machines[0].Spec.Version, "version isn't a semver version"), } } @@ -209,8 +229,8 @@ func validateKubernetesVersion(machines []*clusterv1.Machine) field.ErrorList { if !r(version) { return field.ErrorList{ field.Invalid( - machinePath(0, "spec", "versions", "kubelet"), - machines[0].Spec.Versions.Kubelet, + machinePath(0, "spec", "version"), + machines[0].Spec.Version, fmt.Sprintf("version doesn't match range: %s", ranges[i])), } } @@ -224,13 +244,11 @@ type machinePopulateFunc func(*clusterv1.Machine) func populateVersions(m *clusterv1.Machine) { // We have already validated the version fields are either all empty or have // the same value. Only populate them if they are empty. - if m.Spec.Versions.Kubelet != "" { + if m.Spec.Version != nil { return } - m.Spec.Versions.Kubelet = kubernetes.DefaultVersion - if IsMaster(m) { - m.Spec.Versions.ControlPlane = kubernetes.DefaultVersion - } + versionCopy := kubernetes.DefaultVersion + m.Spec.Version = &versionCopy } // Kubeadm adds the master role label, but not the node one. Add it ourselves so @@ -260,7 +278,7 @@ func Populate(machines []*clusterv1.Machine) { // InvalidMachinesHandler encapsulates logic to apply in case of an invalid // machines manifest being provided. -type InvalidMachinesHandler = func(machines []*clusterv1.Machine, errors field.ErrorList) ([]*clusterv1.Machine, error) +type InvalidMachinesHandler = func(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine, errors field.ErrorList) ([]*clusterv1.Machine, []*baremetalspecv1.BareMetalMachine, error) // NoOpInvalidMachinesHandler does nothing when an invalid machines manifest // is being provided. @@ -270,38 +288,45 @@ var NoOpInvalidMachinesHandler = func(machines []*clusterv1.Machine, errors fiel // ParseAndDefaultAndValidate parses the provided manifest, validates it and // defaults values where possible. -func ParseAndDefaultAndValidate(machinesManifestPath string, errorsHandler InvalidMachinesHandler) ([]*clusterv1.Machine, error) { - machines, err := ParseManifest(machinesManifestPath) +func ParseAndDefaultAndValidate(machinesManifestPath string, errorsHandler InvalidMachinesHandler) ([]*clusterv1.Machine, []*baremetalspecv1.BareMetalMachine, error) { + machines, bl, err := ParseManifest(machinesManifestPath) if err != nil { - return nil, err + return nil, nil, err } Populate(machines) - errors := Validate(machines) - return errorsHandler(machines, errors) + errors := Validate(machines, bl) + return errorsHandler(machines, bl, errors) } // GetKubernetesVersionFromManifest reads the version of the Kubernetes control // plane from the provided machines' manifest. If no version is configured, the // default Kubernetes version will be returned. -func GetKubernetesVersionFromManifest(machinesManifestPath string) (string, error) { - machines, err := ParseManifest(machinesManifestPath) +func GetKubernetesVersionFromManifest(machinesManifestPath string) (string, string, error) { + machines, bl, err := ParseManifest(machinesManifestPath) if err != nil { - return "", err + return "", "", err } - return GetKubernetesVersionFromMasterIn(machines) + return GetKubernetesVersionFromMasterIn(machines, bl) } // GetKubernetesVersionFromMasterIn reads the version of the Kubernetes control // plane from the provided machines. If no version is configured, the default // Kubernetes version will be returned. -func GetKubernetesVersionFromMasterIn(machines []*clusterv1.Machine) (string, error) { +func GetKubernetesVersionFromMasterIn(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) (string, string, error) { // Ensures all machines have the same version (either specified or empty): - errs := Validate(machines) + errs := Validate(machines, bl) if len(errs) > 0 { - return "", errs.ToAggregate() + return "", "", errs.ToAggregate() + } + machine, _ := FirstMaster(machines, bl) + version := GetKubernetesVersion(machine) + ns := machine.ObjectMeta.Namespace + if ns == "" { + ns = manifest.DefaultNamespace } - return GetKubernetesVersion(FirstMaster(machines)), nil + log.WithField("machine", machine.Name).WithField("version", version).WithField("namespace", ns).Debug("Kubernetes version used") + return version, ns, nil } // GetKubernetesVersion reads the Kubernetes version of the provided machine, @@ -310,38 +335,24 @@ func GetKubernetesVersion(machine *clusterv1.Machine) string { if machine == nil { return kubernetes.DefaultVersion } - version := getKubernetesVersion(machine) - log.WithField("machine", machine.Name).WithField("version", version).Debug("Kubernetes version used") - return version + return getKubernetesVersion(machine) } func getKubernetesVersion(machine *clusterv1.Machine) string { - if machine.Spec.Versions.ControlPlane != "" { - return machine.Spec.Versions.ControlPlane - } - log.WithField("machine", machine.Name).Debug("No Kubernetes control plane version configured in manifest, falling back to kubelet version") - if machine.Spec.Versions.Kubelet != "" { - return machine.Spec.Versions.Kubelet + if machine.Spec.Version != nil { + return *machine.Spec.Version } - log.WithField("machine", machine.Name).WithField("defaultVersion", kubernetes.DefaultVersion).Debug("No kubelet version configured in manifest, falling back to default") + log.WithField("machine", machine.Name).WithField("defaultVersion", kubernetes.DefaultVersion).Debug("No kubernetes version configured in manifest, falling back to default") return kubernetes.DefaultVersion } // GetKubernetesNamespaceFromMachines reads the namespace of the Kubernetes control // plane from the applied machines. If no namespace is found, the // default Kubernetes namespace will be returned. -func GetKubernetesNamespaceFromMachines() (string, error) { - cs, err := clientcmd.NewClusterApiClientForDefaultSearchPath("", clientcmd.NewConfigOverrides()) - if err != nil { - return "", err - } - client := cs.ClusterV1alpha1() - mi := client.Machines("") - if mi == nil { - return "", errors.New("No MachineInterface found") - } - mlist, err := mi.List(v1.ListOptions{}) - if err != nil { +func GetKubernetesNamespaceFromMachines(ctx context.Context, c client.Client) (string, error) { + mlist := &clusterv1.MachineList{} + + if err := c.List(ctx, mlist); err != nil { return "", err } for _, m := range mlist.Items { diff --git a/pkg/cluster/machine/machine_test.go b/pkg/cluster/machine/machine_test.go index fafb3247..b992271a 100644 --- a/pkg/cluster/machine/machine_test.go +++ b/pkg/cluster/machine/machine_test.go @@ -1,15 +1,20 @@ package machine_test import ( + "fmt" + "io/ioutil" "strings" "testing" "github.com/stretchr/testify/assert" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/kubernetes" + "github.com/weaveworks/wksctl/pkg/utilities/manifest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation/field" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "k8s.io/client-go/kubernetes/scheme" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) var master = clusterv1.Machine{ @@ -39,14 +44,18 @@ func TestIsNode(t *testing.T) { } func TestFirstMasterInPointersArray(t *testing.T) { - assert.Equal(t, master, *machine.FirstMaster([]*clusterv1.Machine{ + bl := []*baremetalspecv1.BareMetalMachine{nil, nil} + v1, _ := machine.FirstMaster([]*clusterv1.Machine{ &worker, &master, - })) - assert.Nil(t, machine.FirstMaster([]*clusterv1.Machine{ + }, bl) + assert.Equal(t, &master, v1) + v2, _ := machine.FirstMaster([]*clusterv1.Machine{ &worker, - })) - assert.Nil(t, machine.FirstMaster([]*clusterv1.Machine{})) + }, bl) + assert.Nil(t, v2) + v3, _ := machine.FirstMaster([]*clusterv1.Machine{}, bl) + assert.Nil(t, v3) } func TestFirstMasterInArray(t *testing.T) { @@ -60,198 +69,157 @@ func TestFirstMasterInArray(t *testing.T) { assert.Nil(t, machine.FirstMasterInArray([]clusterv1.Machine{})) } -const machinesValid = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" +const machinesValid = ` + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: master-0 labels: set: master spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.14.12" - controlPlane: "1.14.12" -- apiVersion: "cluster.k8s.io/v1alpha1" - kind: Machine + infrastructureRef: + kind: BareMetalMachine + name: master-0 + version: "1.14.12" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" metadata: - generateName: node- - labels: - set: node + name: master-0 spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - authenticationWebhook: - cacheTTL: 2m0s - server: - url: http://127.0.0.1:5000/authenticate - versions: - kubelet: "1.14.12" -` - -const machinesValidWithOnlyKubeletVersion = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" + address: "172.17.8.101" +--- + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: node-0 labels: - set: master + set: node spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.14.12" -- apiVersion: "cluster.k8s.io/v1alpha1" - kind: Machine + infrastructureRef: + kind: BareMetalMachine + name: node-0 + version: "1.14.12" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" metadata: - generateName: node- - labels: - set: node + name: node-0 spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - authenticationWebhook: - cacheTTL: 2m0s - server: - url: http://127.0.0.1:5000/authenticate - versions: - kubelet: "1.14.12" + address: "172.17.8.102" + authenticationWebhook: + cacheTTL: 2m0s + server: + url: http://127.0.0.1:5000/authenticate ` -// A machine doesn't have a matching Kubelet version. -const machinesInconsistentKubeletVersion = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" +// A machine doesn't have a matching Kubernetes version. +const machinesInconsistentKubeVersion = ` + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: master-0 labels: set: master spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.14.4" - controlPlane: "1.14.4" -- apiVersion: "cluster.k8s.io/v1alpha1" - kind: Machine + infrastructureRef: + kind: BareMetalMachine + name: master-0 + version: "1.14.4" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" metadata: - generateName: node- - labels: - set: node + name: master-0 spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - versions: - kubelet: "1.14.3" -` - -// A machine doesn't have a matching controlPlane version. -const machinesInconsistentControlPlaneVersion = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" + address: "172.17.8.101" +--- + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: node-0 labels: - set: master + set: node spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.14.4" - controlPlane: "1.14.3" -- apiVersion: "cluster.k8s.io/v1alpha1" - kind: Machine + infrastructureRef: + kind: BareMetalMachine + name: node-0 + version: "1.14.3" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" metadata: - generateName: node- - labels: - set: node + name: node-0 spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - versions: - kubelet: "1.14.4" + address: "172.17.8.102" ` // Unsupported Kubernetes version. -const machinesUnsupportedKubernetesVersion = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" +const machinesUnsupportedKubernetesVersion = ` apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: master-0 labels: set: master spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.13.2" - controlPlane: "1.13.2" -- apiVersion: "cluster.k8s.io/v1alpha1" + infrastructureRef: + kind: BareMetalMachine + name: master-0 + version: "1.13.2" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-0 + spec: + address: "172.17.8.101" +--- + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: node- + name: node-0 labels: set: node spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - versions: - kubelet: "1.13.2" + infrastructureRef: + kind: BareMetalMachine + name: node-0 + version: "1.13.2" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: node-0 + spec: + address: "172.17.8.102" ` -const machinesNoGodNoMaster = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" +const machinesNoGodNoMaster = ` + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: node- + name: node-0 labels: set: node spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" - versions: - kubelet: "1.14.12" + infrastructureRef: + kind: BareMetalMachine + name: node-0 + version: "1.14.12" +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: node-0 + spec: + address: "172.17.8.102" ` -func machinesFromString(t *testing.T, s string) []*clusterv1.Machine { - r := strings.NewReader(s) - machines, err := machine.Parse(r) +func machinesFromString(t *testing.T, s string) ([]*clusterv1.Machine, []*baremetalspecv1.BareMetalMachine) { + r := ioutil.NopCloser(strings.NewReader(s)) + machines, bml, err := machine.Parse(r) assert.NoError(t, err) - return machines + return machines, bml } // Gather the list of fields paths that didn't pass validation. @@ -264,105 +232,108 @@ func fieldsInError(errors field.ErrorList) []string { } func TestValidateMachines(t *testing.T) { + assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, baremetalspecv1.AddToScheme(scheme.Scheme)) + tests := []struct { input string errors []string }{ {machinesValid, []string{}}, - {machinesValidWithOnlyKubeletVersion, []string{}}, - {machinesInconsistentKubeletVersion, []string{ - "machines[1].spec.versions.kubelet", - }}, - {machinesInconsistentControlPlaneVersion, []string{ - "machines[0].spec.versions.controlPlane", + {machinesInconsistentKubeVersion, []string{ + "machines[1].spec.version", }}, {machinesUnsupportedKubernetesVersion, []string{ - "machines[0].spec.versions.kubelet", + "machines[0].spec.version", }}, {machinesNoGodNoMaster, []string{ - "spec.versions.controlPlane", + "metadata.labels.set", }}, } - for _, test := range tests { - machines := machinesFromString(t, test.input) - errors := machine.Validate(machines) - assert.Equal(t, len(test.errors), len(errors)) - assert.Equal(t, test.errors, fieldsInError(errors)) + for i, test := range tests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + machines, bl := machinesFromString(t, test.input) + errors := machine.Validate(machines, bl) + assert.Equal(t, len(test.errors), len(errors)) + assert.Equal(t, test.errors, fieldsInError(errors)) - if t.Failed() { - t.Log(errors) - t.FailNow() - } + if t.Failed() { + t.Log(errors) + t.FailNow() + } + }) } } -const machinesWithoutVersions = `items: -- apiVersion: "cluster.k8s.io/v1alpha1" +const machinesWithoutVersions = ` + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: master- + name: master-0 labels: set: master spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.101" -- apiVersion: "cluster.k8s.io/v1alpha1" + infrastructureRef: + kind: BareMetalMachine + name: master-0 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-0 + spec: + address: "172.17.8.101" +--- + apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine metadata: - generateName: node- + name: node-0 labels: set: node spec: - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalMachineProviderSpec" - address: "172.17.8.102" - authenticationWebhook: - cacheTTL: 2m0s - server: - url: http://127.0.0.1:5000/authenticate + infrastructureRef: + kind: BareMetalMachine + name: node-0 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: node-0 + spec: + address: "172.17.8.102" + authenticationWebhook: + cacheTTL: 2m0s + server: + url: http://127.0.0.1:5000/authenticate ` // Ensure we populate the Kubernetes version if not provided. func TestPopulateVersions(t *testing.T) { - machinesWithoutVersions := machinesFromString(t, machinesWithoutVersions) + machinesWithoutVersions, _ := machinesFromString(t, machinesWithoutVersions) machine.Populate(machinesWithoutVersions) for _, m := range machinesWithoutVersions { - v := &m.Spec.Versions - assert.Equal(t, kubernetes.DefaultVersion, v.Kubelet) - if machine.IsMaster(m) { - assert.Equal(t, kubernetes.DefaultVersion, v.ControlPlane) - } + v := *m.Spec.Version + assert.Equal(t, kubernetes.DefaultVersion, v) } } func TestGetKubernetesVersionFromMasterInDefaultsVersionWhenMachinesDoNotSpecifyAny(t *testing.T) { - version, err := machine.GetKubernetesVersionFromMasterIn(machinesFromString(t, machinesWithoutVersions)) + version, namespace, err := machine.GetKubernetesVersionFromMasterIn(machinesFromString(t, machinesWithoutVersions)) assert.NoError(t, err) assert.Equal(t, kubernetes.DefaultVersion, version) + assert.Equal(t, manifest.DefaultNamespace, namespace) } func TestGetKubernetesVersionFromMasterInGetsControlPlaneVersion(t *testing.T) { - version, err := machine.GetKubernetesVersionFromMasterIn(machinesFromString(t, machinesValid)) + version, _, err := machine.GetKubernetesVersionFromMasterIn(machinesFromString(t, machinesValid)) assert.NoError(t, err) assert.Equal(t, "1.14.12", version) } -func TestGetKubernetesVersionFallsbackToKubeletVersionForWorkerNodes(t *testing.T) { - machines := machinesFromString(t, machinesInconsistentControlPlaneVersion) - version := machine.GetKubernetesVersion(machines[0]) - assert.Equal(t, "1.14.3", version) - version = machine.GetKubernetesVersion(machines[1]) - assert.Equal(t, "1.14.4", version) -} - func TestGetKubernetesVersionDefaultsVersionWhenMachinesDoNotSpecifyAny(t *testing.T) { - version := machine.GetKubernetesVersion(machinesFromString(t, machinesWithoutVersions)[0]) + machines, _ := machinesFromString(t, machinesWithoutVersions) + version := machine.GetKubernetesVersion(machines[0]) assert.Equal(t, kubernetes.DefaultVersion, version) } diff --git a/pkg/cluster/machine/machines_manifest.go b/pkg/cluster/machine/machines_manifest.go index 16afa74a..94ec12d8 100644 --- a/pkg/cluster/machine/machines_manifest.go +++ b/pkg/cluster/machine/machines_manifest.go @@ -6,7 +6,7 @@ import ( "github.com/pkg/errors" "github.com/thanhpk/randstr" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" "sigs.k8s.io/yaml" ) @@ -27,6 +27,8 @@ func GetMachinesManifest(path string) (string, error) { // Note that if the customer updates the manifest with their own names, we'll // honor those. func UpdateWithGeneratedNames(manifest string) (string, error) { + return "", errors.New("generateName not implemented for v1alpha3") + var machineList clusterv1.MachineList if err := yaml.Unmarshal([]byte(manifest), &machineList); err != nil { return "", errors.Wrap(err, "failed to deserialize machines' manifest") diff --git a/pkg/cluster/machine/machines_manifest_test.go b/pkg/cluster/machine/machines_manifest_test.go index ad60733d..52c84a21 100644 --- a/pkg/cluster/machine/machines_manifest_test.go +++ b/pkg/cluster/machine/machines_manifest_test.go @@ -30,7 +30,8 @@ items: generateName: node- ` -func TestUpdateWithGeneratedNamesWithGenerateNameFieldsShouldGenerateThese(t *testing.T) { +// disabled: not implemented for v1alpha3 +func xTestUpdateWithGeneratedNamesWithGenerateNameFieldsShouldGenerateThese(t *testing.T) { updatedManifest, err := machine.UpdateWithGeneratedNames(manifestWithGenerateNameFields) assert.NoError(t, err) assert.NotEqual(t, manifestWithGenerateNameFields, updatedManifest, "processing a manifest with generateName fields should modify it") @@ -67,7 +68,8 @@ items: name: very-custom-worker-node ` -func TestUpdateWithGeneratedNamesWithCustomNameAndGenerateNameFieldsShouldOnlyChangeTheGenerateNameFields(t *testing.T) { +// disabled: not implemented for v1alpha3 +func xTestUpdateWithGeneratedNamesWithCustomNameAndGenerateNameFieldsShouldOnlyChangeTheGenerateNameFields(t *testing.T) { updatedManifest, err := machine.UpdateWithGeneratedNames(manifestWithCustomNameFields) assert.NoError(t, err) assert.NotEqual(t, manifestWithCustomNameFields, updatedManifest, "processing a manifest with generateName fields should modify it") From f07049b308c3f4eb2c5eec0ab21a03412524451e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 08:54:41 +0000 Subject: [PATCH 09/72] Update 'specs' package for v1alpha3 --- pkg/specs/specs.go | 93 +++++++------- pkg/specs/validation.go | 57 +-------- pkg/specs/validation_test.go | 239 ++++++++++++++++++++--------------- 3 files changed, 188 insertions(+), 201 deletions(-) diff --git a/pkg/specs/specs.go b/pkg/specs/specs.go index 9e00b4c3..6e1c775a 100644 --- a/pkg/specs/specs.go +++ b/pkg/specs/specs.go @@ -2,10 +2,9 @@ package specs import ( "io" - "io/ioutil" "os" - yaml "github.com/ghodss/yaml" + "github.com/pkg/errors" log "github.com/sirupsen/logrus" baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/cluster/machine" @@ -13,6 +12,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" apierrors "sigs.k8s.io/cluster-api/errors" + clusteryaml "sigs.k8s.io/cluster-api/util/yaml" ) // Utilities for managing cluster and machine specs. @@ -20,39 +20,27 @@ import ( type Specs struct { Cluster *clusterv1.Cluster - ClusterSpec *baremetalspecv1.BareMetalClusterProviderSpec - MasterSpec *baremetalspecv1.BareMetalMachineProviderSpec + ClusterSpec *baremetalspecv1.BareMetalClusterSpec + MasterSpec *baremetalspecv1.BareMetalMachineSpec machineCount int masterCount int } // Get a "Specs" object that can create an SSHClient (and retrieve useful nested fields) func NewFromPaths(clusterManifestPath, machinesManifestPath string) *Specs { - cluster, machines, err := parseManifests(clusterManifestPath, machinesManifestPath) + cluster, bmc, machines, bml, err := parseManifests(clusterManifestPath, machinesManifestPath) if err != nil { log.Fatal("Error parsing manifest: ", err) } - return New(cluster, machines) + return New(cluster, bmc, machines, bml) } // Get a "Specs" object that can create an SSHClient (and retrieve useful nested fields) -func New(cluster *clusterv1.Cluster, machines []*clusterv1.Machine) *Specs { - master := machine.FirstMaster(machines) +func New(cluster *clusterv1.Cluster, bmc *baremetalspecv1.BareMetalCluster, machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) *Specs { + _, master := machine.FirstMaster(machines, bl) if master == nil { log.Fatal("No master provided in manifest.") } - codec, err := baremetalspecv1.NewCodec() - if err != nil { - log.Fatal("Failed to create codec: ", err) - } - clusterSpec, err := codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - if err != nil { - log.Fatal("Failed to parse cluster manifest: ", err) - } - masterSpec, err := codec.MachineProviderFromProviderSpec(master.Spec.ProviderSpec) - if err != nil { - log.Fatal("Failed to parse master: ", err) - } masterCount := 0 for _, m := range machines { if m.Labels["set"] == "master" { @@ -61,69 +49,78 @@ func New(cluster *clusterv1.Cluster, machines []*clusterv1.Machine) *Specs { } return &Specs{ Cluster: cluster, - ClusterSpec: clusterSpec, - MasterSpec: masterSpec, + ClusterSpec: &bmc.Spec, + MasterSpec: &master.Spec, machineCount: len(machines), masterCount: masterCount, } } -func parseManifests(clusterManifestPath, machinesManifestPath string) (*clusterv1.Cluster, []*clusterv1.Machine, error) { - cluster, err := parseClusterManifest(clusterManifestPath) +func parseManifests(clusterManifestPath, machinesManifestPath string) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster, []*clusterv1.Machine, []*baremetalspecv1.BareMetalMachine, error) { + cluster, bmc, err := ParseClusterManifest(clusterManifestPath) if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } populateCluster(cluster) - validationErrors := validateCluster(cluster, clusterManifestPath) + validationErrors := validateCluster(cluster, bmc, clusterManifestPath) if len(validationErrors) > 0 { utilities.PrintErrors(validationErrors) - return nil, nil, apierrors.InvalidMachineConfiguration( + return nil, nil, nil, nil, apierrors.InvalidMachineConfiguration( "%s failed validation, use --skip-validation to force the operation", clusterManifestPath) } - errorsHandler := func(machines []*clusterv1.Machine, errors field.ErrorList) ([]*clusterv1.Machine, error) { + errorsHandler := func(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine, errors field.ErrorList) ([]*clusterv1.Machine, []*baremetalspecv1.BareMetalMachine, error) { if len(errors) > 0 { utilities.PrintErrors(errors) - return nil, apierrors.InvalidMachineConfiguration( + return nil, nil, apierrors.InvalidMachineConfiguration( "%s failed validation, use --skip-validation to force the operation", machinesManifestPath) } - return machines, nil + return machines, bl, nil } - machines, err := machine.ParseAndDefaultAndValidate(machinesManifestPath, errorsHandler) + machines, bl, err := machine.ParseAndDefaultAndValidate(machinesManifestPath, errorsHandler) if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } - return cluster, machines, nil + return cluster, bmc, machines, bl, nil } -func parseCluster(r io.Reader) (*clusterv1.Cluster, error) { - bytes, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } +// ParseCluster converts the manifest file into a Cluster +func ParseCluster(r io.ReadCloser) (cluster *clusterv1.Cluster, bmc *baremetalspecv1.BareMetalCluster, err error) { + decoder := clusteryaml.NewYAMLDecoder(r) + defer decoder.Close() + + for { + obj, _, err := decoder.Decode(nil, nil) + if err == io.EOF { + break + } else if err != nil { + return nil, nil, errors.Wrap(err, "failed to parse cluster manifest") + } - cluster := &clusterv1.Cluster{} - err = yaml.Unmarshal(bytes, cluster) - if err != nil { - return nil, err + switch v := obj.(type) { + case *clusterv1.Cluster: + cluster = v + case *baremetalspecv1.BareMetalCluster: + bmc = v + default: + return nil, nil, errors.Errorf("unexpected type %T", v) + } } - - return cluster, nil - + return } -func parseClusterManifest(file string) (*clusterv1.Cluster, error) { +func ParseClusterManifest(file string) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster, error) { f, err := os.Open(file) if err != nil { - return nil, err + return nil, nil, err } defer f.Close() - return parseCluster(f) + return ParseCluster(f) } func TranslateServerArgumentsToStringMap(args []baremetalspecv1.ServerArgument) map[string]string { diff --git a/pkg/specs/validation.go b/pkg/specs/validation.go index 2f88ac5e..634d0cb7 100644 --- a/pkg/specs/validation.go +++ b/pkg/specs/validation.go @@ -7,7 +7,6 @@ import ( "path/filepath" "time" - log "github.com/sirupsen/logrus" "github.com/weaveworks/launcher/pkg/kubectl" "github.com/weaveworks/wksctl/pkg/addons" baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" @@ -25,48 +24,13 @@ func clusterProviderPath(args ...string) *field.Path { return clusterPath(allArgs...) } -func clusterSpec(cluster *clusterv1.Cluster) (*baremetalspecv1.BareMetalClusterProviderSpec, error) { - codec, err := baremetalspecv1.NewCodec() - if err != nil { - return nil, err - } - clusterSpec, err := codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - if err != nil { - return nil, fmt.Errorf("cannot unmarshal cluster's providerSpec field: %v", err) - } - - return clusterSpec, err -} - func populateNetwork(cluster *clusterv1.Cluster) { if cluster.Spec.ClusterNetwork.ServiceDomain == "" { cluster.Spec.ClusterNetwork.ServiceDomain = "cluster.local" } } -func updateClusterProviderSpec(cluster *clusterv1.Cluster, updateFunc func(spec *baremetalspecv1.BareMetalClusterProviderSpec)) { - spec, err := clusterSpec(cluster) - if err != nil { - return - } - - updateFunc(spec) - - // We are changing ClusterProviderSpecs, the per-provider part of the - // manifest. `spec` is a decoded copy of that portion of the manifest and - // needs to be re-encoded and replace the original version. - codec, err := baremetalspecv1.NewCodec() - if err != nil { - log.Fatal("couldn't create codec: ", err) - } - encodedSpec, err := codec.EncodeToProviderSpec(spec) - if err != nil { - log.Fatal("error encoding spec: ", err) - } - cluster.Spec.ProviderSpec = *encodedSpec -} - -type clusterValidationFunc func(*clusterv1.Cluster, string) field.ErrorList +type clusterValidationFunc func(*clusterv1.Cluster, *baremetalspecv1.BareMetalClusterSpec, string) field.ErrorList func isValidCIDR(s string) (*net.IPNet, error) { ip, cidr, err := net.ParseCIDR(s) @@ -84,7 +48,7 @@ func networksIntersect(n1, n2 *net.IPNet) bool { return n2.Contains(n1.IP) || n1.Contains(n2.IP) } -func validateCIDRBlocks(cluster *clusterv1.Cluster, manifestPath string) field.ErrorList { +func validateCIDRBlocks(cluster *clusterv1.Cluster, _ *baremetalspecv1.BareMetalClusterSpec, manifestPath string) field.ErrorList { var errors field.ErrorList const ( services = 0 @@ -142,7 +106,7 @@ func validateCIDRBlocks(cluster *clusterv1.Cluster, manifestPath string) field.E return field.ErrorList{} } -func validateServiceDomain(cluster *clusterv1.Cluster, manifestPath string) field.ErrorList { +func validateServiceDomain(cluster *clusterv1.Cluster, _ *baremetalspecv1.BareMetalClusterSpec, manifestPath string) field.ErrorList { f := cluster.Spec.ClusterNetwork.ServiceDomain if f != "cluster.local" { return field.ErrorList{ @@ -160,12 +124,7 @@ func fileExists(s string) bool { return err == nil } -func validateSSHKeyEmpty(cluster *clusterv1.Cluster, manifestPath string) field.ErrorList { - spec, err := clusterSpec(cluster) - if err != nil { - log.Fatalf("Failed to parse the ClusterSpec - %v", err) - } - +func validateSSHKeyEmpty(_ *clusterv1.Cluster, spec *baremetalspecv1.BareMetalClusterSpec, manifestPath string) field.ErrorList { if spec.DeprecatedSSHKeyPath != "" { return field.ErrorList{ field.Invalid( @@ -189,9 +148,7 @@ func addonPath(i int, args ...string) *field.Path { return clusterProviderPath(allArgs...) } -func validateAddons(cluster *clusterv1.Cluster, manifestPath string) field.ErrorList { - spec, _ := clusterSpec(cluster) - +func validateAddons(_ *clusterv1.Cluster, spec *baremetalspecv1.BareMetalClusterSpec, manifestPath string) field.ErrorList { // Addons require kubectl for their manifests to be applied. kubectl := kubectl.LocalClient{} if len(spec.Addons) > 0 && !kubectl.IsPresent() { @@ -233,7 +190,7 @@ func populateCluster(cluster *clusterv1.Cluster) { populateNetwork(cluster) } -func validateCluster(cluster *clusterv1.Cluster, manifestPath string) field.ErrorList { +func validateCluster(cluster *clusterv1.Cluster, bmc *baremetalspecv1.BareMetalCluster, manifestPath string) field.ErrorList { var errors field.ErrorList for _, f := range []clusterValidationFunc{ @@ -242,7 +199,7 @@ func validateCluster(cluster *clusterv1.Cluster, manifestPath string) field.Erro validateSSHKeyEmpty, validateAddons, } { - errors = append(errors, f(cluster, manifestPath)...) + errors = append(errors, f(cluster, &bmc.Spec, manifestPath)...) } return errors diff --git a/pkg/specs/validation_test.go b/pkg/specs/validation_test.go index 4413cc7b..d28c36d8 100644 --- a/pkg/specs/validation_test.go +++ b/pkg/specs/validation_test.go @@ -1,16 +1,19 @@ package specs import ( + "io/ioutil" "strings" "testing" "github.com/stretchr/testify/assert" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/client-go/kubernetes/scheme" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) const clusterMinimumValid = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -20,15 +23,20 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" + infrastructureRef: + kind: BareMetalCluster + name: example +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" ` const clusterHasSSHKey = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -38,16 +46,21 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - sshKeyPath: "/etc/hosts" - user: "vagrant" + infrastructureRef: + kind: BareMetalCluster + name: example +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + sshKeyPath: "/etc/hosts" + user: "vagrant" ` const clusterNonDefaultServiceDomain = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -58,15 +71,17 @@ spec: pods: cidrBlocks: ["192.168.0.0/16"] serviceDomain: "foo.bar" - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" ` const clusterBadCIDRBlocks = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -76,15 +91,17 @@ spec: cidrBlocks: ["10.96.0.0/12", "10.100.0.0/12"] pods: cidrBlocks: ["192.168.0.0/72"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" ` const clusterServicePodNetworksOverlap = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -94,15 +111,17 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["10.96.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" ` const ClusterAuthenticationBadCacheTTL = `items: -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -112,19 +131,21 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - authenticationWebhook: - cacheTTL: foo - server: - url: http://127.0.0.1:5000/authenticate +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + authenticationWebhook: + cacheTTL: foo + server: + url: http://127.0.0.1:5000/authenticate ` const ClusterAuthenticationBadServerURL = `items: -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -134,19 +155,21 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - authenticationWebhook: - cacheTTL: 2m0s - server: - url: file:///127.0.0.1:5000/authenticate +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + authenticationWebhook: + cacheTTL: 2m0s + server: + url: file:///127.0.0.1:5000/authenticate ` const ClusterAuthenticationNoClientCert = `items: -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -156,22 +179,24 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - authenticationWebhook: - cacheTTL: 2m0s - client: - keyData: SGVsbG8sIFdvcmxkIQo= - server: - url: https://127.0.0.1:5000/authenticate - certificateAuthorityData: SGVsbG8sIFdvcmxkIQo= +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + authenticationWebhook: + cacheTTL: 2m0s + client: + keyData: SGVsbG8sIFdvcmxkIQo= + server: + url: https://127.0.0.1:5000/authenticate + certificateAuthorityData: SGVsbG8sIFdvcmxkIQo= ` const ClusterAuthorizationNoServerCert = `items: -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -181,23 +206,25 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - authorizationWebhook: - cacheAuthorizedTTL: 5m0s - cacheUnauthorizedTTL: 30s - client: - keyData: SGVsbG8sIFdvcmxkIQo= - certificateData: SGVsbG8sIFdvcmxkIQo= - server: - url: https://127.0.0.1:5000/authenticate +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + authorizationWebhook: + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s + client: + keyData: SGVsbG8sIFdvcmxkIQo= + certificateData: SGVsbG8sIFdvcmxkIQo= + server: + url: https://127.0.0.1:5000/authenticate ` const ClusterAddonBadName = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -207,17 +234,19 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - addons: - - name: foo +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + addons: + - name: foo ` const ClusterAddonBadParameters = ` -apiVersion: "cluster.k8s.io/v1alpha1" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: example @@ -227,22 +256,24 @@ spec: cidrBlocks: ["10.96.0.0/12"] pods: cidrBlocks: ["192.168.0.0/16"] - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "vagrant" - addons: - - name: kube-kerberos - params: - keytab: /foo +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" + addons: + - name: kube-kerberos + params: + keytab: /foo ` -func clusterFromString(t *testing.T, s string) *clusterv1.Cluster { - r := strings.NewReader(s) - cluster, err := parseCluster(r) +func clusterFromString(t *testing.T, s string) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster) { + r := ioutil.NopCloser(strings.NewReader(s)) + cluster, bmc, err := ParseCluster(r) assert.NoError(t, err) - return cluster + return cluster, bmc } // Gather the list of fields paths that didn't pass validation. @@ -255,6 +286,8 @@ func fieldsInError(errors field.ErrorList) []string { } func TestValidateCluster(t *testing.T) { + assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, baremetalspecv1.AddToScheme(scheme.Scheme)) tests := []struct { input string errors []string @@ -279,9 +312,9 @@ func TestValidateCluster(t *testing.T) { } for _, test := range tests { - cluster := clusterFromString(t, test.input) + cluster, bmc := clusterFromString(t, test.input) populateCluster(cluster) - errors := validateCluster(cluster, "/tmp/test.yaml") + errors := validateCluster(cluster, bmc, "/tmp/test.yaml") assert.Equal(t, len(test.errors), len(errors)) assert.Equal(t, test.errors, fieldsInError(errors)) @@ -312,7 +345,7 @@ func TestValidCIDR(t *testing.T) { } func TestDefaultClusterValues(t *testing.T) { - cluster := clusterFromString(t, clusterMinimumValid) + cluster, _ := clusterFromString(t, clusterMinimumValid) populateCluster(cluster) assert.Equal(t, "cluster.local", cluster.Spec.ClusterNetwork.ServiceDomain) } From d680644f0e4f2210ceb69f4d23a3e74969eb32dd Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 23 Apr 2020 10:59:06 +0000 Subject: [PATCH 10/72] Fetch fallback namespace from manifest, not from cluster --- pkg/apis/wksprovider/machine/os/os.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index 919cdeeb..168587da 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -225,7 +225,7 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { if err != nil { return nil, err } - kubernetesVersion, err := machine.GetKubernetesVersionFromManifest(params.MachinesManifestPath) + kubernetesVersion, kubernetesNamespace, err := machine.GetKubernetesVersionFromManifest(params.MachinesManifestPath) if err != nil { return nil, err } @@ -593,10 +593,7 @@ func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerS return nil, err } if params.Namespace == "" { - params.Namespace, err = machine.GetKubernetesNamespaceFromMachines() - if err != nil { - return nil, err - } + params.Namespace = kubernetesNamespace } seedNodePlanConfigMapManifest, err := planParametersToConfigMapManifest(paramBuffer.Bytes(), params.Namespace) From 1feb33757c7b10f1aa5d5772127e7caea06f2027 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 23 Apr 2020 10:59:46 +0000 Subject: [PATCH 11/72] For v1alpha3 reuse cluster parsing from specs package --- pkg/apis/wksprovider/machine/os/os.go | 45 ++++----------------------- 1 file changed, 6 insertions(+), 39 deletions(-) diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index 168587da..ba0a3ff1 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -31,6 +31,7 @@ import ( "github.com/weaveworks/wksctl/pkg/plan/resource" "github.com/weaveworks/wksctl/pkg/plan/runners/ssh" "github.com/weaveworks/wksctl/pkg/plan/runners/sudo" + "github.com/weaveworks/wksctl/pkg/specs" "github.com/weaveworks/wksctl/pkg/utilities/envcfg" "github.com/weaveworks/wksctl/pkg/utilities/manifest" "github.com/weaveworks/wksctl/pkg/utilities/object" @@ -44,7 +45,7 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/util/keyutil" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + "sigs.k8s.io/yaml" ) const ( @@ -229,7 +230,7 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { if err != nil { return nil, err } - providerSpec, err := getClusterProviderSpec(params.ClusterManifestPath) + cluster, err := parseCluster(params.ClusterManifestPath) if err != nil { return nil, err } @@ -618,22 +619,6 @@ func (o OS) applySeedNodePlan(p *plan.Plan) error { return nil } -func getClusterProviderSpec(manifestPath string) (*baremetalspecv1.BareMetalCluster, error) { - cluster, err := parseCluster(manifestPath) - if err != nil { - return nil, err - } - codec, err := baremetalspecv1.NewCodec() - if err != nil { - return nil, err - } - providerSpec, err := codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - if err != nil { - return nil, err - } - return providerSpec, nil -} - func planParametersToConfigMapManifest(plan []byte, ns string) ([]byte, error) { cm := v1.ConfigMap{ TypeMeta: metav1.TypeMeta{Kind: "ConfigMap", APIVersion: "v1"}, @@ -1272,23 +1257,13 @@ func fetchOSID(sshClient *ssh.Client) (string, error) { } // parseCluster converts the manifest file into a Cluster -func parseCluster(clusterManifestPath string) (*clusterv1.Cluster, error) { +func parseCluster(clusterManifestPath string) (bmc *baremetalspecv1.BareMetalCluster, err error) { f, err := os.Open(clusterManifestPath) if err != nil { return nil, err } - defer f.Close() - bytes, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - cluster := &clusterv1.Cluster{} - err = yaml.Unmarshal(bytes, cluster) - if err != nil { - return nil, errors.Wrap(err, "failed to parse cluster manifest") - } - return cluster, nil + _, b, err := specs.ParseCluster(f) + return b, err } // createPlan generates a plan from a plan builder @@ -1308,15 +1283,7 @@ func parseAddons(ClusterManifestPath, namespace string, addonNamespaces map[stri if err != nil { return nil, err } - codec, err := baremetalspecv1.NewCodec() - if err != nil { - log.Fatal("Failed to create codec: ", err) - } - clusterSpec, err := codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - if err != nil { - log.Fatal("Failed to parse cluster manifest: ", err) - } ret := make(map[string][][]byte) for _, addonDesc := range cluster.Spec.Addons { log.WithField("addon", addonDesc.Name).Debug("building addon") From e5949cde51195ae13da82654e460ed8a542c29c6 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 27 Apr 2020 13:45:49 +0000 Subject: [PATCH 12/72] BareMetal machine controller updated to v1alpha3 (renamed from "actuator") --- .../wksprovider/controller/wksctl/helpers.go | 40 ++ ...hine_actuator.go => machine_controller.go} | 361 ++++++++---------- ...tor_test.go => machine_controller_test.go} | 0 3 files changed, 195 insertions(+), 206 deletions(-) create mode 100644 pkg/apis/wksprovider/controller/wksctl/helpers.go rename pkg/apis/wksprovider/controller/wksctl/{machine_actuator.go => machine_controller.go} (74%) rename pkg/apis/wksprovider/controller/wksctl/{machine_actuator_test.go => machine_controller_test.go} (100%) diff --git a/pkg/apis/wksprovider/controller/wksctl/helpers.go b/pkg/apis/wksprovider/controller/wksctl/helpers.go new file mode 100644 index 00000000..822c35ae --- /dev/null +++ b/pkg/apis/wksprovider/controller/wksctl/helpers.go @@ -0,0 +1,40 @@ +package wks + +import ( + "strings" + + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + clusterutil "sigs.k8s.io/cluster-api/util" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +func pausedPredicates() predicate.Funcs { + return predicate.Funcs{ + UpdateFunc: func(e event.UpdateEvent) bool { + return processIfUnpaused(log.WithField("predicate", "updateEvent"), e.ObjectNew, e.MetaNew) + }, + CreateFunc: func(e event.CreateEvent) bool { + return processIfUnpaused(log.WithField("predicate", "createEvent"), e.Object, e.Meta) + }, + DeleteFunc: func(e event.DeleteEvent) bool { + return processIfUnpaused(log.WithField("predicate", "deleteEvent"), e.Object, e.Meta) + }, + GenericFunc: func(e event.GenericEvent) bool { + return processIfUnpaused(log.WithField("predicate", "genericEvent"), e.Object, e.Meta) + }, + } +} + +func processIfUnpaused(logger *log.Entry, obj runtime.Object, meta metav1.Object) bool { + kind := strings.ToLower(obj.GetObjectKind().GroupVersionKind().Kind) + log := logger.WithFields(log.Fields{"namespace": meta.GetNamespace(), kind: meta.GetName()}) + if clusterutil.HasPausedAnnotation(meta) { + log.Info("Resource is paused, will not attempt to map resource") + return false + } + log.Info("Resource is not paused, will attempt to map resource") + return true +} diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_actuator.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go similarity index 74% rename from pkg/apis/wksprovider/controller/wksctl/machine_actuator.go rename to pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 33bf3927..57bd21d0 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_actuator.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -24,7 +24,7 @@ import ( fconfig "github.com/weaveworks/footloose/pkg/config" "github.com/weaveworks/wksctl/pkg/apis/wksprovider/machine/config" "github.com/weaveworks/wksctl/pkg/apis/wksprovider/machine/os" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" machineutil "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/kubernetes/drain" "github.com/weaveworks/wksctl/pkg/plan" @@ -44,10 +44,13 @@ import ( "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" bootstrapapi "k8s.io/cluster-bootstrap/token/api" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - clusterclient "sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + "sigs.k8s.io/cluster-api/util" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - controllerconfig "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/source" ) const ( @@ -85,34 +88,92 @@ type FootlooseMachine struct { // maps containerPort -> hostPort. } -// MachineActuator is responsible for managing this cluster's machines, and +// TODO: should this be renamed 'reconciler' to match other CAPI providers ? + +// MachineController is responsible for managing this cluster's machines, and // ensuring their state converge towards their definitions. -type MachineActuator struct { +type MachineController struct { client client.Client clientSet *kubernetes.Clientset - codec *baremetalspecv1.BareMetalProviderSpecCodec controllerNamespace string eventRecorder record.EventRecorder verbose bool } -// Create the machine. -func (a *MachineActuator) Create(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - contextLog := log.WithFields(log.Fields{"context": ctx, "cluster": *cluster, "machine": *machine}) - contextLog.Info("creating machine...") - if err := a.create(ctx, cluster, machine); err != nil { - contextLog.Errorf("failed to create machine: %v", err) - return err +func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr error) { + ctx := context.TODO() // upstream will add this eventually + contextLog := log.WithField("name", req.NamespacedName) + + // request only contains the name of the object, so fetch it from the api-server + bmm := &baremetalspecv1.BareMetalMachine{} + err := r.client.Get(ctx, req.NamespacedName, bmm) + if err != nil { + if apierrs.IsNotFound(err) { // isn't there; give in + return ctrl.Result{}, nil + } + return ctrl.Result{}, err } - return nil -} -func (a *MachineActuator) create(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - c, m, err := a.parse(cluster, machine) + // Get Machine via OwnerReferences + machine, err := util.GetOwnerMachine(ctx, r.client, bmm.ObjectMeta) if err != nil { - return err + return ctrl.Result{}, err + } + if machine == nil { + contextLog.Info("Machine Controller has not yet set ownerReferences") + return ctrl.Result{}, nil + } + contextLog = contextLog.WithField("machine", machine.Name) + + // Get Cluster via label "cluster.x-k8s.io/cluster-name" + cluster, err := util.GetClusterFromMetadata(ctx, r.client, machine.ObjectMeta) + if err != nil { + contextLog.Info("Machine is missing cluster label or cluster does not exist") + return ctrl.Result{}, nil + } + + if util.IsPaused(cluster, bmm) { + contextLog.Info("BareMetalMachine or linked Cluster is marked as paused. Won't reconcile") + return ctrl.Result{}, nil + } + contextLog = contextLog.WithField("cluster", cluster.Name) + + // Now go from the Cluster to the BareMetalCluster + bmc := &baremetalspecv1.BareMetalCluster{} + if err := r.client.Get(ctx, client.ObjectKey{ + Namespace: bmm.Namespace, + Name: cluster.Spec.InfrastructureRef.Name, + }, bmc); err != nil { + contextLog.Info("BareMetalCluster is not available yet") + return ctrl.Result{}, nil + } + + // Object still there but with deletion timestamp => run our finalizer + if !bmm.ObjectMeta.DeletionTimestamp.IsZero() { + err := r.delete(ctx, bmc, machine, bmm) + if err != nil { + contextLog.Errorf("failed to delete machine: %v", err) + } + return ctrl.Result{}, err + } + + // FIXME! assuming everything else is create + { + err := r.create(ctx, bmc, machine, bmm) + if err != nil { + contextLog.Errorf("failed to create machine: %v", err) + } + return ctrl.Result{}, err } - installer, closer, err := a.connectTo(machine, c, m) + + return ctrl.Result{}, nil +} + +func (a *MachineController) create(ctx context.Context, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { + contextLog := log.WithFields(log.Fields{"context": ctx, "cluster": *c, "machine": *machine}) + contextLog.Info("creating machine...") + + installer, closer, err := a.connectTo(c, bmm) if err != nil { return gerrors.Wrapf(err, "failed to establish connection to machine %s", machine.Name) } @@ -133,7 +194,7 @@ func (a *MachineActuator) create(ctx context.Context, cluster *clusterv1.Cluster } log.Infof("FOOTLOOSE ADDR: %s", footlooseAddr) log.Infof("FOOTLOOSE BACKEND: %s", footlooseBackend) - nodePlan, err := a.getNodePlan(c, machine, a.getMachineAddress(machine), installer) + nodePlan, err := a.getNodePlan(c, machine, a.getMachineAddress(bmm), installer) if err != nil { return err } @@ -158,7 +219,7 @@ func (a *MachineActuator) create(ctx context.Context, cluster *clusterv1.Cluster // We set the plan annotation for a seed node at the first create of another mode so we // don't miss any updates. The plan is derived from the original seed node plan and stored in a config map // for use by the actuator. -func (a *MachineActuator) initializeMasterPlanIfNecessary(c *baremetalspecv1.BareMetalClusterProviderSpec) error { +func (a *MachineController) initializeMasterPlanIfNecessary(installer *os.OS) error { // we also use this method to mark the first master as the "originalMaster" originalMasterNode, err := a.getOriginalMasterNode() @@ -202,64 +263,14 @@ func (a *MachineActuator) initializeMasterPlanIfNecessary(c *baremetalspecv1.Bar return nil } -// findMachineSpecForAddress looks up machine resources and selects the one with a particular address. Used to tie -// nodes and machines together. -func (a *MachineActuator) findMachineSpecForAddress(addr string) (*clusterv1.Machine, *baremetalspecv1.BareMetalMachineProviderSpec, error) { - cfg, err := controllerconfig.GetConfig() - if err != nil { - return nil, nil, gerrors.Wrapf(err, "failed to get the coordinates of the API server") - } - clusterClient, err := clusterclient.NewForConfig(cfg) - if err != nil { - return nil, nil, err - } - mi := clusterClient.Machines(a.controllerNamespace) - mlist, err := mi.List(metav1.ListOptions{}) - if err != nil { - return nil, nil, err - } - for _, m := range mlist.Items { - spec, err := a.codec.MachineProviderFromProviderSpec(m.Spec.ProviderSpec) - if err != nil { - return nil, nil, err - } - if spec.Private.Address == addr { - return &m, spec, nil - } - } - return nil, nil, fmt.Errorf("Could not find machine with node address: %s", addr) -} - -// getNodePrivateAddress looks through the addresses for a node and extracts the private address -func getNodePrivateAddress(node *corev1.Node) string { - for _, addr := range node.Status.Addresses { - if addr.Type == "InternalIP" { - return addr.Address - } - } - return "" -} - -func (a *MachineActuator) parse(cluster *clusterv1.Cluster, machine *clusterv1.Machine) (*baremetalspecv1.BareMetalClusterProviderSpec, *baremetalspecv1.BareMetalMachineProviderSpec, error) { - c, err := a.codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - if err != nil { - return nil, nil, gerrors.Wrapf(err, "failed to parse cluster %v", cluster.Spec.ProviderSpec) - } - m, err := a.codec.MachineProviderFromProviderSpec(machine.Spec.ProviderSpec) - if err != nil { - return nil, nil, gerrors.Wrapf(err, "failed to parse machine %v", machine.Spec.ProviderSpec) - } - return c, m, nil -} - -func (a *MachineActuator) connectTo(machine *clusterv1.Machine, c *baremetalspecv1.BareMetalClusterProviderSpec, m *baremetalspecv1.BareMetalMachineProviderSpec) (*os.OS, io.Closer, error) { +func (a *MachineController) connectTo(c *baremetalspecv1.BareMetalCluster, m *baremetalspecv1.BareMetalMachine) (*os.OS, io.Closer, error) { sshKey, err := a.sshKey() if err != nil { return nil, nil, gerrors.Wrap(err, "failed to read SSH key") } sshClient, err := ssh.NewClient(ssh.ClientParams{ User: c.User, - Host: a.getMachineAddress(machine), + Host: a.getMachineAddress(m), Port: m.Private.Port, PrivateKey: sshKey, PrintOutputs: a.verbose, @@ -269,12 +280,12 @@ func (a *MachineActuator) connectTo(machine *clusterv1.Machine, c *baremetalspec } os, err := os.Identify(sshClient) if err != nil { - return nil, nil, gerrors.Wrapf(err, "failed to identify machine %s's operating system", a.getMachineAddress(machine)) + return nil, nil, gerrors.Wrapf(err, "failed to identify machine %s's operating system", a.getMachineAddress(m)) } return os, sshClient, nil } -func (a *MachineActuator) sshKey() ([]byte, error) { +func (a *MachineController) sshKey() ([]byte, error) { secret, err := a.clientSet.CoreV1().Secrets(a.controllerNamespace).Get(controllerSecret, metav1.GetOptions{}) if err != nil { return nil, gerrors.Wrap(err, "failed to get WKS' secret") @@ -296,7 +307,7 @@ type kubeadmJoinSecrets struct { CertificateKey string } -func (a *MachineActuator) kubeadmJoinSecrets() (*kubeadmJoinSecrets, error) { +func (a *MachineController) kubeadmJoinSecrets() (*kubeadmJoinSecrets, error) { secret, err := a.clientSet.CoreV1().Secrets(a.controllerNamespace).Get(controllerSecret, metav1.GetOptions{}) if err != nil { return nil, gerrors.Wrap(err, "failed to get WKS' secret") @@ -308,7 +319,7 @@ func (a *MachineActuator) kubeadmJoinSecrets() (*kubeadmJoinSecrets, error) { }, nil } -func (a *MachineActuator) updateKubeadmJoinSecrets(ID string) error { +func (a *MachineController) updateKubeadmJoinSecrets(ID string) error { len := base64.StdEncoding.EncodedLen(len(ID)) enc := make([]byte, len) base64.StdEncoding.Encode(enc, []byte(ID)) @@ -320,7 +331,7 @@ func (a *MachineActuator) updateKubeadmJoinSecrets(ID string) error { return err } -func (a *MachineActuator) token(ID string) (string, error) { +func (a *MachineController) token(ID string) (string, error) { ns := "kube-system" name := fmt.Sprintf("%s%s", bootstrapapi.BootstrapTokenSecretPrefix, ID) secret, err := a.clientSet.CoreV1().Secrets(ns).Get(name, metav1.GetOptions{}) @@ -367,7 +378,7 @@ func bootstrapTokenHasExpired(secret *corev1.Secret) bool { // if the token expires within 60 seconds, we need to generate a new one return time.Until(expirationTime).Seconds() < 60 } -func (a *MachineActuator) installNewBootstrapToken(ns string) (*corev1.Secret, error) { +func (a *MachineController) installNewBootstrapToken(ns string) (*corev1.Secret, error) { secret, err := bootstraputils.GenerateBootstrapSecret(ns) if err != nil { return nil, gerrors.Errorf("failed to create new bootstrap token %s/%s", ns, secret.ObjectMeta.Name) @@ -387,22 +398,11 @@ func (a *MachineActuator) installNewBootstrapToken(ns string) (*corev1.Secret, e } // Delete the machine. If no error is returned, it is assumed that all dependent resources have been cleaned up. -func (a *MachineActuator) Delete(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": cluster.Name}) +func (a *MachineController) delete(ctx context.Context, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { + contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": c.Name}) contextLog.Info("deleting machine ...") - if err := a.delete(ctx, cluster, machine); err != nil { - contextLog.Errorf("failed to delete machine: %v", err) - return err - } - return nil -} -func (a *MachineActuator) delete(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - c, m, err := a.parse(cluster, machine) - if err != nil { - return err - } - os, closer, err := a.connectTo(machine, c, m) + os, closer, err := a.connectTo(c, bmm) if err != nil { return gerrors.Wrapf(err, "failed to establish connection to machine %s", machine.Name) } @@ -439,22 +439,10 @@ func (a *MachineActuator) delete(ctx context.Context, cluster *clusterv1.Cluster } // Update the machine to the provided definition. -func (a *MachineActuator) Update(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": cluster.Name}) +func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { + contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": c.Name}) contextLog.Info("updating machine...") - if err := a.update(ctx, cluster, machine); err != nil { - contextLog.Errorf("failed to update machine: %v", err) - return err - } - return nil -} -func (a *MachineActuator) update(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error { - log.Infof("........................UPDATING: %s...........................", machine.Name) - c, m, err := a.parse(cluster, machine) - if err != nil { - return err - } - installer, closer, err := a.connectTo(machine, c, m) + installer, closer, err := a.connectTo(c, bmm) if err != nil { return gerrors.Wrapf(err, "failed to establish connection to machine %s", machine.Name) } @@ -472,8 +460,8 @@ func (a *MachineActuator) update(ctx context.Context, cluster *clusterv1.Cluster if err != nil { return gerrors.Wrapf(err, "failed to find node by id: %s/%s", ids.MachineID, ids.SystemUUID) } - contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": cluster.Name, "node": node.Name}) - nodePlan, err := a.getNodePlan(c, machine, a.getMachineAddress(machine), installer) + contextLog = contextLog.WithFields(log.Fields{"node": node.Name}) + nodePlan, err := a.getNodePlan(c, machine, a.getMachineAddress(bmm), installer) if err != nil { return gerrors.Wrapf(err, "Failed to get node plan for machine %s", machine.Name) } @@ -561,7 +549,7 @@ func (a *MachineActuator) update(ctx context.Context, cluster *clusterv1.Cluster // kubeadmUpOrDowngrade does upgrade or downgrade a machine. // Parameter k8sversion specified here represents the version of both Kubernetes and Kubeadm. -func (a *MachineActuator) kubeadmUpOrDowngrade(machine *clusterv1.Machine, node *corev1.Node, installer *os.OS, +func (a *MachineController) kubeadmUpOrDowngrade(machine *clusterv1.Machine, node *corev1.Node, installer *os.OS, k8sVersion, planKey, planJSON string, ntype recipe.NodeType) error { b := plan.NewBuilder() @@ -594,7 +582,7 @@ func (a *MachineActuator) kubeadmUpOrDowngrade(machine *clusterv1.Machine, node return nil } -func (a *MachineActuator) prepareForMasterUpdate() error { +func (a *MachineController) prepareForMasterUpdate() error { // Check if it's safe to update a master if err := a.checkMasterHAConstraint(); err != nil { return gerrors.Wrap(err, "Not enough available master nodes to allow master update") @@ -602,12 +590,12 @@ func (a *MachineActuator) prepareForMasterUpdate() error { return nil } -func (a *MachineActuator) performActualUpdate( +func (a *MachineController) performActualUpdate( installer *os.OS, machine *clusterv1.Machine, node *corev1.Node, nodePlan *plan.Plan, - cluster *baremetalspecv1.BareMetalClusterProviderSpec) error { + cluster *baremetalspecv1.BareMetalCluster) error { if err := drain.Drain(node, a.clientSet, drain.Params{ Force: true, DeleteLocalData: true, @@ -624,7 +612,7 @@ func (a *MachineActuator) performActualUpdate( return nil } -func (a *MachineActuator) getNodePlan(providerSpec *baremetalspecv1.BareMetalClusterProviderSpec, machine *clusterv1.Machine, machineAddress string, installer *os.OS) (*plan.Plan, error) { +func (a *MachineController) getNodePlan(providerSpec *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, machineAddress string, installer *os.OS) (*plan.Plan, error) { namespace := a.controllerNamespace secrets, err := a.kubeadmJoinSecrets() if err != nil { @@ -676,7 +664,7 @@ func (a *MachineActuator) getNodePlan(providerSpec *baremetalspecv1.BareMetalClu return plan, nil } -func (a *MachineActuator) getAuthConfigMap() (*v1.ConfigMap, error) { +func (a *MachineController) getAuthConfigMap() (*v1.ConfigMap, error) { client := a.clientSet.CoreV1().ConfigMaps(a.controllerNamespace) maps, err := client.List(metav1.ListOptions{}) if err != nil { @@ -690,7 +678,7 @@ func (a *MachineActuator) getAuthConfigMap() (*v1.ConfigMap, error) { return nil, nil } -func (a *MachineActuator) getProviderConfigMaps(providerSpec *baremetalspecv1.BareMetalClusterProviderSpec) (map[string]*v1.ConfigMap, error) { +func (a *MachineController) getProviderConfigMaps(providerSpec *baremetalspecv1.BareMetalCluster) (map[string]*v1.ConfigMap, error) { fileSpecs := providerSpec.OS.Files client := a.clientSet.CoreV1().ConfigMaps(a.controllerNamespace) configMaps := map[string]*v1.ConfigMap{} @@ -732,7 +720,7 @@ func checkForVersionJump(machine *clusterv1.Machine, node *corev1.Node) error { return nil } -func (a *MachineActuator) checkIfMasterNotAtVersion(kubernetesVersion string) (bool, error) { +func (a *MachineController) checkIfMasterNotAtVersion(kubernetesVersion string) (bool, error) { nodes, err := a.getMasterNodes() if err != nil { // If we can't read the nodes, return the error so we don't @@ -747,7 +735,7 @@ func (a *MachineActuator) checkIfMasterNotAtVersion(kubernetesVersion string) (b return false, nil } -func (a *MachineActuator) checkIfOriginalMasterNotAtVersion(kubernetesVersion string) (bool, error) { +func (a *MachineController) checkIfOriginalMasterNotAtVersion(kubernetesVersion string) (bool, error) { node, err := a.getOriginalMasterNode() if err != nil { // If we can't read the nodes, return the error so we don't @@ -757,7 +745,7 @@ func (a *MachineActuator) checkIfOriginalMasterNotAtVersion(kubernetesVersion st return nodeVersion(node) != kubernetesVersion, nil } -func (a *MachineActuator) getOriginalMasterNode() (*corev1.Node, error) { +func (a *MachineController) getOriginalMasterNode() (*corev1.Node, error) { nodes, err := a.getMasterNodes() if err != nil { return nil, err @@ -785,7 +773,7 @@ func (a *MachineActuator) getOriginalMasterNode() (*corev1.Node, error) { return originalMasterNode, nil } -func (a *MachineActuator) isOriginalMaster(node *corev1.Node) (bool, error) { +func (a *MachineController) isOriginalMaster(node *corev1.Node) (bool, error) { masterNode, err := a.getOriginalMasterNode() if err != nil { return false, err @@ -809,7 +797,7 @@ func nodeVersion(node *corev1.Node) string { return node.Status.NodeInfo.KubeletVersion } -func (a *MachineActuator) uncordon(node *corev1.Node) error { +func (a *MachineController) uncordon(node *corev1.Node) error { contextLog := log.WithFields(log.Fields{"node": node.Name}) client := a.clientSet.CoreV1().Nodes() retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { @@ -833,7 +821,7 @@ func (a *MachineActuator) uncordon(node *corev1.Node) error { return nil } -func (a *MachineActuator) setNodeAnnotation(node *corev1.Node, key, value string) error { +func (a *MachineController) setNodeAnnotation(node *corev1.Node, key, value string) error { err := a.modifyNode(node, func(node *corev1.Node) { node.Annotations[key] = value }) @@ -843,7 +831,7 @@ func (a *MachineActuator) setNodeAnnotation(node *corev1.Node, key, value string return nil } -func (a *MachineActuator) setNodeLabel(node *corev1.Node, label, value string) error { +func (a *MachineController) setNodeLabel(node *corev1.Node, label, value string) error { err := a.modifyNode(node, func(node *corev1.Node) { node.Labels[label] = value }) @@ -853,7 +841,7 @@ func (a *MachineActuator) setNodeLabel(node *corev1.Node, label, value string) e return nil } -func (a *MachineActuator) removeNodeLabel(node *corev1.Node, label string) error { +func (a *MachineController) removeNodeLabel(node *corev1.Node, label string) error { err := a.modifyNode(node, func(node *corev1.Node) { delete(node.Labels, label) }) @@ -863,7 +851,7 @@ func (a *MachineActuator) removeNodeLabel(node *corev1.Node, label string) error return nil } -func (a *MachineActuator) modifyNode(node *corev1.Node, updater func(node *corev1.Node)) error { +func (a *MachineController) modifyNode(node *corev1.Node, updater func(node *corev1.Node)) error { contextLog := log.WithFields(log.Fields{"node": node.Name}) client := a.clientSet.CoreV1().Nodes() retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { @@ -887,7 +875,7 @@ func (a *MachineActuator) modifyNode(node *corev1.Node, updater func(node *corev return nil } -func (a *MachineActuator) checkMasterHAConstraint() error { +func (a *MachineController) checkMasterHAConstraint() error { nodes, err := a.getMasterNodes() if err != nil { // If we can't read the nodes, return the error so we don't @@ -924,59 +912,7 @@ func hasTaint(node *corev1.Node, value string) bool { return false } -// Exists checks if the machine currently exists. -func (a *MachineActuator) Exists(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) (bool, error) { - contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": cluster.Name}) - contextLog.Info("checking existence of machine...") - exists, err := a.exists(ctx, cluster, machine) - if err != nil { - contextLog.Errorf("failed to check existence of machine: %s", err) - return false, err - } - return exists, nil -} - -func (a *MachineActuator) exists(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) (bool, error) { - c, m, err := a.parse(cluster, machine) - if err != nil { - return false, err - } - contextLog := log.WithFields(log.Fields{"machine": machine.Name}) - // In a managed environment, machine IPs are added by an underlying controller; if no IP is currently present, wait - // for the IP to be added before operating on the machine - if a.getMachineAddress(machine) == "" { - contextLog.Info("Creating underlying machine") - ip, err := invokeFootlooseCreate(machine) - if err != nil { - return false, err - } - contextLog.Infof("Created underlying machine: %s", ip) - a.updateMachine(machine, ip) - contextLog.Infof("Updated machine: %s", ip) - } - os, closer, err := a.connectTo(machine, c, m) - if err != nil { - return false, gerrors.Wrapf(err, "failed to establish connection to machine %s", machine.Name) - } - defer closer.Close() - ids, err := os.IDs() - if err != nil { - return false, gerrors.Wrapf(err, "failed to read machine %s's IDs", machine.Name) - } - node, err := a.findNodeByID(ids.MachineID, ids.SystemUUID) - if err != nil { - // If the error is that the machine was not found; record the event. Otherwise, error out - if apierrs.IsNotFound(err) { - a.recordEvent(machine, corev1.EventTypeNormal, "Exists", "machine %s (%s ; %s) is not a node", machine.Name, ids.SystemUUID, ids.MachineID) - return false, nil - } - return false, err - } - a.recordEvent(machine, corev1.EventTypeNormal, "Exists", "machine %s (%s ; %s) is a node (%s)", machine.Name, ids.SystemUUID, ids.MachineID, node.Name) - return true, nil -} - -func (a *MachineActuator) findNodeByID(machineID, systemUUID string) (*corev1.Node, error) { +func (a *MachineController) findNodeByID(machineID, systemUUID string) (*corev1.Node, error) { nodes, err := a.clientSet.CoreV1().Nodes().List(metav1.ListOptions{}) if err != nil { return nil, gerrors.Wrap(err, "failed to list nodes") @@ -989,9 +925,9 @@ func (a *MachineActuator) findNodeByID(machineID, systemUUID string) (*corev1.No return nil, apierrs.NewNotFound(schema.GroupResource{Group: "", Resource: "nodes"}, "") } -var r = rand.New(rand.NewSource(time.Now().Unix())) +var staticRand = rand.New(rand.NewSource(time.Now().Unix())) -func (a *MachineActuator) getMasterNode() (*corev1.Node, error) { +func (a *MachineController) getMasterNode() (*corev1.Node, error) { masters, err := a.getMasterNodes() if err != nil { return nil, err @@ -1000,11 +936,11 @@ func (a *MachineActuator) getMasterNode() (*corev1.Node, error) { return nil, errors.New("no master node found") } // Randomise to limit chances of always hitting the same master node: - index := r.Intn(len(masters)) + index := staticRand.Intn(len(masters)) return masters[index], nil } -func (a *MachineActuator) getMasterNodes() ([]*corev1.Node, error) { +func (a *MachineController) getMasterNodes() ([]*corev1.Node, error) { nodes, err := a.clientSet.CoreV1().Nodes().List(metav1.ListOptions{}) if err != nil { return nil, gerrors.Wrap(err, "failed to list nodes") @@ -1019,7 +955,7 @@ func (a *MachineActuator) getMasterNodes() ([]*corev1.Node, error) { return masters, nil } -func (a *MachineActuator) getControllerNode() (*corev1.Node, error) { +func (a *MachineController) getControllerNode() (*corev1.Node, error) { name, err := a.getControllerNodeName() if err != nil { return nil, err @@ -1036,7 +972,7 @@ func (a *MachineActuator) getControllerNode() (*corev1.Node, error) { return nil, errors.New("Could not find controller node") } -func (a *MachineActuator) isControllerNode(node *corev1.Node) (bool, error) { +func (a *MachineController) isControllerNode(node *corev1.Node) (bool, error) { name, err := a.getControllerNodeName() if err != nil { return false, err @@ -1044,7 +980,7 @@ func (a *MachineActuator) isControllerNode(node *corev1.Node) (bool, error) { return node.Name == name, nil } -func (a *MachineActuator) getControllerNodeName() (string, error) { +func (a *MachineController) getControllerNodeName() (string, error) { pods, err := a.clientSet.CoreV1().Pods(a.controllerNamespace).List(metav1.ListOptions{}) if err != nil { return "", err @@ -1057,7 +993,7 @@ func (a *MachineActuator) getControllerNodeName() (string, error) { return "", err } -func (a *MachineActuator) updateMachine(machine *clusterv1.Machine, ip string) { +func (a *MachineController) updateMachine(machine *baremetalspecv1.BareMetalMachine, ip string) { machineIPs[getMachineID(machine)] = ip } @@ -1141,7 +1077,7 @@ func getInternalAddress(node *corev1.Node) (string, error) { return "", errors.New("no InternalIP address found") } -func (a *MachineActuator) recordEvent(object runtime.Object, eventType, reason, messageFmt string, args ...interface{}) { +func (a *MachineController) recordEvent(object runtime.Object, eventType, reason, messageFmt string, args ...interface{}) { a.eventRecorder.Eventf(object, eventType, reason, messageFmt, args...) switch eventType { case corev1.EventTypeWarning: @@ -1153,39 +1089,52 @@ func (a *MachineActuator) recordEvent(object runtime.Object, eventType, reason, } } -func getMachineID(machine *clusterv1.Machine) string { +func getMachineID(machine *baremetalspecv1.BareMetalMachine) string { return machine.Namespace + ":" + machine.Name } -func (a *MachineActuator) getMachineAddress(machine *clusterv1.Machine) string { - m, _ := a.codec.MachineProviderFromProviderSpec(machine.Spec.ProviderSpec) - +func (a *MachineController) getMachineAddress(m *baremetalspecv1.BareMetalMachine) string { if m.Private.Address != "" { return m.Private.Address } - return machineIPs[getMachineID(machine)] + return machineIPs[getMachineID(m)] +} + +func (a *MachineController) SetupWithManager(mgr ctrl.Manager, options controller.Options) error { + controller, err := ctrl.NewControllerManagedBy(mgr). + WithOptions(options). + For(&baremetalspecv1.BareMetalMachine{}). + Watches( + &source.Kind{Type: &clusterv1.Machine{}}, + &handler.EnqueueRequestsFromMapFunc{ + ToRequests: util.MachineToInfrastructureMapFunc(baremetalspecv1.SchemeGroupVersion.WithKind("BareMetalMachine")), + }, + ). + // TODO: add watch to reconcile all machines that need it + WithEventFilter(pausedPredicates()). + Build(a) + + if err != nil { + return err + } + _ = controller // not currently using it here, but it will run in the background + return nil } -// MachineActuatorParams groups required inputs to create a machine actuator. -type MachineActuatorParams struct { +// MachineControllerParams groups required inputs to create a machine actuator. +type MachineControllerParams struct { Client client.Client ClientSet *kubernetes.Clientset ControllerNamespace string EventRecorder record.EventRecorder - Scheme *runtime.Scheme Verbose bool } -// NewMachineActuator creates a new Machine actuator. -func NewMachineActuator(params MachineActuatorParams) (*MachineActuator, error) { - codec, err := baremetalspecv1.NewCodec() - if err != nil { - return nil, gerrors.Wrap(err, "failed to create codec") - } - return &MachineActuator{ +// NewMachineController creates a new baremetal machine reconciler. +func NewMachineController(params MachineControllerParams) (*MachineController, error) { + return &MachineController{ client: params.Client, clientSet: params.ClientSet, - codec: codec, controllerNamespace: params.ControllerNamespace, eventRecorder: params.EventRecorder, verbose: params.Verbose, diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_actuator_test.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller_test.go similarity index 100% rename from pkg/apis/wksprovider/controller/wksctl/machine_actuator_test.go rename to pkg/apis/wksprovider/controller/wksctl/machine_controller_test.go From 9b202a046283d2288363eed42b7449ee8192f9bb Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 27 Apr 2020 15:02:41 +0000 Subject: [PATCH 13/72] BareMetal cluster controller updated to v1alpha3 (renamed from 'actuator') --- .../controller/wksctl/cluster_actuator.go | 58 ---------- .../controller/wksctl/cluster_controller.go | 100 ++++++++++++++++++ 2 files changed, 100 insertions(+), 58 deletions(-) delete mode 100644 pkg/apis/wksprovider/controller/wksctl/cluster_actuator.go create mode 100644 pkg/apis/wksprovider/controller/wksctl/cluster_controller.go diff --git a/pkg/apis/wksprovider/controller/wksctl/cluster_actuator.go b/pkg/apis/wksprovider/controller/wksctl/cluster_actuator.go deleted file mode 100644 index b810d78c..00000000 --- a/pkg/apis/wksprovider/controller/wksctl/cluster_actuator.go +++ /dev/null @@ -1,58 +0,0 @@ -package wks - -import ( - "errors" - - log "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/record" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// ClusterActuator is responsible for managing this cluster, and ensuring its -// state converges towards its definition. -type ClusterActuator struct { - eventRecorder record.EventRecorder -} - -// Reconcile creates or updates the cluster. -func (a *ClusterActuator) Reconcile(cluster *clusterv1.Cluster) error { - a.recordEvent(cluster, corev1.EventTypeNormal, "Reconcile", "Reconciled cluster %v", cluster.Name) - return nil -} - -// Delete the cluster. -func (a *ClusterActuator) Delete(cluster *clusterv1.Cluster) error { - a.recordEvent(cluster, corev1.EventTypeNormal, "Delete", "Deleted cluster %v", cluster.Name) - return errors.New("ClusterActuator#Delete not implemented") -} - -func (a *ClusterActuator) recordEvent(object runtime.Object, eventType, reason, messageFmt string, args ...interface{}) { - a.eventRecorder.Eventf(object, eventType, reason, messageFmt, args...) - switch eventType { - case corev1.EventTypeWarning: - log.Warnf(messageFmt, args...) - case corev1.EventTypeNormal: - log.Infof(messageFmt, args...) - default: - log.Debugf(messageFmt, args...) - } -} - -// ClusterActuatorParams groups required inputs to create a cluster actuator. -type ClusterActuatorParams struct { - Client client.Client - ClientSet *kubernetes.Clientset - EventRecorder record.EventRecorder - Scheme *runtime.Scheme -} - -// NewClusterActuator creates a new cluster actuator. -func NewClusterActuator(params ClusterActuatorParams) (*ClusterActuator, error) { - return &ClusterActuator{ - eventRecorder: params.EventRecorder, - }, nil -} diff --git a/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go b/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go new file mode 100644 index 00000000..df83054f --- /dev/null +++ b/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go @@ -0,0 +1,100 @@ +package wks + +import ( + "context" + "errors" + + log "github.com/sirupsen/logrus" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" + corev1 "k8s.io/api/core/v1" + apierrs "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/cluster-api/util" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" +) + +// ClusterReconciler is responsible for managing this cluster, and ensuring its +// state converges towards its definition. +type ClusterReconciler struct { + client client.Client + eventRecorder record.EventRecorder +} + +// Reconcile creates or updates the cluster. +func (a *ClusterReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr error) { + ctx := context.TODO() // upstream will add this eventually + contextLog := log.WithField("name", req.NamespacedName) + + // request only contains the name of the object, so fetch it from the api-server + bmc := &baremetalspecv1.BareMetalCluster{} + err := a.client.Get(ctx, req.NamespacedName, bmc) + if err != nil { + if apierrs.IsNotFound(err) { // isn't there; give in + return ctrl.Result{}, nil + } + return ctrl.Result{}, err + } + + // Get Cluster via OwnerReferences + cluster, err := util.GetOwnerCluster(ctx, a.client, bmc.ObjectMeta) + if err != nil { + return ctrl.Result{}, err + } + if cluster == nil { + contextLog.Info("Cluster Controller has not yet set ownerReferences") + return ctrl.Result{}, nil + } + contextLog = contextLog.WithField("cluster", cluster.Name) + + if util.IsPaused(cluster, bmc) { + contextLog.Info("BareMetalCluster or linked Cluster is marked as paused. Won't reconcile") + return ctrl.Result{}, nil + } + + // Object still there but with deletion timestamp => run our finalizer + if !bmc.ObjectMeta.DeletionTimestamp.IsZero() { + a.recordEvent(cluster, corev1.EventTypeNormal, "Delete", "Deleted cluster %v", cluster.Name) + return ctrl.Result{}, errors.New("ClusterReconciler#Delete not implemented") + } + + // FIXME! do we need any more? + + return ctrl.Result{}, nil +} + +func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager, options controller.Options) error { + controller, err := ctrl.NewControllerManagedBy(mgr). + WithOptions(options). + For(&baremetalspecv1.BareMetalCluster{}). + WithEventFilter(pausedPredicates()). + Build(r) + + if err != nil { + return err + } + _ = controller // not currently using it here, but it will run in the background + return nil +} + +func (a *ClusterReconciler) recordEvent(object runtime.Object, eventType, reason, messageFmt string, args ...interface{}) { + a.eventRecorder.Eventf(object, eventType, reason, messageFmt, args...) + switch eventType { + case corev1.EventTypeWarning: + log.Warnf(messageFmt, args...) + case corev1.EventTypeNormal: + log.Infof(messageFmt, args...) + default: + log.Debugf(messageFmt, args...) + } +} + +// NewClusterReconciler creates a new cluster reconciler. +func NewClusterReconciler(client client.Client, eventRecorder record.EventRecorder) (*ClusterReconciler, error) { + return &ClusterReconciler{ + client: client, + eventRecorder: eventRecorder, + }, nil +} From cdd097b2b0899cdd0a3a1e12a97ec2325604b8f7 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 27 Apr 2020 16:25:47 +0000 Subject: [PATCH 14/72] Update controller main to v1alpha3 --- cmd/controller/main.go | 64 +++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 180fd2c5..a3715872 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -1,20 +1,20 @@ package main import ( + "context" "fmt" "os" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/weaveworks/wksctl/pkg/apis" - "github.com/weaveworks/wksctl/pkg/apis/wksprovider/controller/wksctl" + wks "github.com/weaveworks/wksctl/pkg/apis/wksprovider/controller/wksctl" machineutil "github.com/weaveworks/wksctl/pkg/cluster/machine" "k8s.io/client-go/kubernetes" - clusterapis "sigs.k8s.io/cluster-api/pkg/apis" - clustercommon "sigs.k8s.io/cluster-api/pkg/apis/cluster/common" - capicluster "sigs.k8s.io/cluster-api/pkg/controller/cluster" - capimachine "sigs.k8s.io/cluster-api/pkg/controller/machine" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/runtime/signals" ) @@ -28,8 +28,8 @@ func main() { Execute() } -func initializeControllerNamespace() (string, error) { - controllerNamespace, err := machineutil.GetKubernetesNamespaceFromMachines() +func initializeControllerNamespace(c client.Client) (string, error) { + controllerNamespace, err := machineutil.GetKubernetesNamespaceFromMachines(context.Background(), c) if err != nil { return "", err } @@ -87,48 +87,42 @@ func run(cmd *cobra.Command, args []string) { if err != nil { log.Fatalf("failed to create the cluster manager: %v", err) } - ctlrNamespace, err := initializeControllerNamespace() + ctlrNamespace, err := initializeControllerNamespace(mgr.GetClient()) if err != nil { log.Fatalf("failed to get controller namespace: %s", err) } - log.Info("initializing machine actuator") - machineActuator, err := wks.NewMachineActuator(wks.MachineActuatorParams{ - EventRecorder: mgr.GetRecorder(wks.ProviderName + "-controller"), + + log.Info("registering scheme for all resources") + if err := apis.AddToScheme(mgr.GetScheme()); err != nil { + log.Fatal(err) + } + if err := clusterv1.AddToScheme(mgr.GetScheme()); err != nil { + log.Fatal(err) + } + + log.Info("registering controllers to the cluster manager") + clusterReconciler, err := wks.NewClusterReconciler(mgr.GetClient(), mgr.GetEventRecorderFor(wks.ProviderName+"-controller")) + if err != nil { + log.Fatal(err) + } + if err = clusterReconciler.SetupWithManager(mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { + log.Fatal(err) + } + + machineController, err := wks.NewMachineController(wks.MachineControllerParams{ + EventRecorder: mgr.GetEventRecorderFor(wks.ProviderName + "-controller"), Client: mgr.GetClient(), ClientSet: clientSet, ControllerNamespace: ctlrNamespace, - Scheme: mgr.GetScheme(), Verbose: options.verbose, }) if err != nil { log.Fatalf("failed to create the machine actuator: %v", err) } - - log.Info("initializing cluster actuator") - clusterActuator, err := wks.NewClusterActuator(wks.ClusterActuatorParams{ - EventRecorder: mgr.GetRecorder(wks.ProviderName + "-controller"), - Client: mgr.GetClient(), - ClientSet: clientSet, - Scheme: mgr.GetScheme(), - }) - if err != nil { - log.Fatalf("failed to create the cluster actuator: %v", err) - } - - clustercommon.RegisterClusterProvisioner(wks.ProviderName, clusterActuator) - - log.Info("registering scheme for all resources") - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { - log.Fatal(err) - } - if err := clusterapis.AddToScheme(mgr.GetScheme()); err != nil { + if err = machineController.SetupWithManager(mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { log.Fatal(err) } - log.Info("registering controllers to the cluster manager") - capimachine.AddWithActuator(mgr, machineActuator) - capicluster.AddWithActuator(mgr, clusterActuator) - log.Info("starting the cluster manager") log.Fatal(mgr.Start(signals.SetupSignalHandler())) } From aa1138fa6ee25ccff2bb3bf49ae0da5ca4f94314 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 08:09:47 +0000 Subject: [PATCH 15/72] Remove Scheme registration from helper function --- pkg/utilities/manifest/manifest.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/utilities/manifest/manifest.go b/pkg/utilities/manifest/manifest.go index cfacbc11..451814ee 100644 --- a/pkg/utilities/manifest/manifest.go +++ b/pkg/utilities/manifest/manifest.go @@ -55,10 +55,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { //use the namespace specified. //Returns the updated manifest or an error if there was a problem updating the manifest. func WithNamespace(fileOrString, namespace string) (string, error) { - mutex.Lock() - clusterv1alpha3.AddToScheme(scheme.Scheme) - mutex.Unlock() - content, err := Content(fileOrString) if err != nil { return "", err From a6767d10fd70087efd558360b198d3e21817f88b Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:40:02 +0000 Subject: [PATCH 16/72] Remove unused applyAddons() function --- cmd/wksctl/applyaddons/applyaddons.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/cmd/wksctl/applyaddons/applyaddons.go b/cmd/wksctl/applyaddons/applyaddons.go index 5139a18f..c199e1d1 100644 --- a/cmd/wksctl/applyaddons/applyaddons.go +++ b/cmd/wksctl/applyaddons/applyaddons.go @@ -11,11 +11,9 @@ import ( "github.com/spf13/cobra" "github.com/weaveworks/launcher/pkg/kubectl" "github.com/weaveworks/wksctl/pkg/addons" - "github.com/weaveworks/wksctl/pkg/kubernetes/config" "github.com/weaveworks/wksctl/pkg/specs" "github.com/weaveworks/wksctl/pkg/utilities/manifest" "github.com/weaveworks/wksctl/pkg/utilities/path" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) var Cmd = &cobra.Command{ @@ -42,17 +40,6 @@ func init() { &applyAddonsOptions.namespace, "namespace", manifest.DefaultNamespace, "namespace portion of kubeconfig path") } -func applyAddons(cluster *clusterv1.Cluster, machines []*clusterv1.Machine, basePath string) error { - opts := &applyAddonsOptions - sp := specs.New(cluster, machines) - kubeconfig, err := config.NewKubeConfig(opts.artifactDirectory, machines) - if err != nil { - log.Fatal("Error generating kubeconf", err) - } - - return applyAddonsUsingConfig(sp, basePath, kubeconfig) -} - func applyAddonsUsingConfig(sp *specs.Specs, basePath, kubeconfig string) error { fmt.Println("==> Applying addons (2)") From cf562d2b0040a2d78ed00bbda2f0c5560e83a92a Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:40:18 +0000 Subject: [PATCH 17/72] Update kubeconfig for v1alpha3 --- pkg/kubernetes/config/kubeconfig.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/pkg/kubernetes/config/kubeconfig.go b/pkg/kubernetes/config/kubeconfig.go index 7c0b7618..d76d870f 100644 --- a/pkg/kubernetes/config/kubeconfig.go +++ b/pkg/kubernetes/config/kubeconfig.go @@ -8,6 +8,7 @@ import ( yaml "github.com/ghodss/yaml" "github.com/pkg/errors" log "github.com/sirupsen/logrus" + baremetalv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/plan/runners/ssh" "github.com/weaveworks/wksctl/pkg/plan/runners/sudo" @@ -16,7 +17,7 @@ import ( "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) // DefaultPath defines the default path @@ -27,16 +28,12 @@ var DefaultContextName = fmt.Sprintf("%s@%s", DefaultClusterAdminName, DefaultCl // NewKubeConfig generates a Kubernetes configuration (e.g. for kubectl to use) // from the provided machines, and places it in the provided directory. -func NewKubeConfig(artifactDirectory string, machines []*clusterv1.Machine) (string, error) { - master := machine.FirstMaster(machines) +func NewKubeConfig(artifactDirectory string, machines []*clusterv1.Machine, bl []*baremetalv1.BareMetalMachine) (string, error) { + master, bmm := machine.FirstMaster(machines, bl) if master == nil { return "", errors.New("at least one master node is required to create a Kubernetes configuration file") } - config, err := machine.Config(master) - if err != nil { - return "", err - } - return path.WKSResourcePath(artifactDirectory, config.Address), nil + return path.WKSResourcePath(artifactDirectory, bmm.Spec.Address), nil } // Params groups the various settings to transform Kubernetes configurations. From bf28f2ea442b49198fb4f2e67e9bd4bfc612c819 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:43:43 +0000 Subject: [PATCH 18/72] Re-use machine.GetKubernetesVersionFromManifest() --- .../registrysynccommands.go | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/cmd/wksctl/registrysynccommands/registrysynccommands.go b/cmd/wksctl/registrysynccommands/registrysynccommands.go index 3a850fc3..058351da 100644 --- a/cmd/wksctl/registrysynccommands/registrysynccommands.go +++ b/cmd/wksctl/registrysynccommands/registrysynccommands.go @@ -10,11 +10,7 @@ import ( "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/kubernetes" "github.com/weaveworks/wksctl/pkg/registry" - "github.com/weaveworks/wksctl/pkg/utilities" v "github.com/weaveworks/wksctl/pkg/utilities/version" - "k8s.io/apimachinery/pkg/util/validation/field" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - apierrors "sigs.k8s.io/cluster-api/pkg/errors" ) var Cmd = &cobra.Command{ @@ -78,7 +74,7 @@ func registrySyncRun(cmd *cobra.Command, args []string) { func kubernetesVersionsRange() string { if registrySyncOptions.machinesManifestPath != "" { - version, err := extractKubernetesVersionFromMachines(registrySyncOptions.machinesManifestPath) + version, _, err := machine.GetKubernetesVersionFromManifest(registrySyncOptions.machinesManifestPath) if err != nil { log.Fatalf("Failed to extract Kubernetes version from machines manifest: %s", err) } @@ -89,18 +85,3 @@ func kubernetesVersionsRange() string { } return v.AnyRange } - -func extractKubernetesVersionFromMachines(machinesManifestPath string) (string, error) { - errorsHandler := func(machines []*clusterv1.Machine, errors field.ErrorList) ([]*clusterv1.Machine, error) { - if len(errors) > 0 { - utilities.PrintErrors(errors) - return nil, apierrors.InvalidMachineConfiguration("%s failed validation", machinesManifestPath) - } - return machines, nil - } - machines, err := machine.ParseAndDefaultAndValidate(machinesManifestPath, errorsHandler) - if err != nil { - return "", err - } - return machines[0].Spec.Versions.Kubelet, nil -} From 04a677d6e5634a8e154885e32c756da5aed2498f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:49:12 +0000 Subject: [PATCH 19/72] Update machine controller after adding 'spec' field --- .../controller/wksctl/machine_controller.go | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 57bd21d0..544a89ff 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -269,14 +269,14 @@ func (a *MachineController) connectTo(c *baremetalspecv1.BareMetalCluster, m *ba return nil, nil, gerrors.Wrap(err, "failed to read SSH key") } sshClient, err := ssh.NewClient(ssh.ClientParams{ - User: c.User, + User: c.Spec.User, Host: a.getMachineAddress(m), - Port: m.Private.Port, + Port: m.Spec.Private.Port, PrivateKey: sshKey, PrintOutputs: a.verbose, }) if err != nil { - return nil, nil, gerrors.Wrapf(err, "failed to create SSH client using %v", m.Private) + return nil, nil, gerrors.Wrapf(err, "failed to create SSH client using %v", m.Spec.Private) } os, err := os.Identify(sshClient) if err != nil { @@ -612,7 +612,7 @@ func (a *MachineController) performActualUpdate( return nil } -func (a *MachineController) getNodePlan(providerSpec *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, machineAddress string, installer *os.OS) (*plan.Plan, error) { +func (a *MachineController) getNodePlan(provider *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, machineAddress string, installer *os.OS) (*plan.Plan, error) { namespace := a.controllerNamespace secrets, err := a.kubeadmJoinSecrets() if err != nil { @@ -630,7 +630,7 @@ func (a *MachineController) getNodePlan(providerSpec *baremetalspecv1.BareMetalC if err != nil { return nil, err } - configMaps, err := a.getProviderConfigMaps(providerSpec) + configMaps, err := a.getProviderConfigMaps(provider) if err != nil { return nil, err } @@ -647,16 +647,16 @@ func (a *MachineController) getNodePlan(providerSpec *baremetalspecv1.BareMetalC CertificateKey: secrets.CertificateKey, KubeletConfig: config.KubeletConfig{ NodeIP: machineAddress, - CloudProvider: providerSpec.CloudProvider, - ExtraArguments: specs.TranslateServerArgumentsToStringMap(providerSpec.KubeletArguments), + CloudProvider: provider.Spec.CloudProvider, + ExtraArguments: specs.TranslateServerArgumentsToStringMap(provider.Spec.KubeletArguments), }, KubernetesVersion: machineutil.GetKubernetesVersion(machine), - CRI: providerSpec.CRI, - ConfigFileSpecs: providerSpec.OS.Files, + CRI: provider.Spec.CRI, + ConfigFileSpecs: provider.Spec.OS.Files, ProviderConfigMaps: configMaps, AuthConfigMap: authConfigMap, Namespace: namespace, - ExternalLoadBalancer: providerSpec.APIServer.ExternalLoadBalancer, + ExternalLoadBalancer: provider.Spec.APIServer.ExternalLoadBalancer, }) if err != nil { return nil, gerrors.Wrapf(err, "failed to create machine plan for %s", machine.Name) @@ -678,8 +678,8 @@ func (a *MachineController) getAuthConfigMap() (*v1.ConfigMap, error) { return nil, nil } -func (a *MachineController) getProviderConfigMaps(providerSpec *baremetalspecv1.BareMetalCluster) (map[string]*v1.ConfigMap, error) { - fileSpecs := providerSpec.OS.Files +func (a *MachineController) getProviderConfigMaps(provider *baremetalspecv1.BareMetalCluster) (map[string]*v1.ConfigMap, error) { + fileSpecs := provider.Spec.OS.Files client := a.clientSet.CoreV1().ConfigMaps(a.controllerNamespace) configMaps := map[string]*v1.ConfigMap{} for _, fileSpec := range fileSpecs { @@ -1094,8 +1094,8 @@ func getMachineID(machine *baremetalspecv1.BareMetalMachine) string { } func (a *MachineController) getMachineAddress(m *baremetalspecv1.BareMetalMachine) string { - if m.Private.Address != "" { - return m.Private.Address + if m.Spec.Private.Address != "" { + return m.Spec.Private.Address } return machineIPs[getMachineID(m)] } From 17d17f29de348c1aea7b249b7e51928682caba7e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 09:55:46 +0000 Subject: [PATCH 20/72] Update apply_test for v1alpha3 --- test/integration/test/apply_test.go | 153 ++++++++++------------ test/integration/test/assets/cluster.yaml | 84 ++++++------ 2 files changed, 113 insertions(+), 124 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index 7bbf4a03..4dcaf626 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -20,14 +20,14 @@ import ( "github.com/weaveworks/wksctl/pkg/plan/runners/ssh" yaml "github.com/ghodss/yaml" - baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetalproviderspec/v1alpha1" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" spawn "github.com/weaveworks/wksctl/test/integration/spawn" "github.com/stretchr/testify/assert" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) // Runs a basic set of tests for apply. @@ -45,12 +45,12 @@ var ( configDir = filepath.Join(srcDir, "test", "integration", "test", "assets") ) -func generateName(role role) string { +func generateName(role role, i int) string { switch role { case master: - return "master-" + return fmt.Sprintf("master-%d", i) case node: - return "node-" + return fmt.Sprintf("node-%d", i) default: panic(fmt.Errorf("unknown role: %s", role)) } @@ -67,41 +67,48 @@ func setLabel(role role) string { } } -func appendMachine(t *testing.T, l *clusterv1.MachineList, role role, publicIP, privateIP string) { - // Create a BareMetalMachineProviderSpec and encode it. - spec := &baremetalspecv1.BareMetalMachineProviderSpec{ - Public: baremetalspecv1.EndPoint{ - Address: publicIP, - Port: 22, +func appendMachine(t *testing.T, ordinal int, ml *clusterv1.MachineList, bl *baremetalspecv1.BareMetalMachineList, role role, publicIP, privateIP string) { + spec := baremetalspecv1.BareMetalMachine{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "cluster.weave.works/v1alpha3", + Kind: "BareMetalMachine", }, - Private: baremetalspecv1.EndPoint{ - Address: privateIP, - Port: 22, + ObjectMeta: metav1.ObjectMeta{ + GenerateName: generateName(role, ordinal), }, + Spec: baremetalspecv1.BareMetalMachineSpec{ + Public: baremetalspecv1.EndPoint{ + Address: publicIP, + Port: 22, + }, + Private: baremetalspecv1.EndPoint{ + Address: privateIP, + Port: 22, + }}, } - codec, err := baremetalspecv1.NewCodec() - assert.NoError(t, err) - encodedSpec, err := codec.EncodeToProviderSpec(spec) - assert.NoError(t, err) + bl.Items = append(bl.Items, spec) // Create a machine. machine := clusterv1.Machine{ TypeMeta: metav1.TypeMeta{ - APIVersion: "cluster.k8s.io/v1alpha1", + APIVersion: "cluster.k8s.io/v1alpha3", Kind: "Machine", }, ObjectMeta: metav1.ObjectMeta{ - GenerateName: generateName(role), + GenerateName: generateName(role, ordinal), Labels: map[string]string{ "set": setLabel(role), }, }, Spec: clusterv1.MachineSpec{ - ProviderSpec: *encodedSpec, + InfrastructureRef: v1.ObjectReference{ + Kind: spec.TypeMeta.Kind, + Name: spec.ObjectMeta.Name, + }, }, } - l.Items = append(l.Items, machine) + ml.Items = append(ml.Items, machine) } // makeMachinesFromTerraform creates cluster-api Machine objects from a @@ -112,13 +119,19 @@ func appendMachine(t *testing.T, l *clusterv1.MachineList, role role, publicIP, // numMachines is the number of machines to use. It can be less than the number // of provisionned terraform machines. -1 means use all machines setup by // terraform. The minimum number of machines to use is 2. -func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMachines int) *clusterv1.MachineList { - l := &clusterv1.MachineList{ +func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMachines int) (*clusterv1.MachineList, *baremetalspecv1.BareMetalMachineList) { + ml := &clusterv1.MachineList{ TypeMeta: metav1.TypeMeta{ - APIVersion: "cluster.k8s.io/v1alpha1", + APIVersion: "cluster.k8s.io/v1alpha3", Kind: "MachineList", }, } + bl := &baremetalspecv1.BareMetalMachineList{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "baremetal.weave.works/v1alpha3", + Kind: "BareMetalMachineList", + }, + } publicIPs := terraform.stringArrayVar(keyPublicIPs) privateIPs := terraform.stringArrayVar(keyPrivateIPs) assert.True(t, len(publicIPs) >= 2) // One master and at least one node @@ -134,32 +147,36 @@ func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMach const numMasters = 1 for i := 0; i < numMasters; i++ { - appendMachine(t, l, master, publicIPs[i], privateIPs[i]) + appendMachine(t, i, ml, bl, master, publicIPs[i], privateIPs[i]) } // Subsequent machines will be nodes. for i := numMasters; i < numMachines; i++ { - appendMachine(t, l, node, publicIPs[i], privateIPs[i]) + appendMachine(t, i, ml, bl, node, publicIPs[i], privateIPs[i]) } - return l + return ml, bl } -func writeYamlManifest(t *testing.T, o interface{}, path string) { - data, err := yaml.Marshal(o) - assert.NoError(t, err) - err = ioutil.WriteFile(path, data, 0644) +func writeYamlManifests(t *testing.T, path string, objects ...interface{}) { + var data []byte + for _, o := range objects { + y, err := yaml.Marshal(o) + assert.NoError(t, err) + data = append(data, y...) + } + err := ioutil.WriteFile(path, data, 0644) assert.NoError(t, err) } -func firstMaster(l *clusterv1.MachineList) *clusterv1.Machine { +func firstMaster(l *clusterv1.MachineList, bl *baremetalspecv1.BareMetalMachineList) (*clusterv1.Machine, *baremetalspecv1.BareMetalMachine) { for i := range l.Items { m := &l.Items[i] if machine.IsMaster(m) { - return m + return m, &bl.Items[i] } } - return nil + return nil, nil } func numMasters(l *clusterv1.MachineList) int { @@ -186,58 +203,30 @@ func numWorkers(l *clusterv1.MachineList) int { func setKubernetesVersion(l *clusterv1.MachineList, version string) { for i := range l.Items { - m := &l.Items[i] - m.Spec.Versions.Kubelet = version - if machine.IsMaster(m) { - m.Spec.Versions.ControlPlane = version - } + l.Items[i].Spec.Version = &version } } -func machineSpec(t *testing.T, machine *clusterv1.Machine) *baremetalspecv1.BareMetalMachineProviderSpec { - codec, err := baremetalspecv1.NewCodec() - assert.NoError(t, err) - spec, err := codec.MachineProviderFromProviderSpec(machine.Spec.ProviderSpec) - assert.NoError(t, err) - return spec -} - -func clusterSpec(t *testing.T, cluster *clusterv1.Cluster) *baremetalspecv1.BareMetalClusterProviderSpec { - codec, err := baremetalspecv1.NewCodec() - assert.NoError(t, err) - spec, err := codec.ClusterProviderFromProviderSpec(cluster.Spec.ProviderSpec) - assert.NoError(t, err) - return spec -} - -func parseCluster(t *testing.T, r io.Reader) *clusterv1.Cluster { +func parseCluster(t *testing.T, r io.Reader) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster) { bytes, err := ioutil.ReadAll(r) assert.NoError(t, err) - cluster := &clusterv1.Cluster{} - err = yaml.Unmarshal(bytes, cluster) + list := v1.List{} + err = yaml.Unmarshal(bytes, list) assert.NoError(t, err) - return cluster + assert.Equal(t, 2, len(list.Items)) + cluster := list.Items[0].Object.(*clusterv1.Cluster) + bmCluster := list.Items[1].Object.(*baremetalspecv1.BareMetalCluster) + return cluster, bmCluster } -func parseClusterManifest(t *testing.T, file string) *clusterv1.Cluster { +func parseClusterManifest(t *testing.T, file string) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster) { f, err := os.Open(file) assert.NoError(t, err) defer f.Close() return parseCluster(t, f) } -func getClusterNamespaceAndName(t *testing.T) (string, string) { - cluster := parseClusterManifest(t, "assets/cluster.yaml") - meta := cluster.ObjectMeta - name := meta.Name - namespace := meta.Namespace - if namespace == "" { - return "default", name - } - return namespace, name -} - // The installer names the kubeconfig file from the cluster namespace and name // ~/.wks func wksKubeconfig(t *testing.T, l *clusterv1.MachineList) string { @@ -443,9 +432,9 @@ func TestApply(t *testing.T) { terraform, err := newTerraformOutputFromFile(options.terraform.outputPath) assert.NoError(t, err) - machines := makeMachinesFromTerraform(t, terraform, terraform.numMachines()-1) + machines, bmMachines := makeMachinesFromTerraform(t, terraform, terraform.numMachines()-1) setKubernetesVersion(machines, kubernetes.DefaultVersion) - writeYamlManifest(t, machines, configPath("machines.yaml")) + writeYamlManifests(t, configPath("machines.yaml"), machines, bmMachines) spec := machineSpec(t, &machines.Items[0]) // Generate bad version to check failure return codes @@ -465,18 +454,12 @@ func TestApply(t *testing.T) { clusterManifestPath := configPath("cluster.yaml") machinesManifestPath := configPath("machines.yaml") - clusterBytes, err := ioutil.ReadFile(clusterManifestPath) - assert.NoError(t, err) - cluster := &clusterv1.Cluster{} - err = yaml.Unmarshal(clusterBytes, cluster) - assert.NoError(t, err) - cSpec := clusterSpec(t, cluster) - master := firstMaster(machines) - mSpec := machineSpec(t, master) - ip := mSpec.Public.Address - port := mSpec.Public.Port + _, c := parseClusterManifest(t, clusterManifestPath) + _, m := firstMaster(machines, bmMachines) + ip := m.Spec.Public.Address + port := m.Spec.Public.Port sshClient, err := ssh.NewClient(ssh.ClientParams{ - User: cSpec.User, + User: c.Spec.User, Host: ip, Port: port, PrivateKeyPath: sshKeyPath, diff --git a/test/integration/test/assets/cluster.yaml b/test/integration/test/assets/cluster.yaml index 9367247b..c58ceaed 100644 --- a/test/integration/test/assets/cluster.yaml +++ b/test/integration/test/assets/cluster.yaml @@ -1,39 +1,45 @@ -apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - name: integration-tests -spec: - clusterNetwork: - services: - cidrBlocks: ["172.20.0.0/23"] - pods: - cidrBlocks: ["192.168.0.0/16"] - serviceDomain: "cluster.local" - providerSpec: - value: - apiVersion: "baremetalproviderspec/v1alpha1" - kind: "BareMetalClusterProviderSpec" - user: "wksctl-cit" - os: - files: - - source: - configmap: repo - key: kubernetes.repo - destination: /etc/yum.repos.d/kubernetes.repo - - source: - configmap: repo - key: docker-ce.repo - destination: /etc/yum.repos.d/docker-ce.repo - - source: - configmap: repo - key: cloud-google-com.gpg.b64 - destination: /tmp/cloud-google-com.gpg.b64 - cri: - kind: docker - package: docker-ce - version: 19.03.8 - authorizationWebhook: - secretFile: authz.yaml - cacheAuthorizedTTL: 5m0s - cacheUnauthorizedTTL: 30s - url: https://127.0.0.1:5001/authorize +apiVersion: v1 +kind: List +items: +- apiVersion: "cluster.k8s.io/v1alpha3" + kind: Cluster + metadata: + name: integration-tests + spec: + clusterNetwork: + services: + cidrBlocks: ["172.20.0.0/23"] + pods: + cidrBlocks: ["192.168.0.0/16"] + serviceDomain: "cluster.local" + infrastructureRef: + kind: BareMetalCluster + name: integration-tests +- apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalCluster" + metadata: + name: integration-tests + user: "wksctl-cit" + os: + files: + - source: + configmap: repo + key: kubernetes.repo + destination: /etc/yum.repos.d/kubernetes.repo + - source: + configmap: repo + key: docker-ce.repo + destination: /etc/yum.repos.d/docker-ce.repo + - source: + configmap: repo + key: cloud-google-com.gpg.b64 + destination: /tmp/cloud-google-com.gpg.b64 + cri: + kind: docker + package: docker-ce + version: 19.03.8 + authorizationWebhook: + secretFile: authz.yaml + cacheAuthorizedTTL: 5m0s + cacheUnauthorizedTTL: 30s + url: https://127.0.0.1:5001/authorize From 0a9eea71b1208977d17fe0453879e58326c4c99c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 10:37:15 +0000 Subject: [PATCH 21/72] Update manifest test to v1alpha3 --- pkg/utilities/manifest/manifest_test.go | 59 ++++++++++++++++--------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/pkg/utilities/manifest/manifest_test.go b/pkg/utilities/manifest/manifest_test.go index 49d645b7..8f44f32b 100644 --- a/pkg/utilities/manifest/manifest_test.go +++ b/pkg/utilities/manifest/manifest_test.go @@ -6,6 +6,9 @@ import ( "testing" "github.com/stretchr/testify/assert" + baremetalv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" + "k8s.io/client-go/kubernetes/scheme" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) const ( @@ -129,7 +132,7 @@ subjects: name: default namespace: system ` - clusteryaml = `apiVersion: cluster.k8s.io/v1alpha1 + clusteryaml = `apiVersion: cluster.x-k8s.io/v1alpha3 kind: Cluster metadata: name: example @@ -140,10 +143,15 @@ spec: pods: cidrBlocks: [192.168.0.0/16] serviceDomain: cluster.local - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalClusterProviderSpec + infrastructureRef: + kind: BareMetalCluster + name: example +--- +apiVersion: cluster.weave.works/v1alpha3 +kind: "BareMetalCluster" +metadata: + name: example +spec: sshKeyPath: cluster-key user: root os: @@ -165,37 +173,46 @@ spec: package: docker-ce version: 19.03.8 ` - machinesyaml = `apiVersion: v1 -kind: List -items: -- apiVersion: cluster.k8s.io/v1alpha1 + machinesyaml = ` + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: - generateName: master- + name: master-0 labels: set: master spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + infrastructureRef: + kind: BareMetalMachine + name: master-0 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-0 + spec: public: address: 127.0.0.1 port: 2222 private: address: 172.17.0.2 port: 22 -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: - generateName: node- + name: node-0 labels: set: node spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + infrastructureRef: + kind: BareMetalMachine + name: node-0 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: node-0 + spec: public: address: 127.0.0.1 port: 2223 @@ -233,6 +250,8 @@ var nstests = []struct { } func TestManifestWithNamespace(t *testing.T) { + assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, baremetalv1.AddToScheme(scheme.Scheme)) for _, tt := range nstests { t.Run(tt.name, func(t *testing.T) { fname := createFile(t, tt.content, tt.fileName).Name() From 6670579d33eaff1c5b6ef5da0e71e9ea472bfa3e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 11:15:06 +0000 Subject: [PATCH 22/72] Update multimaster integration test to v1alpha3 --- .../integration/container/multimaster_test.go | 84 +++++++++++++------ 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/test/integration/container/multimaster_test.go b/test/integration/container/multimaster_test.go index 7c30d666..95a66d4e 100644 --- a/test/integration/container/multimaster_test.go +++ b/test/integration/container/multimaster_test.go @@ -19,7 +19,7 @@ import ( corev1 "k8s.io/api/core/v1" ) -const clusterYAML = `apiVersion: cluster.k8s.io/v1alpha1 +const clusterYAML = `apiVersion: cluster.x-k8s.io/v1alpha3 kind: Cluster metadata: name: test-multimaster @@ -30,10 +30,15 @@ spec: pods: cidrBlocks: [192.168.0.0/16] serviceDomain: cluster.local + infrastructureRef: + kind: BareMetalCluster + name: test-multimaster +--- +apiVersion: cluster.weave.works/v1alpha3 +kind: "BareMetalCluster" +metadata: + name: test-multimaster providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalClusterProviderSpec user: root imageRepository: %s:%d os: @@ -71,71 +76,96 @@ spec: value: "10000" ` -const machinesYAML = `apiVersion: v1 -kind: List -items: -- apiVersion: cluster.k8s.io/v1alpha1 +const machinesYAML = ` + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: master-1 labels: set: master spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + clusterName: test-multimaster + infrastructureRef: + kind: BareMetalMachine + name: master-1 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-1 + spec: public: address: 127.0.0.1 port: 2222 private: address: %s port: 22 -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: master-2 labels: set: master spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + clusterName: test-multimaster + infrastructureRef: + kind: BareMetalMachine + name: master-2 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-2 + spec: public: address: 127.0.0.1 port: 2223 private: address: %s port: 22 -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: master-3 labels: set: master spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + clusterName: test-multimaster + infrastructureRef: + kind: BareMetalMachine + name: master-3 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: master-3 + spec: public: address: 127.0.0.1 port: 2224 private: address: %s port: 22 -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: worker-1 labels: set: worker spec: - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalMachineProviderSpec + clusterName: test-multimaster + infrastructureRef: + kind: BareMetalMachine + name: worker-1 +--- + apiVersion: "cluster.weave.works/v1alpha3" + kind: "BareMetalMachine" + metadata: + name: worker-1 + spec: public: address: 127.0.0.1 port: 2225 From 2d5e9c572508d48189d33a2b39f482b46b4c49f2 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 15:01:28 +0000 Subject: [PATCH 23/72] cluster.yaml should be a stream not a list --- test/integration/test/assets/cluster.yaml | 41 +++++++++++------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/test/integration/test/assets/cluster.yaml b/test/integration/test/assets/cluster.yaml index c58ceaed..9ef202a5 100644 --- a/test/integration/test/assets/cluster.yaml +++ b/test/integration/test/assets/cluster.yaml @@ -1,24 +1,23 @@ -apiVersion: v1 -kind: List -items: -- apiVersion: "cluster.k8s.io/v1alpha3" - kind: Cluster - metadata: - name: integration-tests - spec: - clusterNetwork: - services: - cidrBlocks: ["172.20.0.0/23"] - pods: - cidrBlocks: ["192.168.0.0/16"] - serviceDomain: "cluster.local" - infrastructureRef: - kind: BareMetalCluster - name: integration-tests -- apiVersion: "cluster.weave.works/v1alpha3" - kind: "BareMetalCluster" - metadata: - name: integration-tests +apiVersion: "cluster.k8s.io/v1alpha3" +kind: Cluster +metadata: + name: integration-tests +spec: + clusterNetwork: + services: + cidrBlocks: ["172.20.0.0/23"] + pods: + cidrBlocks: ["192.168.0.0/16"] + serviceDomain: "cluster.local" + infrastructureRef: + kind: BareMetalCluster + name: integration-tests +--- +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: integration-tests +spec: user: "wksctl-cit" os: files: From 07c251b5ed70621f3667ea40dc8fd5f699fbc96f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 28 Apr 2020 17:33:46 +0000 Subject: [PATCH 24/72] Use 'require' to fail tests before they crash --- test/integration/test/apply_test.go | 3 ++- test/integration/test/help_test.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index 4dcaf626..65188296 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -24,6 +24,7 @@ import ( spawn "github.com/weaveworks/wksctl/test/integration/spawn" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -430,7 +431,7 @@ func TestApply(t *testing.T) { // Prepare the machines manifest from terraform output. terraform, err := newTerraformOutputFromFile(options.terraform.outputPath) - assert.NoError(t, err) + require.NoError(t, err) machines, bmMachines := makeMachinesFromTerraform(t, terraform, terraform.numMachines()-1) setKubernetesVersion(machines, kubernetes.DefaultVersion) diff --git a/test/integration/test/help_test.go b/test/integration/test/help_test.go index 2ff9e073..c784710f 100644 --- a/test/integration/test/help_test.go +++ b/test/integration/test/help_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // Check "help" has some help blurb about the the "apply", "help", "version" @@ -13,7 +14,7 @@ func TestHelp(t *testing.T) { exe := run.NewExecutor() run, err := exe.RunCmd(exec.Command(cmd, "help")) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, 0, run.ExitCode()) assert.True(t, run.Contains("apply")) assert.True(t, run.Contains("help")) From 1a8044985263bf1e75fb910250b56dcb5333523d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 30 Apr 2020 09:26:46 +0000 Subject: [PATCH 25/72] Make UpdateWithGeneratedNames() not-fail on v1alpha3 (Needs a bit more work on BareMetalMachine to be useful) --- pkg/cluster/machine/machines_manifest.go | 51 ++++++++++-------- pkg/cluster/machine/machines_manifest_test.go | 53 +++++++++++-------- 2 files changed, 61 insertions(+), 43 deletions(-) diff --git a/pkg/cluster/machine/machines_manifest.go b/pkg/cluster/machine/machines_manifest.go index 94ec12d8..afa09070 100644 --- a/pkg/cluster/machine/machines_manifest.go +++ b/pkg/cluster/machine/machines_manifest.go @@ -1,7 +1,8 @@ package machine import ( - "io/ioutil" + "io" + "os" "strings" "github.com/pkg/errors" @@ -12,11 +13,11 @@ import ( // GetMachinesManifest reads a manifest from the filesystem and updates it with generated names (see: UpdateWithGeneratedNames) func GetMachinesManifest(path string) (string, error) { - machinesManifestBytes, err := ioutil.ReadFile(path) + f, err := os.Open(path) if err != nil { return "", err } - return UpdateWithGeneratedNames(string(machinesManifestBytes)) + return UpdateWithGeneratedNames(f) } // UpdateWithGeneratedNames generates names for machines, rather than using @@ -26,36 +27,44 @@ func GetMachinesManifest(path string) (string, error) { // - WKS needs to be as idempotent as possible. // Note that if the customer updates the manifest with their own names, we'll // honor those. -func UpdateWithGeneratedNames(manifest string) (string, error) { - return "", errors.New("generateName not implemented for v1alpha3") - - var machineList clusterv1.MachineList - if err := yaml.Unmarshal([]byte(manifest), &machineList); err != nil { - return "", errors.Wrap(err, "failed to deserialize machines' manifest") +func UpdateWithGeneratedNames(r io.ReadCloser) (string, error) { + machines, bml, err := Parse(r) + if err != nil { + return "", err } // Get all the machine names currently used, either set by a previous call // to this function, or set by the end-user. - namesTaken := readNames(&machineList) - for i := range machineList.Items { - if machineList.Items[i].ObjectMeta.GenerateName != "" { - name := uniqueNameFrom(machineList.Items[i].ObjectMeta.GenerateName, namesTaken) - machineList.Items[i].SetName(name) + namesTaken := readNames(machines) + for i := range machines { + if machines[i].ObjectMeta.GenerateName != "" { + // TODO: update BareMetalMachine list here too + if len(bml) > i && bml[i].ObjectMeta.GenerateName != "" { + return "", errors.New("generateName not implemented for v1alpha3") + } + name := uniqueNameFrom(machines[i].ObjectMeta.GenerateName, namesTaken) + machines[i].SetName(name) // Blank generateName out, now that a name has been generated. - machineList.Items[i].SetGenerateName("") + machines[i].SetGenerateName("") } } - manifestBytes, err := yaml.Marshal(machineList) - if err != nil { - return "", err + var buf strings.Builder + // Need to do this in a loop because we want a stream not an array + for _, machine := range machines { + manifestBytes, err := yaml.Marshal(machine) + if err != nil { + return "", err + } + buf.WriteString("---\n") + buf.Write(manifestBytes) } - return string(manifestBytes), nil + return buf.String(), nil } -func readNames(machineList *clusterv1.MachineList) map[string]struct{} { +func readNames(machines []*clusterv1.Machine) map[string]struct{} { namesTaken := map[string]struct{}{} - for _, machine := range machineList.Items { + for _, machine := range machines { if machine.ObjectMeta.Name != "" { namesTaken[machine.ObjectMeta.Name] = struct{}{} } diff --git a/pkg/cluster/machine/machines_manifest_test.go b/pkg/cluster/machine/machines_manifest_test.go index 52c84a21..30f4b61d 100644 --- a/pkg/cluster/machine/machines_manifest_test.go +++ b/pkg/cluster/machine/machines_manifest_test.go @@ -1,6 +1,9 @@ package machine_test import ( + "fmt" + + "io/ioutil" "regexp" "strings" "testing" @@ -9,30 +12,31 @@ import ( "github.com/weaveworks/wksctl/pkg/cluster/machine" ) -const manifestWithGenerateNameFields = `apiVersion: v1 -kind: List -items: -- apiVersion: cluster.k8s.io/v1alpha1 +const manifestWithGenerateNameFields = ` + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: master- -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: master- -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: node- -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: node- ` -// disabled: not implemented for v1alpha3 -func xTestUpdateWithGeneratedNamesWithGenerateNameFieldsShouldGenerateThese(t *testing.T) { - updatedManifest, err := machine.UpdateWithGeneratedNames(manifestWithGenerateNameFields) +func TestUpdateWithGeneratedNamesWithGenerateNameFieldsShouldGenerateThese(t *testing.T) { + r := ioutil.NopCloser(strings.NewReader(manifestWithGenerateNameFields)) + updatedManifest, err := machine.UpdateWithGeneratedNames(r) assert.NoError(t, err) assert.NotEqual(t, manifestWithGenerateNameFields, updatedManifest, "processing a manifest with generateName fields should modify it") assert.NotContains(t, updatedManifest, "generateName:") @@ -42,35 +46,39 @@ func xTestUpdateWithGeneratedNamesWithGenerateNameFieldsShouldGenerateThese(t *t assert.Regexp(t, regexp.MustCompile("^\\s+name: (master|node)-[0-9A-Za-z]{5}-[0-9A-Za-z]{5}$"), line) } } - updatedManifest2, err := machine.UpdateWithGeneratedNames(updatedManifest) + fmt.Print(updatedManifest) + r = ioutil.NopCloser(strings.NewReader(updatedManifest)) + updatedManifest2, err := machine.UpdateWithGeneratedNames(r) assert.NoError(t, err) assert.Equal(t, updatedManifest, updatedManifest2, "processing the same manifest twice shouldn't modify it") } -const manifestWithCustomNameFields = `apiVersion: v1 -kind: List -items: -- apiVersion: cluster.k8s.io/v1alpha1 +const manifestWithCustomNameFields = ` +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: master- -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: seed-12345 -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: generateName: node- -- apiVersion: cluster.k8s.io/v1alpha1 +--- + apiVersion: cluster.x-k8s.io/v1alpha3 kind: Machine metadata: name: very-custom-worker-node ` -// disabled: not implemented for v1alpha3 -func xTestUpdateWithGeneratedNamesWithCustomNameAndGenerateNameFieldsShouldOnlyChangeTheGenerateNameFields(t *testing.T) { - updatedManifest, err := machine.UpdateWithGeneratedNames(manifestWithCustomNameFields) +func TestUpdateWithGeneratedNamesWithCustomNameAndGenerateNameFieldsShouldOnlyChangeTheGenerateNameFields(t *testing.T) { + r := ioutil.NopCloser(strings.NewReader(manifestWithCustomNameFields)) + updatedManifest, err := machine.UpdateWithGeneratedNames(r) assert.NoError(t, err) assert.NotEqual(t, manifestWithCustomNameFields, updatedManifest, "processing a manifest with generateName fields should modify it") assert.NotContains(t, updatedManifest, "generateName:") @@ -84,7 +92,8 @@ func xTestUpdateWithGeneratedNamesWithCustomNameAndGenerateNameFieldsShouldOnlyC assert.Regexp(t, regexp.MustCompile("^\\s+name: node-[0-9A-Za-z]{5}-[0-9A-Za-z]{5}$"), line) } } - updatedManifest2, err := machine.UpdateWithGeneratedNames(updatedManifest) + r = ioutil.NopCloser(strings.NewReader(updatedManifest)) + updatedManifest2, err := machine.UpdateWithGeneratedNames(r) assert.NoError(t, err) assert.Equal(t, updatedManifest, updatedManifest2, "processing the same manifest twice shouldn't modify it") } From 9d43ec5eb8dabe1b0ae3f0078f8b5e4b0d90ff04 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 30 Apr 2020 09:27:49 +0000 Subject: [PATCH 26/72] Ensure wksctl program can parse YAMLs --- cmd/wksctl/main.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmd/wksctl/main.go b/cmd/wksctl/main.go index 9cfae0e2..44e45b4f 100644 --- a/cmd/wksctl/main.go +++ b/cmd/wksctl/main.go @@ -6,6 +6,9 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/weaveworks/go-checkpoint" + "k8s.io/client-go/kubernetes/scheme" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + "github.com/weaveworks/wksctl/cmd/wksctl/addon" "github.com/weaveworks/wksctl/cmd/wksctl/apply" "github.com/weaveworks/wksctl/cmd/wksctl/applyaddons" @@ -17,6 +20,7 @@ import ( "github.com/weaveworks/wksctl/cmd/wksctl/registrysynccommands" "github.com/weaveworks/wksctl/cmd/wksctl/version" "github.com/weaveworks/wksctl/cmd/wksctl/zshcompletions" + baremetalv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" v "github.com/weaveworks/wksctl/pkg/version" ) @@ -41,6 +45,9 @@ func configureLogger(cmd *cobra.Command, args []string) { } func main() { + clusterv1.AddToScheme(scheme.Scheme) + baremetalv1.AddToScheme(scheme.Scheme) + rootCmd.PersistentFlags().BoolVarP(&options.verbose, "verbose", "v", false, "Enable verbose output") rootCmd.AddCommand(addon.Cmd) From da8b9e3a57b77bc3bbedac9959c73749ceb50c07 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 30 Apr 2020 09:28:49 +0000 Subject: [PATCH 27/72] Fix typo in test data --- test/integration/container/multimaster_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/container/multimaster_test.go b/test/integration/container/multimaster_test.go index 95a66d4e..46d734d2 100644 --- a/test/integration/container/multimaster_test.go +++ b/test/integration/container/multimaster_test.go @@ -38,7 +38,7 @@ apiVersion: cluster.weave.works/v1alpha3 kind: "BareMetalCluster" metadata: name: test-multimaster - providerSpec: +spec: user: root imageRepository: %s:%d os: From d8e0944b9d444a386c11ee294b3a57874b34574b Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 30 Apr 2020 11:48:17 +0000 Subject: [PATCH 28/72] Return error if seed node plan fails --- pkg/apis/wksprovider/machine/os/os.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index ba0a3ff1..72f52661 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -616,7 +616,7 @@ func (o OS) applySeedNodePlan(p *plan.Plan) error { log.Errorf("Apply of Plan failed:\n%s\n", err) return err } - return nil + return err } func planParametersToConfigMapManifest(plan []byte, ns string) ([]byte, error) { From ebce9a093765ea6e4bd07623ebf754d627258e1a Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 30 Apr 2020 16:37:32 +0000 Subject: [PATCH 29/72] Update CRD definitions to v1alpha3 The generated files were created as follows: - ran `controller-gen crd:trivialVersions=true paths=./pkg/baremetal/...` - Copied source files from sigs.k8s.io/cluster-api/api/v1alpha3 to wksctl tree - Edited out x-kubernetes-int-or-string which is not supported in this version - ran `controller-gen crd:trivialVersions=true paths=./v1alpha3` --- ...cluster.weave.works_baremetalclusters.yaml | 152 ++++++ ...cluster.weave.works_baremetalmachines.yaml | 79 +++ .../crds/cluster.x-k8s.io_clusters.yaml | 235 +++++++++ .../cluster.x-k8s.io_machinedeployments.yaml | 487 ++++++++++++++++++ .../cluster.x-k8s.io_machinehealthchecks.yaml | 173 +++++++ .../crds/cluster.x-k8s.io_machines.yaml | 305 +++++++++++ .../crds/cluster.x-k8s.io_machinesets.yaml | 442 ++++++++++++++++ .../config/crds/cluster_v1alpha1_cluster.yaml | 98 ---- .../config/crds/cluster_v1alpha1_machine.yaml | 111 ---- .../crds/cluster_v1alpha1_machineclass.yaml | 33 -- .../cluster_v1alpha1_machinedeployment.yaml | 134 ----- .../crds/cluster_v1alpha1_machineset.yaml | 112 ---- 12 files changed, 1873 insertions(+), 488 deletions(-) create mode 100644 pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_clusters.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinedeployments.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinehealthchecks.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machines.yaml create mode 100644 pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinesets.yaml delete mode 100644 pkg/apis/cluster-api/config/crds/cluster_v1alpha1_cluster.yaml delete mode 100644 pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machine.yaml delete mode 100644 pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineclass.yaml delete mode 100644 pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml delete mode 100644 pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml new file mode 100644 index 00000000..6e2ea59a --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml @@ -0,0 +1,152 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: baremetalclusters.cluster.weave.works +spec: + group: cluster.weave.works + names: + kind: BareMetalCluster + listKind: BareMetalClusterList + plural: baremetalclusters + singular: baremetalcluster + scope: Namespaced + validation: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + properties: + addons: + items: + description: Addon describes an addon to install on the cluster. + properties: + deps: + items: + type: string + type: array + name: + type: string + params: + additionalProperties: + type: string + type: object + required: + - name + type: object + type: array + apiServer: + properties: + additionalSANs: + items: + type: string + type: array + externalLoadBalancer: + type: string + required: + - externalLoadBalancer + type: object + authenticationWebhook: + properties: + cacheTTL: + type: string + secretFile: + type: string + url: + type: string + required: + - secretFile + - url + type: object + authorizationWebhook: + properties: + cacheAuthorizedTTL: + type: string + cacheUnauthorizedTTL: + type: string + secretFile: + type: string + url: + type: string + required: + - secretFile + - url + type: object + cloudProvider: + type: string + cri: + properties: + kind: + type: string + package: + type: string + version: + type: string + required: + - kind + - package + - version + type: object + httpProxy: + type: string + imageRepository: + type: string + os: + properties: + files: + items: + properties: + destination: + type: string + source: + properties: + configmap: + type: string + key: + type: string + required: + - configmap + - key + type: object + required: + - destination + - source + type: object + type: array + type: object + sshKeyPath: + type: string + user: + type: string + required: + - cri + - sshKeyPath + - user + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml new file mode 100644 index 00000000..4df2a4be --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml @@ -0,0 +1,79 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: baremetalmachines.cluster.weave.works +spec: + group: cluster.weave.works + names: + kind: BareMetalMachine + listKind: BareMetalMachineList + plural: baremetalmachines + singular: baremetalmachine + scope: Namespaced + validation: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + properties: + address: + type: string + port: + type: integer + private: + description: EndPoint groups the details required to establish a connection. + properties: + address: + type: string + port: + type: integer + required: + - address + - port + type: object + privateAddress: + type: string + privateInterface: + type: string + public: + description: EndPoint groups the details required to establish a connection. + properties: + address: + type: string + port: + type: integer + required: + - address + - port + type: object + required: + - address + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_clusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_clusters.yaml new file mode 100644 index 00000000..0c49b6dc --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_clusters.yaml @@ -0,0 +1,235 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: clusters.cluster.x-k8s.io +spec: + additionalPrinterColumns: + - JSONPath: .status.phase + description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed + name: Phase + type: string + group: cluster.x-k8s.io + names: + categories: + - cluster-api + kind: Cluster + listKind: ClusterList + plural: clusters + shortNames: + - cl + singular: cluster + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Cluster is the Schema for the clusters API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: ClusterSpec defines the desired state of Cluster + properties: + clusterNetwork: + description: Cluster network configuration. + properties: + apiServerPort: + description: APIServerPort specifies the port the API Server should + bind to. Defaults to 6443. + format: int32 + type: integer + pods: + description: The network ranges from which Pod networks are allocated. + properties: + cidrBlocks: + items: + type: string + type: array + required: + - cidrBlocks + type: object + serviceDomain: + description: Domain name for services. + type: string + services: + description: The network ranges from which service VIPs are allocated. + properties: + cidrBlocks: + items: + type: string + type: array + required: + - cidrBlocks + type: object + type: object + controlPlaneEndpoint: + description: ControlPlaneEndpoint represents the endpoint used to communicate + with the control plane. + properties: + host: + description: The hostname on which the API server is serving. + type: string + port: + description: The port on which the API server is serving. + format: int32 + type: integer + required: + - host + - port + type: object + controlPlaneRef: + description: ControlPlaneRef is an optional reference to a provider-specific + resource that holds the details for provisioning the Control Plane + for a Cluster. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an + entire object, this string should contain a valid JSON/Go field + access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen only + to have some well-defined way of referencing a part of an object. + TODO: this design is not final and this field is subject to change + in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is + made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + infrastructureRef: + description: InfrastructureRef is a reference to a provider-specific + resource that holds the details for provisioning infrastructure for + a cluster in said provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an + entire object, this string should contain a valid JSON/Go field + access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen only + to have some well-defined way of referencing a part of an object. + TODO: this design is not final and this field is subject to change + in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is + made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + paused: + description: Paused can be used to prevent controllers from processing + the Cluster and all its associated objects. + type: boolean + type: object + status: + description: ClusterStatus defines the observed state of Cluster + properties: + controlPlaneInitialized: + description: ControlPlaneInitialized defines if the control plane has + been initialized. + type: boolean + controlPlaneReady: + description: ControlPlaneReady defines if the control plane is ready. + type: boolean + failureDomains: + additionalProperties: + description: FailureDomainSpec is the Schema for Cluster API failure + domains. It allows controllers to understand how many failure domains + a cluster can optionally span across. + properties: + attributes: + additionalProperties: + type: string + description: Attributes is a free form map of attributes an infrastructure + provider might use or require. + type: object + controlPlane: + description: ControlPlane determines if this failure domain is + suitable for use by control plane machines. + type: boolean + type: object + description: FailureDomains is a slice of failure domain objects synced + from the infrastructure provider. + type: object + failureMessage: + description: FailureMessage indicates that there is a fatal problem + reconciling the state, and will be set to a descriptive error message. + type: string + failureReason: + description: FailureReason indicates that there is a fatal problem reconciling + the state, and will be set to a token value suitable for programmatic + interpretation. + type: string + infrastructureReady: + description: InfrastructureReady is the state of the infrastructure + provider. + type: boolean + phase: + description: Phase represents the current phase of cluster actuation. + E.g. Pending, Running, Terminating, Failed etc. + type: string + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinedeployments.yaml b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinedeployments.yaml new file mode 100644 index 00000000..a30d58a6 --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinedeployments.yaml @@ -0,0 +1,487 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: machinedeployments.cluster.x-k8s.io +spec: + additionalPrinterColumns: + - JSONPath: .status.phase + description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown + name: Phase + type: string + - JSONPath: .status.replicas + description: Total number of non-terminated machines targeted by this deployment + name: Replicas + type: integer + - JSONPath: .status.availableReplicas + description: Total number of available machines (ready for at least minReadySeconds) + name: Available + type: integer + - JSONPath: .status.readyReplicas + description: Total number of ready machines targeted by this deployment. + name: Ready + type: integer + group: cluster.x-k8s.io + names: + categories: + - cluster-api + kind: MachineDeployment + listKind: MachineDeploymentList + plural: machinedeployments + shortNames: + - md + singular: machinedeployment + scope: Namespaced + subresources: + scale: + labelSelectorPath: .status.selector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} + validation: + openAPIV3Schema: + description: MachineDeployment is the Schema for the machinedeployments API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: MachineDeploymentSpec defines the desired state of MachineDeployment + properties: + clusterName: + description: ClusterName is the name of the Cluster this object belongs + to. + minLength: 1 + type: string + minReadySeconds: + description: Minimum number of seconds for which a newly created machine + should be ready. Defaults to 0 (machine will be considered available + as soon as it is ready) + format: int32 + type: integer + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress + before it is considered to be failed. The deployment controller will + continue to process failed deployments and a condition with a ProgressDeadlineExceeded + reason will be surfaced in the deployment status. Note that progress + will not be estimated during the time a deployment is paused. Defaults + to 600s. + format: int32 + type: integer + replicas: + description: Number of desired machines. Defaults to 1. This is a pointer + to distinguish between explicit zero and not specified. + format: int32 + type: integer + revisionHistoryLimit: + description: The number of old MachineSets to retain to allow rollback. + This is a pointer to distinguish between explicit zero and not specified. + Defaults to 1. + format: int32 + type: integer + selector: + description: Label selector for machines. Existing MachineSets whose + machines are selected by this will be the ones affected by this deployment. + It must match the machine template's labels. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: A label selector requirement is a selector that contains + values, a key, and an operator that relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: operator represents a key's relationship to a + set of values. Valid operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator + is In or NotIn, the values array must be non-empty. If the + operator is Exists or DoesNotExist, the values array must + be empty. This array is replaced during a strategic merge + patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels map is equivalent to an element + of matchExpressions, whose key field is "key", the operator is + "In", and the values array contains only "value". The requirements + are ANDed. + type: object + type: object + strategy: + description: The deployment strategy to use to replace existing machines + with new ones. + properties: + rollingUpdate: + description: Rolling update config params. Present only if MachineDeploymentStrategyType + = RollingUpdate. + properties: + maxSurge: + anyOf: + - type: integer + - type: string + description: 'The maximum number of machines that can be scheduled + above the desired number of machines. Value can be an absolute + number (ex: 5) or a percentage of desired machines (ex: 10%). + This can not be 0 if MaxUnavailable is 0. Absolute number + is calculated from percentage by rounding up. Defaults to + 1. Example: when this is set to 30%, the new MachineSet can + be scaled up immediately when the rolling update starts, such + that the total number of old and new machines do not exceed + 130% of desired machines. Once old machines have been killed, + new MachineSet can be scaled up further, ensuring that total + number of machines running at any time during the update is + at most 130% of desired machines.' + maxUnavailable: + anyOf: + - type: integer + - type: string + description: 'The maximum number of machines that can be unavailable + during the update. Value can be an absolute number (ex: 5) + or a percentage of desired machines (ex: 10%). Absolute number + is calculated from percentage by rounding down. This can not + be 0 if MaxSurge is 0. Defaults to 0. Example: when this is + set to 30%, the old MachineSet can be scaled down to 70% of + desired machines immediately when the rolling update starts. + Once new machines are ready, old MachineSet can be scaled + down further, followed by scaling up the new MachineSet, ensuring + that the total number of machines available at all times during + the update is at least 70% of desired machines.' + type: object + type: + description: Type of deployment. Currently the only supported strategy + is "RollingUpdate". Default is RollingUpdate. + type: string + type: object + template: + description: Template describes the machines that will be created. + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + properties: + annotations: + additionalProperties: + type: string + description: 'Annotations is an unstructured key value map stored + with a resource that may be set by external tools to store + and retrieve arbitrary metadata. They are not queryable and + should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' + type: object + generateName: + description: "GenerateName is an optional prefix, used by the + server, to generate a unique name ONLY IF the Name field has + not been provided. If this field is used, the name returned + to the client will be different than the name passed. This + value will also be combined with a unique suffix. The provided + value has the same validation rules as the Name field, and + may be truncated by the length of the suffix required to make + the value unique on the server. \n If this field is specified + and the generated name exists, the server will NOT return + a 409 - instead, it will either return 201 Created or 500 + with Reason ServerTimeout indicating a unique name could not + be found in the time allotted, and the client should retry + (optionally after the time indicated in the Retry-After header). + \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency" + type: string + labels: + additionalProperties: + type: string + description: 'Map of string keys and values that can be used + to organize and categorize (scope and select) objects. May + match selectors of replication controllers and services. More + info: http://kubernetes.io/docs/user-guide/labels' + type: object + name: + description: 'Name must be unique within a namespace. Is required + when creating resources, although some resources may allow + a client to request the generation of an appropriate name + automatically. Name is primarily intended for creation idempotence + and configuration definition. Cannot be updated. More info: + http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + namespace: + description: "Namespace defines the space within each name must + be unique. An empty namespace is equivalent to the \"default\" + namespace, but \"default\" is the canonical representation. + Not all objects are required to be scoped to a namespace - + the value of this field for those objects will be empty. \n + Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces" + type: string + ownerReferences: + description: List of objects depended by this object. If ALL + objects in the list have been deleted, this object will be + garbage collected. If this object is managed by a controller, + then an entry in this list will point to this controller, + with the controller field set to true. There cannot be more + than one managing controller. + items: + description: OwnerReference contains enough information to + let you identify an owning object. An owning object must + be in the same namespace as the dependent, or be cluster-scoped, + so there is no namespace field. + properties: + apiVersion: + description: API version of the referent. + type: string + blockOwnerDeletion: + description: If true, AND if the owner has the "foregroundDeletion" + finalizer, then the owner cannot be deleted from the + key-value store until this reference is removed. Defaults + to false. To set this field, a user needs "delete" permission + of the owner, otherwise 422 (Unprocessable Entity) will + be returned. + type: boolean + controller: + description: If true, this reference points to the managing + controller. + type: boolean + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + uid: + description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' + type: string + required: + - apiVersion + - kind + - name + - uid + type: object + type: array + type: object + spec: + description: 'Specification of the desired behavior of the machine. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + properties: + bootstrap: + description: Bootstrap is a reference to a local struct which + encapsulates fields to configure the Machine’s bootstrapping + mechanism. + properties: + configRef: + description: ConfigRef is a reference to a bootstrap provider-specific + resource that holds configuration details. The reference + is optional to allow users/operators to specify Bootstrap.Data + without the need of a controller. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead + of an entire object, this string should contain a + valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container + within a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container + that triggered the event) or if no container name + is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to + have some well-defined way of referencing a part of + an object. TODO: this design is not final and this + field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this + reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + data: + description: "Data contains the bootstrap data, such as + cloud-init details scripts. If nil, the Machine should + remain in the Pending state. \n Deprecated: This field + has been deprecated in v1alpha3 and will be removed in + a future version. Switch to DataSecretName." + type: string + dataSecretName: + description: DataSecretName is the name of the secret that + stores the bootstrap data script. If nil, the Machine + should remain in the Pending state. + type: string + type: object + clusterName: + description: ClusterName is the name of the Cluster this object + belongs to. + minLength: 1 + type: string + failureDomain: + description: FailureDomain is the failure domain the machine + will be created in. Must match a key in the FailureDomains + map stored on the cluster object. + type: string + infrastructureRef: + description: InfrastructureRef is a required reference to a + custom resource offered by an infrastructure provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead + of an entire object, this string should contain a valid + JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container + within a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that + triggered the event) or if no container name is specified + "spec.containers[2]" (container with index 2 in this pod). + This syntax is chosen only to have some well-defined way + of referencing a part of an object. TODO: this design + is not final and this field is subject to change in the + future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + providerID: + description: 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 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 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. + type: string + version: + description: Version defines the desired Kubernetes version. + This field is meant to be optionally used by bootstrap providers. + type: string + required: + - bootstrap + - clusterName + - infrastructureRef + type: object + type: object + required: + - clusterName + - selector + - template + type: object + status: + description: MachineDeploymentStatus defines the observed state of MachineDeployment + properties: + availableReplicas: + description: Total number of available machines (ready for at least + minReadySeconds) targeted by this deployment. + format: int32 + type: integer + observedGeneration: + description: The generation observed by the deployment controller. + format: int64 + type: integer + phase: + description: Phase represents the current phase of a MachineDeployment + (ScalingUp, ScalingDown, Running, Failed, or Unknown). + type: string + readyReplicas: + description: Total number of ready machines targeted by this deployment. + format: int32 + type: integer + replicas: + description: Total number of non-terminated machines targeted by this + deployment (their labels match the selector). + format: int32 + type: integer + selector: + description: 'Selector is the same as the label selector but in the + string format to avoid introspection by clients. The string will be + in the same format as the query-param syntax. More info about label + selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' + type: string + unavailableReplicas: + description: Total number of unavailable machines targeted by this deployment. + This is the total number of machines that are still required for the + deployment to have 100% available capacity. They may either be machines + that are running but not yet available or machines that still have + not been created. + format: int32 + type: integer + updatedReplicas: + description: Total number of non-terminated machines targeted by this + deployment that have the desired template spec. + format: int32 + type: integer + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinehealthchecks.yaml b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinehealthchecks.yaml new file mode 100644 index 00000000..56f3c40e --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinehealthchecks.yaml @@ -0,0 +1,173 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: machinehealthchecks.cluster.x-k8s.io +spec: + additionalPrinterColumns: + - JSONPath: .spec.maxUnhealthy + description: Maximum number of unhealthy machines allowed + name: MaxUnhealthy + type: string + - JSONPath: .status.expectedMachines + description: Number of machines currently monitored + name: ExpectedMachines + type: integer + - JSONPath: .status.currentHealthy + description: Current observed healthy machines + name: CurrentHealthy + type: integer + group: cluster.x-k8s.io + names: + categories: + - cluster-api + kind: MachineHealthCheck + listKind: MachineHealthCheckList + plural: machinehealthchecks + shortNames: + - mhc + - mhcs + singular: machinehealthcheck + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: MachineHealthCheck is the Schema for the machinehealthchecks API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Specification of machine health check policy + properties: + clusterName: + description: ClusterName is the name of the Cluster this object belongs + to. + minLength: 1 + type: string + maxUnhealthy: + anyOf: + - type: integer + - type: string + description: Any further remediation is only allowed if at most "MaxUnhealthy" + machines selected by "selector" are not healthy. + nodeStartupTimeout: + description: Machines older than this duration without a node will be + considered to have failed and will be remediated. + type: string + selector: + description: Label selector to match machines whose health will be exercised + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: A label selector requirement is a selector that contains + values, a key, and an operator that relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: operator represents a key's relationship to a + set of values. Valid operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator + is In or NotIn, the values array must be non-empty. If the + operator is Exists or DoesNotExist, the values array must + be empty. This array is replaced during a strategic merge + patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels map is equivalent to an element + of matchExpressions, whose key field is "key", the operator is + "In", and the values array contains only "value". The requirements + are ANDed. + type: object + type: object + unhealthyConditions: + description: UnhealthyConditions contains a list of the conditions that + determine whether a node is considered unhealthy. The conditions + are combined in a logical OR, i.e. if any of the conditions is met, + the node is unhealthy. + items: + description: UnhealthyCondition represents a Node condition type and + value with a timeout specified as a duration. When the named condition + has been in the given status for at least the timeout value, a node + is considered unhealthy. + properties: + status: + minLength: 1 + type: string + timeout: + type: string + type: + minLength: 1 + type: string + required: + - status + - timeout + - type + type: object + minItems: 1 + type: array + required: + - clusterName + - selector + - unhealthyConditions + type: object + status: + description: Most recently observed status of MachineHealthCheck resource + properties: + currentHealthy: + description: total number of healthy machines counted by this machine + health check + format: int32 + minimum: 0 + type: integer + expectedMachines: + description: total number of machines counted by this machine health + check + format: int32 + minimum: 0 + type: integer + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machines.yaml b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machines.yaml new file mode 100644 index 00000000..c3ea7428 --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machines.yaml @@ -0,0 +1,305 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: machines.cluster.x-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 + - JSONPath: .status.nodeRef.name + description: Node name associated with this machine + name: NodeName + priority: 1 + type: string + group: cluster.x-k8s.io + names: + categories: + - cluster-api + kind: Machine + listKind: MachineList + plural: machines + shortNames: + - ma + singular: machine + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + description: Machine is the Schema for the machines API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: MachineSpec defines the desired state of Machine + properties: + bootstrap: + description: Bootstrap is a reference to a local struct which encapsulates + fields to configure the Machine’s bootstrapping mechanism. + properties: + configRef: + description: ConfigRef is a reference to a bootstrap provider-specific + resource that holds configuration details. The reference is optional + to allow users/operators to specify Bootstrap.Data without the + need of a controller. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + data: + description: "Data contains the bootstrap data, such as cloud-init + details scripts. If nil, the Machine should remain in the Pending + state. \n Deprecated: This field has been deprecated in v1alpha3 + and will be removed in a future version. Switch to DataSecretName." + type: string + dataSecretName: + description: DataSecretName is the name of the secret that stores + the bootstrap data script. If nil, the Machine should remain in + the Pending state. + type: string + type: object + clusterName: + description: ClusterName is the name of the Cluster this object belongs + to. + minLength: 1 + type: string + failureDomain: + description: FailureDomain is the failure domain the machine will be + created in. Must match a key in the FailureDomains map stored on the + cluster object. + type: string + infrastructureRef: + description: InfrastructureRef is a required reference to a custom resource + offered by an infrastructure provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an + entire object, this string should contain a valid JSON/Go field + access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen only + to have some well-defined way of referencing a part of an object. + TODO: this design is not final and this field is subject to change + in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is + made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + providerID: + description: 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 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 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. + type: string + version: + description: Version defines the desired Kubernetes version. This field + is meant to be optionally used by bootstrap providers. + type: string + required: + - bootstrap + - clusterName + - infrastructureRef + type: object + status: + description: MachineStatus defines the observed state of Machine + properties: + addresses: + description: Addresses is a list of addresses assigned to the machine. + This field is copied from the infrastructure provider reference. + items: + description: MachineAddress contains information for the node's address. + properties: + address: + description: The machine address. + type: string + type: + description: Machine address type, one of Hostname, ExternalIP + or InternalIP. + type: string + required: + - address + - type + type: object + type: array + bootstrapReady: + description: BootstrapReady is the state of the bootstrap provider. + type: boolean + failureMessage: + description: "FailureMessage will be set in the event that there is + a terminal problem reconciling the Machine and will contain a more + verbose string suitable for logging and human consumption. \n This + field should not be set for transitive errors that a controller faces + that are expected to be fixed automatically over time (like service + outages), but instead indicate that something is fundamentally wrong + with the Machine's spec or the configuration of the controller, and + that manual intervention is required. Examples of terminal errors + would be invalid combinations of settings in the spec, values that + are unsupported by the controller, or the responsible controller itself + being critically misconfigured. \n Any transient errors that occur + during the reconciliation of Machines can be added as events to the + Machine object and/or logged in the controller's output." + type: string + failureReason: + description: "FailureReason will be set in the event that there is a + terminal problem reconciling the Machine and will contain a succinct + value suitable for machine interpretation. \n This field should not + be set for transitive errors that a controller faces that are expected + to be fixed automatically over time (like service outages), but instead + indicate that something is fundamentally wrong with the Machine's + spec or the configuration of the controller, and that manual intervention + is required. Examples of terminal errors would be invalid combinations + of settings in the spec, values that are unsupported by the controller, + or the responsible controller itself being critically misconfigured. + \n Any transient errors that occur during the reconciliation of Machines + can be added as events to the Machine object and/or logged in the + controller's output." + type: string + infrastructureReady: + description: InfrastructureReady is the state of the infrastructure + provider. + type: boolean + lastUpdated: + description: LastUpdated identifies when the phase of the Machine last + transitioned. + format: date-time + type: string + nodeRef: + description: NodeRef will point to the corresponding Node if it exists. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an + entire object, this string should contain a valid JSON/Go field + access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen only + to have some well-defined way of referencing a part of an object. + TODO: this design is not final and this field is subject to change + in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is + made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + phase: + description: Phase represents the current phase of machine actuation. + E.g. Pending, Running, Terminating, Failed etc. + type: string + version: + description: Version specifies the current version of Kubernetes running + on the corresponding Node. This is meant to be a means of bubbling + up status from the Node to the Machine. It is entirely optional, but + useful for end-user UX if it’s present. + type: string + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinesets.yaml b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinesets.yaml new file mode 100644 index 00000000..42853d45 --- /dev/null +++ b/pkg/apis/cluster-api/config/crds/cluster.x-k8s.io_machinesets.yaml @@ -0,0 +1,442 @@ + +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null + name: machinesets.cluster.x-k8s.io +spec: + additionalPrinterColumns: + - JSONPath: .status.replicas + description: Total number of non-terminated machines targeted by this machineset + name: Replicas + type: integer + - JSONPath: .status.availableReplicas + description: Total number of available machines (ready for at least minReadySeconds) + name: Available + type: integer + - JSONPath: .status.readyReplicas + description: Total number of ready machines targeted by this machineset. + name: Ready + type: integer + group: cluster.x-k8s.io + names: + categories: + - cluster-api + kind: MachineSet + listKind: MachineSetList + plural: machinesets + shortNames: + - ms + singular: machineset + scope: Namespaced + subresources: + scale: + labelSelectorPath: .status.selector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} + validation: + openAPIV3Schema: + description: MachineSet is the Schema for the machinesets API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: MachineSetSpec defines the desired state of MachineSet + properties: + clusterName: + description: ClusterName is the name of the Cluster this object belongs + to. + minLength: 1 + type: string + 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 + be considered available as soon as it is ready) + format: int32 + type: integer + replicas: + description: Replicas is the number of desired replicas. This is a pointer + to distinguish between explicit zero and unspecified. Defaults to + 1. + format: int32 + type: integer + selector: + description: '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. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: A label selector requirement is a selector that contains + values, a key, and an operator that relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: operator represents a key's relationship to a + set of values. Valid operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator + is In or NotIn, the values array must be non-empty. If the + operator is Exists or DoesNotExist, the values array must + be empty. This array is replaced during a strategic merge + patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A single + {key,value} in the matchLabels map is equivalent to an element + of matchExpressions, whose key field is "key", the operator is + "In", and the values array contains only "value". The requirements + are ANDed. + type: object + type: object + template: + description: Template is the object that describes the machine that + will be created if insufficient replicas are detected. Object references + to custom resources resources are treated as templates. + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + properties: + annotations: + additionalProperties: + type: string + description: 'Annotations is an unstructured key value map stored + with a resource that may be set by external tools to store + and retrieve arbitrary metadata. They are not queryable and + should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' + type: object + generateName: + description: "GenerateName is an optional prefix, used by the + server, to generate a unique name ONLY IF the Name field has + not been provided. If this field is used, the name returned + to the client will be different than the name passed. This + value will also be combined with a unique suffix. The provided + value has the same validation rules as the Name field, and + may be truncated by the length of the suffix required to make + the value unique on the server. \n If this field is specified + and the generated name exists, the server will NOT return + a 409 - instead, it will either return 201 Created or 500 + with Reason ServerTimeout indicating a unique name could not + be found in the time allotted, and the client should retry + (optionally after the time indicated in the Retry-After header). + \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency" + type: string + labels: + additionalProperties: + type: string + description: 'Map of string keys and values that can be used + to organize and categorize (scope and select) objects. May + match selectors of replication controllers and services. More + info: http://kubernetes.io/docs/user-guide/labels' + type: object + name: + description: 'Name must be unique within a namespace. Is required + when creating resources, although some resources may allow + a client to request the generation of an appropriate name + automatically. Name is primarily intended for creation idempotence + and configuration definition. Cannot be updated. More info: + http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + namespace: + description: "Namespace defines the space within each name must + be unique. An empty namespace is equivalent to the \"default\" + namespace, but \"default\" is the canonical representation. + Not all objects are required to be scoped to a namespace - + the value of this field for those objects will be empty. \n + Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces" + type: string + ownerReferences: + description: List of objects depended by this object. If ALL + objects in the list have been deleted, this object will be + garbage collected. If this object is managed by a controller, + then an entry in this list will point to this controller, + with the controller field set to true. There cannot be more + than one managing controller. + items: + description: OwnerReference contains enough information to + let you identify an owning object. An owning object must + be in the same namespace as the dependent, or be cluster-scoped, + so there is no namespace field. + properties: + apiVersion: + description: API version of the referent. + type: string + blockOwnerDeletion: + description: If true, AND if the owner has the "foregroundDeletion" + finalizer, then the owner cannot be deleted from the + key-value store until this reference is removed. Defaults + to false. To set this field, a user needs "delete" permission + of the owner, otherwise 422 (Unprocessable Entity) will + be returned. + type: boolean + controller: + description: If true, this reference points to the managing + controller. + type: boolean + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + uid: + description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' + type: string + required: + - apiVersion + - kind + - name + - uid + type: object + type: array + type: object + spec: + description: 'Specification of the desired behavior of the machine. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + properties: + bootstrap: + description: Bootstrap is a reference to a local struct which + encapsulates fields to configure the Machine’s bootstrapping + mechanism. + properties: + configRef: + description: ConfigRef is a reference to a bootstrap provider-specific + resource that holds configuration details. The reference + is optional to allow users/operators to specify Bootstrap.Data + without the need of a controller. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead + of an entire object, this string should contain a + valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container + within a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container + that triggered the event) or if no container name + is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to + have some well-defined way of referencing a part of + an object. TODO: this design is not final and this + field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this + reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + data: + description: "Data contains the bootstrap data, such as + cloud-init details scripts. If nil, the Machine should + remain in the Pending state. \n Deprecated: This field + has been deprecated in v1alpha3 and will be removed in + a future version. Switch to DataSecretName." + type: string + dataSecretName: + description: DataSecretName is the name of the secret that + stores the bootstrap data script. If nil, the Machine + should remain in the Pending state. + type: string + type: object + clusterName: + description: ClusterName is the name of the Cluster this object + belongs to. + minLength: 1 + type: string + failureDomain: + description: FailureDomain is the failure domain the machine + will be created in. Must match a key in the FailureDomains + map stored on the cluster object. + type: string + infrastructureRef: + description: InfrastructureRef is a required reference to a + custom resource offered by an infrastructure provider. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead + of an entire object, this string should contain a valid + JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container + within a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that + triggered the event) or if no container name is specified + "spec.containers[2]" (container with index 2 in this pod). + This syntax is chosen only to have some well-defined way + of referencing a part of an object. TODO: this design + is not final and this field is subject to change in the + future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + providerID: + description: 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 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 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. + type: string + version: + description: Version defines the desired Kubernetes version. + This field is meant to be optionally used by bootstrap providers. + type: string + required: + - bootstrap + - clusterName + - infrastructureRef + type: object + type: object + required: + - clusterName + - selector + type: object + status: + description: MachineSetStatus defines the observed state of MachineSet + properties: + availableReplicas: + description: The number of available replicas (ready for at least minReadySeconds) + for this MachineSet. + format: int32 + type: integer + failureMessage: + type: string + failureReason: + description: "In the event that there is a terminal problem reconciling + the replicas, both FailureReason and FailureMessage will be set. FailureReason + will be populated with a succinct value suitable for machine interpretation, + while FailureMessage will contain a more verbose string suitable for + logging and human consumption. \n These fields should not be set for + transitive errors that a controller faces that are expected to be + fixed automatically over time (like service outages), but instead + indicate that something is fundamentally wrong with the MachineTemplate's + spec or the configuration of the machine controller, and that manual + intervention is required. Examples of terminal errors would be invalid + combinations of settings in the spec, values that are unsupported + by the machine controller, or the responsible machine controller itself + being critically misconfigured. \n Any transient errors that occur + during the reconciliation of Machines can be added as events to the + MachineSet object and/or logged in the controller's output." + type: string + fullyLabeledReplicas: + description: The number of replicas that have labels matching the labels + of the machine template of the MachineSet. + format: int32 + type: integer + observedGeneration: + description: ObservedGeneration reflects the generation of the most + recently observed MachineSet. + format: int64 + type: integer + readyReplicas: + description: The number of ready replicas for this MachineSet. A machine + is considered ready when the node has been created and is "Ready". + format: int32 + type: integer + replicas: + description: Replicas is the most recently observed number of replicas. + format: int32 + type: integer + selector: + description: 'Selector is the same as the label selector but in the + string format to avoid introspection by clients. The string will be + in the same format as the query-param syntax. More info about label + selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' + type: string + required: + - replicas + type: object + type: object + version: v1alpha3 + versions: + - name: v1alpha3 + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_cluster.yaml b/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_cluster.yaml deleted file mode 100644 index ac8250c7..00000000 --- a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_cluster.yaml +++ /dev/null @@ -1,98 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - creationTimestamp: null - labels: - controller-tools.k8s.io: "1.0" - name: clusters.cluster.k8s.io -spec: - group: cluster.k8s.io - names: - kind: Cluster - plural: clusters - scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - spec: - properties: - clusterNetwork: - properties: - pods: - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - type: string - services: - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - required: - - services - - pods - - serviceDomain - type: object - providerSpec: - properties: - value: - type: object - valueFrom: - properties: - machineClass: - properties: - provider: - type: string - type: object - type: object - type: object - required: - - clusterNetwork - type: object - status: - properties: - apiEndpoints: - items: - properties: - host: - type: string - port: - format: int64 - type: integer - required: - - host - - port - type: object - type: array - errorMessage: - type: string - errorReason: - type: string - providerStatus: - type: object - type: object - version: v1alpha1 -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machine.yaml b/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machine.yaml deleted file mode 100644 index e53b5a63..00000000 --- a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machine.yaml +++ /dev/null @@ -1,111 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - creationTimestamp: null - labels: - controller-tools.k8s.io: "1.0" - name: machines.cluster.k8s.io -spec: - group: cluster.k8s.io - names: - kind: Machine - plural: machines - scope: Namespaced - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - spec: - properties: - configSource: - type: object - metadata: - type: object - providerSpec: - properties: - value: - type: object - valueFrom: - properties: - machineClass: - properties: - provider: - type: string - type: object - type: object - type: object - taints: - items: - type: object - type: array - versions: - properties: - controlPlane: - type: string - kubelet: - type: string - required: - - kubelet - type: object - required: - - providerSpec - type: object - status: - properties: - addresses: - items: - type: object - type: array - conditions: - items: - type: object - type: array - errorMessage: - type: string - errorReason: - type: string - lastOperation: - properties: - description: - type: string - lastUpdated: - format: date-time - type: string - state: - type: string - type: - type: string - type: object - lastUpdated: - format: date-time - type: string - nodeRef: - type: object - phase: - type: string - providerStatus: - type: object - versions: - properties: - controlPlane: - type: string - kubelet: - type: string - required: - - kubelet - type: object - type: object - version: v1alpha1 -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineclass.yaml b/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineclass.yaml deleted file mode 100644 index 5de01dc5..00000000 --- a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineclass.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - creationTimestamp: null - labels: - controller-tools.k8s.io: "1.0" - name: machineclasses.cluster.k8s.io -spec: - group: cluster.k8s.io - names: - kind: MachineClass - plural: machineclasses - scope: Namespaced - validation: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - providerSpec: - type: object - required: - - providerSpec - version: v1alpha1 -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml b/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml deleted file mode 100644 index 67459fe5..00000000 --- a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml +++ /dev/null @@ -1,134 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - creationTimestamp: null - labels: - controller-tools.k8s.io: "1.0" - name: machinedeployments.cluster.k8s.io -spec: - group: cluster.k8s.io - names: - kind: MachineDeployment - plural: machinedeployments - scope: Namespaced - subresources: - scale: - labelSelectorPath: .status.labelSelector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - validation: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - spec: - properties: - minReadySeconds: - format: int32 - type: integer - paused: - type: boolean - progressDeadlineSeconds: - format: int32 - type: integer - replicas: - format: int32 - type: integer - revisionHistoryLimit: - format: int32 - type: integer - selector: - type: object - strategy: - properties: - rollingUpdate: - properties: - maxSurge: - oneOf: - - type: string - - type: integer - maxUnavailable: - oneOf: - - type: string - - type: integer - type: object - type: - type: string - type: object - template: - properties: - metadata: - type: object - spec: - properties: - configSource: - type: object - metadata: - type: object - providerSpec: - properties: - value: - type: object - valueFrom: - properties: - machineClass: - properties: - provider: - type: string - type: object - type: object - type: object - taints: - items: - type: object - type: array - versions: - properties: - controlPlane: - type: string - kubelet: - type: string - required: - - kubelet - type: object - required: - - providerSpec - type: object - type: object - required: - - selector - - template - type: object - status: - properties: - availableReplicas: - format: int32 - type: integer - observedGeneration: - format: int64 - type: integer - readyReplicas: - format: int32 - type: integer - replicas: - format: int32 - type: integer - unavailableReplicas: - format: int32 - type: integer - updatedReplicas: - format: int32 - type: integer - type: object - version: v1alpha1 -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml b/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml deleted file mode 100644 index 101db099..00000000 --- a/pkg/apis/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml +++ /dev/null @@ -1,112 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - creationTimestamp: null - labels: - controller-tools.k8s.io: "1.0" - name: machinesets.cluster.k8s.io -spec: - group: cluster.k8s.io - names: - kind: MachineSet - plural: machinesets - scope: Namespaced - subresources: - scale: - labelSelectorPath: .status.labelSelector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - validation: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - spec: - properties: - minReadySeconds: - format: int32 - type: integer - replicas: - format: int32 - type: integer - selector: - type: object - template: - properties: - metadata: - type: object - spec: - properties: - configSource: - type: object - metadata: - type: object - providerSpec: - properties: - value: - type: object - valueFrom: - properties: - machineClass: - properties: - provider: - type: string - type: object - type: object - type: object - taints: - items: - type: object - type: array - versions: - properties: - controlPlane: - type: string - kubelet: - type: string - required: - - kubelet - type: object - required: - - providerSpec - type: object - type: object - required: - - selector - type: object - status: - properties: - availableReplicas: - format: int32 - type: integer - errorMessage: - type: string - errorReason: - type: string - fullyLabeledReplicas: - format: int32 - type: integer - observedGeneration: - format: int64 - type: integer - readyReplicas: - format: int32 - type: integer - replicas: - format: int32 - type: integer - required: - - replicas - type: object - version: v1alpha1 -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] From bfda183ecb1e2a0bad9a521a78ae98a1c5946e56 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 1 May 2020 11:00:06 +0000 Subject: [PATCH 30/72] Better registering of scheme so wksctl controller can parse YAMLs --- cmd/controller/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index a3715872..f66c2770 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -7,8 +7,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/weaveworks/wksctl/pkg/apis" wks "github.com/weaveworks/wksctl/pkg/apis/wksprovider/controller/wksctl" + baremetalv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" machineutil "github.com/weaveworks/wksctl/pkg/cluster/machine" "k8s.io/client-go/kubernetes" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" @@ -93,7 +93,7 @@ func run(cmd *cobra.Command, args []string) { } log.Info("registering scheme for all resources") - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { + if err := baremetalv1.AddToScheme(mgr.GetScheme()); err != nil { log.Fatal(err) } if err := clusterv1.AddToScheme(mgr.GetScheme()); err != nil { From aed05db958295e296b236a3653f6d407393b6399 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 1 May 2020 11:00:39 +0000 Subject: [PATCH 31/72] Read namespace from machines after registering schemes Also do it on a separate client because the manager isn't started yet. --- cmd/controller/main.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index f66c2770..fcce59ce 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -87,10 +87,6 @@ func run(cmd *cobra.Command, args []string) { if err != nil { log.Fatalf("failed to create the cluster manager: %v", err) } - ctlrNamespace, err := initializeControllerNamespace(mgr.GetClient()) - if err != nil { - log.Fatalf("failed to get controller namespace: %s", err) - } log.Info("registering scheme for all resources") if err := baremetalv1.AddToScheme(mgr.GetScheme()); err != nil { @@ -109,6 +105,19 @@ func run(cmd *cobra.Command, args []string) { log.Fatal(err) } + var ctlrNamespace string + { + // Create another client as we can't use the manager's one until it is started + client, err := client.New(mgr.GetConfig(), client.Options{Scheme: mgr.GetScheme()}) + if err != nil { + log.Fatalf("failed to create client: %s", err) + } + ctlrNamespace, err = initializeControllerNamespace(client) + if err != nil { + log.Fatalf("failed to get controller namespace x: %s", err) + } + } + machineController, err := wks.NewMachineController(wks.MachineControllerParams{ EventRecorder: mgr.GetEventRecorderFor(wks.ProviderName + "-controller"), Client: mgr.GetClient(), From 13ee893c6b05e5bdd281267c6da3857cdcf9d5fb Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 1 May 2020 11:04:14 +0000 Subject: [PATCH 32/72] Update RBAC for v1alpha3 Allow wks-controller role to write status subresources but not to write to capi objects. --- .../controller/manifests/yaml/02_rbac.yaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml b/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml index e1b66a19..a9df18bc 100644 --- a/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml +++ b/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml @@ -5,7 +5,7 @@ metadata: name: wks-controller-role rules: - apiGroups: - - cluster.k8s.io + - cluster.x-k8s.io resources: - clusters - machines @@ -16,6 +16,17 @@ rules: - get - list - watch +- apiGroups: + - cluster.weave.works + resources: + - baremetalclusters + - baremetalclusters/status + - baremetalmachines + - baremetalmachines/status + verbs: + - get + - list + - watch - create - update - patch From b5cd2e9d764082fc7a6ed73dc5fff35e80408559 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 5 May 2020 13:55:48 +0000 Subject: [PATCH 33/72] Add RBAC rules for upstream CAPI controller --- .../controller/manifests/yaml/02_rbac.yaml | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml b/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml index a9df18bc..9af31c88 100644 --- a/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml +++ b/pkg/apis/wksprovider/controller/manifests/yaml/02_rbac.yaml @@ -78,3 +78,193 @@ subjects: - kind: ServiceAccount name: default namespace: system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + name: manager-role +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get + - list + - watch +- apiGroups: + - bootstrap.cluster.x-k8s.io + - controlplane.cluster.x-k8s.io + - infrastructure.cluster.x-k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - bootstrap.cluster.x-k8s.io + - exp.infrastructure.cluster.x-k8s.io + - infrastructure.cluster.x-k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - bootstrap.cluster.x-k8s.io + - infrastructure.cluster.x-k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - clusters + - clusters/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machinedeployments + - machinedeployments/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machinehealthchecks + - machinehealthchecks/status + verbs: + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machines + - machines/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.x-k8s.io + resources: + - machinesets + - machinesets/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - nodes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - create + - get + - list + - patch + - watch +- apiGroups: + - exp.cluster.x-k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - exp.cluster.x-k8s.io + resources: + - machinepools + - machinepools/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + creationTimestamp: null + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: default + namespace: system From 55cfe9d46fe45e5b95411046ae40951eded10cab Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 1 May 2020 12:48:18 +0000 Subject: [PATCH 34/72] Register metav1 resource types with the scheme --- pkg/baremetal/v1alpha3/register.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/baremetal/v1alpha3/register.go b/pkg/baremetal/v1alpha3/register.go index 7aa051d7..b4099aeb 100644 --- a/pkg/baremetal/v1alpha3/register.go +++ b/pkg/baremetal/v1alpha3/register.go @@ -1,6 +1,7 @@ package v1alpha3 import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -32,6 +33,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &BareMetalCluster{}, &BareMetalClusterList{}, ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil } From 4797693d5c20251e176dec343080119f711bb763 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 1 May 2020 14:37:40 +0000 Subject: [PATCH 35/72] Need to write out BareMetalMachines in UpdateWithGeneratedNames() --- pkg/cluster/machine/machines_manifest.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/cluster/machine/machines_manifest.go b/pkg/cluster/machine/machines_manifest.go index afa09070..45a9b540 100644 --- a/pkg/cluster/machine/machines_manifest.go +++ b/pkg/cluster/machine/machines_manifest.go @@ -59,6 +59,14 @@ func UpdateWithGeneratedNames(r io.ReadCloser) (string, error) { buf.WriteString("---\n") buf.Write(manifestBytes) } + for _, machine := range bml { + manifestBytes, err := yaml.Marshal(machine) + if err != nil { + return "", err + } + buf.WriteString("---\n") + buf.Write(manifestBytes) + } return buf.String(), nil } From 62e9f1502f0c5aa3425217d0ba6d2407c3b65048 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 5 May 2020 17:25:29 +0000 Subject: [PATCH 36/72] Add 'contract' label for capi-controller --- .../config/crds/cluster.weave.works_baremetalclusters.yaml | 2 ++ .../config/crds/cluster.weave.works_baremetalmachines.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml index 6e2ea59a..931c43ac 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml @@ -7,6 +7,8 @@ metadata: controller-gen.kubebuilder.io/version: v0.3.0 creationTimestamp: null name: baremetalclusters.cluster.weave.works + labels: + cluster.x-k8s.io/v1alpha3: v1alpha3 spec: group: cluster.weave.works names: diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml index 4df2a4be..3ea999c1 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml @@ -7,6 +7,8 @@ metadata: controller-gen.kubebuilder.io/version: v0.3.0 creationTimestamp: null name: baremetalmachines.cluster.weave.works + labels: + cluster.x-k8s.io/v1alpha3: v1alpha3 spec: group: cluster.weave.works names: From 4c90fb4ed733e35088566fbc3e2918901289ee2f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 5 May 2020 17:26:49 +0000 Subject: [PATCH 37/72] Protect against crashes when no infrastructureRef set --- pkg/apis/wksprovider/controller/wksctl/machine_controller.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 544a89ff..54e0d771 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -139,6 +139,10 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e contextLog = contextLog.WithField("cluster", cluster.Name) // Now go from the Cluster to the BareMetalCluster + if cluster.Spec.InfrastructureRef == nil || cluster.Spec.InfrastructureRef.Name == "" { + contextLog.Info("Cluster is missing infrastructureRef") + return ctrl.Result{}, nil + } bmc := &baremetalspecv1.BareMetalCluster{} if err := r.client.Get(ctx, client.ObjectKey{ Namespace: bmm.Namespace, From 0b29ac8f1ef2cd1dfc0cee956acffd2c198a6c67 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 5 May 2020 17:57:49 +0000 Subject: [PATCH 38/72] Raise minimum Kubernetes version to 1.16 for upstream CAPI v1alpha3 won't run on anything earlier. --- pkg/cluster/machine/machine_test.go | 12 ++++++------ pkg/kubernetes/version.go | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/cluster/machine/machine_test.go b/pkg/cluster/machine/machine_test.go index b992271a..da481bcf 100644 --- a/pkg/cluster/machine/machine_test.go +++ b/pkg/cluster/machine/machine_test.go @@ -80,7 +80,7 @@ const machinesValid = ` infrastructureRef: kind: BareMetalMachine name: master-0 - version: "1.14.12" + version: "1.16.2" --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -99,7 +99,7 @@ const machinesValid = ` infrastructureRef: kind: BareMetalMachine name: node-0 - version: "1.14.12" + version: "1.16.2" --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -125,7 +125,7 @@ const machinesInconsistentKubeVersion = ` infrastructureRef: kind: BareMetalMachine name: master-0 - version: "1.14.4" + version: "1.16.4" --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -144,7 +144,7 @@ const machinesInconsistentKubeVersion = ` infrastructureRef: kind: BareMetalMachine name: node-0 - version: "1.14.3" + version: "1.16.3" --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -205,7 +205,7 @@ const machinesNoGodNoMaster = ` infrastructureRef: kind: BareMetalMachine name: node-0 - version: "1.14.12" + version: "1.16.2" --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -329,7 +329,7 @@ func TestGetKubernetesVersionFromMasterInDefaultsVersionWhenMachinesDoNotSpecify func TestGetKubernetesVersionFromMasterInGetsControlPlaneVersion(t *testing.T) { version, _, err := machine.GetKubernetesVersionFromMasterIn(machinesFromString(t, machinesValid)) assert.NoError(t, err) - assert.Equal(t, "1.14.12", version) + assert.Equal(t, "1.16.2", version) } func TestGetKubernetesVersionDefaultsVersionWhenMachinesDoNotSpecifyAny(t *testing.T) { diff --git a/pkg/kubernetes/version.go b/pkg/kubernetes/version.go index f0d188e0..cf6d608b 100644 --- a/pkg/kubernetes/version.go +++ b/pkg/kubernetes/version.go @@ -4,4 +4,4 @@ package kubernetes const DefaultVersion = "1.16.11" // DefaultVersionsRange is the default Kubernetes versions' range used by WKS to validate Kubernetes versions. -const DefaultVersionsRange = ">=1.14.1 <=1.17.5" +const DefaultVersionsRange = ">=1.16.1 <=1.17.5" From 451ded072bf239afa55233f676fe45d0373feb86 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 10:20:56 +0000 Subject: [PATCH 39/72] Add manifest for CAPI controller --- .../manifests/yaml/04_capi_controller.yaml | 33 +++++++++++++++++++ pkg/apis/wksprovider/machine/os/os.go | 32 +++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 pkg/apis/wksprovider/controller/manifests/yaml/04_capi_controller.yaml diff --git a/pkg/apis/wksprovider/controller/manifests/yaml/04_capi_controller.yaml b/pkg/apis/wksprovider/controller/manifests/yaml/04_capi_controller.yaml new file mode 100644 index 00000000..523c1ad9 --- /dev/null +++ b/pkg/apis/wksprovider/controller/manifests/yaml/04_capi_controller.yaml @@ -0,0 +1,33 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: capi-controller + namespace: system + labels: + name: capi-controller +spec: + replicas: 1 + selector: + matchLabels: + name: capi-controller + template: + metadata: + labels: + name: capi-controller + spec: + tolerations: + # Allow scheduling on master nodes; required during bootstrapping. + - effect: NoSchedule + key: node-role.kubernetes.io/master + operator: Exists + # Mark this as a critical addon: + - key: CriticalAddonsOnly + operator: Exists + containers: + - name: controller + image: us.gcr.io/k8s-artifacts-prod/cluster-api/cluster-api-controller:v0.3.5 + resources: + requests: + cpu: 100m + memory: 20Mi diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index 72f52661..ca89d4ad 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -362,12 +362,22 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { mManRsc := &resource.KubectlApply{Manifest: []byte(machinesManifest), Filename: object.String("machinesmanifest"), Namespace: object.String(params.Namespace)} b.AddResource("kubectl:apply:machines", mManRsc, plan.DependOn(kubectlApplyDeps[0], kubectlApplyDeps[1:]...)) + dep := addSealedSecretWaitIfNecessary(b, params.SealedSecretKeyPath, params.SealedSecretCertPath) + + { + capiCtlrManifest, err := capiControllerManifest(params.Controller, params.Namespace, params.ConfigDirectory) + if err != nil { + return nil, err + } + ctlrRsc := &resource.KubectlApply{Manifest: capiCtlrManifest, Filename: object.String("capi_controller.yaml")} + b.AddResource("install:capi", ctlrRsc, plan.DependOn("kubectl:apply:cluster", dep)) + } + wksCtlrManifest, err := wksControllerManifest(params.Controller, params.Namespace, params.ConfigDirectory) if err != nil { return nil, err } - dep := addSealedSecretWaitIfNecessary(b, params.SealedSecretKeyPath, params.SealedSecretCertPath) ctlrRsc := &resource.KubectlApply{Manifest: wksCtlrManifest, Filename: object.String("wks_controller.yaml")} b.AddResource("install:wks", ctlrRsc, plan.DependOn("kubectl:apply:cluster", dep)) @@ -1028,6 +1038,26 @@ func createFluxSecretFromGitData(gitData GitParams, params SeedNodeParams) ([]by return replaceGitFields(fluxSecretTemplate, gitParams) } +func capiControllerManifest(controller ControllerParams, namespace, configDir string) ([]byte, error) { + var file io.ReadCloser + filepath, err := findManifest(configDir, "capi-controller.yaml") + if err != nil { + file, err = manifests.Manifests.Open("04_capi_controller.yaml") + } else { + file, err = os.Open(filepath) + } + if err != nil { + return nil, err + } + defer file.Close() + manifestbytes, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + content, err := manifest.WithNamespace(string(manifestbytes), namespace) + return []byte(content), err +} + func wksControllerManifest(controller ControllerParams, namespace, configDir string) ([]byte, error) { var manifestbytes []byte From 8e894099d4980abe18730748fe33b40680673bf5 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 7 May 2020 11:45:10 +0000 Subject: [PATCH 40/72] Update vfsdata files --- .../controller/manifests/manifests_vfsdata.go | 34 +++++--- .../wksprovider/machine/crds/crds_vfsdata.go | 78 +++++++++++-------- .../machine/scripts/scripts_vfsdata.go | 4 +- 3 files changed, 74 insertions(+), 42 deletions(-) diff --git a/pkg/apis/wksprovider/controller/manifests/manifests_vfsdata.go b/pkg/apis/wksprovider/controller/manifests/manifests_vfsdata.go index 7aff74fa..ff583268 100644 --- a/pkg/apis/wksprovider/controller/manifests/manifests_vfsdata.go +++ b/pkg/apis/wksprovider/controller/manifests/manifests_vfsdata.go @@ -21,42 +21,56 @@ var Manifests = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2020, 5, 19, 22, 23, 27, 249616053, time.UTC), + modTime: time.Date(2020, 6, 2, 15, 17, 7, 132374932, time.UTC), }, "/01_namespace.yaml": &vfsgen۰FileInfo{ name: "01_namespace.yaml", - modTime: time.Date(2020, 5, 8, 13, 59, 12, 351060757, time.UTC), + modTime: time.Date(2020, 5, 6, 16, 16, 51, 411690040, time.UTC), content: []byte("\x2d\x2d\x2d\x0a\x61\x70\x69\x56\x65\x72\x73\x69\x6f\x6e\x3a\x20\x76\x31\x0a\x6b\x69\x6e\x64\x3a\x20\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x0a\x6d\x65\x74\x61\x64\x61\x74\x61\x3a\x0a\x20\x20\x6c\x61\x62\x65\x6c\x73\x3a\x0a\x20\x20\x20\x20\x63\x6f\x6e\x74\x72\x6f\x6c\x6c\x65\x72\x2d\x74\x6f\x6f\x6c\x73\x2e\x6b\x38\x73\x2e\x69\x6f\x3a\x20\x22\x31\x2e\x30\x22\x0a\x20\x20\x6e\x61\x6d\x65\x3a\x20\x73\x79\x73\x74\x65\x6d\x0a"), }, "/02_rbac.yaml": &vfsgen۰CompressedFileInfo{ name: "02_rbac.yaml", - modTime: time.Date(2020, 5, 8, 13, 59, 12, 351927700, time.UTC), - uncompressedSize: 1131, + modTime: time.Date(2020, 6, 2, 15, 17, 7, 28374936, time.UTC), + uncompressedSize: 3925, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x53\xb1\x92\xd3\x30\x10\xed\xfd\x15\x3b\x77\xb5\x93\xa1\x63\xdc\x01\x05\x05\xdd\x1d\x03\xf5\x5a\x7a\x89\x45\x64\xad\x90\x56\xce\x1c\x5f\xcf\x58\x8e\xc3\xe5\x02\x19\x18\x8a\xab\xfc\x56\x5a\xed\xbe\xf7\x3c\xaf\x6d\xdb\x86\xa3\xfb\x82\x94\x9d\x84\x8e\x52\xcf\x66\xc3\x45\x07\x49\xee\x07\xab\x93\xb0\x39\xbc\xcd\x1b\x27\xdb\xe9\x4d\x73\x70\xc1\x76\xf4\xc1\x97\xac\x48\x0f\xe2\xd1\x8c\x50\xb6\xac\xdc\x35\x44\x81\x47\x74\x74\x3c\xe4\xd6\x48\xd0\x24\xde\x23\xb5\x69\xee\x4a\xc5\x23\x77\x4d\x4b\x1c\xdd\xc7\x24\x25\xe6\xb9\xbf\x25\xb3\x4c\x3a\x6d\x68\x88\x12\xb2\x94\x64\x70\x79\x9f\x6b\x31\xb2\x19\x5c\xc0\x65\xb1\xcd\xca\x5a\x2e\xce\x2c\xa2\x97\xa7\x11\x41\x2f\x5b\x51\xeb\x09\xa9\x3f\x4d\xdf\x43\xeb\xd7\xbb\xbc\x80\x23\xab\x19\x96\xc5\x09\xac\xa8\xb0\x44\xbb\xc2\x78\xbe\xb7\xf0\x50\x5c\x0b\xba\xbb\x7b\x29\xe2\x9e\xa2\xd8\xbc\xc5\xe4\xcc\x6c\x26\xb9\x4c\x09\xdf\x8b\x4b\xb0\xb4\x93\x44\x3a\x80\xbe\x7e\x7a\xa4\x5f\x96\x91\x0a\xf5\x20\xee\x3d\x66\x58\x5f\xd6\x21\x75\x5a\x89\x12\x56\x49\x0b\x0d\x27\x21\x6f\x16\x7e\xcf\x37\x9d\x4f\x2a\x08\x62\x4f\xce\x61\x3a\x3b\x93\x61\xd2\xeb\xb8\xd2\xce\x7a\x77\x6e\x3f\x72\xbc\xb5\xfe\x9e\x3e\x0f\xa0\x1e\x5e\x8e\xff\x6e\xdc\xc2\x86\x2c\x63\x94\x50\xff\xfe\x9f\xdd\xbb\xa2\xcc\xb1\x12\x7b\x41\xfa\xd9\xac\xdf\x92\x5e\x0d\xf8\xaf\x4c\xbd\x77\xc1\xba\xb0\xff\xbb\x68\xf5\xa7\xe6\x19\x3f\x60\x37\xf7\xae\x4a\x6e\xec\x6d\x88\xae\xa3\x7c\x2b\xc0\xb9\xf4\xdf\x60\xb4\x66\x78\x79\xf9\x88\x34\x39\x83\x77\xc6\x48\x09\x7a\x7e\x6c\xb1\xe3\xe2\xd7\x3a\x47\x36\xe8\x28\x3f\x65\xc5\xd8\xfc\x0c\x00\x00\xff\xff\x3c\x15\x72\x25\x6b\x04\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x56\xb1\x72\xdb\x30\x0c\xdd\xf5\x15\xbc\x64\xc8\x5d\xef\xa4\x5c\xb7\x9e\xb6\xb6\x43\x87\x6e\x49\xae\x9d\x21\x0a\xb6\x58\x53\x24\x4b\x80\x76\xd2\xaf\xef\x89\xb2\x14\x29\x92\x1d\x3b\x89\x53\x77\x32\x08\x83\xc4\x03\x08\x3e\xbd\x34\x4d\x13\x70\xea\x07\x7a\x52\xd6\xe4\xc2\x17\x20\x33\x08\x5c\x59\xaf\xfe\x00\x2b\x6b\xb2\xd5\x27\xca\x94\xbd\x5e\x7f\x4c\x56\xca\x94\xb9\xf8\xaa\x03\x31\xfa\x1b\xab\x31\xa9\x91\xa1\x04\x86\x3c\x11\xc2\x40\x8d\xb9\xd8\xac\x28\x95\xd6\xb0\xb7\x5a\xa3\x4f\x7d\x13\xe5\x83\x46\xca\x93\x54\x80\x53\xdf\xbc\x0d\x8e\x9a\xf8\x54\xc8\xf6\xa4\xec\x3e\x6d\x73\x24\x42\x78\x24\x1b\xbc\xc4\x71\x04\xc5\x45\x0d\xb2\x52\x06\xc7\x8b\x6b\x62\xe0\x30\xf2\x95\xe8\xb4\x7d\xa8\xd1\xf0\x38\x14\xe3\x7a\x8d\xbe\xd8\x9e\xbe\x44\x8e\xbf\x5a\x51\x6b\x6c\x80\x65\xb5\x1b\xe7\x06\x61\x8d\xd9\xc6\xfa\x15\x4d\xa1\x16\xe0\xb1\x69\x87\x1e\x61\x9e\x78\x87\x78\xfb\x3f\x47\x95\x4d\xbc\x8f\x5b\x9e\xc7\x1e\xe1\x7a\x04\xc6\x68\x06\x57\x76\xa6\xeb\xff\x2f\x51\x23\xe3\xb4\xcc\x8b\x8b\xa7\x55\x5d\x0a\x67\x4b\xba\xc6\xb5\x92\xcd\x28\x08\x45\xc2\xe3\xef\xa0\x3c\x96\x62\x61\xbd\xe0\x0a\xc5\xcf\xef\xb7\xe2\xf1\xc2\x05\x5b\x51\xa0\x80\x42\x63\x63\xc6\x9d\xf1\x90\x78\x5a\x70\xd6\x74\xd7\xd1\xc2\x50\xd6\x50\xd6\xe2\x1b\x66\xea\x3d\xd1\x30\xb6\xdc\xf6\x06\xd7\xfd\xad\x12\x4a\x7f\xe8\x8d\xbe\x6d\x57\xd2\xa6\xde\x85\x5a\xd6\xe0\xf6\xa5\xbf\x14\x77\x15\x8a\x02\xb5\xdd\x1c\xdf\xb8\x16\x8d\x28\x01\x6b\x6b\xe2\xe4\xee\xee\xde\x04\x32\x38\x37\x33\xa0\x83\xb3\x66\x41\x77\x0d\x78\x15\x23\x7c\x51\xa6\x54\x66\x79\x18\x31\x14\xdb\xe0\xc6\xbe\xc1\x45\x13\xdb\x55\xb2\x27\x6f\x22\xc4\x94\x88\xf6\xd1\x0f\x85\xe2\x17\x4a\x8e\x0c\xd4\xee\xbc\x45\xbf\x56\x12\x3f\x4b\x69\x83\xe1\x7e\x73\x89\x0b\x08\xba\x5b\x93\x03\x89\xb9\xa0\x07\x62\xac\x5f\xd9\x96\x51\x3f\xe2\x24\x2a\x6b\xee\x54\x8d\xc4\x50\xbb\x5c\x98\xa0\x75\x0f\xa3\x06\x03\xcb\xe7\xb8\x13\x9c\xc2\x7b\x46\x43\x71\x06\x76\xf2\x67\x20\xb6\x75\xe7\x2c\x71\xa1\x8c\x8a\x53\xf3\x32\x22\x2c\xac\x65\x62\x0f\x2e\x9b\xa1\xee\xb4\x9b\x66\xa7\xc1\xe0\x7c\x84\x32\x0b\x0f\xc4\x3e\x48\x0e\x7e\x36\xe6\x49\x01\x57\x1f\xae\xc6\x50\x07\xcf\x78\x3b\xb0\xb3\x05\x3c\xbe\xeb\xc1\x63\x7f\x59\x55\x78\xef\xb2\xe7\x71\xff\x9f\xb5\x9d\x25\xe6\x23\x65\xc1\xf4\xcb\xfa\xaf\xe1\xed\xd7\x21\x03\xf7\xd9\x41\xae\x10\x34\x57\xb2\x42\xb9\xa2\x5d\xfe\xc3\xe4\xc8\x49\xe0\xed\x92\x7e\x67\xd2\xbd\xed\xb7\x75\xb4\x7e\x2f\x90\x73\x32\xa5\x57\x4b\xf3\xa9\xf7\xe4\x3b\x22\x49\x27\xce\xde\xbf\xbc\x59\x05\xf8\xaa\xfa\x1a\xaa\x3f\x0f\x0e\x3c\x0c\xc9\x76\xce\x9c\xb5\x9a\x26\x8e\x53\x4d\xde\x9b\xeb\xc3\x63\xf4\xd0\x09\x24\xe3\x48\x6e\xbd\x89\x56\xfc\x1b\x00\x00\xff\xff\x56\x94\x63\x3a\x55\x0f\x00\x00"), }, "/03_secrets.yaml": &vfsgen۰FileInfo{ name: "03_secrets.yaml", - modTime: time.Date(2020, 5, 8, 13, 59, 12, 352098811, time.UTC), + modTime: time.Date(2020, 5, 6, 16, 16, 51, 411690040, time.UTC), content: []byte("\x2d\x2d\x2d\x0a\x61\x70\x69\x56\x65\x72\x73\x69\x6f\x6e\x3a\x20\x76\x31\x0a\x6b\x69\x6e\x64\x3a\x20\x53\x65\x63\x72\x65\x74\x0a\x6d\x65\x74\x61\x64\x61\x74\x61\x3a\x0a\x20\x20\x6e\x61\x6d\x65\x3a\x20\x77\x6b\x73\x2d\x63\x6f\x6e\x74\x72\x6f\x6c\x6c\x65\x72\x2d\x73\x65\x63\x72\x65\x74\x73\x0a\x20\x20\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x3a\x20\x73\x79\x73\x74\x65\x6d\x0a\x74\x79\x70\x65\x3a\x20\x4f\x70\x61\x71\x75\x65\x0a\x64\x61\x74\x61\x3a\x0a\x20\x20\x73\x73\x68\x4b\x65\x79\x3a\x20\x22\x22\x0a"), }, + "/04_capi_controller.yaml": &vfsgen۰CompressedFileInfo{ + name: "04_capi_controller.yaml", + modTime: time.Date(2020, 6, 2, 15, 17, 7, 132374932, time.UTC), + uncompressedSize: 787, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x91\x41\x8f\x13\x31\x0c\x85\xef\xf3\x2b\x2c\x71\x9e\x69\x0b\x42\x42\xe1\xb4\x02\x6e\x2c\x1c\x90\xb8\xbb\x19\xb7\xb5\x9a\xc4\xc1\xf6\x2c\xf4\xdf\xa3\xb4\xc3\x30\x3d\x54\xeb\x53\x64\xe7\x7d\x79\x79\xee\xfb\xbe\xc3\xca\x3f\x49\x8d\xa5\x04\xc0\x5a\x6d\xf3\xb2\xeb\xce\x5c\xc6\x00\x9f\xa9\x26\xb9\x64\x2a\xde\x65\x72\x1c\xd1\x31\x74\x00\x05\x33\x05\x88\x58\xb9\x8f\x52\x5c\x25\x25\xd2\xb9\x6f\x15\x23\x05\xb0\x8b\x39\xe5\x0e\x20\xe1\x9e\x92\x35\xd5\x23\x9d\x55\x8a\x6d\xae\x54\x13\x47\xb4\x00\xbb\x0e\xc0\x28\x51\x74\xd1\x9b\x32\xa3\xc7\xd3\xd7\x15\xea\xb1\x09\xa7\x5c\x13\x3a\xcd\xc2\x95\xed\x56\xe9\x8e\xf1\x98\x02\xf0\xcf\x56\x2b\x97\x44\x8a\xce\x52\x16\xe9\x1b\x78\x4a\x49\x7e\x83\xc5\x13\x8d\x53\xe2\x72\x04\x29\x90\xd1\x9c\x14\x8a\x8c\x64\x1f\x41\xe9\xd7\xc4\x4a\x23\x8c\x93\xb6\x0b\x7b\x11\x37\x57\xac\x95\xcb\x71\x98\x41\x3d\xd0\xe1\x40\xd1\x03\x7c\x93\x1f\x37\x18\x2d\xf6\xce\x74\x09\x57\x5a\xaf\x92\x68\x38\x4f\x7b\xd2\x42\x4e\x36\xb0\x6c\x6e\x8f\x2d\x77\xa5\x36\x8f\xa2\x01\xbe\xfc\x61\x73\x5b\x8c\x3e\xa3\x9e\xc1\x4f\x6c\x80\x06\x08\x51\xd9\x39\x62\x02\x1c\x47\x29\x61\xb1\x71\x7d\xeb\xd3\x3c\x7c\x6a\x33\xfb\x5e\xd2\xe5\x35\x7e\x8b\x0d\xb9\x90\xda\x7f\xd4\x9c\xea\x7d\xa0\xad\x38\xe3\x91\x02\x4c\x36\x1c\xa3\xb6\x3f\x9c\x3f\x58\x8f\xea\x7c\xc0\xe8\xd6\x57\x95\x71\x13\xd3\xd4\xfe\xd5\x63\xe5\xf5\x79\xb5\x9f\xf0\xb2\x1d\xde\x0d\xef\x17\xaa\x92\xc9\xa4\x91\x56\x7b\x85\x6b\xf8\x64\x7e\xd7\x03\x88\x75\x0a\xb0\xdb\x6e\xf3\x5d\x37\x53\x16\xbd\x04\x78\xbb\x7d\xe6\xee\x6f\x00\x00\x00\xff\xff\xae\xfa\x8b\x40\x13\x03\x00\x00"), + }, + "/04_capi_controller.yaml~": &vfsgen۰CompressedFileInfo{ + name: "04_capi_controller.yaml~", + modTime: time.Date(2020, 5, 11, 9, 49, 15, 378837164, time.UTC), + uncompressedSize: 1140, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x93\xcd\x6e\xdb\x48\x0c\xc7\xef\x7a\x0a\x02\x7b\x8d\x14\x67\x17\x0b\x2c\xe6\x16\x6c\x73\x6b\xda\x43\x8b\xde\xe9\x19\xda\x9e\x7a\x34\x9c\x92\x9c\x38\x7a\xfb\x62\x64\x55\xb1\x8b\x18\xe5\x49\x20\xc5\x1f\xff\xfc\x98\xbe\xef\x3b\x2c\xf1\x1b\x89\x46\xce\x0e\xb0\x14\xbd\x7f\x79\xe8\x8e\x31\x07\x07\x1f\xa8\x24\x9e\x46\xca\xd6\x8d\x64\x18\xd0\xd0\x75\x00\x19\x47\x72\xe0\xb1\xc4\xde\x73\x36\xe1\x94\x48\x16\xbf\x16\xf4\xe4\x40\x27\x35\x1a\x3b\x80\x84\x5b\x4a\xda\xb2\x6e\xe5\x69\x21\xdf\xe2\x42\x25\x45\x8f\xea\xe0\xa1\x03\x50\x4a\xe4\x8d\xe5\x9c\x39\xa2\xf9\xc3\xc7\x0b\xd4\x6d\x11\x46\x63\x49\x68\xb4\x24\x5e\xc8\x6e\x96\xae\x18\xb7\x29\x00\xbf\x64\x35\x33\x4e\x24\x68\x91\xf3\x9a\xfa\x17\x3c\xa6\xc4\x27\x50\x7f\xa0\x50\x53\xcc\x7b\xe0\x0c\x23\xaa\x91\x40\xe6\x40\x3a\xc0\xd7\x43\x54\x88\x0a\x42\x3f\x6a\x14\x0a\xb0\x25\x8f\x55\x09\x42\x95\x98\xf7\x2b\x69\xcb\x6c\x6a\x82\xa5\xcc\x98\x1d\xd8\x81\xc0\xa7\xda\x58\x77\x70\x22\x18\x71\x82\x98\xa3\x45\x4c\x69\x82\x03\xbe\x10\x7c\xaf\x6a\xc0\x99\x96\x92\x77\x2b\x0c\x73\x80\x13\xd7\x14\x1a\x25\x43\x26\x0a\x60\x0c\x61\x5e\x25\x58\x93\xf4\xd6\x69\xfb\x47\xa8\xc5\x95\x6c\x2e\x4b\xd9\xa2\xd0\x4a\x5b\x54\x40\x2d\xc3\xe2\xeb\x81\x76\x3b\xf2\xe6\xe0\x13\x7f\x39\x37\x4f\xeb\x38\x8f\x34\xb9\xb9\xfb\x5e\x38\xd1\x70\xac\x5b\x92\x4c\x46\x3a\x44\xbe\x3f\x2b\x5d\xff\xe5\xd2\x66\xca\xe2\xe0\xe9\x35\xaa\xe9\x5a\xf3\x19\xe5\x78\x16\x8a\x0a\x08\x5e\xa2\x45\x8f\x09\x30\x04\xce\x6e\x95\x31\xd7\xfa\x7f\x09\x3e\xb6\x98\x7e\xce\x69\xfa\x33\xff\xbc\x38\xa9\x39\x2f\x5b\x9b\xd7\x05\xa7\x68\x07\x68\x91\x10\xf5\x08\xcb\x1d\x57\xa5\x5d\x4d\xb0\x63\x81\x40\x23\xeb\x3b\x43\x78\x7a\x25\x5f\xed\x9d\x19\xfc\xd6\x7e\xc3\xf6\x45\x48\xb5\x0a\xb9\x77\x86\x77\x43\x70\xdb\x16\xc6\x4c\xa2\x6f\xbd\x2f\x67\x7b\x7d\xb1\xcd\xe2\x88\xfb\x59\xf6\xb0\xf7\xd2\xaa\x1e\xff\xd3\x1e\xc5\xe2\x0e\xbd\x69\x5f\x84\xc3\xfd\xb2\xd3\x1e\x4b\xbc\xfc\xbe\x78\x00\xee\x65\x33\xfc\x33\xfc\xbb\x52\x85\x94\xab\x78\xba\x78\x38\x30\x5f\x35\xa9\x5d\xf9\x00\x7c\xa9\x0e\x1e\x36\x9b\xf1\xca\x3b\xd2\xc8\x32\x39\xf8\x7b\xf3\x1c\xbb\x9f\x01\x00\x00\xff\xff\xd6\xef\xd3\x2e\x74\x04\x00\x00"), + }, "/04_controller.yaml": &vfsgen۰CompressedFileInfo{ name: "04_controller.yaml", - modTime: time.Date(2020, 5, 19, 22, 23, 27, 249283676, time.UTC), + modTime: time.Date(2020, 6, 2, 15, 12, 39, 48385926, time.UTC), uncompressedSize: 1532, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x54\x49\x73\xdb\x3a\x0c\xbe\xfb\x57\x60\xfc\xae\x91\x97\xf7\x2e\x6f\x78\xcb\xb4\xb9\x35\xed\x4c\xd3\xe9\x1d\xa6\x90\x88\x15\xb7\x02\x90\x15\xfd\xfb\x0e\x65\x45\xb6\x3b\x4e\x9c\x56\x37\x61\xf9\x16\x90\x60\x55\x55\x0b\xcc\xee\x3b\xb1\xb8\x14\x0d\x60\xce\xb2\xde\x6f\x17\xad\x8b\xb5\x81\x8f\x94\x7d\x1a\x02\x45\x5d\x04\x52\xac\x51\xd1\x2c\x00\x22\x06\x32\xd0\xb7\x52\xd9\x14\x95\x93\xf7\xc4\x53\x58\x32\x5a\x32\x20\x83\x28\x85\x05\x80\xc7\x1d\x79\x29\x4d\xaf\xb6\x01\x4c\xbf\x55\xf6\x18\xdf\xac\xf0\xc4\x95\xa6\xe4\x65\xd5\xfe\x2f\x2b\x97\x0c\x2c\xb7\xab\xcd\x72\x21\x99\x6c\xe1\x60\xca\xde\x59\x14\x03\xdb\x05\x80\x90\x27\xab\x89\x0f\xec\x01\xd5\x36\x9f\x4e\xe4\xbc\x2a\x48\x29\x64\x8f\x4a\x53\xdf\x89\xf1\xf2\xf9\x33\x88\x37\x5c\xbd\xcf\xd9\x3b\xdc\x95\x92\x17\x87\x23\x63\xaa\xe9\xe1\xcc\xdb\x4b\xb4\xe2\xe4\x69\xd5\x76\x3b\xe2\x48\x4a\x05\x64\x1d\x50\x94\xd8\xc0\x72\x39\x95\x6a\xf2\xc4\xa8\x2e\xc5\xd9\xc5\x3f\x70\xeb\x7d\xea\x41\x6c\x43\x75\xe7\x5d\x7c\x82\x14\xe1\xd0\x39\x02\xcb\x0a\xbe\x35\x4e\xc0\x09\x30\xfd\xec\x1c\x53\x0d\x3b\xb2\xd8\x09\x41\xdd\xb1\x8b\x4f\x33\xd2\x2e\x25\x15\x65\xcc\x79\x84\x79\x04\x6d\x08\xac\xef\x0a\xd6\x0d\xf4\x04\x01\x07\x70\xd1\xa9\x43\xef\x07\x68\x70\x4f\xf0\xa3\x13\x85\x14\x69\xa2\xbc\x99\xc1\x30\xd6\xd0\xa7\xce\xd7\x05\x25\x42\x24\xaa\x41\x13\xd4\xe3\xbd\x04\x2d\x92\x8e\xc3\x2b\x35\x4c\x25\x2f\xa4\x23\x2d\x45\x75\x4c\x33\xda\xa4\x02\xba\xbc\x9a\x62\x15\xd0\xe3\x23\x59\x35\xf0\x39\x3d\x1c\xcc\xd3\x3c\xd1\x96\x06\x73\x65\xac\x73\x6d\xca\x65\xa6\x89\x0d\xdc\x3d\x3b\x51\x99\x39\xef\x91\xdb\x83\x50\x14\x40\xb0\xec\xd4\x59\xf4\x80\x75\x9d\xa2\x99\x65\x8c\x5c\x1f\xa6\xe4\x6d\xc9\xc9\x97\xe8\x87\xeb\xf8\xa5\xea\xe5\xdc\xa8\x9c\xda\x78\x5c\xd0\x37\xce\x36\x80\x4c\xc0\x84\xf5\x30\x0e\x92\x09\x6d\x83\x3b\x4f\xe6\x82\xfb\xbb\x67\xb2\x9d\x5e\x30\xbf\x42\x9f\x1b\xfc\xcd\x7d\x4c\xfa\xb5\xe0\x5e\xd3\xf7\xf7\x0c\x5d\x9c\xe5\x5e\x23\x29\x37\x00\x5d\x24\x96\xa3\xb1\xc3\x56\x5e\xd8\x35\x17\xf0\x89\x0c\xd4\xc9\xb6\xc4\x85\xa8\x27\xdc\x53\x9f\xb8\x95\x75\xdf\x8a\x55\x7f\xb2\xa1\xa6\x3c\x03\xa2\x27\x8b\x1a\x02\xc6\xfa\xb8\x74\x15\xac\x77\x2e\xae\x2f\xf0\x54\x50\x55\x7b\xe2\x5d\x92\xa3\x7e\x26\x49\x1d\x5b\x3a\x79\x3d\x00\xbc\x0b\x4e\xcf\x22\x00\x36\x77\x06\xb6\x9b\x4d\x38\x8b\x06\x0a\x89\x07\x03\xff\x6d\xee\xdd\x49\xa2\x2c\x24\xc9\x9f\x41\xfc\x5b\x20\x7e\x05\x00\x00\xff\xff\x51\x54\xb6\xf7\xfc\x05\x00\x00"), }, "/05_sealed_secret_crd.yaml": &vfsgen۰CompressedFileInfo{ name: "05_sealed_secret_crd.yaml", - modTime: time.Date(2020, 5, 8, 13, 59, 12, 352480401, time.UTC), + modTime: time.Date(2020, 5, 6, 16, 16, 51, 411690040, time.UTC), uncompressedSize: 302, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\xd0\xbd\x4e\xc5\x30\x0c\x05\xe0\x3d\x4f\xe1\x17\x68\x51\x37\x94\x15\x36\x10\x03\x57\x62\xf7\x4d\x0f\x17\xab\xf9\x53\xec\x54\x3c\x3e\x6a\x2a\x24\x7e\xc6\xe4\xb3\xcf\x91\x3c\x4d\x93\xe3\x2a\x6f\x68\x2a\x25\x7b\xe2\x2a\xf8\x34\xe4\xe3\xa5\xf3\x76\xaf\xb3\x94\xbb\x7d\xb9\xc2\x78\x71\x9b\xe4\xd5\xd3\x43\x57\x2b\xe9\x15\x5a\x7a\x0b\x78\xc4\xbb\x64\x31\x29\xd9\x25\x18\xaf\x6c\xec\x1d\x51\xe6\x04\x4f\x0a\x8e\x58\x15\xa1\xc1\x74\xbe\x8a\x65\x4e\x32\x87\x92\x9c\x56\x84\x63\xee\xd6\x4a\xaf\x9e\x7e\xd2\xb9\xac\x87\x12\x9d\x95\x97\x91\x73\x19\x39\xe3\x3b\x8a\xda\xd3\x3f\x7a\x16\x3d\xb9\xc6\xde\x38\xfe\xe9\x1f\xa2\x92\x6f\x3d\x72\xfb\x6d\x8e\x48\x43\xa9\xf0\xf4\x72\x54\x57\x0e\x58\x1d\xd1\xfe\x7d\x95\x7d\xe1\x58\x3f\x78\xf9\x0a\x00\x00\xff\xff\x7b\xe7\x31\x16\x2e\x01\x00\x00"), }, "/06_sealed_secret_controller.yaml": &vfsgen۰CompressedFileInfo{ name: "06_sealed_secret_controller.yaml", - modTime: time.Date(2020, 5, 8, 13, 59, 12, 352634417, time.UTC), + modTime: time.Date(2020, 5, 7, 9, 16, 32, 49753575, time.UTC), uncompressedSize: 4505, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x57\x5d\x53\x5b\x37\x10\x7d\xf7\xaf\xd8\x49\xa7\x93\x97\x5c\x83\x9b\xd2\x61\xf4\x46\x49\x4b\x3b\x93\x52\x0f\x94\xbe\x74\xfa\x20\x4b\x6b\x5b\x41\x5f\x91\x56\x86\x9b\x4e\xff\x7b\x47\xf2\xf5\xfd\x00\x3b\x35\x90\x0c\xf8\xe9\xb2\x5a\xed\x9e\x3d\x3a\x5a\x2d\x55\x55\x8d\xb8\x57\x7f\x62\x88\xca\x59\x06\xab\xc9\xe8\x5a\x59\xc9\xe0\x12\xc3\x4a\x09\x1c\x19\x24\x2e\x39\x71\x36\x02\xe0\xd6\x3a\xe2\xa4\x9c\x8d\x0c\xfe\xf9\x77\x04\xa0\xf9\x0c\x75\xcc\x6b\x00\x96\x1b\x64\x10\x91\x6b\x94\x55\x44\x11\x90\x62\x25\x9c\xa5\xe0\xb4\xc6\x30\xda\xd7\x23\x7a\x2e\x90\xc1\x75\x9a\x61\x15\xeb\x48\x68\x46\xd1\xa3\xc8\x49\xbc\x0b\x54\xb2\x55\xe5\x93\xc1\xf1\xe1\xf1\x61\x49\x4e\x3c\x2c\x90\xa6\x7d\x63\x44\x8d\x82\x5c\xd8\x17\x1d\xd5\x1e\x19\x9c\xea\x14\x09\xc3\xaf\xd3\xd1\x5d\x6a\xc2\x8c\x8b\x31\x4f\xb4\x74\x41\x7d\x2a\x2c\x8c\xaf\x8f\xe3\x58\xb9\x83\x96\xb4\x0b\xa7\xf1\x47\x65\xa5\xb2\x8b\xa7\x12\x17\xd7\xfc\x57\x3e\xb8\x5b\xb5\x9b\xbd\xed\x6e\x5b\x28\x0c\x4e\xe3\x05\xce\x0b\x1a\xaf\xce\x82\x4b\xfe\x33\x25\x8d\x00\xba\x8a\xf6\xcd\x1d\xd3\xec\x03\x8a\x7c\x40\xd5\x83\x72\x14\xc7\x2e\x49\xc1\xcb\xf2\x0e\xb4\xa4\x04\x27\x94\xf7\xce\x82\x7b\x1f\x3b\xda\xdf\xa1\xd7\xae\x36\x68\xe9\x65\xc9\xd5\x28\x7b\x81\x5c\xd6\x97\x28\x9c\x95\x91\xc1\xdb\xac\xcb\x80\x5e\x2b\xc1\x23\x83\x49\xf9\x6b\xa5\x72\x4d\xbf\xa8\x48\x2e\xd4\xef\x95\x51\xc4\x60\x72\x5f\xc0\x86\x93\x58\xbe\xef\x15\xb0\x0f\xc0\x48\x81\x13\x2e\xea\xf5\x8e\x6c\x56\x76\x71\xe5\x25\x27\xdc\x04\x31\xfc\xf6\x32\x85\x05\x32\xf8\xee\xe8\xdb\xce\x76\x65\xf9\x8a\x2b\xcd\x67\xba\xb7\xb2\xbe\x22\x17\xfd\x30\xf9\xe2\xa0\xf1\xba\x8d\xd8\x3f\x81\xfc\xbb\x7f\x0a\xf9\xa7\x07\x85\xec\x53\x0a\xc0\x86\xd6\x82\xc4\x69\x0c\x4d\xd4\xc6\xf4\x0d\x9c\x68\xed\x6e\x20\x8a\x25\xca\x94\x11\x82\xb3\x60\x78\xbe\xce\x60\x9d\xc4\x38\x86\x3f\x96\x2a\x82\x8a\x10\xf0\x63\x52\x01\x25\xcc\x50\xf0\x14\x11\x64\x0a\xf9\xd2\x6e\x22\xcd\x9c\xa3\xcc\x9d\xf7\x25\xcc\x1c\x68\x89\x20\xd6\xad\xe1\x0d\xdc\x20\x18\x5e\x83\xb2\x8a\x14\xd7\xba\x86\x25\x5f\x21\x7c\x48\x91\xc0\x59\x6c\x52\xbe\x69\x83\x71\x2b\xe1\xc6\x25\x2d\x73\x14\x0b\x16\x51\x02\x39\x90\x45\xb5\x40\x19\x52\x57\x69\xf6\x09\x98\xd7\x23\x52\x49\x9b\x6f\x41\xc0\x36\x5a\x83\x02\x92\x1f\x37\xb6\x0a\x70\x3e\x47\x41\x0c\xce\xdd\xe5\xba\x78\x6c\x89\xbd\xc6\x9a\x95\xea\xab\xdc\x01\xc6\x59\xa6\xc1\x22\x61\x69\x5c\x6b\xa4\xad\xaf\xf3\x99\x53\x17\x18\xfc\x74\xab\x22\xc5\x66\x21\x83\xe3\xca\x62\x68\xa9\xae\x80\x87\x45\x64\xf0\xd7\xdf\xed\x5e\xe1\x8c\xe1\x56\x76\x27\x5a\xc1\x9d\xe3\xcb\x3f\xb4\xab\xc1\x2e\x65\x78\x56\xde\xc7\xc4\xeb\x8c\x67\xa6\xc8\x72\xa3\x0e\x76\xea\x80\xad\x0e\xc7\x93\xc9\xf8\x70\x18\x60\x9a\xb4\x9e\x3a\xad\x44\xcd\xe0\x44\xdf\xf0\x3a\xb6\xeb\x5a\xad\xd0\x62\x8c\xd3\xe0\x66\xd8\x81\x03\x58\x12\xf9\x33\xa4\xbe\x09\xc0\x73\x5a\x32\x38\x58\x22\xd7\xb4\xfc\x34\x5c\x2a\x4f\x4b\xde\xf5\x20\xcd\x6e\xb6\xc6\xbb\xc4\x14\x42\xa7\xc3\x47\xac\x1f\x76\x90\x29\x20\x97\xea\x6b\x95\x11\x51\xa4\xa0\xa8\x3e\x75\x96\xf0\x76\x10\x2a\xe7\xfd\xdd\xea\xfa\xc2\x39\xfa\x59\x69\x6c\x7a\x33\x50\x48\xd8\x77\x4b\xf6\x24\x9e\x3b\x9b\xdd\xb6\x2f\x5e\x45\x0c\xb9\xab\x1d\x4e\xba\xb4\x24\x95\x65\x30\xe7\x3a\x76\xee\x44\xf5\x5d\xd3\xca\xe9\x64\xf0\x37\x97\xec\x90\x44\x93\x2d\xd3\x75\xa5\x64\xfc\x3d\x02\x3b\x5b\xab\x91\xcb\xf5\x19\xf5\x14\x98\xaf\xf0\x69\x27\xef\x6e\x61\x27\x29\xf3\xd8\xbc\x6b\x3f\x1c\x1d\xbd\xfd\xbe\xf5\x2e\x2f\xe1\x89\x10\x19\xd4\xf9\x5e\xba\x20\x0c\x46\xd9\xd2\xc2\xce\x02\x17\x38\xc5\xa0\x9c\x1c\x3e\x15\x5d\xfd\xbd\xab\x87\xc6\x53\xfd\x4e\x85\x5e\x37\xed\xd7\xfc\xbc\x63\xcb\x97\x79\x40\xbf\xc2\xb0\x72\x8d\x75\xc5\xa5\x51\x76\x30\xa6\x0c\x66\xdd\xe6\xf8\x9e\x02\xfc\x91\xe4\x3f\x95\xf5\xae\xb8\x3d\x1d\xb6\x71\x9e\x34\x0e\x46\xb7\x66\xd0\x7e\xf5\xaa\x4c\x29\xd1\xa5\x20\xb0\xb1\x35\x61\x47\x00\x2b\x0c\xb3\xc6\x28\x02\xae\xe7\x81\x0a\xb4\x8a\xf4\x18\x2e\x9a\xe1\xfb\xb9\xf4\xf8\x48\xd9\xf5\x50\xf7\x92\xac\xa3\x27\x5b\xd2\x85\x97\xa6\xba\x3e\xe6\x87\x53\x7c\xa7\xb6\x9d\x0b\xbb\x34\xd5\xbc\xf3\x63\xe1\xcc\x36\x71\x65\x02\xb6\x4a\x6c\x81\xd4\xe9\x2b\x7f\xdc\xe4\xa1\xb8\x7c\xa5\xf5\x34\xfa\x78\xf9\x6e\x62\xf7\x64\x9c\x36\x13\x6e\x05\x12\x35\xee\x1b\x1e\x57\x68\x3f\x73\x39\x7c\xc1\xfc\x7f\xff\x78\x6f\x64\xf1\x22\xfa\xf1\x33\xb5\xb5\x2f\xfe\x3f\xf0\x3e\x2d\x2e\xbf\xde\x8d\xfd\x75\x9e\x93\xd8\xee\x61\xf4\x75\x4f\xaf\xdb\xf9\xbc\x27\xbc\x82\x34\x1e\x64\xa8\xf5\x4e\x85\x64\x29\xfe\x17\x00\x00\xff\xff\xd1\x93\xfb\x19\x99\x11\x00\x00"), @@ -66,6 +80,8 @@ var Manifests = func() http.FileSystem { fs["/01_namespace.yaml"].(os.FileInfo), fs["/02_rbac.yaml"].(os.FileInfo), fs["/03_secrets.yaml"].(os.FileInfo), + fs["/04_capi_controller.yaml"].(os.FileInfo), + fs["/04_capi_controller.yaml~"].(os.FileInfo), fs["/04_controller.yaml"].(os.FileInfo), fs["/05_sealed_secret_crd.yaml"].(os.FileInfo), fs["/06_sealed_secret_controller.yaml"].(os.FileInfo), diff --git a/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go b/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go index 2c13f662..8cc1f5f3 100644 --- a/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go +++ b/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go @@ -21,50 +21,66 @@ var CRDs = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), + modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), }, - "/cluster_v1alpha1_cluster.yaml": &vfsgen۰CompressedFileInfo{ - name: "cluster_v1alpha1_cluster.yaml", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), - uncompressedSize: 2469, + "/cluster.weave.works_baremetalclusters.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.weave.works_baremetalclusters.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), + uncompressedSize: 4582, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\x4d\x8f\x13\x31\x0c\xbd\xcf\xaf\xb0\x7a\x6f\xa1\x02\x21\x34\x37\xd8\x05\x89\x03\x2b\xb4\x8b\xf6\x82\x38\xb8\x19\x6f\x1b\x9a\x89\x83\xe3\x19\x58\x21\xfe\x3b\x9a\xaf\x6e\xb7\x33\xe9\x2c\x9c\xc9\xa9\xf3\xfc\xec\x38\xcf\x89\x6b\x0c\xf6\x96\x24\x5a\xf6\x39\x60\xb0\xf4\x53\xc9\x37\x5f\x71\xb5\x7f\x1d\x57\x96\x9f\xd5\xeb\x0d\x29\xae\xb3\xbd\xf5\x45\x0e\x17\x55\x54\x2e\xaf\x29\x72\x25\x86\x2e\xe9\xce\x7a\xab\x96\x7d\x56\x92\x62\x81\x8a\x79\x06\x60\x84\xb0\x01\x3f\xdb\x92\xa2\x62\x19\x72\xf0\x95\x73\x19\x80\xc3\x0d\xb9\xd8\x70\x00\x0c\x7b\x15\x76\x8e\x64\xa9\xcc\x6e\xd8\x30\x87\xc5\x7a\xf5\x7c\x91\x01\x78\x2c\x29\x07\xe3\xaa\xa8\x24\x71\xd5\xff\xe8\x69\x59\x0c\x64\x9a\x40\x5b\xe1\x2a\x1c\x68\x83\xb5\xf3\xee\x77\xea\x53\xef\x18\x2d\x12\x5c\x25\xe8\x1e\x82\x67\x00\xd1\x70\xa0\x1c\xae\x1a\xb7\x80\x86\x8a\x06\xab\x36\xd2\x1f\xb5\x0f\x15\x15\xb5\x8a\x39\xfc\xfa\x9d\x01\xd4\xe8\x6c\xd1\x9e\xb4\x33\x72\x20\xff\xe6\xd3\x87\xdb\x17\x37\x66\x47\x25\x76\x20\x40\x10\x0e\x24\x6a\x87\x18\xcd\x3a\x92\xfd\x80\x01\xe8\x7d\x93\x42\x54\xb1\x7e\x7b\x80\xdb\xec\xe7\x48\xc7\xf2\x3f\x26\xf2\xe6\x1b\x19\x3d\xc0\x83\x6c\xc3\x9a\x4a\xae\xad\x4e\xa7\xcc\x15\xe9\x0f\x96\xfd\x63\x5b\xda\xab\xb5\x71\x31\x81\x9e\xf7\x69\x77\xb4\x85\xbc\x75\x6c\xf6\x09\x3b\x80\x55\x2a\x93\xc6\x84\x30\x53\x14\x14\xc1\xfb\x09\x86\xd0\xf7\xca\x0a\x15\x53\x5b\x2c\x8f\xf2\x9b\x30\x4f\x6a\x3d\xac\x48\x52\x5b\x43\x97\x5c\xa2\xf5\x53\xc1\xcf\x66\xde\x7b\xff\xd7\xf4\x09\x51\x97\x07\xb5\x46\x86\xe6\x5a\xa6\xd8\x5d\x65\xb2\x27\x6e\x1f\x84\x6b\x5b\x90\xdc\x9c\x3c\x25\x98\x29\x48\x8d\xae\xa2\x74\xf9\x13\x97\xa7\xf5\x7a\x2f\x5c\xfe\x4b\xfd\x4b\x34\x3b\xeb\xe9\xc2\x61\x4c\x16\x79\x2e\xc6\xf1\x91\xd3\x8c\xbf\xb8\x2a\x89\x83\x9e\x35\x27\x4c\x53\xf7\x60\x79\xd2\xbb\x66\x3b\x62\xd7\xd2\x9f\xd0\x13\x31\xd8\x77\xbe\x08\x6c\xbd\x8e\xb4\x4a\xbc\xa3\xf3\xe2\xee\x38\xea\xb4\xa4\x33\x62\x06\x96\x84\xe3\x1d\x4b\x89\x9a\x83\xf5\xfa\xea\xe5\x99\xd0\xd6\x2b\x6d\xfb\x7f\xc3\xe3\x95\x7e\xaf\xcb\x36\xdd\x09\xb8\x49\x66\x04\xcf\xd6\x72\xdc\x30\x48\x84\xe5\x23\xc5\x88\xdb\xd1\x33\x49\xea\xd1\x3a\x5d\x13\x46\x1e\x75\xd6\xa4\xcf\xe1\x01\x8f\x2a\x7f\x26\xf3\x13\xb8\x1e\x86\xa6\x7a\x8d\x2e\xec\x70\x9d\x3d\xdc\x23\x34\x86\x82\x52\x71\x75\x3a\x82\x2c\x16\x8f\xa6\x8f\xf6\xd3\xb0\x2f\xda\x11\x2a\xe6\xf0\xe5\x6b\x33\x74\x28\x0b\x15\xfd\x74\xd0\x81\x7f\x02\x00\x00\xff\xff\x28\xd8\xc3\xb7\xa5\x09\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x58\x4b\x93\xdb\x36\x0c\xbe\xeb\x57\x60\xd2\x43\x2e\x95\x9c\x4c\x2e\x1d\xdd\x36\xdb\x76\x26\x93\x64\x67\x67\x77\xbb\x3d\x74\x7a\x80\x48\xd8\x62\x4d\x91\x2c\x1f\xce\x3a\xbf\xbe\x43\x4a\xf2\x4b\x0f\xdb\x49\x7b\x29\x4f\x26\x08\x02\x1f\x3f\x80\x10\xcc\x2c\xcf\xf3\x0c\x8d\x78\x26\xeb\x84\x56\x25\xa0\x11\xf4\xe2\x49\xc5\x99\x2b\xd6\x3f\xb9\x42\xe8\xc5\xe6\x6d\x45\x1e\xdf\x66\x6b\xa1\x78\x09\xb7\xc1\x79\xdd\x3c\x90\xd3\xc1\x32\xfa\x99\x96\x42\x09\x2f\xb4\xca\x1a\xf2\xc8\xd1\x63\x99\x01\xa0\x52\xda\x63\x14\xbb\x38\x05\x60\x5a\x79\xab\xa5\x24\x9b\xaf\x48\x15\xeb\x50\x51\x15\x84\xe4\x64\x93\x87\xde\xff\xe6\x4d\xf1\xae\x78\x93\x01\x30\x4b\x69\xfb\x93\x68\xc8\x79\x6c\x4c\x09\x2a\x48\x99\x01\x28\x6c\xa8\x84\x0a\x2d\x45\x87\x92\xc9\xe0\x3c\x59\x57\x74\x3f\x8a\x2f\x84\x1b\x2a\xbe\x68\xbb\x76\x19\x80\xc4\x8a\x64\x8f\xa1\xd3\x78\xc9\x77\x07\x43\x69\x6a\x7c\x57\x42\xff\x2b\x73\x86\x58\xd4\x5e\x59\x1d\x4c\x09\xe3\x46\x23\x84\xce\x66\xcb\xc9\x7b\xb4\xf4\x39\xa2\xb9\x6d\xf5\xd3\x92\x14\xce\x7f\x1c\x5d\xfe\x24\x9c\x4f\x2a\x46\x06\x8b\x72\xe4\x34\x69\xd5\x09\xb5\x0a\x12\xed\x70\x3d\x03\x70\x4c\x1b\x2a\xe1\x2e\x42\x31\xc8\x88\x67\x00\x1b\x94\x82\x27\xda\x5a\x70\xda\x90\xba\xb9\xff\xf0\xfc\xee\x91\xd5\xd4\x60\x2b\x04\x30\x56\x1b\xb2\x5e\xf4\x67\x88\xe3\x20\x09\x76\x32\x00\x4e\x8e\x59\x61\x92\x45\x78\x1d\x4d\xb5\x3a\xc0\x63\xd8\xc9\x81\xaf\x09\xba\xe0\x11\x07\x97\xdc\x80\x5e\x82\xaf\x85\x03\x4b\xc6\x92\x23\xd5\x26\xc2\x81\x59\x88\x2a\xa8\x40\x57\x7f\x11\xf3\x05\x3c\x92\x8d\x46\xc0\xd5\x3a\x48\x1e\x73\x65\x43\xd6\x83\x25\xa6\x57\x4a\x7c\xdd\x59\x76\xe0\x75\x72\x29\xd1\x53\x47\x61\x3f\x84\xf2\x64\x15\xca\x48\x42\xa0\x1f\x01\x15\x87\x06\xb7\x60\x29\xfa\x80\xa0\x0e\xac\x25\x15\x57\xc0\x67\x6d\x09\x84\x5a\xea\x12\x6a\xef\x8d\x2b\x17\x8b\x95\xf0\x7d\xda\x33\xdd\x34\x41\x09\xbf\x5d\xa4\xe4\x15\x55\xf0\xda\xba\x05\xa7\x0d\xc9\x85\x13\xab\x1c\x2d\xab\x85\x27\xe6\x83\xa5\x05\x1a\x91\x27\xe0\x2a\x65\x7d\xd1\xf0\x1f\x6c\x77\x47\xdc\xeb\x03\xa4\x7e\x1b\xc3\xe6\xbc\x15\x6a\xb5\x13\xa7\x2c\x9a\xe4\x3d\x26\x11\x08\x07\xd8\x6d\x6b\xf1\xef\xe9\x8d\xa2\xc8\xca\xc3\x2f\x8f\x4f\xd0\x3b\x4d\x21\x38\xe6\x3c\xb1\xbd\xdf\xe6\xf6\xc4\x47\xa2\x84\x5a\x92\x6d\x03\xb7\xb4\xba\x49\x16\x49\x71\xa3\x85\xf2\x69\xc2\xa4\x20\x75\x4c\xba\x0b\x55\x23\x7c\x8c\xf4\xdf\x81\x9c\x8f\xf1\x29\xe0\x36\x5d\x7e\xa8\x08\x82\xe1\xe8\x89\x17\xf0\x41\xc1\x2d\x36\x24\x6f\xd1\xd1\x7f\x4e\x7b\x64\xd8\xe5\x91\xd2\xf3\xc4\x1f\xd6\xac\x63\xc5\x96\xad\x9d\xb8\xaf\x0b\xfd\x18\xbb\x43\xe9\x1e\x71\xbe\xab\x79\x07\xc9\xe9\xa9\x19\x08\x4f\xc2\x7c\x13\x77\x76\xa2\x8a\x5c\xbc\x1f\xc9\x58\xcc\x79\xa1\x9c\x47\x29\x21\xce\x52\x24\xda\xaa\x34\x30\x38\x85\xaa\x77\x67\x46\xe5\x93\xf8\x66\x88\x1b\x2a\xa0\xb5\xb8\x1d\x59\x4f\xf5\x7a\x66\xdf\xa4\x61\x83\x16\xa7\x50\x21\xe7\xe9\xa3\x83\xf2\x7e\xf6\xc8\x57\xe0\x3f\x09\x78\x3f\x62\x6a\x0b\x4b\x7c\x68\x3d\x4f\x47\x1b\x88\x67\xac\x4d\x11\x85\x46\xb4\x37\xf1\xd4\xc9\x5c\x3c\xf7\x14\x3c\xde\xdc\x8d\x1e\x7e\x26\xaa\x67\x38\x99\x8b\x68\xec\x0f\x62\xa1\xfd\xa4\x91\xbf\x47\x89\x8a\x0d\x71\x9f\x71\x31\xc5\x69\x3e\x6a\x7c\x94\xc4\x11\x7e\x31\xf8\x3a\x96\x01\x96\x3e\x37\xbf\x53\x55\x6b\xbd\xbe\x86\x51\x86\xac\xa6\xa7\xa7\x4f\x57\x9e\x06\xc0\x11\xb3\xe4\x7f\x15\x72\x34\xd1\x67\xb7\x06\x2b\xff\x35\xf2\xf6\x30\x06\x4b\xc1\xca\x6b\x68\xd4\x56\x7c\xfd\x2e\x16\x6f\x3a\x23\xc4\xbf\x85\xcf\x64\xe2\x37\x85\xdf\x65\xe4\x7f\x15\x14\x26\x75\xe0\xf7\x56\x6f\x04\x1f\xde\xb6\x49\x5c\xcc\x8a\x6b\x22\x77\xda\x85\x5c\x70\xee\x58\xa5\xd9\x1a\x57\xd7\x73\xbc\x19\x76\x9b\x17\xec\x9b\xe6\x39\x82\x1f\x08\x3b\x70\x03\x79\xe7\xfc\x52\xf6\x63\x97\x72\x6f\xf5\xcb\xf6\x62\xe6\x45\x83\x2b\x7a\x20\xa3\x9d\xf0\xda\x5e\xbe\x4f\x0f\xc2\x32\x17\xb0\xa5\x90\xe3\x9f\xbd\x99\xca\x3f\xdf\x22\x40\xdb\x95\x78\xa1\x0e\xfe\x46\x8c\x8d\xb3\x1f\x55\x80\xb6\x0f\x9d\x36\x71\x1e\x09\xb4\x7f\x1c\x97\x62\xd5\xa0\x99\x53\xba\x08\x4f\x1c\x6b\x1a\xc4\xe2\x1b\xec\x4c\xf7\x04\xfd\xc8\xf7\xb8\x67\x74\xd6\x34\xd6\x30\x1d\x02\x99\x68\x4a\xce\x83\xc8\x0f\xc3\x38\xa1\xd1\x06\xe8\xfa\x96\x68\xae\x3f\x98\xdc\xe8\x5c\xfd\x91\xb6\xf7\xe8\xeb\x8b\x2f\x43\x70\x17\xd7\xba\x31\x32\xf2\x58\xff\x8e\xe6\x7b\x0c\x47\xe2\xe8\x67\xbe\xff\x3f\x11\xed\x9f\x2b\xfa\x67\x83\x9d\x2c\xe5\x72\xde\x3d\x52\x1c\x2c\xc7\xef\x91\xdd\x10\x2f\xc1\xdb\xd0\x72\xee\xbc\xb6\xb1\x72\xb6\x12\xe7\xd1\x87\xb4\x1b\x19\x23\xe3\x89\xdf\x9d\xbe\x32\xbc\x7a\x75\xf4\x68\x90\xa6\x4c\xab\xb6\x0d\x74\x25\xfc\xf1\x67\xd6\x5a\x25\xfe\xdc\xa3\x89\xc2\x7f\x02\x00\x00\xff\xff\x7d\x9c\xfd\x86\xe6\x11\x00\x00"), }, - "/cluster_v1alpha1_machine.yaml": &vfsgen۰CompressedFileInfo{ - name: "cluster_v1alpha1_machine.yaml", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), - uncompressedSize: 2719, + "/cluster.weave.works_baremetalmachines.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.weave.works_baremetalmachines.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), + uncompressedSize: 2502, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x56\xcd\x8e\xd3\x30\x10\xbe\xe7\x29\x46\xbd\xb7\x50\x71\x41\xb9\xa1\x45\x48\x1c\x76\x59\xed\xc2\x5e\x10\x87\xa9\x3d\x6d\xcd\x3a\xb6\x19\x4f\x22\x56\x88\x77\x47\x4e\x9a\xfe\x26\x6e\x2b\xc1\x09\xdf\x32\x33\xdf\x37\xbf\x9e\x18\x83\x79\x22\x8e\xc6\xbb\x12\x30\x18\xfa\x29\xe4\xd2\x57\x9c\x3d\xbf\x8d\x33\xe3\x5f\x35\xf3\x05\x09\xce\x8b\x67\xe3\x74\x09\x37\x75\x14\x5f\x3d\x50\xf4\x35\x2b\x7a\x4f\x4b\xe3\x8c\x18\xef\x8a\x8a\x04\x35\x0a\x96\x05\x80\x62\xc2\x24\xfc\x6c\x2a\x8a\x82\x55\x28\xc1\xd5\xd6\x16\x00\x16\x17\x64\x63\xb2\x01\x50\xde\x09\x7b\x6b\x89\xa7\xe2\xbd\xed\x1d\x96\x30\x99\xcf\x5e\x4f\x0a\x00\x87\x15\x95\x50\xa1\x5a\x1b\x47\x71\xa6\x6c\x1d\x85\x78\x63\x56\xc4\x40\x2a\x11\xad\xd8\xd7\xa1\x84\x23\x6d\x87\xde\x78\xea\x42\xbf\xed\x88\x5a\x49\xb0\x35\xa3\xdd\x91\x17\x00\x51\xf9\x40\x25\xdc\x25\x58\x40\x45\x3a\xc9\xea\x05\x6f\x52\xdd\x50\x45\x41\xa9\x63\x09\xbf\x7e\x17\x00\x0d\x5a\xa3\xdb\x4c\x3b\xa5\x0f\xe4\xde\xdd\x7f\x7c\x7a\xf3\xa8\xd6\x54\x61\x27\x04\x08\xec\x03\xb1\x98\x9e\x23\x9d\xbd\xb2\x6f\x65\x00\xf2\x92\x42\x88\xc2\xc6\xad\xb6\xe2\x36\xfa\x73\x46\xfb\xe5\x3f\x34\xf4\x8b\xef\xa4\x64\x2b\xee\xcb\xd6\x9f\xa1\xe0\x36\xdd\x59\x9a\xd5\x63\x9b\xfb\xa1\x66\x84\x78\x2c\x8a\x2c\x20\xb0\x6f\x8c\x26\x7e\x3c\x8a\x2a\x17\x59\x3a\x0d\xda\xfa\x24\xac\xac\xa7\x2d\xea\x03\xfb\x6a\x08\x99\x73\xd7\xe6\xd6\x8d\xca\x8d\xc5\x38\x62\x71\x9e\x63\x3f\xe5\x71\x8b\x91\x16\x5f\x91\x68\x56\x3d\xaa\x12\x34\x4e\x4e\x22\x37\x42\xd5\x40\x3a\x67\x1d\x20\x33\xbe\x1c\x68\x9a\x6e\xe0\x4f\xc8\x72\x55\xdb\x2c\x89\x7b\x8b\x2e\xd3\xef\x91\x4a\x3d\xd7\x0b\xb2\x24\x57\xe2\x98\x7e\xd4\x86\x49\x1f\xc3\xa6\x3d\xdf\x65\xf5\x1c\xa2\x99\x1e\x0c\xfc\xd9\xab\xda\xed\x9a\x0b\x2e\x2b\x6a\xcd\x14\xe3\x69\x01\xff\x5e\xf3\x94\x77\xba\xdd\xf4\xff\xd0\x07\x31\x7b\xbe\xa5\x18\x71\x35\xb2\x73\x06\x1a\xd6\x82\x1e\x08\xe3\xe1\x2a\xcd\x62\x2c\x46\xf9\x14\x88\xf7\x76\xf7\xee\xe4\xc6\x51\x53\x54\x6c\xc2\x10\x2c\xeb\xb0\x77\xfa\x25\x68\x94\xd3\xd1\x4a\x67\xe9\xb9\x42\x29\x21\x19\x4c\xc5\x54\x74\x2d\x7f\x1a\x97\xeb\xef\x48\xab\xbc\x0e\x34\xda\xd9\x4c\x86\xe7\xb2\x1b\x75\xe7\xbc\xa6\x07\x5a\x5e\xfe\x47\x59\x63\xbc\x7c\x78\xb6\xd7\xf1\xe4\xaa\x65\x9d\xfc\x5f\x9b\xec\x48\xdc\xf4\xcf\xc5\x66\x8e\x36\xac\x71\x5e\xec\x16\x15\x2a\x45\x41\x48\xdf\x1d\x3f\xbe\x26\x93\x83\x77\x57\xfb\xb9\xb7\x52\xe0\xeb\xb7\xf4\xdc\x12\xcf\xa4\x9f\xfa\xe2\x26\xe1\x9f\x00\x00\x00\xff\xff\x8b\x40\xfd\xc2\x9f\x0a\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\xc1\x8e\x1b\x37\x0c\xbd\xcf\x57\x10\xe9\x21\x97\xce\x38\x41\x2e\xc5\xdc\xd2\x6d\x0e\x8b\x76\x83\x20\x1b\xec\xa5\xe8\x81\x23\xd1\x36\xbb\x1a\x69\x4a\x52\x4e\xb6\x5f\x5f\x48\xe3\xf1\xda\x5e\xef\x16\x05\xda\x5b\xe7\x64\x51\xe4\x23\xf9\x1e\x25\xab\x69\xdb\xb6\xc1\x89\xef\x48\x94\x53\xec\x01\x27\xa6\x6f\x46\xb1\xac\xb4\xbb\xff\x41\x3b\x4e\xab\xdd\xdb\x81\x0c\xdf\x36\xf7\x1c\x7d\x0f\x57\x59\x2d\x8d\x9f\x49\x53\x16\x47\x3f\xd1\x9a\x23\x1b\xa7\xd8\x8c\x64\xe8\xd1\xb0\x6f\x00\x30\xc6\x64\x58\xcc\x5a\x96\x00\x2e\x45\x93\x14\x02\x49\xbb\xa1\xd8\xdd\xe7\x81\x86\xcc\xc1\x93\xd4\x0c\x4b\xfe\xdd\x9b\xee\x5d\xf7\xa6\x01\x70\x42\x35\xfc\x0b\x8f\xa4\x86\xe3\xd4\x43\xcc\x21\x34\x00\x11\x47\xea\x61\x40\xa1\x92\x30\x8c\xe8\xb6\x1c\x49\x3b\x17\xb2\x1a\x49\xf7\x95\x70\x47\xdd\xd7\x24\xf7\xda\x00\x04\x1c\x28\x2c\x35\xec\x3d\xbe\xb5\x87\xc6\x30\x4c\x5b\x7c\xd7\xc3\xf2\xab\xd1\x89\x5c\xf1\xde\x48\xca\x53\x0f\x97\x41\x4b\x09\x7b\xcc\x99\x93\x1f\x51\xe8\xa6\x54\x73\x33\x57\x53\xb7\x02\xab\xfd\x7c\x71\xfb\x17\x56\xab\x2e\x53\xc8\x82\xe1\x42\x37\x75\x57\x39\x6e\x72\x40\x79\xba\xdf\x00\xa8\x4b\x13\xf5\xf0\xb1\x94\x32\xa1\x23\xdf\x00\xec\x30\xb0\xaf\xb4\xcd\xc5\xa5\x89\xe2\xfb\x4f\xd7\x77\xef\x6e\xdd\x96\x46\x9c\x8d\x00\x93\xa4\x89\xc4\x78\xe9\xa1\x7c\x47\x43\x70\xb0\x01\x78\x52\x27\x3c\x55\x44\x78\x5d\xa0\x66\x1f\xf0\x45\x76\x52\xb0\x2d\xc1\x5e\x3c\xf2\xa0\x35\x0d\xa4\x35\xd8\x96\x15\x84\x26\x21\xa5\x38\x0f\xc2\x11\x2c\x14\x17\x8c\x90\x86\xdf\xc9\x59\x07\xb7\x24\x05\x04\x74\x9b\x72\xf0\x65\x56\x76\x24\x06\x42\x2e\x6d\x22\xff\x79\x40\x56\xb0\x54\x53\x06\x34\xda\x53\xb8\x7c\x1c\x8d\x24\x62\x28\x24\x64\xfa\x1e\x30\x7a\x18\xf1\x01\x84\x4a\x0e\xc8\xf1\x08\xad\xba\x68\x07\x37\x49\x08\x38\xae\x53\x0f\x5b\xb3\x49\xfb\xd5\x6a\xc3\xb6\x8c\xbd\x4b\xe3\x98\x23\xdb\xc3\xaa\x0e\x2f\x0f\xd9\x92\xe8\xca\xd3\x8e\xc2\x4a\x79\xd3\xa2\xb8\x2d\x1b\x39\xcb\x42\x2b\x9c\xb8\xad\x85\xc7\x3a\xf5\xdd\xe8\xbf\x93\xfd\x19\xd1\xd7\x47\x95\xda\x43\x91\x4d\x4d\x38\x6e\x0e\xe6\x3a\x45\xcf\xf2\x5e\x86\x08\x58\x01\xf7\x61\x73\xfd\x8f\xf4\x16\x53\x61\xe5\xf3\x87\xdb\x2f\xb0\x24\xad\x12\x9c\x72\x5e\xd9\x7e\x0c\xd3\x47\xe2\x0b\x51\x1c\xd7\x24\xb3\x70\x6b\x49\x63\x45\xa4\xe8\xa7\xc4\xd1\xea\xc2\x05\xa6\x78\x4a\xba\xe6\x61\x64\x2b\x4a\xff\x91\x49\xad\xe8\xd3\xc1\x55\x3d\xfc\x30\x10\xe4\xc9\xa3\x91\xef\xe0\x3a\xc2\x15\x8e\x14\xae\x50\xe9\x3f\xa7\xbd\x30\xac\x6d\xa1\xf4\xef\x89\x3f\xbe\xb3\x4e\x1d\x67\xb6\x0e\xe6\xe5\x5e\x58\xbe\x4b\x67\xa8\x9e\x23\xef\x85\xf4\xcc\xf8\x4c\xf2\x8a\x93\xc4\x2e\x3b\x97\x81\xde\x90\x9c\x7a\x0b\xef\xd0\xe8\x3c\xe0\x64\x5c\x3e\x44\xff\xa9\x6a\x56\xaf\xb0\xf9\x88\x7a\x32\xe4\x30\xeb\xc4\x42\xbe\x9c\xa3\x72\xad\x0e\x81\x75\x0b\x58\x4e\x5c\x24\x57\xe2\xbb\x33\xe8\xe7\xfa\x7c\xa1\xd7\x17\xfb\x7d\xae\xe7\x97\xfb\x86\x43\xe5\xe7\x71\xed\x52\xc5\x13\x7b\xc9\x72\x91\xd8\x33\x65\xe1\x91\xd7\xf7\xff\x54\xbc\x39\xec\xba\x5c\x3d\x6b\x74\x4f\x74\x79\x3e\x30\x0f\x81\xdd\xff\x32\x1e\xbe\x7f\x43\xc6\x4b\xd8\x97\x70\x2f\x84\x9f\x99\x1e\x9f\x23\xcb\xb3\xe0\x60\xab\x34\xb5\xfb\x47\xc8\xd1\x36\x80\x96\xbb\xd4\xf7\x60\x92\xe7\xff\x7f\xb5\x24\xb8\xa1\xbd\x45\x0d\x2d\xd7\x68\x74\x8e\x26\x23\xff\xf1\xfc\x15\xf1\xea\xd5\xc9\xa3\xa0\x2e\x5d\x8a\x9e\xe7\x77\x14\xfc\xfa\x5b\x33\xa3\x92\xbf\x5b\xaa\x29\xc6\xbf\x02\x00\x00\xff\xff\x48\x89\x29\x52\xc6\x09\x00\x00"), }, - "/cluster_v1alpha1_machineclass.yaml": &vfsgen۰CompressedFileInfo{ - name: "cluster_v1alpha1_machineclass.yaml", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), - uncompressedSize: 667, + "/cluster.x-k8s.io_clusters.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.x-k8s.io_clusters.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + uncompressedSize: 11151, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x52\xb1\x8e\x14\x31\x0c\xed\xf3\x15\xd6\xf6\x37\x30\xa2\x41\xe9\xd0\xd1\x50\x70\x42\x1c\xba\x06\x51\x78\x13\x73\x1b\x2e\x13\x07\xdb\x19\xc1\xdf\xa3\xcc\xcc\x8e\x76\xb7\xe0\xd2\xf9\xe5\xe5\xbd\xbc\x27\x63\x4d\x4f\x24\x9a\xb8\x78\xc0\x9a\xe8\x8f\x51\xe9\x93\x0e\x2f\xef\x75\x48\xfc\x66\x1e\x8f\x64\x38\xba\x97\x54\xa2\x87\xfb\xa6\xc6\xd3\x57\x52\x6e\x12\xe8\x23\xfd\x4c\x25\x59\xe2\xe2\x26\x32\x8c\x68\xe8\x1d\x40\x10\xc2\x0e\x7e\x4b\x13\xa9\xe1\x54\x3d\x94\x96\xb3\x03\xc8\x78\xa4\xac\x9d\x03\x10\xb8\x98\x70\xce\x24\x77\xc6\x9c\xcf\x86\x1e\x0e\xe3\xf0\xf6\xe0\x00\x0a\x4e\xe4\x61\xc2\x70\x4a\x85\x42\x46\x55\xd2\x21\xe4\xa6\x46\xb2\x91\x9d\x56\x0a\x5d\xee\x59\xb8\x55\x0f\x37\xb7\xab\xc6\xe6\xb7\x06\xf8\xbc\xca\xdd\x77\xb9\x05\xae\xb9\x09\xe6\x5b\x1f\x07\xa0\x81\x2b\x79\x78\xe8\x0a\x15\x03\x45\x07\x30\x63\x4e\x71\xc9\xb6\x6a\x72\xa5\xf2\xe1\xcb\xa7\xa7\x77\x8f\xe1\x44\x13\xae\x20\x40\x15\xae\x24\x96\xce\xd6\xfd\x5c\x14\xbd\x63\x00\xf6\xb7\x7b\xa8\x49\x2a\xcf\x3b\xbc\xfc\xf4\x35\xd2\x65\xe1\xd7\x44\x3e\xfe\xa2\x60\x3b\x5c\x85\xe7\x14\x49\x1e\xb7\xaa\xfe\x43\x16\xfa\xdd\x92\xd0\x6e\x7e\x77\xf5\xb8\xe7\x3f\xaf\xca\x3c\x62\xae\x27\x1c\x9d\x1a\x5a\x5b\x62\x62\x08\x54\x8d\xe2\xc3\x6d\xe5\x87\xc3\x55\xd1\xcb\x18\xb8\xc4\x65\x71\xd4\xc3\xf7\x1f\xbd\x6d\x63\xa1\xb8\x35\xb4\x82\xff\x02\x00\x00\xff\xff\x7d\x29\x91\x1c\x9b\x02\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\x1b\xb7\x11\x7f\xe7\xa7\xd8\x71\x1e\xdc\xcc\x98\xc7\xc4\xce\x74\x3a\x7c\x73\xa5\xa4\xa3\xb6\xb1\x39\x92\xea\x17\x8f\x1f\x96\x87\x3d\x1e\x2a\x1c\x70\x05\x70\xa4\x99\x4c\xbe\x7b\x67\x01\x1c\x79\x24\x71\x14\xe5\x8c\xd3\x3e\xe8\x5e\x24\xe2\xcf\x62\x77\xb1\x7f\x7e\x0b\x60\x32\x9d\x4e\x27\xd8\xca\x0f\x64\x9d\x34\x7a\x0e\xd8\x4a\xfa\xec\x49\xf3\x2f\x57\x3c\xfc\xc5\x15\xd2\xcc\xd6\xdf\x2f\xc9\xe3\xf7\x93\x07\xa9\xc5\x1c\xae\x3a\xe7\x4d\x73\x4b\xce\x74\xb6\xa4\x6b\xaa\xa4\x96\x5e\x1a\x3d\x69\xc8\xa3\x40\x8f\xf3\x09\x00\x6a\x6d\x3c\x72\xb3\xe3\x9f\x00\xa5\xd1\xde\x1a\xa5\xc8\x4e\x57\xa4\x8b\x87\x6e\x49\xcb\x4e\x2a\x41\x36\xac\xd0\xaf\xbf\xfe\xae\x78\x53\x7c\x37\x01\x28\x2d\x85\xe9\xf7\xb2\x21\xe7\xb1\x69\xe7\xa0\x3b\xa5\x26\x00\x1a\x1b\x9a\x43\xa9\x3a\xe7\xc9\xba\x22\xfd\x53\x7c\x9e\x46\x6e\x27\xae\xa5\x32\xb0\x20\x44\xe0\x0b\xd5\xc2\x4a\xed\xc9\x5e\x19\xd5\x35\x91\x9f\x29\xfc\xfd\xee\xfd\xbb\x05\xfa\x7a\x0e\x85\xf3\xe8\x3b\x57\xb4\x35\x3a\x0a\xbc\x0a\x72\xa5\x95\xad\x0f\x1c\x5d\x45\xfa\x10\x47\x81\xeb\xca\x1a\xd0\xc1\x82\xb4\x90\x7a\x35\x5b\x58\xb3\x96\xcc\xfb\xc1\x0f\x12\xb3\x6b\x52\xe4\xb9\xf1\x27\x94\x8a\x44\x20\x1c\x59\x5f\xec\x16\xf2\xdb\x96\xe6\xe0\xbc\x95\x7a\x35\x01\x58\x59\xd3\xb5\x3b\xd1\xf6\x12\xc5\x89\xbd\x22\xd1\xd3\xca\x58\xd9\xff\x9e\xf6\xe3\xa7\xd8\xca\xd0\x92\xb6\x29\xb6\x86\x16\x25\x9d\xff\xc7\xb0\xf5\x9f\xd2\xf9\xd0\xd3\xaa\xce\xa2\xda\xab\x33\x34\xba\xda\x58\xff\x6e\xbf\x24\x2f\x11\x3b\xa4\x5e\x75\x0a\xed\x6e\xfc\x04\xc0\x95\x86\x85\x08\xc3\x5b\x2c\x83\xa4\xae\x5b\xda\x64\x1f\x89\x44\xd4\xde\x1c\x7e\xfd\x6d\x02\xb0\x46\x25\x45\xd8\xdd\xd8\x69\x5a\xd2\x6f\x17\x37\x1f\xde\xdc\x95\x35\x35\x18\x1b\x47\xb6\x41\x3a\xf0\x35\x41\x1c\x09\x95\xb1\xe1\x67\xcf\x3e\xbc\x5d\xdc\xa4\xd9\xad\x35\x2d\x59\xbf\xd3\x13\x7f\x03\x4b\xdf\xb5\x1d\xad\xf3\x92\x19\x89\x63\x40\xb0\x6d\x53\x5c\x30\x59\x28\x09\x70\x71\x69\x53\x81\xaf\xa5\x03\x4b\xad\x25\x47\x3a\x5a\xfb\x80\x2c\xf0\x10\xd4\x60\x96\xff\xa6\xd2\x17\x70\x47\x96\x89\xb0\x76\x3b\x25\xd8\x21\xd6\x64\x3d\x58\x2a\xcd\x4a\xcb\x5f\x76\x94\x1d\x78\x13\x96\x54\xe8\x29\x6d\x53\xff\x05\x3b\xd6\xa8\x58\x85\x1d\xbd\x02\xd4\x02\x1a\xdc\x82\x25\x5e\x03\x3a\x3d\xa0\x16\x86\xb8\x02\x7e\x36\x96\x40\xea\xca\xcc\xa1\xf6\xbe\x75\xf3\xd9\x6c\x25\x7d\xef\xdb\xa5\x69\x9a\x4e\x4b\xbf\x9d\x05\x0f\x95\xcb\xce\x1b\xeb\x66\x82\xd6\xa4\x66\x4e\xae\xa6\x68\xcb\x5a\x7a\x2a\x7d\x67\x69\x86\xad\x9c\x06\xc6\x75\x70\xed\xa2\x11\xdf\xec\x36\xfa\xe5\x80\xd3\x23\xc3\x8e\x5f\xb0\xcb\x51\xbd\xb3\x7d\xf2\xee\x62\x9a\x16\xf9\xdf\xab\x97\x9b\x58\x2b\xb7\x3f\xde\xdd\x43\xbf\x68\xd8\x82\x43\x9d\x07\x6d\xef\xa7\xb9\xbd\xe2\x59\x51\x52\x57\x64\xe3\xc6\x55\xd6\x34\x81\x22\x69\xd1\x1a\xa9\x7d\xb2\x24\x49\xfa\x50\xe9\xae\x5b\x36\xd2\xf3\x4e\xff\xa7\x23\xe7\x79\x7f\x0a\xb8\x0a\x11\x0e\x96\x04\x5d\x2b\xd0\x93\x28\xe0\x46\xc3\x15\x36\xa4\xae\xd0\xd1\x57\x57\x3b\x6b\xd8\x4d\x59\xa5\x8f\x2b\x7e\x18\x98\x0f\x07\x46\x6d\xed\x9a\xfb\xd0\x99\xdd\xa1\xe4\x81\x77\x2d\x95\x07\x9e\x21\xc8\x49\xcb\xd6\xeb\xd1\x13\xdb\xfc\x30\xf2\x8c\xfb\x22\x7f\xc9\x6d\xdf\x91\xdf\x18\xfb\x70\xd8\x37\xe2\xff\x3a\x8e\x65\xf7\xa9\xe4\xaa\xb3\xc1\xeb\x8a\xa3\x99\x63\xeb\x41\x8c\x01\xd1\x20\x16\xc6\xfa\xd3\xee\xa3\x65\xdf\x2e\x6e\xf6\xa3\x83\x7e\x64\x25\x93\xe0\x2d\x37\xf1\x3f\x6f\x17\x37\xc9\xc8\x92\x73\x67\xa8\x02\x2c\xd9\xc0\xd9\x74\xae\xa9\xc2\x4e\x05\x3b\x82\x3f\xff\xf0\xc3\x9b\x63\xee\xf9\xab\x8c\x6d\xd0\xcf\xd9\xe1\xdf\xbc\xce\xf4\xc7\xed\xe3\x70\xb0\x3a\xd0\x74\x92\xdf\x88\x8c\xe4\x47\xa2\xdd\xd7\xb4\xd3\xa6\x45\xbd\xa2\xe4\x12\x9b\x5a\x96\x35\x2c\x8c\xe8\x7b\x1d\xa0\x25\x40\xa5\x4c\x19\x0c\x3d\x43\xf8\x9c\xc2\xf9\x2b\xa5\xb0\x7f\x55\xa6\x7c\x18\xe9\x07\x90\x9e\x9a\xd1\xce\x11\xbb\xce\x0d\x41\x6b\x71\x9b\x19\xc1\xce\xcb\x66\x9a\x5b\x62\x3a\xe0\x6f\x54\xd7\x47\xae\xd2\x7f\x8e\xec\x5a\x96\x74\x6d\x1a\x94\xfa\x51\x9d\xc7\x61\x21\x9d\x87\xdc\x95\x66\xbb\x9c\x4e\xcf\x8a\xdc\x4f\xfc\x9d\xbb\x9c\xc8\xc0\x87\x9b\xc5\xf3\x2e\x8f\xee\xf2\x68\x57\x02\xb5\x0b\x85\x9a\x7e\x4c\x59\xe4\x7c\x14\xcb\x4c\x18\xe4\xaa\xc3\x74\xd4\x39\xe2\x80\x01\x29\x57\xf0\xb6\x9c\xf0\xbd\x91\xbe\x8e\x79\x2b\x52\x86\x96\x49\x3f\x25\x1e\xd6\xc6\x3d\x1e\x06\xd9\x8a\x78\x60\x30\x5c\xa3\x93\xf5\xf4\xb1\xcf\xc5\xd8\x27\x5d\xb4\x27\xbd\x7a\xb2\x39\xb7\x97\xc4\xe2\xfb\x3e\xe6\x7e\x19\x03\xbf\x27\xa4\x8e\xd9\xd5\x34\x68\xe5\xa4\x91\xb9\xfc\x12\x1b\xba\xa5\xea\x62\xf3\xb9\xa5\x2a\xc0\x25\x0d\xa6\x8d\x65\x0e\x58\xaa\xc8\x92\x66\x58\x64\x00\x79\xd7\xd7\x52\x90\x9d\xa6\xb4\x55\x9e\x08\x3d\x80\x51\xe8\xa1\x36\x4a\xf4\x29\xdd\xa3\x54\x2e\x84\xa8\x76\x50\xe0\x84\xce\xc4\x04\x04\x2e\x4e\x48\xf2\x14\xec\xb3\xf5\x13\xf3\x72\x06\x9b\x67\xd5\xc0\x5b\x9e\xf0\x78\x84\xe1\xd4\x8b\xee\x9f\x6c\x79\x95\x24\x25\x42\x21\xf8\xd8\xaa\x2f\x6f\xaa\xb8\x4c\x40\xa7\x51\xc3\x92\x4a\x3a\x80\xf9\x20\xb5\xf3\x84\x22\x36\x66\x63\x18\x83\x38\x4b\x69\xfc\xab\x88\x45\x13\xe4\xdd\x97\x06\x9e\xd3\x04\xc6\x4a\x29\xd4\xaa\xb3\xbf\x99\xc8\x6b\x96\x26\x96\x25\x39\x17\x21\x58\x43\xda\xbf\xda\xd5\xa9\x09\x9d\xdd\x71\x4f\xd1\xa0\x96\x15\x39\x5f\xa4\x15\xc8\xba\x8f\xaf\x3f\xe5\x74\x06\xf0\x93\xb1\x40\x9f\xb1\x69\x15\xbd\x02\x19\xb5\xbc\x03\xd7\xbd\x9d\x49\x17\x15\xb1\xa3\x17\x02\x92\xcc\x0b\x8e\x8c\x4b\x92\xc0\x9b\x20\xa8\xc7\x87\x10\x4e\x30\x81\x7d\x25\x1f\x68\x0e\x2f\xd8\x5e\x07\x2c\xfe\xca\x51\xe7\xb7\x17\x59\x9a\x7f\xda\xd4\x64\x09\x5e\xf0\x90\x17\x91\xb1\x5d\xfd\x14\x83\x55\xb5\x0b\x8f\x91\xc1\x60\xea\xde\xca\xd5\x8a\x2c\xe5\xb5\x19\xa2\x30\x83\xed\x6f\xc1\x58\x96\x5d\x9b\x01\x81\x40\x96\xf7\x2c\x81\x41\x71\xc2\xf0\xc7\xd7\x9f\x46\xb8\x3d\xd4\x13\x48\x2d\xe8\x33\xbc\x06\xa9\xa3\x56\x5a\x23\xbe\x2d\xe0\x3e\x58\xc4\x56\x7b\xfc\xcc\xeb\x94\xb5\x71\xa4\xc1\x68\x95\xcb\x78\xc0\xd2\xd6\xb8\x26\x70\xa6\x21\xd8\x90\x52\xd3\x88\xce\x05\x6c\x70\xcb\xf2\xf7\xdb\xc5\x16\x86\xd0\x22\x47\xd0\x61\x65\x9a\xa5\x7a\xff\xfe\xfa\xfd\x3c\x72\xc5\x26\xb4\xd2\xcc\x0a\x57\x3c\x95\xe4\x50\xc3\x85\x67\xac\xa2\xd8\x26\x83\x3a\xba\x68\x1c\x9c\xb0\x6a\x06\x1a\x59\xb2\x41\x52\x82\xaa\xe3\xba\xa6\x78\xf9\x54\x6f\x3d\x2e\x21\xfb\x2f\x53\x4a\x1e\x07\x86\xff\x51\x41\x76\x91\x58\xe1\x5c\xe8\x51\xb1\xde\x0d\xec\xf9\xac\x58\x0f\xdd\x92\xac\x26\x4f\x41\x32\x61\x4a\xc7\x42\x95\xd4\x7a\x37\x33\x6b\xce\x90\xb4\x99\x31\x22\x94\x7a\x35\x65\x43\x9c\x46\x4b\x70\xb3\x70\xce\x34\xfb\x26\xfc\xf9\x22\x29\xc2\x11\xd0\x65\xa2\x84\xa1\x7f\x84\x3c\xbc\x8e\x9b\x3d\x59\x9c\x3e\x39\x5e\x9a\x95\x5e\xde\xa5\x34\x7b\x3c\x93\x5d\xa2\xc7\x2b\xe1\xc0\x68\x1f\x3d\xb3\x3e\xd2\xa0\x88\x21\x17\xf5\xf6\xab\x9b\x2d\x2b\xb2\xb3\xcc\xcf\x76\x9a\xa0\xc8\x14\xb5\xe0\xff\x9d\x74\x9e\xdb\x9f\xac\xb9\x4e\x5e\xe0\xa4\xff\xba\xb9\xfe\x63\x8c\xb9\x93\x4f\xf6\xc8\x51\xb0\x26\x75\x65\xd1\x79\xdb\x05\x7d\x3e\x06\xd7\x6e\x8e\x47\xc7\xf3\xad\xaf\x0f\xd3\x0e\xd9\xe4\xfe\x53\xb8\xd5\x1f\xbe\x70\x48\x76\x28\xc5\x8e\x8f\x67\xd0\x96\xf9\x9e\x41\xdb\x33\x68\x7b\x06\x6d\xcf\xa0\x6d\xf0\x3d\x83\xb6\x67\xd0\xb6\xff\x9e\x41\xdb\xff\x2d\x68\x6b\xb1\x73\xa7\x47\x77\x07\x82\x2d\xc2\x10\x28\x51\x87\x1b\xbd\x74\xf0\xda\xda\x90\x50\x06\x6f\x17\xd2\xe1\x79\x6b\x0d\xa7\xee\x9c\x1a\xc3\x09\x59\x42\x56\x1c\x6f\x51\x29\x90\xde\x01\x3a\x67\x4a\x89\x9e\x44\x62\xf1\xe4\xcc\x3f\xf2\xbf\x34\x46\xd1\x01\x08\xc9\xdf\xd4\xc5\xfb\xf4\xc9\x88\x3c\xfd\x5d\x5d\x7c\xb3\x30\xbc\xad\x33\xcb\x70\x58\xfa\x65\xd7\x75\x83\xe3\xc7\x1b\x2d\xbd\x44\x25\x7f\x79\x44\xb3\x57\xf9\x39\x3b\x9e\x64\x75\x7a\x7c\x0d\x35\x9e\x3a\xd9\x92\x48\x83\xdc\x53\xb8\x54\x7d\xc7\x27\xac\x28\xb6\x4f\x38\x63\x45\xb1\x3d\xcf\x6a\x88\x0d\x28\xb6\x97\xb3\x53\xa1\x54\x9d\x4d\x37\x46\x27\x98\x7a\xf8\x6a\x65\x1c\x77\x1f\x70\xfc\xd3\x90\x60\xb8\x9e\x3d\x7d\x24\xd1\x9b\x24\xa3\xf0\xc4\x40\xce\xd9\x23\x4f\x05\xdc\xf8\x70\x13\xb4\x71\x07\xb6\xef\x0d\x74\x5a\x90\x75\x9e\x2d\xbb\x36\x1b\x68\x50\x6f\x7b\x7a\xfd\xec\x0c\xdd\x7d\xb1\x51\x0e\xce\xab\xd5\x16\x5c\x8b\x1a\xb0\xb4\xc6\x65\xae\xc0\xce\x5f\x37\xa1\x8f\x91\x73\xec\x32\xea\x32\x45\x0e\x37\xeb\xcc\xbd\xd3\x61\x25\xb3\x5b\x39\xd6\x73\x95\xa5\x50\x63\x35\xd0\x60\x1b\x50\xda\x7e\x00\xea\xa3\x62\x6c\x84\x83\xbe\xf8\x82\x46\xae\xea\x70\xf5\xc3\x28\x36\x5d\x3b\xe4\xc1\xde\xd9\x6b\xc9\x43\xab\xcf\xcb\x3d\x6a\xf6\x5c\x58\x92\x6d\xf6\x46\xcf\x90\xf1\x60\x93\xc7\xb2\x20\x80\xeb\xa4\xc7\xa5\x8a\xd7\x9b\x2c\xc6\x72\x7b\xe4\x31\x0d\x96\x35\x93\x3e\x27\x55\xce\x6f\x1e\x91\x79\xdc\x25\xd2\x36\x39\x25\x23\x74\x39\x12\x25\x85\x63\x06\xef\x65\xa6\xb6\xd8\x3d\x13\x39\x2a\xaa\xc7\xca\xe5\x51\x16\xd3\xb2\x3f\x93\x73\xb8\x3a\xd9\x92\x1c\xfb\x69\x28\x57\x1c\xe1\xf6\xcf\xa5\x3a\x28\x54\x4f\xd1\xf4\xd0\xa3\x62\x56\x96\x8a\x9a\x0c\x18\xe2\xa4\x2b\x55\x7f\x73\x13\x42\x7e\x7c\x34\xb4\x91\x4a\x71\xaa\x73\xe4\x63\x31\xb8\x5b\x7f\x4d\x40\xd6\x1a\x0b\x4d\x5c\x3d\x2f\x5f\xc6\x57\x92\x7c\xb7\x84\xee\x14\x78\xe5\xc4\x8b\x23\x2f\x95\x6e\x28\x4d\x36\xeb\x9e\x93\xce\x9b\x07\xd2\xa9\x5e\x3d\xb0\xd0\xd6\x9a\x95\xc5\xa6\x41\x9f\x39\x77\x09\xaf\xad\x5a\x4b\x3e\xfb\xc8\x64\x54\x11\xc7\x87\x44\x8f\x65\x9c\xe3\x63\x22\xce\x39\x29\x82\xef\x92\xf4\xa9\x01\xe6\xc2\xe5\x19\x83\xcc\x79\x54\x78\xf1\x78\x1e\x17\xf1\x88\xe3\x0b\xea\x08\x3d\x7d\x9c\xce\xcc\xf5\xc1\x1d\x4b\xdf\x65\x55\x05\xf0\x63\xb1\x2a\xfa\x37\x93\xaf\xe0\xb6\xd3\x3a\xfc\x73\x1f\xc2\x0c\xfa\xf0\x23\x3e\x94\x04\xf2\xe5\x85\xaa\xce\xb8\xda\x51\xd3\xfe\x5d\xe9\xf7\xa8\xda\x1a\xdf\xec\xdb\xd2\x3b\xd0\xf8\x24\x73\xd0\x1d\xdf\x56\x90\x98\x83\xb7\x5d\xd4\xb2\xf3\xc6\xb2\xcb\xc6\x96\x3d\xf4\xc2\x92\x11\x2d\x89\xc1\x53\xc9\xf8\xf6\xf2\x45\x3c\x49\xe8\x1f\x57\x86\x9f\xa5\xd1\x31\x21\xb9\x39\x7c\xfc\x34\x89\x54\x49\x7c\xe8\xb9\xe1\xc6\xff\x06\x00\x00\xff\xff\x1d\xe7\x0a\x25\x8f\x2b\x00\x00"), }, - "/cluster_v1alpha1_machinedeployment.yaml": &vfsgen۰CompressedFileInfo{ - name: "cluster_v1alpha1_machinedeployment.yaml", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), - uncompressedSize: 3749, + "/cluster.x-k8s.io_machinedeployments.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.x-k8s.io_machinedeployments.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + uncompressedSize: 27896, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x4b\x8f\xd3\x30\x10\xbe\xe7\x57\x58\xbd\xb7\x50\x16\x21\x94\x1b\xda\x15\x0f\x09\x96\x55\xcb\xee\x05\x71\x98\xd8\xd3\xd4\xac\x63\x1b\x7b\x12\x6d\x85\xf8\xef\xc8\x79\xd1\x64\x93\x26\x8b\x8a\xf0\xa9\x99\xf9\xfc\xcd\xb3\xf6\x18\xac\xbc\x43\xe7\xa5\xd1\x31\x03\x2b\xf1\x81\x50\x87\x2f\xbf\xba\x7f\xed\x57\xd2\x3c\x2b\xd6\x09\x12\xac\xa3\x7b\xa9\x45\xcc\x2e\x73\x4f\x26\xdb\xa0\x37\xb9\xe3\x78\x85\x3b\xa9\x25\x49\xa3\xa3\x0c\x09\x04\x10\xc4\x11\x63\xdc\x21\x04\xe1\x17\x99\xa1\x27\xc8\x6c\xcc\x74\xae\x54\xc4\x98\x82\x04\x95\x0f\x18\xc6\xb8\xd1\xe4\x8c\x52\xe8\x96\x64\x8c\x6a\x0c\xc6\x6c\xb1\x5e\x3d\x5f\x44\x8c\x69\xc8\x30\x66\x19\xf0\xbd\xd4\x28\xd0\x2a\x73\xc8\x50\x93\x5f\x71\x95\x7b\x42\x57\x6f\x88\xbc\x45\x1e\x28\x53\x67\x72\x1b\xb3\x9e\xb6\xe2\xa9\x6d\x56\x41\x7c\xaa\x28\xaf\x5a\xca\x52\x67\x55\xee\x40\x0d\x19\x8c\x18\xf3\xdc\x58\x8c\xd9\x75\xa0\xb2\xc0\x51\x04\x59\x9e\xb8\x3a\x11\x35\xbd\xe7\xa0\xb0\xfa\x59\xc7\xba\x45\x85\x9c\x8c\xbb\x01\xda\xc7\x6c\xe5\x09\x28\xf7\xab\x8e\xaa\x86\x87\x28\x36\x68\x95\xe4\xe0\x1b\xb4\x45\xbe\x72\xb5\xac\x81\x95\x0c\x7d\x60\x45\xdb\x81\x56\xb2\x98\xfd\xfc\x15\x31\x56\x80\x92\xa2\xac\x49\xe5\x9d\xb1\xa8\xdf\xdc\x7c\xb8\xbb\xd8\xf2\x3d\x66\xd0\xb8\x6c\x9d\xb1\xe8\x48\x36\xf1\x84\x75\xd4\x20\xad\x8c\x31\x3a\x84\x74\x78\x72\x52\xa7\xad\xb8\xcc\xee\x14\xe8\xb8\x51\xba\x40\x93\x7c\x47\x4e\xad\xb8\x29\x6b\xb3\x86\x9c\x2b\x09\xa5\xde\x20\x88\xc3\x16\xb9\xd1\xa2\xa7\x64\x6c\x67\x5c\x06\x14\x33\xa9\xe9\xe2\x45\x4f\x57\xd9\x95\x9a\x30\x45\xd7\xd1\x59\xc8\x3d\x8a\x3e\x57\x85\x4f\x8c\x51\x08\xba\x8b\x77\x26\x75\xe8\xfd\x15\x82\x50\x52\xe3\x59\x9d\x69\xea\x7a\x2e\xb6\x42\x86\x72\xbe\x97\x9e\x8c\x3b\x7c\x94\x99\xa4\xf3\x30\xfb\xba\xa3\x87\xd3\xd6\x2b\x6f\xb9\x81\x1c\x10\xa6\x87\xfe\x86\xb1\x52\x97\xee\x1b\xa5\xa4\x4e\x6f\xad\x00\xc2\xc7\xea\xd3\x9b\xc3\xca\xe0\x61\x9b\xbb\x74\x70\x6f\x58\x46\xe3\xe7\xdd\x98\x72\x39\xdc\xd4\xc3\xa0\xa1\x1c\x1d\x79\x71\xab\xa1\x00\xa9\x20\x51\xff\xd5\x97\xd1\xea\xb4\xca\xd1\x4d\x83\x96\x47\xf9\x08\x33\xab\x06\x8a\x76\xaa\x60\x43\xa7\xc5\x2c\xc7\xfb\xa7\xc7\x1c\x63\xac\xba\x95\x76\x32\xdd\x96\xa7\xfa\x58\xe2\x4f\x1a\x9e\xf2\x7a\x16\x81\x75\xa6\x90\x02\xdd\x76\x24\x8a\x39\x91\x84\x55\x80\xca\x47\xc3\x98\xe5\x49\xcb\xf2\xd6\x99\xec\x14\xd3\x1c\x77\x58\xd9\xf8\xe5\xf5\x7a\xa9\xc0\x4f\x20\xe7\x73\xb2\xa3\x94\x4d\x23\x4f\x76\xef\x30\x74\x22\x41\xb3\x60\x93\x10\x02\xa9\x69\x34\x52\x49\x98\x9d\x48\xc3\x6c\x07\xc0\x39\x38\x0c\x22\x8a\xea\x9a\x1f\x35\x32\xa7\x1a\xf5\x50\x77\xa3\x40\xcf\xe8\xbb\x89\x0a\xdc\xe7\x09\x2a\x7c\x74\x39\x3d\x91\xc7\xe1\x8f\x5c\xba\xc7\x97\x79\xb3\x96\x8d\x9d\xbf\xab\xdb\x29\xfa\x65\xe7\x8f\xfc\xb4\x23\x6c\x44\x35\x64\x6e\xd9\xde\xbc\x1d\x61\x73\xde\x4e\x0e\x5a\xd5\xa4\x38\x63\xd4\x6a\xef\xab\xcd\x59\x27\x12\x93\x78\x74\x05\x8a\x77\xa8\xd1\x1d\x4d\xa9\x83\xbc\xaf\x5e\x3e\x61\xd2\x01\x71\x38\xaf\xab\xe7\x1d\xc5\x72\xfd\x8f\x32\x9a\x97\xd3\x91\x38\x27\x69\xaf\x75\x8a\xe6\xd1\x58\xac\x41\xd9\x3d\xac\xa3\x3f\x6d\x04\x9c\xa3\x25\x14\xd7\xfd\x87\xd7\x62\xd1\x79\x69\x95\x9f\x61\x4e\x2e\x9f\x90\x3e\x66\x5f\xbf\x85\x67\x15\x19\x87\xe2\xae\x39\x8c\x82\xf0\x77\x00\x00\x00\xff\xff\xa6\xa2\xeb\xe1\xa5\x0e\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x6d\x6f\xdc\x38\x92\xf0\xf7\xfc\x8a\x82\x17\x83\x24\x40\x77\xdb\xc9\xec\xdb\x63\xe0\xf9\xe0\x8d\x67\xf6\x7c\x9b\x71\x82\x38\x33\x87\xc3\xce\xe2\xc0\x96\xaa\xbb\x79\x96\x48\x2d\x49\xd9\xee\x59\x2c\x70\x7f\xe3\xfe\xde\xfd\x92\x03\xab\x48\xbd\x74\x4b\x94\xec\x71\xf6\x76\xf4\x25\x71\x4b\x2a\x16\x8b\xf5\x5e\x45\xea\xc5\x72\xb9\x7c\x21\x2a\xf9\x03\x1a\x2b\xb5\x3a\x07\x51\x49\x7c\x70\xa8\xfc\x5f\x76\x75\xfb\x7b\xbb\x92\xfa\xf4\xee\xcd\x1a\x9d\x78\xf3\xe2\x56\xaa\xfc\x1c\xde\xd5\xd6\xe9\xf2\x13\x5a\x5d\x9b\x0c\x2f\x71\x23\x95\x74\x52\xab\x17\x25\x3a\x91\x0b\x27\xce\x5f\x00\x08\xa5\xb4\x13\xfe\x67\xeb\xff\x04\xc8\xb4\x72\x46\x17\x05\x9a\xe5\x16\xd5\xea\xb6\x5e\xe3\xba\x96\x45\x8e\x86\x46\x88\xe3\xdf\x9d\xad\xbe\x5e\x9d\xbd\x00\xc8\x0c\xd2\xeb\x9f\x65\x89\xd6\x89\xb2\x3a\x07\x55\x17\xc5\x0b\x00\x25\x4a\x3c\x87\x52\x64\x3b\xa9\x30\xc7\xaa\xd0\xfb\x12\x95\xb3\xab\xac\xa8\xad\x43\xb3\x7a\x58\x32\xde\x2f\x6c\x85\x19\x21\x93\xe7\x84\xa1\x28\x3e\x1a\xa9\x1c\x9a\x77\xba\xa8\x4b\xc6\x6c\x09\xff\x7a\xf3\xe1\xfa\xa3\x70\xbb\x73\x58\x59\x27\x5c\x6d\x57\xd5\x4e\x58\x24\xac\x73\xb4\x99\x91\x95\x23\xdc\xbe\xe3\x21\x2f\x9b\x21\x81\x9f\x07\x5b\x67\x3b\x10\x16\x6e\x32\x51\x48\xb5\xfd\xbe\x3a\x0d\xff\xbb\xd4\xf7\xea\xf4\x53\xad\x94\x54\xdb\xd3\x6f\x85\x2c\x30\x3f\xfd\x5e\xdd\x2a\x7d\xaf\x08\x3c\x4f\xe5\x63\x33\x9c\xdb\x57\x78\x0e\xd6\x19\xa9\xb6\x23\xb8\x19\xac\x0a\x99\x09\x7b\x8c\xde\x67\xed\x44\x01\xaa\x2e\xd7\x68\x40\x6f\x40\x69\xb5\x74\x68\x4a\xa9\x84\xc3\x3c\x12\xcc\x82\x13\x66\x8b\xfe\x97\xf5\x1e\xdc\x4e\x5a\x68\x69\xd8\x41\xea\x53\x77\x1c\xc6\xcb\x93\x6e\x8b\x66\x04\x31\x71\x27\x64\x21\xd6\x05\x7e\x9a\x8d\x61\xf3\x4a\x8b\xdc\x2b\x83\x22\xdf\xc3\x46\x1b\x10\x0e\x0a\x14\xd6\x41\x29\xd5\x27\xff\xeb\x0d\x66\x5a\xe5\xf6\x75\x07\xcb\x8b\x08\x61\x36\x9a\x04\x7f\x3e\x8a\x8c\xce\x1c\xda\xad\x7a\xc4\x13\xf9\x7e\x10\xa5\xad\xd1\x75\x75\x0e\x47\xac\xca\x6f\x46\x59\x11\x0e\xb7\xda\xc8\xf8\xf7\x32\x3e\xbf\x14\x95\xa4\x5f\x58\x12\x8f\x18\x92\xee\x15\xd2\xba\x3f\x0d\xdf\x7f\x2f\x2d\x3f\x53\x15\xb5\x11\xc5\x90\x14\xd1\x6d\xbb\xd3\xc6\x5d\xb7\x08\x2d\xa1\xcc\xf9\x86\x54\xdb\xba\x10\x66\xe0\xcd\x17\x00\x36\xd3\x7e\xb6\xf4\x62\x25\x32\xf4\xef\xd8\x7a\x6d\x82\xaa\x08\xc0\x6c\x26\x0a\xe4\xff\x02\x14\x62\x8d\xc5\x0d\x16\x98\x39\x6d\xfa\x2b\x65\xc3\xaf\xe1\x49\x2f\xcc\x71\xdd\xe2\x83\x15\x66\x7d\x81\x80\x20\x92\x87\x0f\x0e\xc8\x0e\xff\x76\x0e\x7f\xfb\xfb\x0b\x80\x3b\x51\xc8\x9c\xf4\x0d\x23\xa6\x2b\x54\x17\x1f\xaf\x7e\xf8\xfa\x26\xdb\x61\x29\x22\xb6\x13\xea\x40\x5a\x70\x3b\x04\x7e\x87\x78\xd8\xff\x79\x4c\x63\xb8\xf8\x78\x15\x20\x56\x46\x57\x68\x5c\xb3\xd4\xfe\xea\xe8\xe3\xe6\xb7\x83\xb1\x5f\x7a\xe4\xf8\x19\xc8\xbd\x06\x46\x1e\x3a\xe8\x51\xcc\xc1\x32\x12\x7a\xc3\x7c\x6a\xb0\x32\x68\x51\xb1\x4e\xee\x80\x05\x12\x44\x05\x7a\xfd\x9f\x98\xb9\x15\xdc\xa0\xf1\x40\x3c\x0b\xd4\x45\xee\xd5\xf6\x1d\x1a\x07\x06\x33\xbd\x55\xf2\xa7\x06\xb2\x05\xa7\x69\xc8\x42\x38\x0c\x5c\x15\x2f\xd2\xb1\x4a\x14\x9e\xac\x35\x2e\x40\x28\xaf\x7e\xf6\x60\xd0\x8f\x01\xb5\xea\x40\xa3\x47\xec\x0a\xbe\xd3\x06\x41\xaa\x8d\x3e\x87\x9d\x73\x95\x3d\x3f\x3d\xdd\x4a\x17\x2d\x50\xa6\xcb\xb2\x56\xd2\xed\x4f\xc9\x8e\xc8\x75\xed\xb4\xb1\xa7\x39\xde\x61\x71\x6a\xe5\x76\x29\x4c\xb6\x93\x0e\x33\x57\x1b\x3c\x15\x95\x5c\x12\xe2\x8a\x0c\xd0\xaa\xcc\x7f\xd5\xf0\xe0\xcb\x0e\xa6\x07\xea\x96\x2f\x12\xad\x51\xba\x7b\xc1\xf2\xeb\x2c\xc2\x6b\x8c\x7f\x4b\x5e\xff\x93\xa7\xca\xa7\x6f\x6e\x3e\x43\x1c\x94\x96\xa0\x4f\x73\xa2\x76\xfb\x9a\x6d\x09\xef\x09\x25\xd5\x06\x0d\x2f\xdc\xc6\xe8\x92\x20\xa2\xca\x2b\x2d\x95\xa3\x3f\xb2\x42\x46\x71\x8f\x97\xad\xd7\xa5\x74\x7e\xa5\xff\x5a\xa3\x75\x7e\x7d\x56\xf0\x8e\xec\x30\xac\x11\xea\x2a\xf7\x66\x60\x05\x57\x0a\xde\x89\x12\x8b\x77\xc2\xe2\x17\x27\xbb\xa7\xb0\x5d\x7a\x92\x4e\x13\xbe\xeb\x3e\xf4\x1f\x64\x6a\x35\x3f\x47\xb3\x3e\xb8\x42\x47\x52\x79\x53\x61\xd6\x93\x91\x1c\xad\x34\x9e\x8f\x9d\x70\xe8\xb9\x7f\x58\x8d\x8e\xcb\xa7\xbf\x82\x42\xf6\xaa\xae\x7f\xe3\x00\x9d\x77\xed\x73\x51\x3d\x78\x45\xcf\x72\x89\xf1\x36\x2f\x75\x60\x8a\x35\x16\x5a\x6d\xed\x01\x54\xf0\xeb\x79\xf0\x5b\x29\xd5\x7b\x54\x5b\xaf\xe2\xde\x1c\xdc\x1a\xa4\x70\x78\xa7\x6b\x4c\x93\xc8\x7f\x27\x95\x2c\xeb\xb2\x63\x0e\x2d\xbf\x45\xba\xed\x7e\x27\xbd\xdb\x03\x0a\xef\x8b\x3d\xfb\x6b\xad\x9b\x71\x84\x7d\xd0\x27\x6b\x64\x93\xba\x82\x4b\xdc\x88\xba\x20\x3e\x85\x33\x78\x15\xde\x83\x7b\x59\x14\xfe\xa9\x4c\x2b\x2b\x73\xf4\x0b\x25\x7a\x46\xbe\x7b\x09\x0b\x56\x6b\xe5\xff\x95\xa4\x7e\x09\xf6\xeb\x83\xe7\x36\xda\x94\xc2\x91\x15\xfe\xfa\xed\x20\x9d\x5a\xfb\xdc\x5e\x95\xa8\x2d\xe6\x49\xfa\x5c\xa9\x5c\x7a\x5b\xed\xd7\x55\xb8\xc0\x5c\x5d\x6b\xc0\x30\x0e\x97\x8d\xc7\x5c\x6b\x5d\xa0\xe8\xab\xe2\xca\xe8\xad\x41\x6b\x2f\x51\xe4\x85\x54\x38\x67\x91\x3e\x93\x89\x79\xa0\x85\x72\xd2\xb3\x99\xea\x2d\x93\xe8\xe2\xe4\x34\x94\xe2\x16\x9b\x81\x8e\x28\xba\xc6\x0d\x69\x04\x42\xbf\xb3\x06\x4e\xfb\x45\xd9\x90\x0b\xbb\xa2\x31\x3b\x50\x5b\xdf\x9e\x96\xef\x08\xa8\xbf\x2f\x55\x8d\x1e\x4a\x65\x74\x86\xd6\x06\x50\xd0\xb5\x8a\xde\x4c\x08\xff\x30\x7b\xeb\x70\x2f\x9d\xe7\xaf\x8f\x07\x44\xf9\xe6\x21\x43\xcc\x31\x3f\x1a\xc6\xa0\xb0\xf4\x1a\x73\x90\xad\xcd\xc6\x3b\x21\x9e\x20\x07\x4b\x13\xfc\x01\xb8\xd6\x0e\x79\xed\x46\x09\x42\xd0\x82\x0e\x45\xeb\x64\x49\x5c\x9e\xd7\x26\x6a\x7a\xa2\xb9\x18\x5e\xf8\x86\xc9\x07\x84\x19\x7e\x7b\x76\x66\x0f\x59\xe3\x69\xac\x1a\xfd\x9a\x24\x9f\x5c\x37\x42\x1c\x15\x60\xf4\x6a\xfb\xb2\xf8\xc6\x2f\xaf\xb4\x6c\xe4\xc8\xe2\x1c\x8c\x16\xd0\xcf\xa5\xf5\xd6\xae\x96\x76\x07\x6b\x74\xf7\x88\x0a\xf0\xc1\x23\x22\x1d\xfc\x84\x46\xd3\x7a\x7a\xca\x79\x7d\x2d\x37\xf2\x58\x10\x9e\x3a\xdb\x3b\xe9\x9d\x9c\x7f\x91\xd6\x69\xb3\x7f\x2f\x4b\xe9\x26\x25\xa4\x55\x61\xba\xc8\xa3\xc6\xbf\x41\x9e\xb2\x41\x27\x3c\x93\x68\x10\x45\xa1\xef\xc1\xf3\xf2\x5a\x64\xb7\x87\xf8\xc2\x31\x65\x9e\x89\x12\x70\xb0\x04\xcf\x42\xa8\xe8\x40\x27\x89\xf3\xde\x3b\xe0\xcd\xa3\xa4\x31\x5a\xbe\xf8\xe6\x81\xa7\xd6\x23\xd8\xfd\x4e\xdb\x63\x55\xdc\x84\x48\xc2\x60\x00\xd7\x09\x93\xa2\x4c\x7a\x81\xd1\xf4\xd4\x66\xd3\x7f\xe2\x30\x90\xea\x5e\x57\x0e\xca\xda\x07\x82\xc2\x65\xbb\xae\x4f\x0d\x0e\xcb\xca\x3b\xa0\x2f\x2d\x47\x12\x47\x02\x35\x66\xbf\x19\x65\x97\xed\xbe\x79\xf0\x2e\x98\x6d\x13\x15\x09\x5a\x1d\xbe\xc0\x9c\xe0\xe3\x2d\xcf\x58\x45\x9f\x92\xde\x0f\x93\x06\x39\x35\x31\x00\x19\x88\x2f\xbb\x4f\x11\xe9\x2e\xae\x2f\x87\xd8\x03\x40\x3a\x2c\x07\x51\x3c\x40\xf2\x22\x81\x48\xf0\x5c\xe3\x1d\xd2\x7c\x5e\x39\x0b\xa9\x8e\x55\x14\x5f\xec\x9f\x2f\x40\xc0\x2d\xee\xd9\x95\xf7\xd1\x42\x85\x46\x34\x20\x0c\x16\xc1\x0a\xa2\x7f\x8a\x1e\x0a\x7e\xfd\x20\xd4\xd4\xa2\xf0\x75\x8b\xfb\xb1\x5b\x07\xd3\xf5\xe3\x05\xc7\x8a\xe7\xed\x7f\x68\xcc\x71\x33\x55\x51\x55\x85\xc4\xb1\x49\xc2\xa0\x7b\xd5\xb9\x37\xe6\x4d\xb5\x57\xa4\xc8\x4c\xb4\x1b\x02\xb6\x21\x00\x93\xf8\xa5\x65\x72\x7a\xfe\xda\xc9\x8a\x94\x52\x02\x6b\x8b\xc4\x7b\x31\x8a\xfa\xc1\xc7\xb1\x0d\x70\xe6\xa8\x2b\xb5\xf0\x86\xce\xff\x43\xf2\x4c\x86\x36\x01\xf2\x52\xa3\xbd\xd6\x8e\x9e\xfd\x59\x24\x61\xa4\x66\x12\x84\x1f\x26\x06\x55\x20\x8c\x11\x7b\xf2\x37\x3b\x41\x96\x5d\xc1\x15\x7b\xcd\x71\x7e\x89\x49\x48\xeb\x03\x1d\x6d\xe2\xcc\x29\x38\xe6\x21\x18\x38\x29\x94\x35\x52\x96\x0c\xcb\xca\xed\x23\xf4\x04\xd0\x66\xd1\xa4\x8d\xa4\xd4\xa6\x47\xaf\x91\x81\x12\x30\xbd\x5b\xc1\xc3\x93\x6d\xe1\x77\x38\x60\x2f\xc8\x7b\x09\xae\x06\x05\x9c\xc2\xe1\x56\x66\x50\xa2\xd9\xa6\xf0\xac\xbc\x9e\x1a\x5f\xba\x84\x26\xe1\x6b\xc6\xda\xc6\x87\x08\xdf\xc1\x67\x82\xda\x39\xf2\xa0\xf9\x5a\x7a\x5e\x1f\xb9\x93\x5c\xde\xc1\x88\x70\x1e\x56\xa4\xbe\xc9\xde\x0d\xce\xbe\x9b\x25\x4e\xeb\xa7\x09\xfa\x1c\xdb\x0c\x1e\x94\xb5\x6f\x29\x2a\xcf\xd9\x7f\xf3\xea\x94\x18\xe5\xef\x50\x09\x69\xec\x0a\x2e\x28\xbd\x36\x10\xe6\xf8\xab\xfb\x7c\x70\x68\xbb\xa0\x3d\x54\x69\xc1\xd3\xfc\x4e\x14\xc1\xd5\x17\x0a\xb0\xc0\xf2\x30\x53\x10\x2f\xbd\x39\xb2\x68\x0b\xb6\xee\xa4\x44\x37\x12\x0b\xca\x75\x9c\xdc\xe2\xfe\x64\xd1\x93\x3c\x90\xc3\xaa\xf4\xe4\x4a\x9d\xb0\x91\x38\x92\x83\x68\x67\x40\xab\x62\x0f\x27\x74\xef\x64\x75\x64\x04\x07\xc1\x26\x0d\x63\x82\x23\x46\x6f\x05\x59\x3a\x32\x32\x47\x7e\x63\x2f\x68\xe0\x77\x3c\x65\x6b\x8b\xec\x38\x92\x90\x02\x46\x3f\x29\x7a\x41\x03\x61\x84\xdb\xf9\x48\x99\xbc\x9f\xc7\x38\x29\xde\x17\xa5\x9a\x42\x2e\xdc\x51\xaa\xe1\x08\xe5\x4f\xfc\x74\xc8\xf6\x78\x9a\x6f\xe4\x16\x2a\x61\x44\x69\x57\xf0\x91\x2d\x0d\xaf\x80\x1c\x48\x7c\xdc\x84\x29\x7e\xde\x57\xc3\x5c\xf8\xff\xe3\x08\x8c\xcf\xd0\x72\x4c\x19\xf7\x52\x3c\xdc\xd4\x66\x3b\x38\x17\x7f\x09\xb5\xff\xb0\x19\xbb\xb9\x4c\xb8\xbb\xc7\x4f\x25\x35\x58\x3f\xaf\xd7\x8d\xa2\xdb\x58\xa1\xcd\xfb\x93\xa7\x24\x14\xc5\x95\xd9\x0e\xf3\xba\x18\x08\x40\x9b\x29\xac\xf5\x1d\xf6\x72\x4d\xc7\x20\xc9\x56\xd7\x18\x81\x7a\xa3\xb7\xb6\xba\xa8\xdd\xb8\x62\x0f\x40\x5e\xe1\xc3\x39\xfc\xe6\x35\x50\x6c\x5f\xa1\xc9\x50\x39\xb1\xc5\xa1\xc8\x8e\x9f\x7d\x73\xf6\xd5\xeb\x71\x6b\x40\x66\xc7\x63\x11\x82\xdc\x33\xe6\x8c\x87\xef\x55\x5b\x9e\x91\x16\xce\x56\x70\x11\x10\x0c\x88\x8c\xdb\x17\x0f\xaf\xc8\xea\x82\x42\x65\x4a\x60\x76\xd0\x5c\xef\xc1\xe8\x5a\xe5\xcc\xa6\xbd\xd8\x73\x14\xe2\x1b\x1f\x8a\x88\xb2\x2a\xf0\x1c\xee\x77\xa8\x38\x64\x90\x96\xdc\x1f\xa7\xe1\xeb\xb3\xaf\x58\x3f\x79\x09\x6b\x63\x15\x3f\xad\x51\x98\xb4\x92\xa2\xc0\x1c\xea\x0a\x64\x59\x62\x2e\x85\xc3\x62\x1f\x07\xc0\x28\x7a\x51\x98\xac\x13\xc6\xd9\x05\x55\xfb\xc6\xad\x62\xf4\x3c\xdd\x41\x21\xc9\x87\x9d\x14\x06\xe2\x7d\xbb\x3c\xb9\x26\xaa\x23\x65\x34\xc6\x67\xff\xf5\xd9\x57\xc3\x71\xfb\x07\x95\x21\x41\x6e\x20\xee\xc4\x1d\xc2\xda\x47\xa0\xb7\xb2\x28\x30\x5f\x8c\x73\xd3\x11\xa9\xfa\x24\xd9\xd4\xc6\xed\xd0\x2c\x00\x95\x8d\xd9\x0e\x3f\x37\x3f\xaf\x29\x16\xed\x8a\x8e\xe1\xf2\x27\x08\xe7\x45\x9b\xd3\x25\x9d\xf4\x49\x20\xee\x88\x3d\xf1\x97\x70\x50\x6a\xeb\xc6\xc9\xf0\x72\x4c\xcf\x74\x58\xf8\x17\xab\x6d\x6a\x35\x9e\xfe\x6c\x80\x1f\x92\x73\x5c\xb9\x1c\x28\x91\x51\x90\x8f\x53\x2e\x5f\x40\x35\xe4\xfa\x5e\xad\x7a\xca\x29\x25\xc9\x51\x69\x91\x65\x09\xea\xaa\x97\x60\x1e\x51\x20\xa3\x30\x0f\x15\x4b\x3f\x6b\x74\x20\x2d\x1e\x57\xff\xf4\xef\x88\x41\x53\xf1\x4e\x9f\x80\xf3\xb5\xce\xb8\xfa\x26\x15\xd0\x53\x2a\xde\x59\xa2\x3c\xf8\x22\x89\xf5\x38\x9a\x7e\x36\x8d\xf4\x6f\x74\x51\xe8\x7b\x4e\xd4\x58\xee\x6a\xf0\xda\xe1\x58\xd9\xb6\x8a\xe2\xf1\xca\xb1\xc5\xbd\x31\x39\x5e\x5d\x14\x05\xa9\x0b\x1b\x18\x3c\x01\xb7\xa3\x47\xda\xbe\x81\xdf\x3d\x42\x5f\x24\xc3\x0a\xba\x39\xe5\x7a\x79\x9f\x89\x87\x6b\x12\x59\xf0\xae\x36\x06\x95\x2b\xf6\x21\xf1\x55\xec\xc1\xd6\x55\xa5\x8d\xa3\xfa\x13\x3b\x5b\x83\xd3\xf2\x6e\x77\xcf\xd5\x3a\x69\x18\xda\xdf\x9b\xf4\xc2\x12\x2a\x69\x74\xaa\x31\x99\x96\x76\x8a\xc3\x43\xe1\xd7\x75\x48\xfb\xf4\x75\x57\x53\xc4\xe1\xa2\xd0\xa3\x92\x72\x03\x55\xc0\x41\x44\x5e\xde\x38\xa1\x72\x61\xf2\x30\x95\x97\x2f\x6d\xf3\xf2\x17\xaf\x6b\xc6\x81\x86\x58\x69\xca\x01\x3e\x6a\x8d\x1a\x78\x64\x76\x28\x0a\xf3\xc2\xf5\x83\xe6\x81\x16\x83\x90\x70\xa9\x95\x75\xa6\xa6\xe9\xe6\x14\xfc\x71\x59\xdb\x47\x95\xd6\x69\x93\xd0\x16\xa1\x48\xd3\x29\x75\x7b\x7b\x2d\xf6\xa4\x68\xd0\x79\xb5\x81\x0f\xa1\x1d\xc0\x69\x5d\x90\x3a\x26\x98\xe3\x06\x5f\xe5\x60\xd0\x19\x89\x77\x08\xc2\xac\xa5\x33\xc2\xec\x3b\x8b\xfb\x79\x87\x7b\x52\x73\xde\x79\xfa\x6b\x8d\x66\xcf\x2a\x23\x91\xd6\x6a\xcb\x8f\x94\x6e\x33\x77\x98\xb3\xca\x2d\x75\x2e\x37\x7b\xaf\xd5\x98\x8d\x8e\x5b\x11\xce\x4f\x4f\x6f\xeb\x35\x1a\x85\x0e\x89\x7b\x72\x9d\xd9\xd3\xda\xa2\x59\x6e\x6b\x99\xe3\x69\x67\x41\x87\x5d\x91\xc9\xac\x05\xc0\x16\x95\x8f\xac\x71\xa8\xa0\x3c\xb8\x88\x27\x7f\xec\xbc\x11\x56\x51\x57\xcc\x34\x7e\x8e\x1b\xf9\xb0\xf0\x61\x6a\xc8\xb0\x8f\x53\x9b\x88\x61\x16\x7e\x59\x22\x12\x20\xa0\x56\xf2\xaf\x75\xa8\x55\x7f\xb8\x7e\xff\xef\x70\xf5\x2d\xc9\x39\x8d\xc6\x99\x81\x9d\x18\x37\x9f\x1c\x4b\xa0\xf2\xc2\x70\x27\x73\xea\x3b\x08\x9d\x28\x4d\x5a\xc1\x23\xb7\x68\x2b\xe2\x06\x5d\x6d\x54\x82\xd3\x42\xbf\x09\xb7\x3e\x34\x2a\x26\x97\x9b\x0d\x1a\x4a\x78\xec\x84\x6a\xc1\x55\xc2\x5a\x2e\x55\x26\xac\x3c\x73\x39\x81\x12\x85\xd5\x5c\x77\x2e\xd7\x52\x79\xee\x60\xc6\x0e\x84\xb0\xf5\x66\x23\x1f\x38\x5d\x11\xe7\x34\x01\x76\x27\x58\x35\x5a\x8f\x4e\xdb\x60\x04\xa6\x2e\xbc\xa5\xb3\x07\xf4\x5c\x24\xf9\x37\x48\x94\x33\xb5\xca\x44\x53\x37\x41\x28\xa8\xfe\x1f\xdb\x09\x18\xcb\x26\xf5\x16\xcb\xbd\x49\xc3\xc9\xc8\x86\x69\x6a\x15\xd2\xe6\x9e\x27\x56\xf0\xa3\x3a\x5e\xb6\xa6\x86\x95\x94\x5f\x0f\x25\xb2\x53\xce\x2b\x42\x49\x12\xbb\xe8\x0c\xc0\x94\xbf\xfe\xf0\x39\x2c\xfe\x38\x44\xf8\xf5\xd9\xff\x83\x25\x48\x65\x1d\x8a\x7c\x01\x32\x30\x00\x4a\xef\xa5\x84\xd7\xe1\xed\xd9\x1b\x78\x17\xfa\x10\xb4\x81\xdf\x9c\x9d\xa5\xd5\xd6\x27\x2e\x18\x73\xe7\xcd\x67\x59\xa2\xae\x1d\x48\x2e\xea\x73\xce\xb5\x2b\x06\x19\x69\x90\x09\x47\x74\xe3\xfd\xd7\x98\xa0\xe3\xd2\x70\x51\x68\xe7\x30\x6f\xd3\x62\x81\x83\x83\x4a\xf2\x9a\x6e\xd8\x07\xf0\xd7\xab\x28\xd3\xc5\x1e\xc4\x86\x5b\x45\x30\xd6\xf9\xb9\xfb\xa0\x19\xee\x93\x87\xb4\xbc\xa0\xa7\x76\x28\x72\x34\x89\xb0\xff\x47\x05\x17\x54\x13\xc9\x9b\x74\x50\xd4\x24\xfd\x4a\xe5\x97\x36\xa5\x32\xc7\xb2\xd2\x0e\x55\xb6\x3f\x49\x6a\xcf\x84\x81\x2b\x46\x93\xba\xf0\xe5\xad\xe9\x77\x9c\xd0\x0d\xa5\x8a\x5b\xdc\xdb\x4e\x01\xac\x1f\xcb\xd9\xb4\x7a\xd3\x66\x2b\x94\xfc\x89\x2c\x59\xd3\x04\xfa\x13\xc2\x2b\x6a\xac\xa4\x5f\xb9\xa0\xf5\xba\x63\xac\x46\xd2\xef\x10\x13\xde\x4d\x0d\xcc\x72\x3f\x2b\xb5\x0a\x90\x22\x6a\xdb\x36\x6c\x80\x6d\xee\x64\x16\x9b\xf1\xc6\x63\xb8\xf9\x96\x91\xd7\xe5\xc9\x46\x51\xcd\x35\x86\x2f\x89\x75\x63\x49\x27\x08\xad\x17\x71\xa9\x40\x70\x67\x6d\x25\x32\x5c\xc1\x95\x6d\x94\xe3\xb8\x6a\xf0\x6e\x01\xb7\x9f\xab\x6d\xe3\xd8\xd8\x05\x88\xc2\xed\x74\xbd\xdd\x81\xd5\x64\xaf\xc2\x0d\xd2\xcd\xd4\x38\x90\xd0\x5f\x41\xe6\x29\x67\x4c\xfd\x79\x5d\x0d\xe9\x17\x83\xbb\x30\x45\xe5\xbd\x47\xe3\x63\x42\x42\x7b\x1c\x62\xed\x74\x29\x9c\xcc\xbc\x66\x58\x35\xa2\x5b\x19\x59\x0a\x23\xbd\x3c\x2b\x87\x2a\xf7\x41\xb6\x36\x4d\x33\x3d\xb4\xc2\x96\x76\xbf\x38\x71\x5c\x07\xdc\xf2\xa6\xc7\x7f\xb0\xa3\xb0\x55\x10\xa3\x30\x67\x71\x8b\xcc\xbd\x5a\xd8\x48\x34\xf6\x57\xb4\x66\x69\xc6\x49\x88\x68\xb3\xe2\xf3\x5c\xa9\xa6\x61\xb9\xd7\x27\xc8\xbf\x04\x2e\x42\x91\xed\xd8\x0c\x24\xeb\x79\x0d\xf7\xad\xe0\x42\x71\x61\xaf\x45\xe6\xb8\x40\xe3\x87\xf9\xf1\x24\xe7\xb8\xee\xc7\x31\xf5\xd7\x99\xcf\x02\xd6\xb5\xeb\xbe\x12\x6b\xdf\x99\x50\x5a\x79\x6e\x38\xe8\xf4\x1d\x37\x00\xd7\x9a\x23\xec\xa0\x49\x42\xda\xa0\x75\x1c\x28\x51\xa0\x2b\xfe\xa3\x23\x44\xb0\x9c\xe1\x4e\xe8\x9e\xd7\xc0\x9d\xd0\xda\x62\x33\x58\xf4\xde\x42\xe9\xf3\xc7\x71\xd3\xff\x5d\x10\x6a\x01\x97\xd7\x37\xff\xf1\xfe\xe2\x0f\xdf\xbc\x9f\x60\xc2\x79\xcc\xd6\xcc\xc7\x3e\xd9\xea\xe8\x7b\x85\xe6\x13\x92\xfb\x99\x8d\x9b\x94\x7e\xbb\x4d\x68\x16\x89\x84\xc8\xb1\x62\x31\x8d\x7d\x30\xb1\x0f\xfb\x6a\x03\x17\xef\xdf\x8f\xe7\xe7\xc2\xfb\xc1\xf4\x53\x0f\x4a\x9b\xfb\xcd\xb1\x40\xc7\xde\x75\xdb\x57\x1a\x68\x3e\x0a\x72\x2b\xcc\x5a\x6c\xbd\x9f\x53\x70\xf7\x4e\xeb\xb3\x07\x08\xd2\xeb\x3a\x25\xb6\x8c\xae\xe8\x18\x90\xf1\x34\xb3\xf3\xda\x54\x28\x40\xe5\xcc\x9e\xd1\x95\x96\xf1\x25\x84\x42\x4f\xb3\xe6\xdf\xe7\x40\x24\xd7\x8d\x78\xbe\x6d\x3b\x64\x3e\x0b\x49\x3b\x67\xbc\xfc\x7d\xde\xa1\x21\xb9\x08\x9c\x52\xa6\x6c\x1a\xc5\x0e\x5a\x21\xcf\xcf\xeb\xfd\x16\xf8\x98\x08\x4d\x94\xd1\x7b\xcb\xfe\xa1\xc7\x2a\x6d\x2d\x14\x15\x19\x14\xcf\xb7\xa6\x64\x65\x9b\x28\x83\x00\x14\xe8\x60\xaf\x6b\x08\xaa\x72\x4f\x51\xdf\xbd\x6a\xc3\x57\xd2\x3b\xbd\x5f\x66\x34\x20\x04\x26\xa2\x40\xa5\x95\x73\x11\xdb\xa5\x89\x43\x95\x5b\x78\x9f\xda\x47\x48\x61\x2f\x0a\x6b\x87\xf1\x75\x02\xb0\xa4\xe1\x4c\x70\x2a\x3b\xa0\x69\xb9\xc6\x55\xd3\x74\x7f\x10\x8c\x6e\x93\x38\xbe\xfa\xdd\x51\x1f\xaf\xe2\x26\x89\x18\x34\x19\x5e\x96\x44\xaf\x0b\xcc\xed\x89\x00\x58\x17\x3a\xbb\xa5\xd5\xbe\xf4\x32\xf8\x38\xe4\xbc\xb8\x99\x1a\x17\x70\x71\x7d\xe9\x1d\x72\x4a\x1a\x7a\x58\x4d\x2c\x79\xb2\xd1\x06\xb7\x94\x24\x8f\xf0\xc7\xad\x06\x5f\x1b\xa9\x44\x21\x7f\xa2\x10\x3f\xe6\x98\x19\x68\x2b\x1b\x41\x5f\x34\x9b\x0d\x26\x40\xde\xe2\x7e\xc9\x7a\x9e\x12\x39\x50\x2b\x27\x8b\xb8\xcf\x24\xf2\x38\xfd\x51\xea\xbb\x64\x1b\x6c\xff\x72\x1a\x36\xa2\xb0\x5e\x78\x35\x0b\x73\x63\x43\x16\x3e\x18\xb3\x68\x40\x21\xe6\x16\x4e\x18\xe3\x13\xa8\xd0\x94\x92\x7a\x17\x26\x60\xeb\x0e\x39\x17\xa0\x3d\x5f\xde\x4b\x8b\xf0\xeb\xb7\x6f\xe1\xd5\xf7\x2a\xb4\x25\x53\x1e\xe9\x1b\xe5\xa4\xdb\xbf\x1e\xee\x65\xee\x5f\xeb\x36\x6f\x31\x87\x7d\x86\x7a\xbe\xfb\x57\xab\x76\x9e\xc2\x37\x07\x4b\x40\xba\xb5\xd9\xa8\x13\x55\xdb\xc4\x94\xa6\x15\xdf\xe3\x66\x74\xb8\x9f\x66\x62\x2e\xbc\xc3\xe6\x50\x34\xff\x8f\xf6\xa9\x8c\xcd\x7a\x52\x0d\xa4\x22\x97\xa1\x49\x5f\x77\xf6\x84\x8c\x4e\xfa\xf9\x1c\xe8\x47\xcd\xa5\x96\x8f\x5a\xbf\xef\xaf\x2e\x9f\x77\x26\xb5\x7c\x96\x45\x49\xf7\xa3\x01\x15\x72\x5b\x93\x92\x78\xc8\x73\x49\xe2\x76\x32\x6c\x5b\x7a\x6a\x4e\xa4\x1e\x12\x01\xf1\x54\xd7\x5d\x12\xc0\xe1\xb6\xa9\x78\x1d\x54\x55\x38\xf1\x93\x35\x51\x69\xb7\x8d\x65\x8d\x3b\x71\x27\xb5\x89\xbf\x87\xaa\xcf\xb0\xa2\xf8\xc2\x22\xeb\xa7\xb3\x14\x2a\x5f\xf2\x66\x8e\xa7\x54\x62\xd6\x5a\x3b\xeb\x8c\xa8\x66\xb9\xee\x7f\x88\x4f\x73\x1f\x5f\xab\x66\x29\x3e\x2a\xb4\x0f\xbe\xb8\x8a\xc2\x5b\xa3\x46\x97\x19\x55\x26\x2a\x5b\x73\xcf\x34\x59\x37\xd2\xd1\x31\xe6\xe6\xce\xa1\x50\x58\xfd\x9f\xff\xfa\x6f\xdb\xe2\x59\xa5\x18\xbc\xc4\x6c\x27\x94\xb4\xe5\x98\xde\x9e\xe3\x56\x31\x12\x9f\x70\xb4\x27\xe2\x88\x2c\xef\xe2\x1b\x83\x64\x69\x50\x8f\x59\x73\xb3\x0c\xa9\xc5\x2c\x29\xd2\xfd\x7a\xd2\x4e\x7b\x1a\x1d\x26\x25\x9c\x90\x85\x8d\x1d\x84\x61\xd4\x24\x50\x1f\xc9\xc4\x12\x49\xb3\xd9\xc3\x6b\x1d\x7b\xda\xb6\x4c\x3b\x1d\x92\x9f\xfb\x76\xc5\x57\x97\xc2\xa5\xba\xb0\x39\x28\xd1\xb5\x0b\x75\x71\x24\x0b\x26\x66\xda\xd2\x79\xee\xee\x7c\x87\xf7\xb9\x5c\xde\xd9\x16\x02\x98\x8b\x69\xb3\xf5\x63\x30\x7b\x79\xb5\x61\x54\xb8\x7d\xc5\xf3\x4b\x25\x31\xc3\xde\x96\xe4\x98\xf4\x9f\x00\x1c\xf7\x31\x7b\x0d\x61\x62\xa2\x21\x78\x44\x21\x35\xdb\x6e\x69\xa6\xed\x3e\xe9\x05\x05\x08\xbb\xc2\xe9\x0c\x81\xd3\x3f\xea\x10\x63\x8a\x8c\xb6\xaf\xd1\xe6\xd1\x92\xa2\xa2\x78\xfa\x43\x50\x92\x37\xfe\xce\xaa\x14\x4a\x6e\xd0\xba\x55\x18\x0d\x8d\xfd\xf3\xdb\xbf\x4c\xd1\x1b\xe0\x5b\x6d\x00\xb9\x53\x65\xd1\x84\x00\x71\xb3\x70\xc7\xb5\x26\x62\x35\xb0\x27\xc1\x36\xb9\xd0\x4a\xc7\xac\xc0\x3d\x11\xc3\x89\x5b\xaa\xfa\x88\x90\xb8\x29\xe4\x2d\x9e\xc3\x09\xed\xac\x6f\x51\xff\x9b\x37\x6a\x7f\x9f\x8a\x34\x00\x5e\xdd\x53\xb8\x77\xe2\x1f\x3f\x61\x84\x1b\xf7\xb3\xbb\xed\x75\x3e\xe2\xdc\x32\x62\xe4\x76\xcb\xdb\x10\x77\x08\xe8\xad\x00\xb5\x3f\xca\x8d\x0f\x2b\x1b\x60\x69\xd3\x1b\xaf\x6e\x09\xeb\x68\xa2\x7f\x7e\xfb\x97\x13\x78\xd5\x42\xf4\x74\x9b\x86\xa8\x72\x7c\x80\xb7\x4d\x72\xa3\xd2\xf9\xeb\xd0\xba\x64\xf7\xca\x89\x07\x6a\x7b\xda\x69\x8b\x8a\x6b\x2d\xc9\x10\x9f\x2f\xca\xe5\x50\x9e\xf9\x1e\x8b\x62\xc9\x79\xc9\x1c\xee\x79\x5b\x44\x64\x05\x2e\x52\x55\xc2\xb8\x54\xdf\x51\xbc\x3a\xbb\xfc\x3f\x7f\xb8\xfc\x70\x1e\x37\x5e\x59\xb9\x55\xb1\xee\x43\xd1\x62\xa8\x54\x25\x0a\xa7\xf1\x6a\xab\x82\x35\x33\xa9\xb7\x63\x3b\xa1\xb6\x4d\x52\x61\x53\x7b\x03\x3e\xd2\xa3\xd7\x5e\xb3\x35\xcd\x74\x38\xf1\xcb\x0a\x28\x1e\x31\xf5\xe9\xa0\xe2\x49\x61\x85\x1d\xf6\xc6\x33\xad\x32\xac\x9c\x3d\xd5\x77\x68\xee\x24\xde\x9f\xde\x6b\x73\x2b\xd5\x76\xe9\x85\x62\x19\x12\x90\x9c\x47\x3d\x9d\x13\x6e\x3c\x72\xa6\xc9\xfc\xfd\xf8\x74\x39\xc1\x94\x98\xf3\xb4\xe8\x3d\x0f\x4d\x28\xb7\x7c\xfa\x6c\x24\x89\x0e\xd1\x53\x3c\x80\xc6\xa9\x3f\x84\xe2\xc5\x95\xb7\xf1\xcf\x92\xf6\x9e\x05\x2a\x45\xce\x26\x4a\xa8\xfd\x17\x17\x27\x4f\x78\xea\xa5\xcb\xf6\xcb\xe0\x54\x91\xef\x4f\x3b\xd4\x2d\x15\x8f\x9f\x8d\xd2\x93\xf1\xee\x53\x22\xde\x67\x11\xb2\xe9\x48\x78\xf6\x34\x67\x84\x9a\x00\x63\x7d\x78\x83\x64\x38\xf1\x3e\x72\x9b\xd9\xf6\xd4\x68\x9d\x7f\x0f\xa9\xf1\x94\x92\x33\xc8\x0a\x5d\xe7\x4b\xa9\xa4\x8b\x1e\x3e\xf0\x20\xbc\xfd\x4f\xc9\x62\xd1\x8d\x8f\x82\x53\x37\x21\x3a\xa5\xf7\xf7\x82\x41\xfa\x88\xdc\x60\x4c\x1e\x1c\xb5\xb8\x5c\x62\x65\x90\x3a\x29\xce\xd9\x6a\x93\x55\x4b\x82\xdc\x09\x1b\x2b\x2d\xf1\x5d\x0f\xff\xee\x8d\x28\xaa\x9d\xf8\x9a\x0c\x68\xac\x71\x85\x2c\x28\xc8\x74\x8a\x52\x04\x53\x19\x7d\xf5\x15\xdc\xdc\x4b\xda\xef\xac\xc1\x93\xf6\x06\x33\x83\x74\x28\xd3\x2a\xe5\x88\xcd\x5a\xff\xbc\x07\x6f\xf6\x12\xf7\xd1\x18\x3a\xcf\xc4\xd2\x5d\xf2\xda\x92\x93\xa5\xbc\xf1\x10\x93\x84\xc5\x1e\x5c\xeb\x34\xc4\xd8\x4d\x33\xbe\xd6\x3f\x8f\x6a\x93\x12\x93\x38\x12\x66\x90\x9a\x8f\x3f\x1a\x26\x51\x76\xa6\x23\x63\x12\x7b\x98\x13\x47\xc5\xcc\xa6\xc1\x46\xc8\xa2\x36\x78\xa9\x3d\x89\x67\x4d\xf1\xdb\xee\x1b\x71\x92\x01\x0c\xe4\xfc\x6b\x27\x8f\x94\x28\xf9\xf5\xfa\x89\x41\xaa\x15\x17\x86\xb9\xc3\x45\xf0\x2e\x70\x86\xd5\x1b\x73\x5c\xd7\xb4\xad\xad\xb1\xe9\x2d\xac\x5f\xf4\x91\x9f\x4a\x25\xa9\x36\x46\x34\xdd\xb4\x89\x4c\xca\xc1\x51\x32\x07\x6f\xc5\x6c\x4a\x28\xc8\xf7\xd3\x2a\xe3\xe9\x1b\x3a\x9b\xb1\xcd\x9e\x68\x6a\x8e\xe4\x72\xad\x3a\x40\xad\xc9\xc8\xfc\x9c\x7c\xd1\xbc\x9c\xc4\x73\xe4\x23\x66\x29\xb6\x59\x79\x88\x2f\x94\x83\x78\x74\xfe\x81\xf3\x0b\x49\x98\xff\xb0\xdc\xc3\x17\xc8\x3b\xfc\x03\x72\x0e\x8f\xce\x37\x4c\x5b\xa6\xc7\xe4\x1a\xe6\xb5\xc3\xfa\x6b\x4e\x9e\x61\x38\x8f\x90\x04\x9b\xcc\x31\x24\x72\x08\x53\x7c\x3c\x98\x5f\x48\xe6\x0f\xa6\xf2\xae\xc7\xb9\x85\xe9\xdc\x41\x3a\xe3\x38\x9d\x57\x98\xa5\x31\xa6\xf2\x09\xbf\x9c\x5c\xc2\xac\xe9\x4e\xe5\x10\xfe\x69\xf3\x07\xb3\x67\x37\x99\x37\x78\x42\xce\xe0\x1f\x97\x13\x98\x59\xca\x9c\x9d\x0b\x78\x4a\x1e\x60\x7e\x35\xe5\x97\x94\x03\x98\x45\xd9\x89\xd8\xff\x9f\x34\xee\x7f\x8e\xe8\x25\x3a\x83\x57\x97\xb3\xfc\xd5\x8f\xcd\xe3\xd1\xad\x8f\x25\xfb\x50\x39\x6e\x69\x33\xe5\xdc\xc7\xed\x34\x71\x4b\x4b\xe3\x96\x76\x82\xf1\xc3\xf3\xbf\xe2\x33\xa3\x40\xaf\x2e\xe9\x70\x48\x24\x73\xc8\xfe\x80\xce\x1b\x97\x26\xd3\xc6\xa0\xad\x34\x47\x87\xb1\xf9\x30\x59\xcd\x86\x68\x6e\x1b\xb3\xd5\xf8\xe6\xeb\x3d\xec\xe4\x76\x87\x06\x0a\xcf\xcc\x74\x6c\x62\x5d\x22\x37\xdc\x77\x4e\x6e\x1e\x07\x1c\xf6\x26\xd3\xb1\x22\x99\xb0\xe4\x58\xc4\x70\x44\xd4\x4e\xd3\x8e\xdd\xe0\x25\x74\x00\xa6\x72\x29\x2d\x15\xdf\x15\x28\xd4\xb2\xae\xa0\xd0\x5b\x99\xc5\x30\xa9\x03\x36\xd3\x65\x25\x0c\xda\xf1\xd3\x4b\xe2\xe5\x34\x91\x91\x7c\xac\x0d\x99\xc2\xda\x75\x36\xef\xba\x66\xd4\xa0\x4d\xa6\xb7\xcc\x6c\xd1\x3b\x98\x5b\x2f\xbf\x74\xd4\xa7\x85\x3f\x35\xd2\xc2\x63\xad\xe0\xdf\x8e\xa7\x9d\x08\x81\xa8\xa7\x5e\x66\x1e\xb5\xa5\xde\x2c\x9d\xc1\x96\x5d\xf8\x40\xcc\x66\xe6\x8b\xbe\x23\x92\xd0\xb7\xed\x4a\x77\xe8\xc6\x4d\xd2\xd4\x32\x16\xbd\x2d\xd1\x0e\xe5\xa5\x7a\x14\x62\x10\x8d\x78\x74\x5c\x7b\xa2\xc3\x85\xa2\xd6\xb4\xe6\x0e\x93\x5b\x5a\xda\xe6\x98\xf2\x32\x9b\x73\x82\x6f\x7f\x6f\x7d\x54\x16\x76\x58\x85\x3d\x47\x8a\xbc\x76\xbf\xcc\xd2\x6a\x8a\xc4\x73\xad\x30\x2e\xe3\x38\x9a\x35\x9f\xd6\xdc\xac\x4f\xbb\xd6\x2a\xa7\x8e\xf1\x52\x98\xdb\xb0\xc9\x80\x5b\xf2\x26\x76\xdc\x31\xad\x9b\x23\x3a\x79\x83\x28\xf1\x63\xe6\xea\x70\x66\x19\xef\x3f\xf0\x22\xd4\x91\xad\x51\x88\x2c\x73\x5e\xf7\xf8\x48\x95\x82\x89\xde\x22\x75\xf7\x23\xd3\x91\x8d\x1b\x41\x7e\x6d\xb2\xb4\x77\xc0\x6d\x91\xa7\xa6\x22\xe6\x49\x45\x7c\x97\xb6\xd8\x3d\x15\x3b\x74\xbe\x77\x6c\xc4\xe9\x08\x49\x4c\x17\xce\xd4\x5a\x25\x0a\xee\xb7\x5e\x23\x74\xf6\x96\xc5\x9d\xa2\xc7\xfd\x1a\xa3\x67\x0f\x4c\x4c\x36\xd5\x6f\xb5\x6c\xc7\x19\xbc\xdb\x49\xa5\x0d\xde\x3f\xca\xb1\x0c\x3c\xf5\xf8\x63\xa1\x86\x30\x1e\xc3\x65\x09\x07\xc7\xd3\xf3\x8f\x71\x0b\xfd\x8b\x89\xc1\xc2\xe1\xf3\x9d\xc7\x26\x0e\xb1\xe6\x0f\x4d\x74\x59\x41\xaf\xc3\x36\xe6\x9f\x75\x8e\xf5\xd1\x57\x1b\xd2\x9b\xff\x9f\xf4\x01\x87\xa3\xc5\x39\xfc\xa0\xc3\xf4\x67\x15\xda\xeb\x69\x47\xa1\x46\x62\xfd\xb1\xd9\x70\x35\x79\xf2\x57\x77\x6f\x56\x24\x75\xd0\x55\x83\x47\x1f\x27\x10\xfd\xed\xaf\x67\x23\x4a\x9f\x1e\x49\xe2\x46\x5f\x0b\xe9\x1e\x1b\x49\x09\x0e\x3e\x68\x82\x5f\xe7\xde\xa3\x14\x37\xf0\xf5\xaa\xf9\x5e\xc9\x02\x3a\x1f\x2c\x59\x40\xf8\x62\xc9\x02\xf8\x93\x25\xd4\xf8\x1f\x3e\x5b\x72\x94\x90\x18\xd5\x02\xbd\x0f\x6d\x3c\x8a\xab\x1e\xfb\xcd\x8d\x9f\xcb\x1c\xb3\x8e\x4f\x7e\xea\xd7\x55\x8e\xa8\xde\x61\x9e\x57\x6e\x87\xd2\x84\xdd\xab\x1d\xef\x36\xaa\x96\x23\x62\x7f\xc1\x73\x80\x5f\xc6\x8f\x70\x44\x7f\x9e\x76\x83\x88\xee\xc9\xaa\xcd\x61\xaa\x6b\xda\x26\x3d\x98\xa2\x09\xa9\x4e\x46\x94\xb2\x85\x77\x5a\xe6\x1e\x2d\xa3\x6d\x85\x19\xc9\xd3\x7a\x1f\xf6\x43\x86\xee\xbd\xf0\xd2\xd8\x06\xa5\xee\xf6\x94\x00\x38\xe0\x45\x67\x3f\x2c\xe9\x78\xbb\x90\x06\xeb\x04\x60\x20\xd6\xde\x7f\x21\xdc\x8f\xf1\x8c\x9b\x62\x1f\xb5\x93\xf5\x57\xf4\xcf\xb2\x79\xf9\x30\x28\x1b\x15\x86\xce\x29\x4e\x4f\x12\x89\xce\xfb\x4f\x12\x8c\xf6\xe4\xea\xe4\xf1\x3b\xe4\x2c\xd1\x01\xce\xce\xaf\x45\xe3\xf7\x86\x4f\x99\xa4\x78\x39\x7a\xc0\x6f\xce\xce\xbe\xea\xd8\x85\x4c\x54\x22\x93\x7c\xbc\x29\xee\x69\xab\x6c\xd8\xb3\xbf\xc6\xf1\x78\xa3\xc1\x23\x1e\x1e\xe6\x39\x4e\x69\x07\x7b\x74\x1d\xe0\x9d\xb3\xaa\xf9\x15\x46\xdb\xe3\x71\x04\xb2\x39\x91\x62\xe4\x4c\x9a\xa7\x89\x56\xd8\x7e\xf8\xa4\x35\x7d\x0e\x0d\xc2\xdd\xb1\xe2\xe0\xb4\xc1\xe8\x85\x50\x72\xfa\x39\x26\x3a\xe0\xc3\x1c\xfc\xd4\x7e\xc0\x2b\x94\xc0\xdb\xdf\xc2\x67\xb6\xf8\xcb\x48\x9d\xdb\xe1\xe8\x91\xfc\x9c\x36\xaf\xf0\x0f\x4e\x1b\xb1\xc5\xf0\x4b\xeb\x24\x89\x2c\xc3\xca\x61\xde\xf9\x24\x11\x7f\x01\xe9\x84\xeb\x03\xf1\x73\x46\xf4\x67\xf3\x01\x01\x7b\x0e\x7f\xfe\xcb\x8b\x50\x6c\xce\x7f\x88\xd8\xf8\x1f\xff\x37\x00\x00\xff\xff\xb0\x21\x1d\xfe\xf8\x6c\x00\x00"), }, - "/cluster_v1alpha1_machineset.yaml": &vfsgen۰CompressedFileInfo{ - name: "cluster_v1alpha1_machineset.yaml", - modTime: time.Date(2020, 6, 3, 14, 6, 49, 548960221, time.UTC), - uncompressedSize: 3044, + "/cluster.x-k8s.io_machinehealthchecks.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.x-k8s.io_machinehealthchecks.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + uncompressedSize: 6835, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\xcd\x8e\xdb\x36\x10\xbe\xeb\x29\x06\xbe\xdb\xad\xbb\x45\x51\xe8\x56\x6c\xd1\xa2\x40\x77\xb1\xb0\x83\xbd\x04\x39\x8c\xa9\xb1\xcd\x2c\x45\x32\xc3\x91\x10\x23\xc8\xbb\x07\xd4\x8f\x63\x69\x25\x4b\x9b\x98\x27\x69\xe6\xe3\x37\x3f\x1c\x72\x06\xbd\x7e\x26\x0e\xda\xd9\x14\xd0\x6b\xfa\x2c\x64\xe3\x5f\x58\xbd\xfc\x19\x56\xda\xfd\x52\xae\x77\x24\xb8\x4e\x5e\xb4\xcd\x52\xb8\x2f\x82\xb8\x7c\x43\xc1\x15\xac\xe8\x6f\xda\x6b\xab\x45\x3b\x9b\xe4\x24\x98\xa1\x60\x9a\x00\x28\x26\x8c\xc2\x77\x3a\xa7\x20\x98\xfb\x14\x6c\x61\x4c\x02\x60\x70\x47\x26\x44\x0c\x80\x72\x56\xd8\x19\x43\xbc\x14\xe7\x4c\x6b\x30\x85\xc5\x7a\xf5\xeb\x22\x01\xb0\x98\x53\x0a\x39\xaa\xa3\xb6\x14\x48\xc2\x4a\x99\x22\x08\x71\x83\x4c\x82\x27\x15\xb9\x0e\xec\x0a\x9f\x42\x4f\x5b\x13\x34\xc6\x6a\xef\x1f\x6a\xae\x2d\x49\x25\xf4\xa6\x60\x34\x1d\x13\x09\x40\x50\xce\x53\x0a\x8f\x71\xb3\x47\x45\x59\x94\x15\x3b\x6e\x62\x6e\x08\x83\x42\x43\xf5\x67\x13\xd6\x96\x0c\x29\x71\xfc\x84\x72\x4c\x61\x15\x04\xa5\x08\xab\x8e\xaa\x81\x47\xbf\x37\xe4\x8d\x56\x18\x5a\xb4\x27\xb5\xe2\x46\xd6\xc2\x2a\x86\x3e\xb0\xa6\xed\x40\x6b\x59\x0a\x5f\xbe\x26\x00\x25\x1a\x9d\x55\xe9\xaf\xbd\x73\x9e\xec\x5f\x4f\xff\x3d\xdf\x6d\xd5\x91\x72\x6c\x5d\xf6\xec\x3c\xb1\xe8\x36\x9e\xb8\x2e\x6a\xe1\x2c\x03\x90\x53\x4c\x47\x10\xd6\xf6\x70\x16\x57\xf9\x9c\x02\x5d\xd6\x44\x17\xe8\x76\x1f\x49\xc9\x59\xdc\x1e\x64\xbb\x86\x9c\xab\x08\xb5\xdd\x10\x66\xa7\x2d\x29\x67\xb3\x9e\x12\x60\xef\x38\x47\x49\x41\x5b\xb9\xfb\xad\xa7\xab\xed\x6a\x2b\x74\x20\xee\xe8\xda\x54\xde\x86\x2d\x34\x47\xdd\x67\x1b\x8c\xbb\x52\x50\xee\x0d\x0a\xf5\x37\x8c\xe5\x00\x46\x12\x3b\x69\x08\x06\x12\x3d\xc7\x18\xd4\x77\x75\xaf\x0f\xdb\xea\x02\x0c\x23\x26\x0c\x4f\x79\x3d\x8b\xc0\xb3\x2b\x75\x46\xbc\x1d\x89\x62\x4e\x24\x71\x95\x68\x8a\xd1\x30\x66\x79\x72\x66\xf9\x87\x5d\x7e\x8d\x69\x8e\x3b\x71\x35\x4f\xd0\xbd\xc1\x30\x81\x9c\xcf\x09\x17\x29\x9b\x46\x8e\xdc\xe1\x6b\xd0\x89\x04\xcd\x82\x4d\x42\x04\xb5\x95\xd1\x48\xb5\x50\x7e\x25\x0d\xb3\x1d\x40\x66\x3c\x0d\x22\xca\xfa\x45\x1c\x35\x32\xe7\x34\x9a\x56\xf7\x64\xd0\xce\xa8\xbb\x89\x13\x78\x29\x76\x64\x48\x7e\x92\x87\xe9\x53\xa1\x99\xb2\x31\x9a\x65\x6b\xe7\xc7\xce\xed\x1a\xfd\xb2\x73\x91\xdf\xf6\x84\x8d\xa8\x86\xcc\x2d\xcf\x6f\xf1\x64\xfb\xa9\xfb\xe7\x8c\x06\x84\x25\x6a\x83\x3b\x43\x9b\x9b\x36\x0d\x62\x76\xfc\x40\x21\xe0\xe1\x55\x7d\x8c\x9e\x65\xb5\x69\x43\x18\xba\xed\xfa\xea\x9e\x7d\x61\xcc\xe9\xff\x38\x92\x50\x76\xdb\x10\xdc\x2e\x10\x97\x94\xfd\x4b\x96\xf8\x62\xfc\x18\xe4\xfd\xe3\xf7\x37\x74\x67\xcc\x4e\xb7\x75\xf5\x96\x0d\x7f\xb8\xf0\x7a\x83\x1c\xbc\x2e\xbc\xb2\x9d\xb9\xcb\x35\x1a\x7f\xc4\x75\xf2\xbd\x08\x51\x29\xf2\x42\xd9\x63\x7f\x7c\x5d\x2c\x3a\x63\x6b\xf5\x1b\x07\xa1\x6a\x02\x0f\x29\xbc\xff\x10\x47\x55\x71\x4c\xd9\x73\xfb\x6a\x45\xe1\xb7\x00\x00\x00\xff\xff\x32\xcc\xbc\x93\xe4\x0b\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x4d\x73\xdb\xbc\x11\xbe\xeb\x57\xec\xa8\x87\x5c\x2c\x3a\x69\x2e\x1d\xdd\x3c\x4e\x66\xea\x36\x71\x32\x71\xde\xf4\xd0\xe9\x01\x02\x57\xe2\xd6\xf8\x60\x01\x50\xb6\xfa\x4e\xfe\x7b\x67\x01\xf0\x43\x24\x45\xbb\xf3\x4e\x70\x49\x04\x80\x8b\x07\xbb\x8b\x67\x3f\xbc\xda\x6c\x36\x2b\x51\xd3\x0f\x74\x9e\xac\xd9\x82\xa8\x09\x9f\x03\x1a\xfe\xe5\x8b\xc7\xbf\xf8\x82\xec\xf5\xf1\xdd\x0e\x83\x78\xb7\x7a\x24\x53\x6e\xe1\xb6\xf1\xc1\xea\x6f\xe8\x6d\xe3\x24\x7e\xc0\x3d\x19\x0a\x64\xcd\x4a\x63\x10\xa5\x08\x62\xbb\x02\x10\xc6\xd8\x20\x78\xda\xf3\x4f\x00\x69\x4d\x70\x56\x29\x74\x9b\x03\x9a\xe2\xb1\xd9\xe1\xae\x21\x55\xa2\x8b\x27\xb4\xe7\x1f\xdf\x16\xef\x8b\xb7\x2b\x00\xe9\x30\x7e\xfe\x9d\x34\xfa\x20\x74\xbd\x05\xd3\x28\xb5\x02\x30\x42\xe3\x16\xb4\x90\x15\x19\xac\x50\xa8\x50\xc9\x0a\xe5\xa3\x2f\xa4\x6a\x7c\x40\x57\x3c\x6f\x12\xf0\x95\xaf\x51\x46\x34\x65\x19\x21\x0a\xf5\xd5\x91\x09\xe8\x6e\xad\x6a\x74\x82\xb6\x81\xbf\x3d\x7c\xb9\xff\x2a\x42\xb5\x85\x82\x3f\x28\xb4\x78\xfe\xcd\x24\xc1\xa7\x88\xbd\x44\x2f\x1d\xd5\x21\x22\xfc\x2c\x9e\x49\x37\x1a\x4c\xa3\x77\xe8\xc0\xee\xa1\x69\x37\xb7\xa0\x3c\x08\xa5\xec\x13\x96\xf1\xeb\x84\xf7\xf3\x58\x68\x38\xd5\xb8\x05\x1f\x1c\x99\xc3\x04\x46\x10\xa1\xf1\x05\x3e\xd7\x28\x03\x96\x9f\xb3\xd8\x29\x98\xfb\x0e\x44\x77\xb4\x6c\x9c\x43\x13\xd4\x09\xb4\x35\x14\xac\x3b\x83\xf1\x71\x4e\x64\x82\xc2\x8a\x39\xa0\xbb\x80\x25\x8b\xfd\xeb\x25\xb5\xdc\xa6\x75\xb0\x3b\x8f\xee\x88\x25\x8c\x75\x32\x00\x71\x3b\x95\x35\x86\x70\x70\xb6\xa9\xb7\x30\xb1\x68\x12\xd1\xfa\x94\x08\x78\xb0\x8e\xda\xdf\x9b\x76\xff\x46\xd4\x14\x67\x92\xc7\xe6\xcb\xa6\xf3\x6e\xd9\x57\xe2\xa2\x22\x1f\xfe\x7e\x61\xc3\x27\xf2\x21\x6e\xaa\x55\xe3\x84\x9a\xf5\xb7\xb8\xee\x2b\xeb\xc2\x7d\x8f\x69\x03\xba\x92\xfd\xff\xf2\x26\x32\x87\x46\x09\x37\x27\x66\x05\xe0\xa5\xe5\xdb\x47\x29\xb5\x90\xd1\x60\xbe\xd9\xb9\xfc\xc4\xb2\xe4\x64\x88\x2d\xfc\xfe\x73\x05\x70\x14\x8a\xca\xf8\x40\xd2\xa2\xad\xd1\xdc\x7c\xbd\xfb\xf1\xfe\x41\x56\xa8\x45\x9a\x9c\x78\xee\xf8\x96\x40\x1e\x42\x85\x90\x3e\x82\xbd\x75\xf1\xe7\xcc\x5d\xe1\xe6\xeb\x5d\x96\x59\x3b\x5b\xa3\x0b\x9d\xd6\x79\x0c\x28\xa4\x9b\x1b\x9d\xfe\x86\xe1\xa5\x3d\x50\x32\x69\x60\x3a\x3b\x3f\x7d\x2c\xc1\x27\x14\x76\x0f\xa1\x22\x0f\x0e\x6b\x87\x1e\x4d\xa2\x91\x81\x58\xe0\x2d\xc2\x80\xdd\xfd\x1b\x65\x28\xe0\x81\x1d\xce\x79\x36\x45\xa3\x4a\x66\x9a\x23\xba\x00\x0e\xa5\x3d\x18\xfa\x6f\x27\xd9\x43\xb0\xf1\x48\x25\x02\x66\xf3\xb6\x23\xb2\x82\x11\x8a\x15\xdb\xe0\x15\x08\x53\x82\x16\x27\x70\xc8\x67\x40\x63\x06\xd2\xe2\x16\x5f\xc0\x67\xeb\x10\xc8\xec\xed\x16\xaa\x10\x6a\xbf\xbd\xbe\x3e\x50\x68\x49\x53\x5a\xad\x1b\x43\xe1\x74\x1d\xa9\x8f\x76\x4d\xb0\xce\x5f\x97\x78\x44\x75\xed\xe9\xb0\x11\x4e\x56\x14\x50\x86\xc6\xe1\xb5\xa8\x69\x13\x81\x9b\xc8\x99\x85\x2e\xff\xd4\x99\xff\xcd\x00\xe9\x88\x35\xd2\x88\x5e\x7e\x51\xef\xec\xe2\x6c\x68\x91\x3f\x4b\xf8\x7b\xf5\xf2\x14\x6b\xe5\xdb\xc7\x87\xef\xd0\x1e\x1a\x4d\x70\xae\xf3\xa8\xed\xfe\x33\xdf\x2b\x9e\x15\x45\x66\x8f\x2e\x19\x6e\xef\xac\x8e\x12\xd1\x94\xb5\x25\x13\xe2\x0f\xa9\x08\xcd\xb9\xd2\x7d\xb3\xd3\x14\xd8\xd2\xff\x69\xd0\x07\xb6\x4f\x01\xb7\x31\x74\xc0\x0e\xa1\xa9\x4b\x11\xb0\x2c\xe0\xce\xc0\xad\xd0\xa8\x6e\x85\xc7\x5f\xae\x76\xd6\xb0\xdf\xb0\x4a\x5f\x56\xfc\x30\xe2\x9d\x6f\x4c\xda\xea\xa6\xdb\x40\x34\x6b\xa1\x87\x1a\x25\xed\x49\x46\x3f\x1f\x70\x79\xa6\x50\x88\x2f\x10\x6a\xab\x48\x9e\x06\x32\xe6\xde\x21\x8f\xcc\x81\xcc\x26\xe7\x0b\x63\xc6\xee\xf7\xb5\x3c\xc0\xdc\x9a\xde\x1f\xb6\xcb\xc9\xa4\xd9\xf8\x3b\x54\xd6\x1c\xfc\x48\x2a\xb0\xdd\x46\x73\x9a\xcc\x27\x34\x07\x8e\x20\xef\x46\x4b\xb3\x9a\x8c\xdf\x0c\x42\xe4\x18\xb9\x30\xa7\x2f\xfb\xf1\xe4\x66\x12\x36\xe6\x56\x67\x4e\x1a\x69\xe2\xc6\x9c\x60\xdf\xb8\x50\xa1\x03\x87\x1a\x4b\x4a\xa6\xe0\x8b\x1b\x75\x6a\xa3\x39\xd0\x1e\x44\x00\x6d\x7d\x80\xf5\x30\x9e\xaf\x27\x0a\xe9\xa2\xb1\x47\x15\xe3\x2d\xec\x4e\xb0\x4e\x3f\xac\x5b\x83\x70\x08\xec\xe5\x59\xc0\xb9\xf6\x8c\x2d\xf1\x21\x08\x17\x9a\x9a\xb3\x1f\xdb\x84\x45\x3b\xb6\xa1\x1c\x2c\x67\x53\x10\x2a\x61\x92\xd1\xca\xc6\xa5\x7b\x3c\x51\xa8\x6c\x13\x40\x44\xd1\xf0\x44\x4a\xc1\x0e\x27\xa0\xa5\x35\x9e\x4a\x74\x58\x32\x51\x56\xe2\x88\xb0\x17\xa4\xb0\x8c\x6c\x98\xbf\xea\x14\x84\xe5\xd8\xe6\x17\xd5\xdd\xde\x7b\xf1\x1a\x9f\xc4\x0e\x55\xb7\x95\x11\x68\x11\x64\xd5\xab\xf2\xa9\xb2\xbe\x7b\x13\x2d\x1a\x7c\x46\x27\xc9\xe7\x1c\xa7\x1f\x97\x1e\x47\x32\x4e\x90\xd5\xc7\x67\xe6\x31\xdf\x27\xa8\x0b\xd0\xc6\x1f\x24\x36\xe5\xf4\x81\x1f\x8b\x3a\x07\xce\x64\x46\xac\x24\xa6\xc8\x19\xc9\x00\xdf\x2b\x3c\xdb\x15\xbd\xe1\xe6\xfe\xc3\x54\xa3\x3c\x28\xa0\x9e\x85\x38\x76\xe2\x05\x20\x99\xfe\x3b\xdd\x56\x22\xc4\x84\x5c\x90\x99\x3e\xe6\x34\x52\x90\xbb\x02\x01\x8f\x78\x4a\xf1\x90\x43\x6e\x8d\x4e\x74\x22\x1c\xc6\x48\x1a\xe9\xe2\x11\x4f\x71\x53\x0e\x8e\xb3\x52\x97\x8c\x92\xc6\x23\x4e\x5e\xfe\x85\xeb\xf2\x79\x99\xb5\xd2\xbd\x79\x22\xa2\xe2\xa9\xee\xaa\xa2\xae\x15\xe1\xa5\x4b\xc2\x2c\x77\x0d\xd6\x2e\x13\x48\x3b\x5a\x8d\xbc\x12\x76\xa7\xc0\x3e\x8e\x26\x15\xbf\xf1\x49\x9d\xec\x5f\x15\xd5\xec\xff\x62\x01\xb5\xc7\xe8\x7b\x6d\x2a\xf2\x83\xd3\xc1\x4e\x78\xf2\xa8\x3b\x73\x05\xf7\x36\xf0\x3f\x1f\x9f\x89\xc3\xab\x30\xe3\x67\x32\x1c\x1f\x2c\xfa\x7b\x1b\xe2\xde\x3f\xa4\x92\x04\xea\x95\x0a\x49\x9b\xa3\x83\x1a\x10\xce\x89\x13\xdf\x6b\x98\xa9\xf8\x02\xee\x52\x48\x6a\xef\xb7\x70\x09\xf2\x9c\x2d\x58\xd7\xde\x3c\x66\x98\xe9\x88\x24\x5c\x37\x3e\x26\x17\xc6\x9a\x0d\xea\x3a\x9c\x5a\xe9\x0b\x42\x3b\xa3\x91\x6f\x55\x69\xdd\x99\xbe\x2e\x1c\xb4\x20\x93\xb9\x2b\x1d\xff\x9d\xb9\x3a\x7d\x93\xb2\x5e\xc5\x25\x00\xb3\x37\xab\x20\x66\x6d\x5c\xe7\x90\x04\x8d\xee\xb0\x84\xb3\x66\x9e\xba\x6c\xba\x05\x26\x49\xe3\x15\xb6\x6d\x37\x45\xbc\xb3\x7b\x32\xed\x94\xf3\x07\x6d\xd8\xd7\x2f\xac\x2c\x9a\x77\x36\xad\x7a\x1d\xaa\x48\xdf\x31\xbc\xcc\xde\x7e\xd8\x1c\x58\xe6\xa7\x17\xf4\x33\x8d\x19\xe9\xd0\xc4\xbe\x5a\xd4\xec\xd9\xbf\x33\x9d\x46\x47\xf9\x09\xb5\x20\xe7\x0b\xb8\x89\xf5\xa1\x9a\xb7\xec\x70\x3f\x99\x5c\x9e\xf5\xa2\x59\x2a\x79\x60\x9d\x1f\x85\x62\xaa\x67\xe2\x30\x80\x2a\x12\xff\xac\xc8\x98\x61\x9e\x47\xb4\xab\x1c\x5d\x99\x44\xf7\x84\x2a\x16\x0c\xeb\x47\x3c\xad\xaf\xce\x5e\x1e\xd0\x3c\x95\xae\xef\xcc\x3a\x05\x89\xc9\x3b\x68\xe3\x4c\x4a\xa5\xd6\x71\x6d\x5d\x4c\x82\xe0\xac\xd8\xc5\xc0\xb8\xe0\x11\x17\x97\xba\x56\xcd\xad\x35\xc9\xea\x13\x53\x9f\x59\xf1\xb7\xe9\xfe\xfe\x42\x7d\x0a\x10\xeb\x9b\x7e\x07\x87\xa1\x09\xe0\x12\x03\x3a\xcd\x69\xfd\x53\x85\x31\xd5\xcc\xe9\x18\xf9\x61\xe6\xd5\x21\x2c\x52\xa2\xd0\x8b\x9d\x48\x64\xed\x48\xab\x77\xc4\xc5\x33\x19\xc6\x63\x0f\x24\x85\x82\x2f\xdf\xae\x80\x0a\x2c\x62\xc6\x6a\x4e\x33\x10\xc9\x73\xf1\x72\x35\xcd\xe4\xb9\x0a\xc8\xa8\x7a\x28\xa3\x6d\x17\x88\xe4\x05\xcd\x9d\x87\xbc\x7b\x3e\xa4\x03\x14\x2d\x76\x21\x3e\xa5\x72\x95\x73\x58\x10\x10\x52\x42\x1c\x0b\x2a\xda\x13\xe7\xa6\x2c\xad\x4d\x75\x0b\x80\x7f\x54\x68\xba\x62\xa6\xec\x8f\x98\x91\x5c\x09\x0f\x3b\x44\xd3\x3e\xac\x03\x1d\xd1\xe4\x3e\x4b\x6c\x86\x88\x00\x0a\x85\x4f\x39\x45\x7b\x74\xdb\x21\x88\x7a\x9a\x4b\xd8\x2e\xd8\x73\xb2\x75\x39\x1d\xca\xed\x9e\xd9\x77\xb1\x50\x5d\xa5\xf1\x02\x53\x85\xf9\xb2\xe2\x75\xdf\xf2\xf2\x2f\x40\x75\x39\x6e\x6c\xb2\x2e\x66\x16\xf2\x45\xe6\x56\x4e\xf5\xd4\x38\x0b\x94\xa1\xc9\xdc\x45\xb7\xbe\x50\xaf\x8e\x43\xcb\x1c\xdc\xcd\xb0\xf6\x3e\x9b\x6f\xf3\xd1\xb3\xc9\x19\x32\x7a\xb1\x8f\x30\x71\x8a\xf3\x52\x90\x4b\x53\x87\x32\xf5\x7f\xbb\x56\x6c\xf6\x68\xbb\x9f\x6b\x01\xb6\x1d\x9f\xd7\x74\x16\xce\xfa\xb6\x8b\xc4\x19\x6c\x10\x6a\xd0\x23\x9f\x74\xc8\xa5\x6d\x4c\xae\x8b\x63\xb1\x9a\x17\x26\x26\x1b\xf6\x40\x46\x8b\x7b\xeb\xb4\x08\xb1\xfc\x7f\xff\xe7\xa9\x39\x49\x37\x7a\x0b\x6f\x67\xad\x39\xd7\x31\x18\x77\xdb\xff\xaf\xfb\xbd\x74\xaf\x7c\x8f\x69\xcd\xfd\xab\xef\x35\xe3\x46\xa3\xa9\xfe\x6f\x2f\xef\x84\xaa\x2b\xf1\xbe\x9f\xcb\x7f\x20\x49\x5d\xfb\xc1\x32\xd7\x1f\xec\x59\x5b\x08\xae\xc1\xdc\x9d\xb6\x4e\x1c\x30\xcf\xf4\x7e\x2a\xa4\xc4\x3a\x60\x39\x68\x91\xa7\xa6\xfc\x3a\x75\x4d\xda\xfe\x7a\xfc\xd9\x07\xa8\x2d\xfc\xf3\x5f\xab\x24\x15\xcb\x1f\x2d\x1a\x9e\xfc\x5f\x00\x00\x00\xff\xff\x91\x66\xe2\xd0\xb3\x1a\x00\x00"), + }, + "/cluster.x-k8s.io_machines.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.x-k8s.io_machines.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + uncompressedSize: 16637, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5c\xdb\x6e\xe4\xc6\xd1\xbe\xd7\x53\x14\xd6\x17\xb2\x01\x0d\xc7\x6b\xdf\x18\x73\xb7\xff\x1e\xfe\x28\xf6\xae\x85\xd5\xda\x09\xe0\xf8\xa2\x87\x5d\x24\x3b\x22\xbb\xe9\x3e\x48\x9a\x18\x06\xf2\x1a\x79\xbd\x3c\x49\x50\x7d\xe0\x61\x48\x8e\x46\x92\xd7\xd9\x00\xe2\x8d\x76\xc8\x66\x75\x55\x75\x1d\xbe\xea\x6a\xee\xc9\x6a\xb5\x3a\x61\xad\xf8\x11\xb5\x11\x4a\x6e\x80\xb5\x02\x6f\x2d\x4a\xfa\x65\xb2\xab\x6f\x4c\x26\xd4\xfa\xfa\xf9\x16\x2d\x7b\x7e\x72\x25\x24\xdf\xc0\x4b\x67\xac\x6a\xde\xa3\x51\x4e\xe7\xf8\x0a\x0b\x21\x85\x15\x4a\x9e\x34\x68\x19\x67\x96\x6d\x4e\x00\x98\x94\xca\x32\xba\x6d\xe8\x27\x40\xae\xa4\xd5\xaa\xae\x51\xaf\x4a\x94\xd9\x95\xdb\xe2\xd6\x89\x9a\xa3\xf6\x33\xa4\xf9\xaf\xbf\xcc\xbe\xce\xbe\x3c\x01\xc8\x35\xfa\xd7\x3f\x88\x06\x8d\x65\x4d\xbb\x01\xe9\xea\xfa\x04\x40\xb2\x06\x37\xd0\xb0\xbc\x12\x12\x4d\x96\xd7\xce\x58\xd4\xd9\xed\x2a\x70\x7b\x62\x5a\xcc\x3d\x0b\x9c\x7b\xbe\x58\x7d\xa1\x85\xb4\xa8\x5f\xaa\xda\x35\x81\x9f\x15\xfc\xf9\xf2\xfb\x77\x17\xcc\x56\x1b\xc8\xe8\x85\xac\xd5\xea\x5a\x70\xd4\xe7\xaf\x3c\xbb\x1c\x4d\xae\x45\x6b\x3d\x53\x17\xf1\x19\xc4\x87\x81\x83\x8b\xf1\x1b\x76\xd7\xe2\x06\x8c\xd5\x42\x96\x93\x19\x2c\xb3\xce\x64\x6d\xc5\x0c\x4e\xc9\xbf\x0d\xa2\x40\x18\x05\xc6\xe5\x15\x30\x03\x1f\x50\x37\x42\x32\x2b\x64\xb9\xbe\x40\xc9\xe9\xef\x7b\x27\x25\xfd\x7d\xc3\x44\x8d\x1c\xd0\xe6\x43\x86\x3a\xf2\x47\xf0\x22\x15\xc7\xf7\x58\x64\xf4\xea\x94\xa5\x77\x8a\xa3\xa7\x0a\xcc\x18\x95\x0b\x66\x91\xc3\x8d\xb0\x15\xd8\x4a\x98\xa4\xfc\xc1\xdc\xf4\xc2\xbb\x44\xaa\xd5\x42\x69\x61\x77\x1b\x78\x3e\xc7\x4e\xa9\x95\x6b\x37\x30\x59\xb8\x40\x2b\xd9\x0b\xb3\x58\x2a\x2d\xd2\xef\x55\x1a\xbf\x62\xad\xf0\x77\x82\x35\xbe\x1d\xb0\x52\x0b\x63\xbf\x1d\xde\xfd\x4e\x18\x1b\x38\xaa\x9d\x66\x75\x6f\x35\xfe\xa6\xa9\x94\xb6\xef\xfa\x29\x57\xd0\xb0\xf0\x40\xc8\xd2\xd5\x4c\x6f\x06\x82\x9a\x5c\x91\x10\x7e\x78\xcb\x72\xe4\x74\xcf\x6d\x75\x74\x83\x48\x22\x28\x77\x03\xbf\xfe\x76\x02\x70\xcd\x6a\xc1\xbd\x11\x87\x87\xaa\x45\xf9\xe2\xe2\xfc\xc7\xaf\x2f\xf3\x0a\x1b\x16\x6e\x2e\xd8\x82\x30\x60\x2b\x84\x30\x12\x0a\xa5\xfd\xcf\xc4\x3e\xbc\xb8\x38\x8f\x6f\xb7\x5a\xb5\xa8\x6d\xa7\x27\xba\x06\x0e\xdd\xdd\xdb\x9b\xe7\x94\x18\x09\x63\x80\x93\x0b\x63\x98\x30\x3a\x22\x72\x30\x61\x6a\x55\x84\x25\xd7\xd8\x6a\x34\x28\x83\x53\x0f\xc8\x02\x0d\x61\x12\xd4\xf6\xef\x98\xdb\x0c\x2e\x51\x13\x11\xd2\xae\xab\x39\xf9\xfd\x35\x6a\x0b\x1a\x73\x55\x4a\xf1\x8f\x8e\xb2\x01\xab\xfc\x94\x35\xb3\x18\x97\x29\x5d\xde\x5d\x25\xab\x49\x85\x0e\xcf\x80\x49\x0e\x0d\xdb\x81\x46\x9a\x03\x9c\x1c\x50\xf3\x43\x4c\x06\x6f\x95\x46\x10\xb2\x50\x1b\xa8\xac\x6d\xcd\x66\xbd\x2e\x85\x4d\x21\x2c\x57\x4d\xe3\xa4\xb0\xbb\xb5\x0f\x44\x62\xeb\xac\xd2\x66\xcd\xf1\x1a\xeb\xb5\x11\xe5\x8a\xe9\xbc\x12\x16\x73\xeb\x34\xae\x59\x2b\x56\x9e\x71\xe9\x23\x58\xd6\xf0\xcf\xba\x85\x3e\x1d\x70\xba\x67\xd8\xe1\xf2\x76\xb9\xa8\x77\xb2\x4f\x5a\x5d\x16\x5f\x0b\xfc\xf7\xea\xa5\x5b\xa4\x95\xf7\xaf\x2f\x3f\x40\x9a\xd4\x2f\xc1\x58\xe7\x5e\xdb\xfd\x6b\xa6\x57\x3c\x29\x4a\xc8\x02\x75\x58\xb8\x42\xab\xc6\x53\x44\xc9\x5b\x25\xa4\xf5\x3f\xf2\x5a\xa0\x1c\x2b\xdd\xb8\x6d\x23\x2c\xad\xf4\x2f\x0e\x8d\xa5\xf5\xc9\xe0\xa5\x0f\xe4\xb0\x45\x70\x2d\xa7\x28\x90\xc1\xb9\x84\x97\xac\xc1\xfa\x25\x33\xf8\xd1\xd5\x4e\x1a\x36\x2b\x52\xe9\xdd\x8a\x1f\xe6\x9f\xf1\xc0\xa0\xad\xee\x76\xca\x10\xb3\x2b\x14\x3d\xf0\xb2\xc5\x7c\xe4\x19\x1c\x8d\xd0\x64\xbd\x96\x59\x24\x9b\x1f\x46\x9e\x65\x5f\xa4\x6b\xab\x94\x35\x56\xb3\x76\x7c\x7b\x6f\xe2\xff\x4b\xa3\x82\x79\x68\x2c\x50\xa3\xa4\xc5\x57\xc0\xa0\x56\x39\xab\x49\x62\x97\x5b\xb8\xa9\x44\x5e\x01\xca\x9c\xb5\xc6\x79\xff\xd9\x23\x0c\x50\x08\xac\xb9\xf7\xb1\x5c\xc9\x42\x94\x4e\xa3\x17\x23\x72\xfd\xef\x7f\xfe\xcb\xf4\x7c\xb5\x64\x75\x0d\xe6\x15\x93\xc2\x34\xd9\x1e\xb1\x25\xb1\x20\xa4\xf5\x42\x94\xef\xb1\x98\x3e\xda\x13\xef\x65\x1a\x39\x2b\x5e\xc7\x0a\xa4\x44\xbc\xa2\x55\x12\x85\xc8\x67\x08\xc3\xd0\x33\x98\x85\x4a\x91\xac\x49\x50\x1f\xa1\x80\xa3\x65\xa2\x36\x19\x7c\xa8\x70\x30\x9b\x30\xa0\xda\x00\x0b\x66\x09\x13\x37\x75\xad\x6e\xc0\x19\xd4\x66\x4d\x92\x33\xb2\x59\x7a\x10\x38\xda\xf5\x2b\x95\xbd\x62\x96\xf9\xbc\xa8\x9c\xf7\xab\x59\x92\x12\x91\xfb\x20\x39\x00\x41\xfb\x3a\xbe\x4b\xcf\xb0\x18\xd6\x17\x15\xfe\xe2\xe2\x3c\x85\xf3\x10\xc5\x3b\x35\xd8\xb9\xd9\x61\xc9\xad\x86\x97\xb7\x2a\x0f\x24\x8e\xe1\xe0\xf4\xbc\x08\x53\xfa\x40\xe7\xd7\xb9\x15\x98\xe3\x28\x63\x80\x90\xc6\x22\x23\x0d\x2d\xd0\x24\x34\x09\x14\x13\x34\xc6\x77\xce\x42\x68\x8b\x11\xb4\xcf\x34\x96\x09\x09\x2c\x24\x5e\x8f\x79\xd6\xff\xaf\x16\x89\x7a\x59\x80\xe5\x39\x1a\x13\xbc\xba\x41\x69\xcf\x3a\xfc\x15\x1d\xfe\x92\x9e\x64\x0d\x93\xa2\x40\x63\xb3\x38\x0b\x6a\xf3\xd3\x57\x3f\x2f\xe9\x11\xe0\x8d\xd2\x80\xb7\xac\x69\x6b\x3c\x03\x11\xb4\xdf\xc5\xec\x81\x2d\x7a\xa5\x74\x34\xbd\x29\x09\xb9\xac\x07\x68\x15\x8f\xc2\xdf\x78\xa1\x2d\xbb\x42\x50\x51\x68\x87\x50\x8b\x2b\xdc\xc0\x33\x0f\x69\x7b\x56\x7f\x25\x60\xf5\xdb\xb3\x45\xba\x9f\xdf\x54\xa8\x11\x9e\xd1\xb0\x67\x81\xc1\x2e\x3d\x7b\x14\x18\xed\xa7\x67\xd4\xbb\x9d\xd5\xa2\x2c\x51\x7b\x2c\x34\x7f\xf9\xbc\x43\xf1\xfc\x0b\x50\x9a\xf4\x20\xd5\x80\x88\x27\x4d\xeb\x18\x3c\x1d\xf9\x84\xf1\x9f\xbe\xfa\xf9\x00\xd7\x63\xbd\x81\x90\x1c\x6f\xe1\x2b\x10\x32\x68\xa8\x55\xfc\x0b\x72\x7f\x9a\x61\x27\x2d\xbb\xa5\xb9\xf2\x4a\x19\x5c\xd6\xb0\x92\xf5\x8e\x24\xaf\xd8\x35\x82\x51\x0d\xc2\x0d\xd6\xf5\x2a\x24\x02\x0e\x37\x6c\x47\xba\x48\x4b\x48\xd6\xc7\xa0\x65\xda\xde\x61\xbd\x09\x1c\x7d\xf8\xfe\xd5\xf7\x9b\xc0\x1d\x99\x57\x29\x89\x25\x4a\xb0\x85\x20\xb8\x43\x38\x27\x24\x6d\x6f\x9b\x62\x1a\xd6\xd3\x65\x5c\x30\x26\x8a\xef\x15\x93\x25\x06\xa9\x11\x0a\x47\xa9\x34\x3b\x7d\xa8\x87\xef\xa3\x97\xe1\x35\x83\x64\xf6\x03\xcb\x7f\x09\x0f\xdc\x4b\x44\x5f\xb1\x1c\x25\xe2\xbb\x81\xed\x1f\x14\x91\xca\x59\x2d\xd1\xa2\x97\x92\xab\xdc\x90\x80\x39\xb6\xd6\xac\xd5\x35\xea\x6b\x81\x37\xeb\x1b\xa5\xaf\x84\x2c\x57\x64\xac\xab\x60\x11\x66\xed\x4b\x9e\xf5\x67\xfe\xcf\xa3\x24\xf2\x55\xc9\xf1\x62\xf9\xe1\x7f\x84\x6c\x34\x8f\x59\x3f\x58\xb4\x94\xe8\xef\x93\xf9\x4e\x2f\x23\x74\xd8\x7f\x9b\xdc\x25\x60\xa7\x58\xd3\xc4\x48\xbc\xe8\x66\xbe\xd6\xe5\x21\x84\x33\xb9\xfb\xe8\xe6\x4d\x8a\x75\x9a\x78\xda\xad\x22\x58\x58\x31\xc9\xe9\xdf\x46\x18\x4b\xf7\x1f\xac\x49\x27\x8e\x74\xec\x1f\xce\x5f\xfd\x31\x46\xef\xc4\x83\xbd\x78\x16\xd7\x77\xe2\xec\x15\x01\xb3\x62\x3e\xf3\xd8\x2d\xa6\x90\x00\xf1\x7b\x10\x4a\x14\x7a\x24\x90\xd7\xca\xf1\x95\x90\x62\x3a\x55\x20\xeb\x91\x26\x04\xe2\x26\x83\xf3\x02\xa4\xa8\xcf\x86\x78\x3b\x81\x14\x8d\x0d\x61\x94\x18\xac\xe3\xb6\xce\x2c\x55\x8f\x48\x32\xf8\x9b\x84\x57\x54\xe4\xe5\x54\x7c\x6d\x42\x36\x0b\xd9\xa1\x62\x06\xb6\x88\x84\x74\xd3\x73\xa2\x7b\xfd\x9c\xd5\x6d\xc5\xbe\x9e\x87\x90\x92\xc3\x8d\xa8\x6b\x2a\xe8\x34\x36\xea\x3a\xbc\xc3\x62\xda\x48\x78\x31\x83\xcb\x1b\x61\xc9\x4d\x14\x90\x9a\x2e\x31\xd7\xe8\xb7\x4a\xb2\xb9\x74\x7c\x70\xad\xf8\xe8\xfd\x3b\x97\x65\x3c\x5d\xda\x07\x19\x82\x10\xe3\x9f\x06\x04\x62\xac\xd2\x33\xc5\x0f\x44\xe8\x31\x5e\xd0\xb8\x40\xc7\xad\xcf\x22\xcd\xb8\x66\x71\x7d\xee\xa7\x8d\x45\xab\x8d\x7b\x5b\x73\x1a\x1a\x17\x51\xfd\xb8\x39\xd5\xc4\xc7\x21\xba\x45\xb8\xb9\xc5\x5a\xc9\x72\xaa\x23\xab\xf6\x99\x6f\x84\xfc\x0e\x65\x69\xab\xb4\x6f\x77\x84\x4c\x05\x13\xb5\xd3\xf8\x4a\x91\xda\x0e\xb2\xfe\x66\x38\x32\x31\x1f\x5f\x07\x1e\xee\x0e\xf6\xb8\x92\x99\x4e\x2b\x4e\x8d\xd1\xd4\x33\x78\xeb\x8c\x85\x86\x91\xa5\x32\xb8\xc2\x5d\xf2\xab\xd1\x5c\x14\xc2\xdb\x60\x29\x9c\xa0\xf2\x5c\x99\x16\xf5\x9f\x70\xda\xb1\xd2\x0b\x59\x68\x16\x6a\x72\xa7\x71\xa6\x0a\x1e\x69\xe0\x7c\x7f\x74\xaa\x84\x7f\x71\x7e\x67\x61\xaf\x24\xce\xfd\x3e\x7b\x97\xc2\x26\x3c\xab\x82\x86\x73\xd8\xee\x08\x61\x8e\x59\xe9\xaa\xe8\xfb\xd4\xf2\x87\xeb\xcb\xc7\xd4\x96\x07\x03\xc4\xc1\x9a\xf2\x51\xf5\x24\xb0\x79\x37\x7e\x70\x2d\x19\x78\x9d\x8f\xac\xbf\x7f\x1d\xf9\xfb\xd7\x90\x1f\xa3\x7e\xfc\x28\xb5\xe3\x47\xab\x1b\x1f\x51\x33\xfa\xda\x70\x69\xcf\xe8\x01\xf5\xe2\xa0\x2e\x9c\xa5\x7a\xdf\x5a\x71\x5a\x13\xce\x92\xbd\xbb\x4e\x3c\xe8\xad\x4b\xf5\xe1\xa7\x5f\x1b\x1e\x14\x6b\xa9\x26\xfc\xe4\xea\xc1\x3b\xa5\x58\xac\x03\x3f\xc9\x1a\xf0\xa0\x38\x47\xd4\x7e\x8f\xab\xfb\x96\x76\x58\xfe\x17\x6a\xbe\x83\x9a\x5b\xa8\xf5\x3e\xb1\x3a\xef\x21\x48\xb9\xef\xd3\x1f\xc4\x5a\x7d\x73\x3e\x41\x4d\xc1\x49\xe7\x85\xc8\x43\x7b\xa0\x97\x3d\x01\xce\x48\x79\x9a\x90\xb6\x3b\x3f\xae\x83\x54\xc3\x22\xac\xe9\x11\xe8\x70\x0c\x91\x67\x06\x0c\xfa\xb4\x31\xc5\xde\x94\x1b\x15\xef\xd2\x79\xae\xb4\x46\xd3\xaa\x50\x59\xf8\xe4\xd9\x77\xd9\x47\xf3\x09\xd3\xe1\xc5\x39\x3e\x2b\x51\x56\xa8\xa1\x26\xe3\xa3\x84\x69\x5c\x43\xe9\x58\x15\xc3\xee\x79\x06\xaf\x03\xaa\x00\x67\x10\x72\x66\x7c\x32\x8d\x03\xa6\xa8\xd0\x59\x65\x72\x56\xa7\x8c\x39\x20\x44\x22\xf6\x5a\x79\x59\x23\x93\x2b\xd7\x42\xad\x4a\x91\xa7\x3c\xd3\xbf\x3e\xd3\x3b\x6a\x5a\xa6\xd1\xf4\x6d\x6d\xab\xbc\x5a\xfc\x3f\x0a\x9f\x42\x9c\xed\x9f\x32\xdb\xeb\xd7\x7b\xf3\x0c\x45\xc2\x34\x94\x23\x4b\x24\x90\x54\x92\xff\x10\x46\x66\x06\xbe\xed\xac\x38\xcc\x91\xc1\x5f\xa6\xe2\x4c\xa5\x87\x12\x25\x6a\x91\x13\x2b\x2b\x55\xac\xac\xc6\xc1\x32\x17\x4a\x0f\x24\x3c\xdb\x4b\xc8\x87\x56\x6a\xa0\x56\xab\xa8\x1c\x67\xdb\x1a\x3b\x24\xc1\xfa\x29\xc8\xbb\x92\xa9\xd6\xc2\x78\xe4\xd0\x1d\x7e\x99\x50\x7e\x21\x95\xf5\x16\x10\x47\x06\x75\x0a\x03\xbf\x38\xd4\x84\x94\xba\x76\xf0\xd5\x37\x86\x10\xbf\xf1\x5d\xe3\x88\x26\x50\x02\x5b\x58\x26\x61\x94\x07\x20\x5c\x49\x1c\x2d\x8f\x93\x03\x3d\xf7\x6b\x25\x39\x30\x4d\xce\xa5\xaf\x66\x14\x40\x7a\xe3\x58\xa3\x1d\x5b\x77\xda\x9a\x30\x68\x93\xd7\xb1\xdc\xba\xd0\x80\x23\x92\xd1\xa4\xa9\xe8\x99\xd0\x1c\xd9\x3e\xf9\x3a\x55\x39\x1e\xd0\x8e\x94\x4d\xe0\x33\xcd\xe3\xcf\x19\x14\xcc\xe3\x32\x32\xee\xa5\xba\x30\x19\x7b\xb2\x85\xa5\xea\x6a\x31\xa0\x5d\xcf\x67\xb0\x51\xc8\x9a\x3b\x8e\x91\x9a\xce\x03\xe3\xed\xb6\x68\x7a\xbd\x4d\xd8\xa6\xe0\x81\x4c\xda\x68\x5a\xa9\xe1\x59\xef\xc8\xe3\x7d\xc5\x38\xed\xb7\x4e\x8c\x69\x41\x98\x64\xd4\x43\x59\x56\x3d\xbd\xd1\xdd\xc1\xb6\xc6\xe8\xfe\xa4\x6e\x3e\xd9\x9f\x76\xbf\x63\x1f\xce\xd5\x9c\x2c\xa8\x2e\xf5\xec\xc3\x01\xaa\xa1\x02\xd5\xd6\x1b\xf8\x83\xda\xf6\x8c\x73\x8d\xc6\x4c\x4b\xe5\x71\x29\x9c\x46\x85\x6a\x3e\x39\x5e\xf7\x32\x30\x43\xe0\x1d\x79\x2a\x8a\x52\x58\x9f\xac\xda\x38\xcc\xe7\xaa\x1d\xf9\xeb\x42\x81\xdf\x83\x99\x7d\x82\xc2\x62\x33\x53\xe5\xcf\x29\x2e\xca\xd0\xef\x86\x12\x00\xd0\x4d\xc8\x94\xe9\xf0\x11\x85\x92\x53\x93\x04\x9b\xb2\x7f\xb8\x7d\x1d\x5f\x9b\xdf\x81\x1e\xf1\xf4\x61\x90\x93\x17\x27\x83\x23\xb7\x88\xef\x9e\xee\xed\x78\x2a\xff\xda\x19\x50\x94\x53\x05\xfc\x49\x19\x4b\x20\xe6\x0c\x5e\xdf\x86\x23\x49\xe7\x17\x0b\x1b\xd6\x4a\xc3\xb9\x4c\x63\x1e\xc0\xf0\x9c\x5f\x85\x6b\x95\x78\x9b\x79\x42\x24\xa7\xf0\x62\x79\x73\x3c\x3c\x62\x5a\xb3\x71\x00\xed\xfc\xf7\x3d\x32\xbe\x3b\xee\x9c\x8a\x1f\x9a\xe0\x55\xe7\x5f\xe3\x7d\xd7\xc3\x91\x72\xab\x14\x81\x86\xb9\x1d\xc5\xb7\x68\x0c\x2b\x0f\xef\x86\x3e\x7b\x33\x1a\x3b\x4a\x1f\x11\x7e\xf8\x4d\x84\xb8\xe3\xe0\xf7\x29\x66\x10\x3f\x03\x1b\x8e\x5a\xd6\xc4\xee\xb6\xc6\xc6\x9f\x56\x93\xb9\xa8\xd3\x69\xac\xce\x48\xd2\xfe\x79\xbf\x41\xd4\x28\x3d\x5d\x81\x6b\xd4\x5b\x65\xb0\xdb\x55\x72\xc2\xfa\xfc\x4e\xbe\x54\xab\xb2\xf4\x1b\x01\x92\x43\xe5\x1a\x26\x63\x56\xf3\x42\xf9\x0d\xff\x0f\xfb\xa7\xbd\xa0\x3b\xae\x10\xf7\xa7\xe2\x99\x2c\x12\xd4\xbb\xa7\x66\xd2\x08\x2b\xae\x11\x50\x6b\x7f\x5a\x85\x24\x1e\x1e\x38\x81\x82\x6a\xb0\x19\x24\x4a\xe3\x34\x02\xde\xb6\x98\xdb\x10\xa5\xb6\x08\x85\xb8\x25\xd8\xe4\xac\xa2\x28\x90\xfb\xdc\x41\x58\x1f\xac\x68\x10\x3e\xf7\x59\x95\x22\xab\x98\xdb\x98\x74\x96\x95\x68\xbe\x38\x83\xad\xeb\xb7\xe3\x84\xe4\x84\xbd\xe3\x89\x1d\xa3\x1a\xb4\x15\xa9\x81\x62\x9e\x93\x9c\x35\x28\xad\x9f\xe6\x46\xab\x19\xf7\x88\x87\x4f\xbb\xa5\x38\x0d\xdb\x3f\x10\x83\xd3\xf8\xec\xcf\x60\xcb\x29\x48\xef\x8f\x10\xce\x0b\xdf\x30\xe9\x58\x1d\xa0\x40\x2c\xcb\x86\xd8\xad\x03\xcb\x1e\x45\x77\x86\x12\xd4\x3c\xe5\xd2\xaf\x8e\x47\x16\x61\xe3\x30\x57\xcd\xd6\x1f\xe2\x55\xd2\x13\x30\x68\xad\x90\xa5\x49\xf6\x49\x32\x9c\xc5\x33\x8c\x9e\x9f\xa9\x75\x6a\x04\x27\x8d\x6b\x5b\xa5\x6d\x48\xde\xfb\xb2\x45\x1d\x84\x12\xc2\x08\x32\xb4\xc1\xc2\x0b\x6b\xb0\x9e\x9e\x4e\xd8\x22\x69\x3f\xd7\x22\x2d\x6f\x23\x4c\x77\x54\x8c\x7b\x3b\x7c\x21\x77\xd1\xb4\xc8\x89\x86\x96\xa5\xf2\xdc\x4d\x01\x3d\x77\x3a\x39\x4c\xe7\x40\xdd\x82\xbc\x4d\xd0\x30\x67\xd2\xe3\x5d\xce\x03\x30\xf7\x2e\x9a\xb6\x0c\x27\x34\x93\xe7\xc5\x4a\x89\x49\xbe\x8e\x3e\x14\x5a\x57\x63\x5d\x9c\x1a\xb2\xbe\xd6\xd9\x49\x9f\xea\xae\x0e\xc6\x7b\x64\xe6\x0e\x80\x96\xc2\x4d\x18\x7a\x64\xb4\x99\x01\xd4\x8f\x89\x36\xc6\xe5\xb9\x90\x33\x3d\xcf\xb0\x7d\x3b\x0a\x34\x29\x89\x7a\xd3\x6e\x35\x86\xa3\xbb\x5d\x84\x99\x44\x94\x19\x13\xb9\x7f\x84\x99\x46\x94\x99\xce\xd3\x3d\x23\xcc\x7c\x44\x99\xa2\xde\x7b\x45\x98\x99\x88\x32\xa1\x78\xdf\x08\xb3\x18\x51\xe6\x10\xfa\x51\x11\xe6\x70\x44\x99\xe9\x09\xdd\x1d\x61\x8e\x88\x28\x53\xba\x47\x44\x98\xbb\x22\xca\x84\xe8\xdd\x11\xe6\xb8\x88\x32\xad\xda\x0e\x45\x98\x63\x22\xca\x4c\x0d\xfc\x88\x08\xb3\x5f\xed\xdc\x05\xb0\xf6\xfb\x84\x4b\x28\x6b\x4c\x77\x0e\x8f\xdf\x13\x7a\xd5\xcc\xd8\x1f\xc2\x31\xef\x83\x0c\x7e\xd7\x8f\xeb\xb6\xd5\xd0\xc0\x4d\x85\xc1\xe4\xfc\x77\x2e\x89\xcb\xa4\x6e\x22\x3e\x0d\x05\x31\xac\x28\x39\x35\x90\x50\x81\x6c\x80\xe6\x59\x51\x50\x38\x56\xdf\xf1\xd3\x96\x83\x22\xbc\x0b\x63\x42\x78\x8d\xc7\xe2\x55\x74\x83\xe1\x5e\x9c\xff\x10\x46\x14\x20\x2c\xe0\xad\x30\x76\x52\x8a\x3c\x35\x54\x9f\x1a\xaa\x4f\x0d\xd5\xa7\x86\xea\x53\x43\x75\x7c\x3d\x35\x54\x9f\x1a\xaa\xfd\xf5\xd4\x50\xfd\x74\x1b\xaa\x04\xd6\x0e\xf7\x52\x3d\x9c\xeb\x3f\x35\x0c\xd9\xc7\x6b\xd8\xf6\x58\xaf\xdb\xb2\xf5\x0d\x1b\x2a\x34\x27\x0c\xbe\xce\xca\x2c\x9d\x9f\x3c\x83\xf8\x2d\xf3\xd9\xf0\x43\xe7\x33\xe8\xbf\x6c\xfe\x28\xcd\x95\x94\xe1\xc6\x42\x0c\x90\xd7\xa0\xd3\xa2\x03\x83\xd3\x62\x48\x2e\x00\xc5\x98\xe7\xf6\xba\x2f\xcc\xff\xf2\xc5\xdd\xd6\x6d\xb7\xf5\xac\x79\xb5\xe9\xeb\xef\x6e\xbf\xdf\x23\xcf\x71\xc9\x92\xc1\xb9\x25\xea\x01\x6e\x51\xbd\x1c\x1b\x3b\xbe\x2e\x9e\x12\x35\x58\xb8\xda\x97\xef\x28\xf9\xca\x19\xd4\xf0\xc3\x5f\x03\x9a\xf5\xdf\xff\xc5\x05\x3d\x52\xd1\x33\x16\xb4\x77\xab\xff\x8a\xbf\x3f\x83\x1c\xef\xc5\xaf\xee\xc3\xc7\xe2\xa3\x23\xca\xa1\x3f\xb3\x01\xab\x5d\xc8\xaf\xc6\x2a\xcd\x4a\x8c\x77\xfa\xce\x0f\x01\xc2\xd6\x22\x1f\x7c\xb1\x1d\x3e\x01\x7f\x16\x90\x49\xfa\xc6\xdb\xff\xcc\x69\x59\xc2\x7f\x3f\x00\x3f\xfd\x7c\x02\xf1\xfc\xe7\x8f\x89\x1b\xba\xf9\x9f\x00\x00\x00\xff\xff\xff\x19\xa6\x71\xfd\x40\x00\x00"), + }, + "/cluster.x-k8s.io_machinesets.yaml": &vfsgen۰CompressedFileInfo{ + name: "cluster.x-k8s.io_machinesets.yaml", + modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + uncompressedSize: 25364, + + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x3d\xed\x6e\x1c\x37\x92\xff\xf5\x14\x85\xd9\x1f\xb2\x81\x99\x91\xed\xec\x1d\xf6\xf4\x4f\x6b\x39\x81\x6e\x6d\xd9\xb0\xb4\x39\x1c\xe2\xe0\xc0\xe9\xae\x99\xe1\xa9\x9b\xec\x90\x6c\x8d\x26\x41\x80\x7b\x8d\x7b\xbd\x7b\x92\x43\x15\xc9\xfe\x98\xe9\x2f\x29\x72\x76\xd3\x7f\x62\xf5\xb0\x8b\xc5\xfa\xae\x62\x91\x39\x59\x2c\x16\x27\xa2\x90\xdf\xa3\xb1\x52\xab\x73\x10\x85\xc4\x07\x87\x8a\xfe\xb2\xcb\xbb\xbf\xd8\xa5\xd4\x67\xf7\xaf\x57\xe8\xc4\xeb\x93\x3b\xa9\xd2\x73\x78\x5b\x5a\xa7\xf3\xcf\x68\x75\x69\x12\xbc\xc4\xb5\x54\xd2\x49\xad\x4e\x72\x74\x22\x15\x4e\x9c\x9f\x00\x08\xa5\xb4\x13\xf4\xda\xd2\x9f\x00\x89\x56\xce\xe8\x2c\x43\xb3\xd8\xa0\x5a\xde\x95\x2b\x5c\x95\x32\x4b\xd1\xf0\x0c\x71\xfe\xfb\x57\xcb\x6f\x96\xaf\x4e\x00\x12\x83\xfc\xf9\xad\xcc\xd1\x3a\x91\x17\xe7\xa0\xca\x2c\x3b\x01\x50\x22\xc7\x73\xc8\x45\xb2\x95\x0a\x2d\x3a\xbb\x4c\xb2\xd2\x3a\x34\xcb\x87\x85\x47\xf8\xc4\x16\x98\x30\x16\x69\xca\xa8\x89\xec\x93\x91\xca\xa1\x79\xab\xb3\x32\xf7\x28\x2d\xe0\xdf\x6f\x3e\x5e\x7f\x12\x6e\x7b\x0e\x4b\xeb\x84\x2b\xed\xd2\x60\x91\xc9\x44\x58\xc6\x38\x45\x9b\x18\x59\x38\xc6\xeb\x56\x3b\x91\x81\x2a\xf3\x15\x1a\xd0\x6b\x50\x5a\x2d\x1c\x9a\x5c\x2a\xe1\x30\xad\xb0\x01\x27\xcc\x06\xe9\xcd\x6a\x0f\x6e\x2b\x6d\x03\x4f\x06\xea\x91\xff\xdc\x9c\xc7\xed\x0b\x3c\x07\x42\x6f\x83\xa6\x07\x31\x71\x2f\x64\x26\x56\x19\x7e\x9e\x8c\x61\xf5\x49\x8d\xdc\x0b\x83\x22\xdd\xc3\x5a\x1b\x10\x0e\x32\x14\xd6\x41\x2e\xd5\x67\x7a\x7b\x83\x89\x56\xa9\x7d\xd9\xc0\xf2\x22\x42\x98\x8c\x26\xc3\x9f\x8e\xa2\x47\x67\x0a\xed\x96\x2d\xe2\x89\x74\xdf\x89\xd2\xc6\xe8\xb2\x38\x87\x23\x71\xf0\x5f\x46\x41\x14\x0e\x37\xda\xc8\xf8\xf7\x22\x8e\x5f\x88\x42\xf2\x1b\x2f\xe6\x1f\xfc\xe4\x37\x81\x71\x99\xb4\xee\x6f\x07\x3f\xbc\x97\xd6\xff\x58\x64\xa5\x11\x59\x4b\x28\xf9\xbd\xdd\x6a\xe3\xae\xeb\xb9\x17\x90\x87\x1f\xa4\xda\x94\x99\x30\xe7\x6d\xf9\xb0\x89\xa6\x15\xf1\x17\x85\x48\x30\xa5\x77\xe5\xca\x04\x5d\x0b\x50\x6c\x22\x32\xf4\xff\x04\xc8\xc4\x0a\xb3\x1b\xcc\x30\x71\xda\xb4\xb9\x61\xc3\xdb\x30\x92\x94\x22\xf2\x26\x0e\x2c\x30\x69\x0b\x3d\x80\xff\xf8\x70\x60\x87\x7e\xf8\x77\xe7\xf0\xcb\xaf\x27\x00\xf7\x22\x93\x29\x2b\xac\x47\x4c\x17\xa8\x2e\x3e\x5d\x7d\xff\xcd\x4d\xb2\xc5\x5c\x44\x6c\x5b\xe2\x50\x13\x12\xa4\x05\xb7\x45\xf0\x83\x59\x40\xe9\xcf\x06\x39\xe1\xe2\xd3\x55\x80\x51\x18\x5d\xa0\x71\x15\x03\xe9\x69\x98\xb0\xea\xdd\xc1\x6c\xa7\x84\x8e\x1f\x03\x29\x19\x2d\xf4\x73\x06\xd3\x83\x29\x58\x3f\xbb\x5e\x7b\xe9\x33\x58\x18\xb4\xa8\xbc\x19\x6b\x80\x05\x56\x2f\x05\x7a\xf5\xdf\x98\xb8\x25\xdc\xa0\x21\x20\xc4\xed\x32\x4b\xc9\xd2\xdd\xa3\x71\x60\x30\xd1\x1b\x25\x7f\xae\x20\x5b\x70\x9a\xa7\xcc\x84\xc3\x20\x39\xf1\x61\xeb\xa4\x44\x46\x84\x2c\x71\x0e\x42\x91\x51\xd9\x83\x41\x9a\x03\x4a\xd5\x80\xc6\x43\xec\x12\x3e\x68\x83\x20\xd5\x5a\x9f\xc3\xd6\xb9\xc2\x9e\x9f\x9d\x6d\xa4\x8b\x46\x3b\xd1\x79\x5e\x2a\xe9\xf6\x67\x6c\x7a\xe5\xaa\x74\xda\xd8\xb3\x14\xef\x31\x3b\xb3\x72\xb3\x10\x26\xd9\x4a\x87\x89\x2b\x0d\x9e\x89\x42\x2e\x18\x71\xc5\x36\x7b\x99\xa7\x7f\xaa\xa4\xee\xb4\x81\xa9\x57\x39\xeb\x8c\x54\x9b\xea\x35\x2b\x4c\x2f\xdd\x49\x6b\x88\xc1\x22\x7c\xe6\xf1\xaf\xc9\x4b\xaf\x88\x2a\x9f\xdf\xdd\xdc\x42\x9c\x94\x59\xd0\xa6\x39\x53\xbb\xfe\xcc\xd6\x84\x27\x42\x49\xb5\x46\xe3\x19\xb7\x36\x3a\x67\x88\xa8\xd2\x42\x4b\xe5\xf8\x8f\x24\x93\xa8\xda\x44\xb7\xe5\x2a\x97\x8e\x38\xfd\x53\x89\xd6\x11\x7f\x96\xf0\x96\x5d\x17\xac\x10\xca\x22\x25\xe3\xbe\x84\x2b\x05\x6f\x45\x8e\xd9\x5b\x61\xf1\xab\x93\x9d\x28\x6c\x17\x44\xd2\x71\xc2\x37\x3d\x6e\x7b\xa0\xa7\x56\xf5\x3a\x3a\xc4\x4e\x0e\xd5\x7a\x78\x53\x60\xd2\x52\x8e\x14\xad\x34\x24\xc0\x4e\x38\x24\xb1\x3f\xb0\x8a\xfd\x1a\x49\x4f\x30\xac\x64\xce\xda\x3f\x1c\x20\xf0\xb6\x1e\x17\x2d\x01\x19\x6c\xaf\x89\x18\x7f\xf6\xcc\x0d\x62\xb0\xc2\x4c\xab\x8d\x3d\x80\x0a\xc4\xc1\x83\x77\xb9\x54\xef\x51\x6d\xc8\x8c\xbd\x3e\xf8\xa9\x93\xa6\x1e\xbb\x0c\x1d\x7e\xd2\x99\x4c\xf6\x83\x98\x5f\x36\x06\xb6\x08\x57\xf8\x57\xa5\xc5\x94\xb4\x5e\xa6\xc4\xe1\xf5\x1e\x94\x4e\xb1\x0b\xeb\x30\x25\xec\xb6\xa8\x20\xd5\x3b\x45\x46\x5e\xaa\xcd\x12\x2e\x71\x2d\xca\x8c\x85\x13\x66\x9f\x85\x4a\x75\x3e\x5b\x02\x7c\x4f\x06\x37\x98\x02\x10\x06\x8f\x60\x86\xb1\x73\x98\x5d\xe3\x0e\xad\x9b\xcd\x61\xf6\x31\x4b\xe9\x5f\x07\x63\x51\x95\xf9\xe1\x2a\x17\xe0\x3f\x3f\x7a\xed\x81\x1d\xbd\xf6\x90\xa7\xd2\xf7\x20\xe8\x18\x24\xf1\x87\xf6\xd8\x28\x20\xb9\x54\x32\x2f\xf3\x46\x34\x61\xc3\x00\xf2\x1e\xbb\xad\x4c\xb6\x47\x24\x11\xa0\x70\x97\xed\x7d\x6c\x59\x47\x6d\xd1\x70\xaf\xd0\x47\x24\x6d\x9a\xbf\x82\x17\x71\xdc\x4e\x72\x00\xda\x7e\x56\x48\x16\xdf\xca\x14\x49\x51\xea\xa8\x4b\x58\xb0\x5a\x2b\xfa\xaf\x64\x07\xc7\xb0\x5f\x1e\x7c\xbf\xd6\x26\x17\x8e\x83\x98\x6f\xde\x74\x92\xaf\x0e\x6f\xea\x27\xfa\xe1\x41\xc2\x45\x17\x5e\xa9\x54\x45\xa9\xa8\xd5\x11\xcc\x12\x6e\x49\xb5\xd8\x46\xb3\xc1\x3c\x98\x0e\x82\x88\x4a\x4b\xc6\xba\x94\x76\x0b\x2b\x74\x3b\x44\x05\xf8\x40\x20\xa4\x83\x9f\xd1\x68\xf6\x5a\xa5\x22\x63\x23\xd7\x92\x2c\x67\x83\x90\x47\x10\x5f\x1f\x6a\xea\xd3\x68\x11\xa3\x9c\x41\x5a\x9c\xc6\x08\xc9\x2f\x92\x83\x26\xf8\xa9\x44\xb3\x07\x7d\x8f\xa6\x11\x83\x6e\x85\x8b\xf2\x90\x0b\xd7\x21\x44\x44\xca\x40\x38\x48\x74\xa9\xdc\x12\xde\x33\xb8\x3b\xdc\x5b\xa6\x40\x50\x4a\x06\x95\x97\x14\x63\x13\x20\x90\x0a\xb4\x49\xbb\x49\xeb\x85\xc8\x27\x48\x75\xfc\x5b\x1b\xdb\x25\x5c\xb5\x60\x35\xa2\x23\x70\x98\x17\x14\x51\x9c\x9e\x1e\x1b\x16\x5e\x68\x77\xa8\x40\x19\x98\x51\xe8\x90\xdd\x56\xaa\x13\x4b\x1e\x2b\xc1\xc2\xd9\x33\xa2\xc9\xbd\xc4\xdd\xd9\x4e\x9b\x3b\xa9\x36\x8b\x9d\x74\xdb\x85\x37\xbd\xf6\xcc\x03\x3d\xfb\x13\xff\x77\x11\xe9\xdf\xf2\x56\x30\xe0\x15\xe8\xe1\x55\xbc\x7b\x20\x57\x6e\xeb\x1c\x71\x80\x81\x87\x1f\x04\x3e\x4a\xeb\x48\xa0\x3d\x3f\x23\x26\xec\xcf\xa5\xc1\x9c\xa3\x84\x0e\xc8\x00\xb7\xcc\xc4\x7a\x14\x59\x50\xb8\xb8\xbe\xc4\xb4\x6b\xbc\x74\x98\x77\xa2\x78\x80\xe4\xc5\x00\x22\x21\x02\x8a\xbf\xb0\x70\x10\xcb\x85\x54\xc7\x6c\xf3\x8f\x97\xa3\x39\x08\x12\x2d\x1f\x12\x52\xd4\x59\xa0\x11\x15\x08\x83\x1c\x4c\xb2\x40\xdc\xe1\xbe\x21\x7f\xdd\x0b\x1f\x62\x8a\x7f\xee\xf0\xc8\xe5\xf5\x2c\x97\xe6\x0b\xb6\x25\x8b\x1a\xe0\xb1\xa2\x57\xd5\x52\x45\x51\x64\xb2\xc3\xe9\xd5\xcf\xb1\xd3\x6e\xfc\xd6\xe7\x43\xea\x27\x52\x64\x22\xda\x15\x01\xeb\x50\xd2\x93\xf8\xd4\x7a\x72\x92\x7c\x6d\x65\x41\x7a\x29\x06\xb0\xb6\xc8\xb2\x17\xa3\x71\xef\x90\x23\x70\x2f\x51\x57\x6a\x0e\xd7\xda\xd1\x7f\xde\x3d\x48\x8a\x30\x85\x4a\x07\x40\x5e\x6a\xb4\xd7\xda\xf1\xd8\xdf\x44\x12\x8f\xd4\x44\x82\x04\x7b\x45\x02\xaa\x40\x18\x23\xf6\xec\x4e\x1b\xc1\xba\x5d\xc2\x95\x8f\xc5\xe2\xfa\x06\x16\x21\x2d\x05\xcc\xda\xc4\x95\x73\x92\x15\xe3\x14\x02\xce\x76\x6c\x85\x5c\x43\xc1\xbc\x70\xfb\x08\x7d\x00\x68\xc5\x34\x69\x23\x29\xb5\x69\xd1\xab\x67\xa2\x01\x98\x2b\x84\x30\x3d\xbb\x3f\xff\x8d\x4f\xfc\x32\x4a\xbe\x21\x2d\x99\x04\x9c\xb8\x08\x87\x1b\x99\x40\x8e\x66\x33\x84\x67\x41\x76\xaa\x9f\x75\x03\x96\xc4\x3f\x13\x78\x1b\x07\x31\xbe\x9d\x63\x82\xd9\x49\xbb\x27\x5a\x90\xac\xf7\xfc\x32\xc8\xde\xce\xcc\x62\x1a\x56\x6c\xbe\xd9\x4d\x76\xae\xbe\x59\xa7\x1b\xb6\x4f\x23\xf4\x39\xf6\x19\x7e\x52\x6f\x7d\x73\x51\x90\x64\xff\x42\xe6\x94\x05\xe5\x57\x28\x84\x34\x76\x09\x17\x5c\x91\xc9\xba\x39\xdb\x1c\x2f\x55\xf0\xbd\x35\x68\x82\x2a\x2d\x10\xcd\xef\x45\x46\xa6\x9e\x0c\x87\x02\xcc\xd8\xf0\x77\x82\xd4\xeb\x23\x8f\x36\x87\xdd\x56\x5b\x6f\xc5\xd7\x12\x33\xce\x99\x67\x77\xb8\x9f\xcd\x5b\x9a\x07\xb2\xdb\x94\xce\xae\xd4\xcc\x3b\x89\x23\x3d\x88\x7e\x06\xb4\xca\xf6\x30\xe3\xdf\x66\xcb\x23\x27\xd8\x09\x76\xd0\x31\x0e\x48\x44\xef\x4f\x31\x5c\x19\x8c\xd7\x6e\xc3\xa0\xe8\x5f\x42\xd6\xc7\xce\xc5\x0f\x5c\x05\xa7\x57\x45\x41\x5b\x71\x4c\x6a\x0a\xd8\x39\xb6\x0a\x01\xbf\x5c\x83\x54\xb6\x5c\xaf\x65\x22\x89\x51\x31\x00\xe6\x55\xa6\x48\x59\x39\x45\xad\x1f\x63\xa9\x61\x8d\x06\x55\xd2\x9d\xb0\x25\x5c\x06\xaf\x0a\x16\xb6\xf1\x2f\x82\xe6\xc2\x94\xc2\x56\x2b\x3e\x72\xc9\x83\x11\x52\x47\x6a\xdf\x49\xaa\xd3\x1b\x27\x54\x2a\x4c\x1a\x88\x74\x7a\x6a\xab\x8f\xbf\x7a\xb1\x22\x4e\x74\x18\xfb\x8d\xad\x8e\x9e\xa3\x2d\x82\x8e\x21\x93\xed\x02\x4c\xb3\x9d\x07\x15\xc1\x1a\x83\xe0\xfd\x4a\x65\x9d\x29\x79\xb9\x29\x6b\xa2\xaf\x55\x91\x8a\x5b\xa7\x0d\xf6\x3b\x6f\x8a\x90\x41\x34\xeb\x57\x14\xfd\x8b\x3d\x89\x1f\x45\x0a\xab\x3d\xe0\x43\xa8\xf1\x39\xad\x33\xce\x2d\x19\x66\x2f\x48\xd2\x65\x83\xce\x48\xbc\x47\x10\x66\x25\x9d\x11\x66\xdf\x60\xee\xed\x96\x22\x3e\x43\x9e\xd4\xf9\x6c\xc6\x67\x9e\x03\x31\x46\x9d\xea\x72\xec\x63\xee\x31\xf5\x35\x87\x5c\xa7\x72\xbd\x27\x77\x17\xc2\xfc\x23\xd9\xe9\xce\x19\x4a\x8b\x66\xb1\x29\x65\x8a\x67\x0d\x86\x76\xc9\x03\x8c\xbb\x10\x80\x0d\x2a\x32\x73\xd8\x55\x33\xea\x64\xe2\xec\xbb\xc6\x17\x81\x8b\xba\xf0\x42\x43\x6b\x5c\xcb\x87\xb9\x2f\xc3\x70\x56\xd5\x4f\x6d\x26\x86\x99\x13\x5b\x22\x12\x20\xa0\x54\xf2\xa7\x32\x94\xa3\x3e\x5e\xbf\xff\x4f\xb8\xfa\x96\xcd\x0e\xcf\xe6\xcd\xf4\x56\xf4\xc7\xb6\xbe\x92\x88\x8a\x94\xe1\x5e\xa6\x5c\x4c\x0c\xe5\xe5\xca\xc6\x13\x72\xf3\xba\xe8\x65\xd0\x95\x46\x0d\x48\x5a\x28\x22\xfb\x7a\x66\x65\xe2\x52\xb9\x66\x6b\xc5\x46\x52\xd5\xe0\x0a\x61\x2d\x4d\x7b\x7b\x58\x4f\x6d\x3e\x5e\xca\x19\x94\xc8\x6c\x48\x47\xf3\x95\x54\x24\x1d\x5e\xb0\x03\x21\xd8\x78\x3e\x78\xdf\x11\xd7\x34\x02\x76\x2b\xbc\xa5\xb6\x84\x4e\xbd\x4f\x00\xa6\xcc\xc8\x56\xda\x03\x7a\xce\x07\xe5\x37\x68\x94\x33\xa5\x4a\x44\xb5\x57\x84\x90\x71\x89\x2f\x56\x0c\x3d\x96\x55\x1c\x44\x24\xcb\xc5\x5d\x3f\xef\x2b\x8f\x19\x97\xa9\x55\xc8\x61\x48\x26\x96\xf0\x45\x1d\xb3\xad\xaa\x72\x0c\xea\x2f\x41\x89\xe2\x94\x7a\x8e\x20\x87\xaf\xf3\xc6\x04\x9e\xf2\xd7\x1f\x6f\x03\xf3\xfb\x21\xc2\x9f\x5f\xfd\x1b\x2c\xc8\x89\x39\x14\xe9\x1c\x64\x10\x00\x94\x6e\x8b\x26\x7c\x0e\x6f\x5e\xbd\x86\xb7\xc1\xff\x68\x03\xff\xf2\xea\xd5\xb0\xd9\xfa\x8c\xc2\x6a\x15\xca\xe9\xb7\x32\x47\x5d\x3a\x90\x2a\x95\x89\x70\x3e\x00\x6e\xaa\x41\xc2\x16\x44\xe9\xfe\xd0\x7a\x85\xb0\xd6\xa5\x4a\x63\xb4\xe4\x64\x8e\x20\xb2\x4c\x3b\x87\x69\x1d\xa3\x04\x09\x0e\x26\x89\x2c\x5d\x77\x58\x4a\xcf\x8b\xa8\xd3\xd9\x1e\xc4\xda\x57\x83\x03\xe0\x80\x28\x56\xd3\x7d\x26\x48\x8b\x0b\x1e\xb5\x45\x91\xa2\x79\xd9\x1f\x91\x7f\x51\x70\xc1\x09\x6a\xea\xa3\x23\xb9\x86\x68\x49\x48\x79\x1b\xb5\xac\xaf\xec\x4a\x65\x8a\x79\xa1\x1d\xaa\x64\x7f\x58\xa0\x8d\xcf\xa8\x83\xcb\x7a\x23\x6c\xf8\xfa\xde\xf4\x83\x8f\xae\x43\xde\xd8\x59\x0d\x4b\x84\xe2\x8d\x15\x3b\x6c\xde\xb4\xd9\x08\x25\x7f\x66\x4f\x56\xed\xd7\xfe\x8c\xf0\x82\xf7\x47\xf9\xad\xaf\x2e\xbc\x6c\x38\xab\x9e\x5c\x08\x62\xf6\x51\x15\x24\xac\xdf\x7a\xe6\xc8\x8f\x0d\x51\xdd\x9a\x60\x03\x6c\x73\x2f\x93\xb8\xc3\xd6\x9f\xcb\x4d\xf7\x8c\x9e\x2f\x4f\x76\x8a\x6a\xaa\x33\x3c\x65\xd1\x8d\xf9\x75\x50\x5a\x52\x71\xa9\x40\xf8\x4d\xf0\x42\x24\xb8\x84\x2b\x5b\x19\xc7\x7e\xd3\x40\x61\x81\x6f\xc3\x50\x9b\x3a\xba\x9d\x83\xc8\xdc\x56\x97\x9b\x2d\x58\xcd\xfe\x2a\x86\xbd\x64\x9b\x49\xcb\x77\x03\xf6\x2b\xe8\xbc\xd3\x71\xd3\xad\x69\x21\x89\x19\x7e\x6b\x55\x14\x14\x3d\x1a\x49\x4e\x98\xd0\xee\x87\x58\x3a\x9d\x0b\x27\x13\xb2\x0c\xcb\x4a\x75\x0b\x23\x73\x61\x24\xe9\xb3\x72\xa8\x52\x4c\x79\x5b\x20\x36\x95\x40\xad\x6c\xc3\xe1\x57\xa2\xd5\x5a\x6e\xca\x80\x5b\x5a\xf5\xba\x74\x6e\x13\xd6\x06\xa2\x17\xe6\x24\x69\x09\x9b\x45\x12\x8d\xfd\x13\xf3\x6c\x58\x70\x06\x54\xb4\xe2\xf8\xb4\x50\xaa\xea\x3b\x68\x6d\x65\xf9\x37\x41\x8a\x50\x24\x5b\xef\x06\x06\x8b\x2b\x95\xf4\x2d\xe1\x42\xf9\x2a\x4b\x8d\xcc\x71\xb6\x4c\xd3\x7c\x99\xa5\x7e\xb3\xe0\x4b\x9f\xf9\x6b\xac\x67\x0e\xab\xd2\x35\x3f\x89\x89\x62\x22\x94\x56\x24\x0d\x07\xdb\xf7\xfd\x0e\xe0\x5a\x3b\x92\xda\x68\x49\x38\x9e\x6e\x06\x0e\x14\xbf\x93\xd9\xe1\x3f\x1a\x4a\x04\x8b\x09\xe1\x84\x6e\x45\x0d\xbe\xaf\x81\x92\xfc\x38\x59\x8c\xde\x42\x1d\xea\x4b\xbf\xeb\xff\x10\x94\x5a\xc0\xe5\xf5\xcd\x7f\xbd\xbf\xf8\xeb\xbb\xf7\x23\x42\x38\x4d\xd8\xaa\xf5\xd8\x27\x7b\x1d\xbd\x53\x68\x3e\x57\xc9\xf2\x24\x59\x7b\x1f\x2a\xf7\x91\x10\x29\x16\x5e\x4d\xe3\xde\x47\x6c\xae\xb8\x5a\xc3\xc5\xfb\xf7\xbd\x64\x89\xdf\x07\xd7\xcf\x1b\x02\x5b\x71\x8f\x3e\xea\xf6\x9b\xaa\x1c\x5d\xd7\x5b\xc7\x81\xe6\xbd\x20\x37\xc2\xac\xc4\x86\xe2\x9c\x2c\x0b\x05\x81\x18\xfc\x05\x08\xdc\x9a\xa4\xc4\xc6\xa3\x2b\x1a\x0e\x64\x3e\x24\x13\x8a\xab\x42\xca\x99\xbd\x47\x57\x5a\x8f\x2f\x23\x14\x1a\x15\xb4\x7f\x3f\x05\x22\x87\x6e\x2c\xf3\xd5\xe0\x20\x67\x94\x6f\x12\x24\x43\xfa\x77\xbb\x45\xc3\x7a\x11\x24\x25\x1f\xf2\x69\x9c\x3b\x68\x85\x7e\x7d\x64\xf7\x6b\xe0\x7d\x2a\x34\x52\xd3\x6c\xb1\xfd\x63\x4b\x54\xea\xc2\x14\x2a\x76\x28\x24\xb7\x26\xf7\xc6\xb6\x63\xc7\xb0\x7e\x32\x74\xb0\xd7\x65\xbd\xaf\x4e\x68\xef\x54\x9d\xbe\xb2\xdd\x69\xbd\x99\x50\x0d\x0e\x42\xc4\x89\x4a\xad\xe7\x22\xb6\x42\xb0\x84\x2a\x37\xa7\x98\x9a\x32\xa4\xd0\x36\xe6\xad\x43\x3f\x9f\x00\x2c\x5b\x38\x13\x82\xca\x06\x68\x66\x57\xbf\x69\x1a\xdf\xac\x81\xde\xde\xa7\xe3\xa7\xbd\x55\xf5\xe9\x2a\x76\x3e\xc5\xa4\x29\x94\xbb\x06\x36\x1e\x60\x6a\x81\x1a\x60\x95\xe9\xe4\x8e\xb9\xcd\x2d\x12\x8f\x43\x8e\xd4\xcd\x94\x38\x87\x8b\xeb\x4b\x0a\xc8\xb9\x02\x48\xb0\xaa\x5c\x72\xb6\xd6\x06\x37\x86\x92\x8c\x08\xbf\xdf\x6b\xf8\x67\x2d\x95\xc8\xe4\xcf\x9c\xe2\x93\x2e\xd6\x40\x6b\xdd\x08\xf6\xa2\xea\x20\x1a\x01\x79\x87\xfb\x85\xb7\xf3\x5c\xc8\x81\x52\x39\x99\xc5\xe6\xb1\x28\xe3\xfc\x47\xae\xef\x9b\xdb\xe1\x23\x70\x9d\x86\xb5\xc8\x2c\x29\xaf\xf6\xca\x5c\xf9\x90\x39\x25\x63\x16\x0d\x28\xc4\xd4\xc2\xcc\x63\x3c\x83\x02\x4d\x2e\xb9\x90\x3c\x02\x5b\x37\xc8\x39\x07\x4d\x72\xb9\x93\x16\xe1\xcf\x6f\xde\xc0\x8b\xbf\xab\xc2\xe8\x04\xad\xe5\x3a\xd2\x3b\xe5\xa4\xdb\xbf\xec\x6e\x7b\x68\x3f\xab\xba\x6e\x31\x45\x7c\x56\x5a\x67\x28\x86\x50\xad\xcd\xce\x53\xe4\xe6\x80\x05\x6c\x5b\xab\xee\xbb\x68\xda\x46\x96\x34\x6e\xf8\x1e\xb7\xa2\xc3\x26\xb9\x91\xb5\xf8\xb6\xb9\x43\xd5\xfc\x07\x35\x9f\xf5\xad\x7a\xd4\x0c\x0c\x65\x2e\x5d\x8b\xbe\x6e\xb4\x7d\xf5\x2e\xfa\xf9\x02\xe8\x47\xad\xa5\x94\x8f\xe2\xdf\xdf\xaf\x2e\x9f\x77\x25\xa5\x7c\x16\xa6\x0c\x6f\x0e\x02\x6f\x03\xd6\x2e\x65\x60\x10\x49\xc9\xc0\xcf\x83\x69\xdb\x82\xa8\x39\x52\x7a\x18\x48\x88\xc7\xb6\x40\x07\x01\x1c\xf6\x42\xc6\xe7\x60\x57\xc5\x17\x7e\x92\x2a\x2b\x6d\xb6\x43\xae\x70\x2b\xee\xa5\x36\xf1\x7d\xd8\x84\xea\x36\x14\x5f\x59\x65\x69\x39\x0b\xa1\xd2\x85\xef\xc7\x7e\xca\x4e\xcc\x4a\x6b\x67\x9d\x11\xc5\xa4\xd0\xfd\xaf\x71\xb4\xdf\x54\xad\xcd\x2c\xe7\x47\x99\xa6\xe4\xcb\xef\xa2\xf4\xb4\xe1\xc5\x07\x55\x22\x0a\x5b\xfa\x06\x16\xf6\x6e\x6c\xa3\x63\xce\x8d\x4c\xda\xd0\x03\xf5\x7f\xff\xf3\xbf\xb6\xc6\xb3\x18\x12\xf0\x1c\x93\xad\x50\xd2\xe6\x7d\x76\x7b\x4a\x58\xe5\x91\xf8\x8c\xeb\x21\x95\x6f\x37\xb1\xc6\x2f\x3a\xc9\x52\xa1\x1e\xab\xe6\x66\x11\x4a\x8b\xc9\xa0\x4a\xb7\xf7\x93\xb6\x9a\x68\x74\x58\x94\x70\x42\x66\x36\x6e\xe7\x86\x59\x07\x81\x52\x26\x13\xb7\x48\x08\xbb\x2c\xd3\x3b\x8e\x2a\xec\x59\xdd\xbf\xe2\x74\x28\x7e\xee\x6b\x8e\x2f\x2f\x85\x1b\x6a\x89\xf1\x49\x89\x2e\x7d\x55\x87\x42\x14\xae\xe7\x4c\xf4\xa5\xd3\xc2\xdd\xe9\x01\xef\x73\x85\xbc\x93\x3d\x04\x78\x29\xe6\x33\x13\x8f\xc1\xec\xf4\x6a\xed\x51\xe1\xca\x29\xcb\x4b\x21\x31\xc1\xd6\x39\x83\x58\xf4\x1f\x01\x1c\x0f\x27\x90\x85\x30\xb1\xd0\x10\x22\xa2\x50\x9a\xad\xcf\x29\x50\xf2\x35\xd8\xe3\xe4\x1f\xde\xb4\xe1\xe3\x3e\x67\xdf\xe9\x90\x63\x8a\x84\xe2\x44\xdf\x18\x9e\x73\x56\x64\xcb\x64\x4b\xc9\x52\x30\x92\x37\xf4\xcb\x32\x17\x4a\xae\xd1\xba\x65\x98\x0d\x8d\xfd\xe1\xcd\x8f\x63\xf4\x06\xf8\x56\x1b\xc0\x07\x91\x17\x19\xce\xab\x14\xe0\x60\x5b\x9e\x6b\x3e\x3a\x88\x17\xc3\x1e\x05\x5b\xd5\x42\x0b\x1d\xab\x02\x3b\x26\x86\x13\x77\xbc\xeb\x23\x42\xe1\x26\x93\x77\x78\x0e\x33\x3e\x20\x53\xa3\xfe\x0b\x39\xb5\x5f\xc7\x32\x0d\x80\x17\x3b\x4e\xf7\x66\x34\x7c\xe6\x11\xae\xc2\xcf\x66\x67\xfb\x74\xc4\x7d\x5b\x9d\x91\x9b\x0d\xb7\x19\xf3\xe9\x06\xf2\x02\x2f\x29\x19\x95\x6b\x4a\x2b\x2b\x60\xc3\xae\x37\x3e\xcd\x2d\xac\xa3\x85\xfe\xf0\xe6\xc7\x19\xbc\xa8\x21\x12\xdd\xc6\x21\xaa\x14\x1f\xe0\x4d\x55\xdc\x28\x74\xfa\x32\xf4\x56\xd9\xbd\x72\xe2\x81\xe6\x4c\xb6\xda\xa2\xf2\x7b\x2d\x83\x29\xbe\x7f\xb8\x96\xc3\x75\xe6\x1d\x66\xd9\xc2\xd7\x25\x53\xd8\xf9\x1e\xb5\x28\x0a\x7e\x93\xaa\x10\xc6\x81\x5e\x8f\xc2\x6c\x1c\xdd\xb9\xfd\x78\xf9\xf1\xdc\x63\x4b\x62\xbb\x51\x71\xdf\x87\xb3\xc5\xb0\x53\x35\xb0\x71\x1a\x9f\x7a\x57\xb0\x0c\x9d\x2a\x1a\xc8\x0b\x6d\xaa\xa2\xc2\xba\x24\x07\xbe\x1c\x0e\xe0\x1e\x61\x69\xc6\xd3\x89\x3f\x56\x42\xf1\x88\xa5\x8f\x27\x15\x4f\x4a\x2b\x7e\x5b\x53\x34\xe7\x19\x67\x53\xd2\x8d\x47\xae\x74\xb0\x7e\xdf\xbf\x5c\x5f\x60\x1a\x58\xf3\xb8\xea\x3d\x0f\x4d\xb8\xb6\x7c\xf6\x6c\x24\x89\x01\xd1\x53\x22\x80\x2a\xa8\x3f\x84\x42\xea\xca\xb1\xea\x34\x6d\x6f\x79\xa0\x5c\xa4\xde\x45\x09\xb5\xff\xea\xea\x44\x84\x2f\x0d\xcd\xbd\x5f\x84\xa0\x8a\x63\x7f\x3e\x81\x62\x79\xf3\xf8\xd9\x28\x3d\x9a\xef\x3e\x25\xe3\x7d\x16\x25\x1b\xcf\x84\x27\x2f\x73\x42\xaa\x09\xd0\xd7\x87\xd7\x49\x86\x19\xc5\xc8\x75\x65\x9b\xa8\x51\x07\xff\x04\xa9\x8a\x94\x06\x57\x90\x64\xba\x4c\x17\x52\x49\x17\x23\x7c\xf0\x93\xf8\x5e\x6c\x25\xb3\x79\x33\x3f\x0a\x41\xdd\x88\xea\xe4\x14\xef\x05\x87\xf4\x09\x55\xca\xd1\x20\xc7\x69\xf0\x45\xc1\x25\x16\x06\xb9\x93\xe2\xdc\x7b\x6d\xf6\x6a\x83\x20\xb7\xc2\xc6\x9d\x96\xf8\x2d\xc1\xbf\x7f\x2d\xb2\x62\x2b\xbe\x61\x07\x1a\xf7\xb8\x42\x15\x14\xe4\x70\x89\x52\x04\x57\x19\x63\xf5\x25\xdc\xec\x24\x9f\x79\xd1\x40\xa4\xbd\xc1\xc4\x20\x1f\xaa\x5e\x0e\x05\x62\x93\xf8\x9f\xb6\xe0\x4d\x66\x71\x1b\x8d\xae\x23\x8b\x96\x7f\xed\x6e\x4a\x6d\x3e\x5c\x37\xee\x12\x92\xc0\xec\x4e\x5e\x0f\x43\x8c\xdd\x34\xfd\xbc\xfe\x6d\x54\x1b\xd5\x98\x81\x53\x9f\x9d\xd4\x7c\xfc\xe9\xcf\x81\x6d\x67\x3e\x15\x3a\x70\xa0\x64\xe0\x34\xe8\x64\x1a\xac\x85\xcc\x4a\x83\x97\x9a\x48\x3c\x69\x89\xdf\x36\xbf\x88\x8b\x0c\x60\x20\xf5\x6f\x1b\x75\xa4\x81\x2d\xbf\x83\x7e\x66\xb5\xf4\x1b\xc3\xbe\xc3\x45\xf8\x23\x39\x1e\x56\x6b\xce\x7e\x5b\x53\xb7\xb6\xc6\xa6\xb7\xc0\xbf\x18\x23\x3f\x95\x4a\x52\xad\x8d\xa8\xba\x69\x07\x2a\x29\xed\x12\xfe\xe1\x57\xb1\x9a\x12\x36\xe4\xdb\x65\x95\xfe\xf2\x4d\xbb\x39\x1b\x34\x37\x47\xfa\xed\x5a\x75\x80\x5a\x55\x91\xf9\x2d\xf5\xa2\x69\x35\x89\xe7\xa8\x47\x4c\x32\x6c\x93\xea\x10\x5f\xa9\x06\xf1\xe8\xfa\x83\xaf\x2f\x0c\xc2\xfc\xdd\x6a\x0f\x5f\xa1\xee\xf0\x3b\xd4\x1c\x1e\x5d\x6f\x18\xf7\x4c\x8f\xa9\x35\x4c\x6b\x87\xa5\x67\x4a\x9d\xa1\xbb\x8e\x30\x08\x76\xb0\xc6\x30\x50\x43\x18\x93\xe3\xce\xfa\xc2\x60\xfd\x60\xac\xee\x7a\x5c\x5b\x18\xaf\x1d\x0c\x57\x1c\xc7\xeb\x0a\x93\x2c\xc6\x58\x3d\xe1\x8f\x53\x4b\x98\xb4\xdc\xb1\x1a\xc2\x3f\x6d\xfd\x60\xf2\xea\x46\xeb\x06\x4f\xa8\x19\xfc\x7e\x35\x81\x89\x5b\x99\x93\x6b\x01\x4f\xa9\x03\x4c\xdf\x4d\xf9\x23\xd5\x00\x26\x51\x76\x24\xf7\xff\x27\xcd\xfb\x9f\x23\x7b\x89\xc1\xe0\xd5\xe5\xa4\x78\xf5\x53\x35\x3c\x86\xf5\x71\xcb\x3e\xec\x1c\xd7\xb4\x19\x0b\xee\xe3\x71\x9a\x78\xa4\xa5\x0a\x4b\x1b\xc9\xf8\xe1\x1d\x10\x71\x4c\x2f\xd0\xab\x4b\xbe\x88\x04\xd9\x1d\xfa\x78\x40\xa7\x55\x48\x93\x68\x63\xd0\x16\xda\x67\x87\xb1\xf9\x70\x70\x37\x1b\xa2\xbb\xad\xdc\x56\x15\x9b\xaf\xf6\xb0\x95\x9b\x2d\x1a\xc8\x48\x98\xf9\x5a\x94\x32\x47\xdf\x70\xdf\xb8\x64\xad\x1f\xf0\x3b\x1f\x79\x41\x69\x11\x12\x61\x39\xb0\x88\xe9\x88\x28\x9d\xe6\x9b\xcf\x42\x94\xd0\x00\x38\x54\x4b\xa9\xa9\xf8\x36\x43\xa1\x16\x65\x01\x99\xde\xc8\x24\xa6\x49\x0d\xb0\x89\xce\x0b\x61\xb0\xbe\x77\xae\xbf\x41\x41\xfb\x8b\x7c\xb8\x53\x8b\x5d\x61\xe9\xea\x3b\x44\x84\xab\x66\x0d\xd6\x64\xfc\xc8\xcc\x06\x29\xc0\xdc\x90\xfe\x1a\x7f\x6a\xf4\x6f\x95\xb6\xf8\xb9\x96\xf0\x1f\xc7\xcb\x1e\x48\x81\xb8\xa7\x5e\x26\x84\xda\x42\xaf\x17\xce\x60\x2d\x2e\xfe\x0a\xc0\x6a\xe5\xf3\x76\x20\x32\x60\x6f\x6b\x4e\x37\xe8\xe6\x9b\xa4\xb9\x65\x2c\x46\x5b\xa2\x9e\x8a\xb4\xba\x17\x62\x50\x8d\x78\x8f\x47\x24\xe1\x12\x2e\x14\xb7\xa6\x55\xbf\x78\x72\x4b\xcb\xc7\x1c\x87\xa2\xcc\xea\xf2\xaf\xbb\xbf\x58\xca\xca\xc2\x09\xab\x70\xe6\x48\x71\xd4\x4e\x6c\x96\x56\x73\x26\x9e\x6a\x85\x91\x8d\xfd\x68\x96\xfe\x0a\xb6\x8a\x3f\x35\xaf\x55\xca\x1d\xe3\xb9\x30\x77\xe1\x90\x81\x6f\xc9\x1b\x39\x71\xe7\x69\x1d\xf3\xf9\x70\x40\x94\xe5\x31\x71\x65\xb8\x40\xc2\x9f\x3f\x20\x15\x6a\xe8\x56\x2f\x44\xaf\x73\x64\x7b\x28\x53\xe5\x64\xa2\xc5\xa4\xad\xa8\x0f\x0b\xf2\x15\x3f\x6b\xc1\x71\xed\xe0\xd6\xde\x81\xb4\x45\x99\x1a\xcb\x98\x47\x0d\xf1\xfd\xb0\xc7\x6e\x99\xd8\xae\x4b\xfb\x62\x23\x4e\x43\x49\x62\xb9\x70\xa2\xd5\xca\x51\xf8\x7e\xeb\x15\x42\xe3\x6c\x59\x3c\x29\x7a\xdc\xaf\xd1\x73\xa1\xca\xe8\x62\x87\xfa\xad\x16\xf5\x3c\x9d\xbf\x36\x4a\x69\x9d\xbf\x1f\xd5\x58\x3a\x46\x3d\xfe\x8c\x7e\x17\xc6\x7d\xb8\x2c\xe0\xe0\x96\xc9\x5e\xb8\xe1\xba\xc8\xc6\xb0\xbe\x4b\xe8\x78\x60\x8b\xdd\x7a\x15\x8e\x2a\x3f\xed\x1e\xba\xa3\xdb\x53\x87\xef\x1e\x68\xdd\x95\x55\x5f\xe8\x55\x5d\x16\x30\xf9\x1a\xd5\xe6\xe3\xcf\x7e\xb4\x2f\x75\x3a\x39\x1a\xf2\x84\xfb\xaf\x42\x19\xf1\x03\x5a\x2b\x36\x47\x01\x7f\xaf\x70\x86\xcf\xfc\xd1\xcf\x41\x7a\xcc\xae\x54\x5d\x03\xa8\xee\xf7\xf1\xdd\xec\x02\xc2\x25\xb8\x19\x11\x7f\x95\x61\xce\xd7\x5e\xaa\x44\x66\x5d\xda\xd0\xb8\x3b\xcb\xce\x61\xa5\xdd\x36\x96\x29\xc3\x11\x54\xb2\x79\xdf\xb6\x16\xd4\xb4\x91\xcb\xf6\xe8\x23\xf0\x71\x68\xa1\x0b\xee\x2a\xab\x0e\x2f\xdb\x32\x49\xa4\x4a\x5c\x28\xb4\xd8\x52\x3a\x66\x29\x31\x25\x5e\x20\xc1\x36\xb1\x30\xe8\xcf\x0b\x1d\xb7\xf3\xef\xb6\x32\xc3\x4e\xe4\xea\x42\x56\xae\xfd\xbe\xc5\x4a\x5b\xac\xaa\x5d\x8d\xc9\x8e\x80\x66\x7a\xc3\xa7\x2c\x68\xdd\xdb\x32\x17\x2a\x58\xfc\xc2\x1f\x32\xfb\xa2\x48\x1a\x2d\xc6\xee\xb8\x50\x39\x0b\xdd\xea\xe4\x35\xba\x80\x3a\x23\x94\x95\x4e\xde\x23\xa0\x31\xdc\xcb\x45\x4c\x13\xad\x83\x22\x94\x81\x85\xf7\x06\x01\x1f\x0a\x3e\xea\xe2\x0d\xe2\xb1\xf0\xca\x07\x0a\x4a\x9a\x67\xed\xfc\xbd\x69\x7c\x00\xf7\x05\xfb\x9a\x70\x6a\x92\x7c\xa5\xd8\xa0\x7d\xe9\x8f\x68\xf5\x15\x0c\xe3\xa1\xdd\x70\xe1\x9a\xce\xd1\x6d\x89\x10\x64\xa2\x4b\x95\x8a\x1c\x95\xe3\x69\x76\x46\x07\x27\xd5\xdc\x02\x89\xf7\x83\x74\x5c\x79\x66\x0b\x4c\x20\x5c\x20\xdb\xee\x94\x6b\xc7\xe1\xcd\x33\x36\x21\x3c\xe0\x1b\x1b\x54\x29\x8e\xbb\xdd\x59\x38\x42\x12\xd6\x8c\x79\x97\x31\x64\xe5\x18\xb7\xd2\x85\x40\xf6\x5d\xbc\x6b\x41\xaa\xee\x12\xa7\x3f\x64\x1f\x6e\xa0\xe0\x2b\x0c\x9d\x93\x6a\x53\x1d\x67\xa2\xb5\xcc\x5b\x27\x68\x05\x1f\x33\xb0\x65\x51\x68\xe3\x3a\xc2\xa0\x10\x45\x74\xad\x31\xd0\xc4\x07\xfc\x56\x36\x6e\x86\x6e\x0a\x86\x74\x16\xb3\x63\x3f\xb2\x42\x3e\x0c\x64\x64\x64\x7f\x2e\x6d\xd5\xa8\x99\xb2\xa4\x5e\xa8\x7d\x10\x3d\xb2\x13\x4d\xc9\xd3\x49\x52\x1e\x8b\x69\xb8\x5d\xc9\xe3\x14\x6c\x46\xc5\xa8\x0f\x31\xc0\x0a\x47\x86\x45\x9a\xfa\xb0\x98\xad\x50\x2c\x6e\x1e\xc1\x6c\x5c\x29\x1c\x52\x1c\xa1\xd2\x33\x6d\x58\xd1\xea\x13\xe2\xf5\x7a\x4f\x2d\x09\x6c\x51\xba\xa3\xcd\xc4\x7e\xcb\x59\x66\xd9\x9e\xef\xfe\xc1\xf4\x09\x0e\xa5\x72\x23\xbe\xa3\x93\xa2\xe5\x2c\x5e\x24\xe4\x92\x6d\x24\x89\x7f\x77\xb4\xc0\x03\x19\x8e\x57\xcb\xc4\xf7\xcf\xed\x5c\xa2\xe3\xfd\xae\x3a\xa0\x3b\xb8\xd2\x8f\x47\xc3\xc1\xe0\x3a\xe3\x13\x7a\xc7\xe7\x7c\x79\x21\xba\xe3\x50\x96\xc1\x04\x95\x23\x1b\x13\xfd\xfe\xa4\x75\xfd\xeb\x9f\x27\xaf\xab\x75\x51\xf9\xa3\x98\x47\x9e\xbf\x62\x61\x97\x53\x87\x8b\xde\x4c\xdf\x1f\xec\x8b\x57\x85\x7a\x58\xbb\x78\x16\x89\xf3\xf2\x6a\x3f\x3d\xee\xf0\x09\x7f\x77\xf2\x8c\x83\x8b\xd9\xf3\x30\xf5\x49\xb7\x87\x12\xa3\x3a\x18\x73\x2c\xd7\xff\xa8\x5b\x3d\xab\x93\x7b\xa2\x79\x25\x61\x75\x0b\xa1\x77\x46\x9d\x46\x23\x38\x6a\x8f\x28\xef\xec\xdc\x6b\x49\xb6\xc2\x19\x4d\x16\x98\xe5\x75\xb5\x0f\x67\xd7\x43\xa7\x75\xf8\xa8\xef\x30\x69\xf3\x28\x61\x00\x1c\xf0\xe2\x7b\x7a\x16\x85\x30\x22\x0f\x5b\x16\x8d\x62\x19\x88\x15\xe5\x9a\x8c\xfb\x31\x9e\xf1\x02\x83\x47\xdd\x3a\x30\x76\x4d\x67\x8f\x9d\xeb\x4e\x02\x0e\xee\x8a\x87\xee\x60\xff\xe0\x55\xfd\x3f\x77\x08\x6d\x21\xf5\xbb\xf0\x7f\x62\xf0\x17\xfb\x37\x7e\x0e\xd7\xf1\xa4\xe7\x7c\xa0\xcb\xbf\x70\xda\x50\x80\xeb\xdf\xd4\xd9\x84\x48\x12\x2c\x1c\xa6\x8d\x6b\xf6\xfd\x05\xfe\x33\x6f\xd1\xe3\xdd\xfc\xfc\x27\x05\xe7\xd2\x5f\x39\x05\x3f\xfc\x78\x12\x1a\x30\xd2\xef\x23\x36\xf4\xf2\xff\x03\x00\x00\xff\xff\x11\x20\x6e\x1e\x14\x63\x00\x00"), }, } fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ - fs["/cluster_v1alpha1_cluster.yaml"].(os.FileInfo), - fs["/cluster_v1alpha1_machine.yaml"].(os.FileInfo), - fs["/cluster_v1alpha1_machineclass.yaml"].(os.FileInfo), - fs["/cluster_v1alpha1_machinedeployment.yaml"].(os.FileInfo), - fs["/cluster_v1alpha1_machineset.yaml"].(os.FileInfo), + fs["/cluster.weave.works_baremetalclusters.yaml"].(os.FileInfo), + fs["/cluster.weave.works_baremetalmachines.yaml"].(os.FileInfo), + fs["/cluster.x-k8s.io_clusters.yaml"].(os.FileInfo), + fs["/cluster.x-k8s.io_machinedeployments.yaml"].(os.FileInfo), + fs["/cluster.x-k8s.io_machinehealthchecks.yaml"].(os.FileInfo), + fs["/cluster.x-k8s.io_machines.yaml"].(os.FileInfo), + fs["/cluster.x-k8s.io_machinesets.yaml"].(os.FileInfo), } return fs diff --git a/pkg/apis/wksprovider/machine/scripts/scripts_vfsdata.go b/pkg/apis/wksprovider/machine/scripts/scripts_vfsdata.go index f3a219bf..19760e6e 100644 --- a/pkg/apis/wksprovider/machine/scripts/scripts_vfsdata.go +++ b/pkg/apis/wksprovider/machine/scripts/scripts_vfsdata.go @@ -21,11 +21,11 @@ var Scripts = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2019, 8, 23, 13, 41, 0, 107080373, time.UTC), + modTime: time.Date(2020, 5, 6, 16, 16, 51, 411690040, time.UTC), }, "/dummy.sh": &vfsgen۰CompressedFileInfo{ name: "dummy.sh", - modTime: time.Date(2019, 8, 23, 13, 41, 0, 107080373, time.UTC), + modTime: time.Date(2020, 5, 6, 16, 16, 51, 411690040, time.UTC), uncompressedSize: 294, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\x90\x31\x6e\xc3\x30\x0c\x45\x77\x9d\xe2\x03\x19\xbc\xb4\xbe\x43\xc7\x0c\xdd\x7a\x01\x5a\xa2\x22\xa2\x2a\x65\x88\x14\xdc\xdc\xbe\x90\xd3\x00\x59\x25\xfc\xf7\x1e\x78\xc1\x57\x11\x43\x96\xca\xe0\x5f\x31\x37\x58\x83\x17\x72\x78\x61\x7c\xd2\x37\x9f\x7f\x87\xd4\x8a\x2c\x9a\x40\x8e\xca\x64\x8e\xa6\x8c\xd5\xca\x63\x9b\x5b\xc7\x0f\xc5\x22\xca\xb0\xd8\x65\x77\x5b\xc3\x05\x57\x5f\x0c\x7b\x33\x93\x6d\x42\xfe\x39\x07\xa9\xc3\x1b\x28\x25\x28\x1f\xcf\x01\x2a\x39\xf7\x87\xff\x49\xc1\x8d\xbc\x70\x17\xbd\x41\x34\x77\x32\xef\x23\xfa\xe8\x0c\x31\x6c\x3c\xdf\x2b\x67\x87\x28\xf6\x4a\x91\xd7\x10\x38\x96\x86\xe5\x03\xe6\xa4\xe9\x5d\xf4\x6c\xdb\x86\xd4\x64\x2b\xae\x79\x56\x4c\x31\xe9\xfd\x55\xfe\x06\x9f\x87\x38\xfb\x36\xc6\x50\xe5\xc8\x66\xd4\xef\x4b\x08\x7f\x01\x00\x00\xff\xff\xce\xf2\x11\xa2\x26\x01\x00\x00"), From d855a70f821cfb826b4b821ed48ac66ab1a3c30e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 7 May 2020 13:05:45 +0000 Subject: [PATCH 41/72] Set providerID on Node and BareMetalMachine in controller --- .../controller/wksctl/machine_controller.go | 20 +++++++++++++++++++ pkg/baremetal/v1alpha3/types.go | 1 + 2 files changed, 21 insertions(+) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 54e0d771..236f51c9 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -213,6 +213,9 @@ func (a *MachineController) create(ctx context.Context, c *baremetalspecv1.BareM if err != nil { return err } + if err = a.setNodeProviderIDIfNecessary(node); err != nil { + return err + } if err = a.setNodeAnnotation(node, planKey, nodePlan.ToJSON()); err != nil { return err } @@ -465,6 +468,10 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM return gerrors.Wrapf(err, "failed to find node by id: %s/%s", ids.MachineID, ids.SystemUUID) } contextLog = contextLog.WithFields(log.Fields{"node": node.Name}) + + if err = a.setNodeProviderIDIfNecessary(node); err != nil { + return err + } nodePlan, err := a.getNodePlan(c, machine, a.getMachineAddress(bmm), installer) if err != nil { return gerrors.Wrapf(err, "Failed to get node plan for machine %s", machine.Name) @@ -547,6 +554,9 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM if err = a.setNodeAnnotation(node, planKey, planJSON); err != nil { return err } + // CAPI machine controller requires providerID + bmm.Spec.ProviderID = node.Spec.ProviderID + a.recordEvent(machine, corev1.EventTypeNormal, "Update", "updated machine %s", machine.Name) return nil } @@ -835,6 +845,16 @@ func (a *MachineController) setNodeAnnotation(node *corev1.Node, key, value stri return nil } +func (a *MachineController) setNodeProviderIDIfNecessary(node *corev1.Node) error { + err := a.modifyNode(node, func(node *corev1.Node) { + node.Spec.ProviderID = "wks://" + node.Name + }) + if err != nil { + return gerrors.Wrapf(err, "Failed to set providerID on node: %s", node.Name) + } + return nil +} + func (a *MachineController) setNodeLabel(node *corev1.Node, label, value string) error { err := a.modifyNode(node, func(node *corev1.Node) { node.Labels[label] = value diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go index b6051435..d64054fa 100644 --- a/pkg/baremetal/v1alpha3/types.go +++ b/pkg/baremetal/v1alpha3/types.go @@ -111,6 +111,7 @@ type BareMetalMachineSpec struct { PrivateInterface string `json:"privateInterface,omitempty"` Private EndPoint `json:"private,omitempty"` Public EndPoint `json:"public,omitempty"` + ProviderID string `json:"providerID,omitempty"` } // BareMetalMachineList contains a list of Machine From a908c1747cc1f5f6f8e0734d39b17f56dbd17de9 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 7 May 2020 13:06:20 +0000 Subject: [PATCH 42/72] Patch data after reconcile in controller --- .../controller/wksctl/machine_controller.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 236f51c9..e177837c 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -46,6 +46,7 @@ import ( bootstrapapi "k8s.io/cluster-bootstrap/token/api" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" "sigs.k8s.io/cluster-api/util" + "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -152,6 +153,21 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e return ctrl.Result{}, nil } + // Initialize the patch helper + patchHelper, err := patch.NewHelper(bmm, r.client) + if err != nil { + return ctrl.Result{}, err + } + // Attempt to Patch the BareMetalMachine object and status after each reconciliation. + defer func() { + if err := patchHelper.Patch(ctx, bmm); err != nil { + contextLog.Error(err, "failed to patch BareMetalMachine") + if reterr == nil { + reterr = err + } + } + }() + // Object still there but with deletion timestamp => run our finalizer if !bmm.ObjectMeta.DeletionTimestamp.IsZero() { err := r.delete(ctx, bmc, machine, bmm) From ea99f762f08689a1f2166d13915e0a6cf6fff7f2 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 7 May 2020 17:38:35 +0000 Subject: [PATCH 43/72] Add Ready status on BareMetalMachine --- .../wksprovider/controller/wksctl/machine_controller.go | 1 + pkg/baremetal/v1alpha3/types.go | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index e177837c..2ea64049 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -572,6 +572,7 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM } // CAPI machine controller requires providerID bmm.Spec.ProviderID = node.Spec.ProviderID + bmm.Status.Ready = true a.recordEvent(machine, corev1.EventTypeNormal, "Update", "updated machine %s", machine.Name) return nil diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go index d64054fa..e553b341 100644 --- a/pkg/baremetal/v1alpha3/types.go +++ b/pkg/baremetal/v1alpha3/types.go @@ -101,7 +101,8 @@ type BareMetalMachine struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec BareMetalMachineSpec `json:"spec,omitempty"` + Spec BareMetalMachineSpec `json:"spec,omitempty"` + Status BareMetalMachineStatus `json:"status,omitempty"` } type BareMetalMachineSpec struct { @@ -114,6 +115,10 @@ type BareMetalMachineSpec struct { ProviderID string `json:"providerID,omitempty"` } +type BareMetalMachineStatus struct { + Ready bool `json:"ready"` +} + // BareMetalMachineList contains a list of Machine // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type BareMetalMachineList struct { From 7e612ac205a8e5d8cc9078cd4def2cf580f3ba31 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 8 May 2020 10:15:01 +0000 Subject: [PATCH 44/72] controller: invoke 'create()' if we can't find the Node --- .../controller/wksctl/machine_controller.go | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 2ea64049..dba3e18d 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -177,11 +177,10 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e return ctrl.Result{}, err } - // FIXME! assuming everything else is create { - err := r.create(ctx, bmc, machine, bmm) + err := r.update(ctx, bmc, machine, bmm) if err != nil { - contextLog.Errorf("failed to create machine: %v", err) + contextLog.Errorf("failed to update machine: %v", err) } return ctrl.Result{}, err } @@ -189,19 +188,10 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e return ctrl.Result{}, nil } -func (a *MachineController) create(ctx context.Context, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { +func (a *MachineController) create(ctx context.Context, installer *os.OS, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { contextLog := log.WithFields(log.Fields{"context": ctx, "cluster": *c, "machine": *machine}) contextLog.Info("creating machine...") - installer, closer, err := a.connectTo(c, bmm) - if err != nil { - return gerrors.Wrapf(err, "failed to establish connection to machine %s", machine.Name) - } - defer closer.Close() - // Bootstrap - set plan on seed node if not present before any updates can occur - if err = a.initializeMasterPlanIfNecessary(c); err != nil { - return err - } // Also, update footloose IP from env log.Infof("FETCHING FOOTLOOSE ADDRESS...") fip := goos.Getenv("FOOTLOOSE_SERVER_ADDR") @@ -235,6 +225,9 @@ func (a *MachineController) create(ctx context.Context, c *baremetalspecv1.BareM if err = a.setNodeAnnotation(node, planKey, nodePlan.ToJSON()); err != nil { return err } + // CAPI machine controller requires providerID + bmm.Spec.ProviderID = node.Spec.ProviderID + bmm.Status.Ready = true a.recordEvent(machine, corev1.EventTypeNormal, "Create", "created machine %s", machine.Name) return nil } @@ -481,6 +474,9 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM } node, err := a.findNodeByID(ids.MachineID, ids.SystemUUID) if err != nil { + if apierrs.IsNotFound(err) { // isn't there; try to create it + return a.create(ctx, installer, c, machine, bmm) + } return gerrors.Wrapf(err, "failed to find node by id: %s/%s", ids.MachineID, ids.SystemUUID) } contextLog = contextLog.WithFields(log.Fields{"node": node.Name}) From 3040650912063dc504a21c26092b63513b896f3c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 10:45:56 +0000 Subject: [PATCH 45/72] Add apiVersion field to infrastructureRef in test --- test/integration/container/multimaster_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/integration/container/multimaster_test.go b/test/integration/container/multimaster_test.go index 46d734d2..1de61185 100644 --- a/test/integration/container/multimaster_test.go +++ b/test/integration/container/multimaster_test.go @@ -31,6 +31,7 @@ spec: cidrBlocks: [192.168.0.0/16] serviceDomain: cluster.local infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalCluster name: test-multimaster --- @@ -86,6 +87,7 @@ const machinesYAML = ` spec: clusterName: test-multimaster infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-1 --- @@ -110,6 +112,7 @@ const machinesYAML = ` spec: clusterName: test-multimaster infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-2 --- @@ -134,6 +137,7 @@ const machinesYAML = ` spec: clusterName: test-multimaster infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-3 --- @@ -158,6 +162,7 @@ const machinesYAML = ` spec: clusterName: test-multimaster infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: worker-1 --- From e7980855ed65cfc59e74cae7bc51112cccaa626d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 11:58:30 +0000 Subject: [PATCH 46/72] Clean up a couple of log messages --- pkg/apis/wksprovider/controller/wksctl/machine_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index dba3e18d..297ed210 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -161,7 +161,7 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e // Attempt to Patch the BareMetalMachine object and status after each reconciliation. defer func() { if err := patchHelper.Patch(ctx, bmm); err != nil { - contextLog.Error(err, "failed to patch BareMetalMachine") + contextLog.Errorf("failed to patch BareMetalMachine: %v", err) if reterr == nil { reterr = err } @@ -189,7 +189,7 @@ func (r *MachineController) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e } func (a *MachineController) create(ctx context.Context, installer *os.OS, c *baremetalspecv1.BareMetalCluster, machine *clusterv1.Machine, bmm *baremetalspecv1.BareMetalMachine) error { - contextLog := log.WithFields(log.Fields{"context": ctx, "cluster": *c, "machine": *machine}) + contextLog := log.WithFields(log.Fields{"machine": machine.Name, "cluster": c.Name}) contextLog.Info("creating machine...") // Also, update footloose IP from env From e81d41f622e1e40818a7403a41de79746f349846 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 11:58:49 +0000 Subject: [PATCH 47/72] Print version at controller startup --- cmd/controller/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index fcce59ce..dff4534b 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -75,6 +75,8 @@ func preRun(cmd *cobra.Command, args []string) { } func run(cmd *cobra.Command, args []string) { + log.Infof("Starting wks controller version %s", version) + cfg, err := config.GetConfig() if err != nil { log.Fatalf("failed to get the coordinates of the API server: %v", err) From 0355bf87dcd260a6b1ba6f63ea6d3331a3263e0e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 16:51:00 +0000 Subject: [PATCH 48/72] remove FirstMasterInArray() which is now a duplicate --- pkg/cluster/machine/machine.go | 11 ----------- pkg/cluster/machine/machine_test.go | 11 ----------- 2 files changed, 22 deletions(-) diff --git a/pkg/cluster/machine/machine.go b/pkg/cluster/machine/machine.go index 8e07d4a0..6cabe519 100644 --- a/pkg/cluster/machine/machine.go +++ b/pkg/cluster/machine/machine.go @@ -50,17 +50,6 @@ func FirstMaster(machines []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalM return nil, nil } -// FirstMasterInArray scans the provided array of machines and return the first -// one which is a "Master" or nil if none. -func FirstMasterInArray(machines []clusterv1.Machine) *clusterv1.Machine { - for _, machine := range machines { - if IsMaster(&machine) { - return &machine - } - } - return nil -} - // ParseManifest parses the provided machines manifest file. func ParseManifest(file string) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine, err error) { f, err := os.Open(file) diff --git a/pkg/cluster/machine/machine_test.go b/pkg/cluster/machine/machine_test.go index da481bcf..83ac4582 100644 --- a/pkg/cluster/machine/machine_test.go +++ b/pkg/cluster/machine/machine_test.go @@ -58,17 +58,6 @@ func TestFirstMasterInPointersArray(t *testing.T) { assert.Nil(t, v3) } -func TestFirstMasterInArray(t *testing.T) { - assert.Equal(t, &master, machine.FirstMasterInArray([]clusterv1.Machine{ - worker, - master, - })) - assert.Nil(t, machine.FirstMasterInArray([]clusterv1.Machine{ - worker, - })) - assert.Nil(t, machine.FirstMasterInArray([]clusterv1.Machine{})) -} - const machinesValid = ` apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Machine From da5779ef50bff2692033262b90f6313d77ee5ff3 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 16:52:07 +0000 Subject: [PATCH 49/72] Split out function to write manifest from machine lists --- pkg/cluster/machine/machines_manifest.go | 26 +++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/pkg/cluster/machine/machines_manifest.go b/pkg/cluster/machine/machines_manifest.go index 45a9b540..90f2896c 100644 --- a/pkg/cluster/machine/machines_manifest.go +++ b/pkg/cluster/machine/machines_manifest.go @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" "github.com/thanhpk/randstr" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" "sigs.k8s.io/yaml" ) @@ -50,24 +51,35 @@ func UpdateWithGeneratedNames(r io.ReadCloser) (string, error) { } var buf strings.Builder + err = WriteMachines(&buf, machines, bml) + return buf.String(), nil +} + +func WriteMachines(w io.Writer, machines []*clusterv1.Machine, bml []*baremetalspecv1.BareMetalMachine) error { // Need to do this in a loop because we want a stream not an array for _, machine := range machines { manifestBytes, err := yaml.Marshal(machine) if err != nil { - return "", err + return err + } + w.Write([]byte("---\n")) + _, err = w.Write(manifestBytes) + if err != nil { + return err } - buf.WriteString("---\n") - buf.Write(manifestBytes) } for _, machine := range bml { manifestBytes, err := yaml.Marshal(machine) if err != nil { - return "", err + return err + } + w.Write([]byte("---\n")) + _, err = w.Write(manifestBytes) + if err != nil { + return err } - buf.WriteString("---\n") - buf.Write(manifestBytes) } - return buf.String(), nil + return nil } func readNames(machines []*clusterv1.Machine) map[string]struct{} { From 54a6c39186c9f993c91cb22ab938db5cd27c7958 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 16:53:27 +0000 Subject: [PATCH 50/72] Further v1alpha3 updates for cluster.yaml --- test/integration/test/assets/cluster.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/test/assets/cluster.yaml b/test/integration/test/assets/cluster.yaml index 9ef202a5..687e9d41 100644 --- a/test/integration/test/assets/cluster.yaml +++ b/test/integration/test/assets/cluster.yaml @@ -1,4 +1,4 @@ -apiVersion: "cluster.k8s.io/v1alpha3" +apiVersion: "cluster.x-k8s.io/v1alpha3" kind: Cluster metadata: name: integration-tests @@ -10,6 +10,7 @@ spec: cidrBlocks: ["192.168.0.0/16"] serviceDomain: "cluster.local" infrastructureRef: + apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalCluster name: integration-tests --- From 2a84ec81549f6981119ec647b5f1959130196699 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 17:03:35 +0000 Subject: [PATCH 51/72] Update apply_test for v1alpha3 --- test/integration/test/apply_test.go | 109 ++++++++++------------------ 1 file changed, 37 insertions(+), 72 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index 65188296..af9b35f3 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -3,7 +3,6 @@ package test import ( "bytes" "fmt" - "io" "io/ioutil" "log" "net" @@ -18,8 +17,8 @@ import ( "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/kubernetes" "github.com/weaveworks/wksctl/pkg/plan/runners/ssh" + "github.com/weaveworks/wksctl/pkg/specs" - yaml "github.com/ghodss/yaml" baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" spawn "github.com/weaveworks/wksctl/test/integration/spawn" @@ -28,6 +27,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/kubernetes/scheme" clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) @@ -68,14 +68,15 @@ func setLabel(role role) string { } } -func appendMachine(t *testing.T, ordinal int, ml *clusterv1.MachineList, bl *baremetalspecv1.BareMetalMachineList, role role, publicIP, privateIP string) { +func appendMachine(t *testing.T, ordinal int, ml *[]*clusterv1.Machine, bl *[]*baremetalspecv1.BareMetalMachine, role role, publicIP, privateIP string) { + name := generateName(role, ordinal) spec := baremetalspecv1.BareMetalMachine{ TypeMeta: metav1.TypeMeta{ APIVersion: "cluster.weave.works/v1alpha3", Kind: "BareMetalMachine", }, ObjectMeta: metav1.ObjectMeta{ - GenerateName: generateName(role, ordinal), + Name: name, }, Spec: baremetalspecv1.BareMetalMachineSpec{ Public: baremetalspecv1.EndPoint{ @@ -87,29 +88,30 @@ func appendMachine(t *testing.T, ordinal int, ml *clusterv1.MachineList, bl *bar Port: 22, }}, } - bl.Items = append(bl.Items, spec) + *bl = append(*bl, &spec) // Create a machine. machine := clusterv1.Machine{ TypeMeta: metav1.TypeMeta{ - APIVersion: "cluster.k8s.io/v1alpha3", + APIVersion: "cluster.x-k8s.io/v1alpha3", Kind: "Machine", }, ObjectMeta: metav1.ObjectMeta{ - GenerateName: generateName(role, ordinal), + Name: name, Labels: map[string]string{ "set": setLabel(role), }, }, Spec: clusterv1.MachineSpec{ InfrastructureRef: v1.ObjectReference{ - Kind: spec.TypeMeta.Kind, - Name: spec.ObjectMeta.Name, + APIVersion: "cluster.weave.works/v1alpha3", + Kind: spec.TypeMeta.Kind, + Name: spec.ObjectMeta.Name, }, }, } - ml.Items = append(ml.Items, machine) + *ml = append(*ml, &machine) } // makeMachinesFromTerraform creates cluster-api Machine objects from a @@ -120,19 +122,7 @@ func appendMachine(t *testing.T, ordinal int, ml *clusterv1.MachineList, bl *bar // numMachines is the number of machines to use. It can be less than the number // of provisionned terraform machines. -1 means use all machines setup by // terraform. The minimum number of machines to use is 2. -func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMachines int) (*clusterv1.MachineList, *baremetalspecv1.BareMetalMachineList) { - ml := &clusterv1.MachineList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "cluster.k8s.io/v1alpha3", - Kind: "MachineList", - }, - } - bl := &baremetalspecv1.BareMetalMachineList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "baremetal.weave.works/v1alpha3", - Kind: "BareMetalMachineList", - }, - } +func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMachines int) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) { publicIPs := terraform.stringArrayVar(keyPublicIPs) privateIPs := terraform.stringArrayVar(keyPrivateIPs) assert.True(t, len(publicIPs) >= 2) // One master and at least one node @@ -148,42 +138,28 @@ func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMach const numMasters = 1 for i := 0; i < numMasters; i++ { - appendMachine(t, i, ml, bl, master, publicIPs[i], privateIPs[i]) + appendMachine(t, i, &ml, &bl, master, publicIPs[i], privateIPs[i]) } // Subsequent machines will be nodes. for i := numMasters; i < numMachines; i++ { - appendMachine(t, i, ml, bl, node, publicIPs[i], privateIPs[i]) + appendMachine(t, i, &ml, &bl, node, publicIPs[i], privateIPs[i]) } return ml, bl } -func writeYamlManifests(t *testing.T, path string, objects ...interface{}) { - var data []byte - for _, o := range objects { - y, err := yaml.Marshal(o) - assert.NoError(t, err) - data = append(data, y...) - } - err := ioutil.WriteFile(path, data, 0644) +func writeYamlManifests(t *testing.T, path string, machines []*clusterv1.Machine, bml []*baremetalspecv1.BareMetalMachine) { + var buf bytes.Buffer + err := machine.WriteMachines(&buf, machines, bml) + assert.NoError(t, err) + err = ioutil.WriteFile(path, buf.Bytes(), 0644) assert.NoError(t, err) } -func firstMaster(l *clusterv1.MachineList, bl *baremetalspecv1.BareMetalMachineList) (*clusterv1.Machine, *baremetalspecv1.BareMetalMachine) { - for i := range l.Items { - m := &l.Items[i] - if machine.IsMaster(m) { - return m, &bl.Items[i] - } - } - return nil, nil -} - -func numMasters(l *clusterv1.MachineList) int { +func numMasters(l []*clusterv1.Machine) int { n := 0 - for i := range l.Items { - m := &l.Items[i] + for _, m := range l { if machine.IsMaster(m) { n++ } @@ -191,10 +167,9 @@ func numMasters(l *clusterv1.MachineList) int { return n } -func numWorkers(l *clusterv1.MachineList) int { +func numWorkers(l []*clusterv1.Machine) int { n := 0 - for i := range l.Items { - m := &l.Items[i] + for _, m := range l { if machine.IsNode(m) { n++ } @@ -202,37 +177,23 @@ func numWorkers(l *clusterv1.MachineList) int { return n } -func setKubernetesVersion(l *clusterv1.MachineList, version string) { - for i := range l.Items { - l.Items[i].Spec.Version = &version +func setKubernetesVersion(l []*clusterv1.Machine, version string) { + for i := range l { + l[i].Spec.Version = &version } } -func parseCluster(t *testing.T, r io.Reader) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster) { - bytes, err := ioutil.ReadAll(r) - assert.NoError(t, err) - list := v1.List{} - err = yaml.Unmarshal(bytes, list) - assert.NoError(t, err) - assert.Equal(t, 2, len(list.Items)) - cluster := list.Items[0].Object.(*clusterv1.Cluster) - bmCluster := list.Items[1].Object.(*baremetalspecv1.BareMetalCluster) - return cluster, bmCluster - -} - func parseClusterManifest(t *testing.T, file string) (*clusterv1.Cluster, *baremetalspecv1.BareMetalCluster) { f, err := os.Open(file) assert.NoError(t, err) - defer f.Close() - return parseCluster(t, f) + cluster, bmCluster, err := specs.ParseCluster(f) + assert.NoError(t, err) + return cluster, bmCluster } // The installer names the kubeconfig file from the cluster namespace and name // ~/.wks -func wksKubeconfig(t *testing.T, l *clusterv1.MachineList) string { - master := machine.FirstMasterInArray(l.Items) - assert.NotNil(t, master) +func wksKubeconfig(t *testing.T) string { kubeconfig := clientcmd.RecommendedHomeFile _, err := os.Stat(kubeconfig) assert.NoError(t, err) @@ -427,6 +388,9 @@ func writeTmpFile(runner *ssh.Client, inputFilename, outputFilename string) erro } func TestApply(t *testing.T) { + assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, baremetalspecv1.AddToScheme(scheme.Scheme)) + exe := run.NewExecutor() // Prepare the machines manifest from terraform output. @@ -456,7 +420,8 @@ func TestApply(t *testing.T) { clusterManifestPath := configPath("cluster.yaml") machinesManifestPath := configPath("machines.yaml") _, c := parseClusterManifest(t, clusterManifestPath) - _, m := firstMaster(machines, bmMachines) + _, m := machine.FirstMaster(machines, bmMachines) + assert.NotNil(t, m) ip := m.Spec.Public.Address port := m.Spec.Public.Port sshClient, err := ssh.NewClient(ssh.ClientParams{ @@ -501,7 +466,7 @@ func TestApply(t *testing.T) { assert.Equal(t, 0, run.ExitCode()) // Tell kube-state-harness about the location of the kubeconfig file. - kubeconfig := wksKubeconfig(t, machines) + kubeconfig := wksKubeconfig(t) err = kube.SetKubeconfig(kubeconfig) assert.NoError(t, err) From 212ff9540d60b2f67653e828f85de54f0bd6eead Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 17:04:56 +0000 Subject: [PATCH 52/72] Fail test early if setup returns an error --- test/integration/test/apply_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index af9b35f3..3ad66574 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -431,7 +431,7 @@ func TestApply(t *testing.T) { PrivateKeyPath: sshKeyPath, PrintOutputs: true, }) - assert.NoError(t, err) + require.NoError(t, err) err = writeTmpFile(sshClient, "/tmp/workspace/cmd/mock-https-authz-server/server", "authserver") assert.NoError(t, err) for _, authFile := range []string{"rootCA.pem", "server.crt", "server.key"} { @@ -458,7 +458,7 @@ func TestApply(t *testing.T) { "--config-directory="+configDir, "--sealed-secret-key="+configPath("ss.key"), "--sealed-secret-cert="+configPath("ss.cert"), "--verbose=true", "--ssh-key="+sshKeyPath) assert.NoError(t, err) - assert.Equal(t, 0, run.ExitCode()) + require.Equal(t, 0, run.ExitCode()) // Extract the kubeconfig, run, err = kubeconfig(exe, "--cluster="+configPath("cluster.yaml"), "--machines="+configPath("machines.yaml"), "--namespace=default", "--ssh-key="+sshKeyPath) From 0d6db22dfc576c8909ed9a0c40b3e1a8e761b872 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 17:14:06 +0000 Subject: [PATCH 53/72] fix up function to write manifest from machine lists --- pkg/cluster/machine/machines_manifest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cluster/machine/machines_manifest.go b/pkg/cluster/machine/machines_manifest.go index 90f2896c..ad211944 100644 --- a/pkg/cluster/machine/machines_manifest.go +++ b/pkg/cluster/machine/machines_manifest.go @@ -52,7 +52,7 @@ func UpdateWithGeneratedNames(r io.ReadCloser) (string, error) { var buf strings.Builder err = WriteMachines(&buf, machines, bml) - return buf.String(), nil + return buf.String(), err } func WriteMachines(w io.Writer, machines []*clusterv1.Machine, bml []*baremetalspecv1.BareMetalMachine) error { From 6be71a0769253e30d36f5863ac2f6b79fe6b338c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 2 Jun 2020 15:36:07 +0000 Subject: [PATCH 54/72] Update 'badmachines' part of test for v1alpha3 --- test/integration/test/apply_test.go | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index 3ad66574..a5fc7494 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -401,21 +401,11 @@ func TestApply(t *testing.T) { setKubernetesVersion(machines, kubernetes.DefaultVersion) writeYamlManifests(t, configPath("machines.yaml"), machines, bmMachines) - spec := machineSpec(t, &machines.Items[0]) // Generate bad version to check failure return codes - savedAddress := spec.Private.Address - spec.Private.Address = "192.168.111.111" - codec, err := baremetalspecv1.NewCodec() - assert.NoError(t, err) - encodedSpec, err := codec.EncodeToProviderSpec(spec) - assert.NoError(t, err) - machines.Items[0].Spec.ProviderSpec = *encodedSpec - writeYamlManifest(t, machines, configPath("badmachines.yaml")) - // Restore valid config - spec.Private.Address = savedAddress - encodedSpec, err = codec.EncodeToProviderSpec(spec) - assert.NoError(t, err) - machines.Items[0].Spec.ProviderSpec = *encodedSpec + savedAddress := bmMachines[0].Spec.PrivateAddress + bmMachines[0].Spec.PrivateAddress = "192.168.111.111" + writeYamlManifests(t, configPath("badmachines.yaml"), machines, bmMachines) + bmMachines[0].Spec.PrivateAddress = savedAddress clusterManifestPath := configPath("cluster.yaml") machinesManifestPath := configPath("machines.yaml") From 60f30c714dc0ea057eaa004927ee3b2515821da0 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 May 2020 17:21:01 +0000 Subject: [PATCH 55/72] Set clusterName on machines in test --- test/integration/test/apply_test.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index a5fc7494..d79bc497 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -68,7 +68,7 @@ func setLabel(role role) string { } } -func appendMachine(t *testing.T, ordinal int, ml *[]*clusterv1.Machine, bl *[]*baremetalspecv1.BareMetalMachine, role role, publicIP, privateIP string) { +func appendMachine(t *testing.T, ordinal int, ml *[]*clusterv1.Machine, bl *[]*baremetalspecv1.BareMetalMachine, clusterName, role role, publicIP, privateIP string) { name := generateName(role, ordinal) spec := baremetalspecv1.BareMetalMachine{ TypeMeta: metav1.TypeMeta{ @@ -103,6 +103,7 @@ func appendMachine(t *testing.T, ordinal int, ml *[]*clusterv1.Machine, bl *[]*b }, }, Spec: clusterv1.MachineSpec{ + ClusterName: clusterName, InfrastructureRef: v1.ObjectReference{ APIVersion: "cluster.weave.works/v1alpha3", Kind: spec.TypeMeta.Kind, @@ -122,7 +123,7 @@ func appendMachine(t *testing.T, ordinal int, ml *[]*clusterv1.Machine, bl *[]*b // numMachines is the number of machines to use. It can be less than the number // of provisionned terraform machines. -1 means use all machines setup by // terraform. The minimum number of machines to use is 2. -func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMachines int) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) { +func makeMachinesFromTerraform(t *testing.T, clusterName string, terraform *terraformOutput, numMachines int) (ml []*clusterv1.Machine, bl []*baremetalspecv1.BareMetalMachine) { publicIPs := terraform.stringArrayVar(keyPublicIPs) privateIPs := terraform.stringArrayVar(keyPrivateIPs) assert.True(t, len(publicIPs) >= 2) // One master and at least one node @@ -138,12 +139,12 @@ func makeMachinesFromTerraform(t *testing.T, terraform *terraformOutput, numMach const numMasters = 1 for i := 0; i < numMasters; i++ { - appendMachine(t, i, &ml, &bl, master, publicIPs[i], privateIPs[i]) + appendMachine(t, i, &ml, &bl, clusterName, master, publicIPs[i], privateIPs[i]) } // Subsequent machines will be nodes. for i := numMasters; i < numMachines; i++ { - appendMachine(t, i, &ml, &bl, node, publicIPs[i], privateIPs[i]) + appendMachine(t, i, &ml, &bl, clusterName, node, publicIPs[i], privateIPs[i]) } return ml, bl @@ -397,7 +398,7 @@ func TestApply(t *testing.T) { terraform, err := newTerraformOutputFromFile(options.terraform.outputPath) require.NoError(t, err) - machines, bmMachines := makeMachinesFromTerraform(t, terraform, terraform.numMachines()-1) + machines, bmMachines := makeMachinesFromTerraform(t, c.Name, terraform, terraform.numMachines()-1) setKubernetesVersion(machines, kubernetes.DefaultVersion) writeYamlManifests(t, configPath("machines.yaml"), machines, bmMachines) From 8adf3f6029288e95fec2255e6658fd14619d5610 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 12 May 2020 16:51:49 +0000 Subject: [PATCH 56/72] Rename field from ExternalLoadBalancer to ControlPlaneEndpoint To fit with upstream requirements: https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#infrastructure-provider --- cmd/wksctl/apply/apply.go | 2 +- ...cluster.weave.works_baremetalclusters.yaml | 6 ++-- .../controller/wksctl/machine_controller.go | 2 +- .../machine/config/kubeadm/kubeadm.go | 4 --- pkg/apis/wksprovider/machine/os/os.go | 33 +++++++++---------- pkg/baremetal/v1alpha3/types.go | 8 ++--- pkg/kubernetes/config/kubeconfig.go | 4 +-- pkg/plan/resource/kubeadm_init.go | 4 --- pkg/plan/resource/kubeadm_join.go | 6 ++-- 9 files changed, 29 insertions(+), 40 deletions(-) diff --git a/cmd/wksctl/apply/apply.go b/cmd/wksctl/apply/apply.go index 7eac7e58..4472052c 100644 --- a/cmd/wksctl/apply/apply.go +++ b/cmd/wksctl/apply/apply.go @@ -180,7 +180,7 @@ func (a *Applier) initiateCluster(clusterManifestPath, machinesManifestPath stri SealedSecretCertPath: a.Params.sealedSecretCertPath, ConfigDirectory: configDir, ImageRepository: sp.ClusterSpec.ImageRepository, - ExternalLoadBalancer: sp.ClusterSpec.APIServer.ExternalLoadBalancer, + ControlPlaneEndpoint: sp.ClusterSpec.ControlPlaneEndpoint, AdditionalSANs: sp.ClusterSpec.APIServer.AdditionalSANs, Namespace: ns, AddonNamespaces: addonNamespaces, diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml index 931c43ac..cca966b9 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml @@ -58,10 +58,6 @@ spec: items: type: string type: array - externalLoadBalancer: - type: string - required: - - externalLoadBalancer type: object authenticationWebhook: properties: @@ -91,6 +87,8 @@ spec: type: object cloudProvider: type: string + controlPlaneEndpoint: + type: string cri: properties: kind: diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 297ed210..a9c2b6a1 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -683,7 +683,7 @@ func (a *MachineController) getNodePlan(provider *baremetalspecv1.BareMetalClust ProviderConfigMaps: configMaps, AuthConfigMap: authConfigMap, Namespace: namespace, - ExternalLoadBalancer: provider.Spec.APIServer.ExternalLoadBalancer, + ControlPlaneEndpoint: provider.Spec.ControlPlaneEndpoint, }) if err != nil { return nil, gerrors.Wrapf(err, "failed to create machine plan for %s", machine.Name) diff --git a/pkg/apis/wksprovider/machine/config/kubeadm/kubeadm.go b/pkg/apis/wksprovider/machine/config/kubeadm/kubeadm.go index f75697d0..c8659576 100644 --- a/pkg/apis/wksprovider/machine/config/kubeadm/kubeadm.go +++ b/pkg/apis/wksprovider/machine/config/kubeadm/kubeadm.go @@ -19,9 +19,6 @@ type ClusterConfigurationParams struct { // Used to configure kubeadm and kubelet with a cloud provider CloudProvider string ImageRepository string - // ExternalLoadBalancer is the name or IP of the external load balancer setup - // in from the the API master nodes. - ExternalLoadBalancer string // AdditionalSANs can hold additional SANs to add to the API server certificate. AdditionalSANs []string // Additional arguments for auth, etc. @@ -37,7 +34,6 @@ type ClusterConfigurationParams struct { func NewClusterConfiguration(params ClusterConfigurationParams) *kubeadmapi.ClusterConfiguration { SANs := []string{} SANs = append(SANs, params.NodeIPs...) - SANs = append(SANs, params.ExternalLoadBalancer) SANs = append(SANs, params.AdditionalSANs...) cc := &kubeadmapi.ClusterConfiguration{ diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index ca89d4ad..b8b17ce7 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -178,7 +178,7 @@ type SeedNodeParams struct { ConfigDirectory string Namespace string ImageRepository string - ExternalLoadBalancer string + ControlPlaneEndpoint string AdditionalSANs []string AddonNamespaces map[string]string } @@ -261,27 +261,27 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { apiServerArgs := getAPIServerArgs(&cluster.Spec, pemSecretResources) - controlPlaneEndpointIP := params.ExternalLoadBalancer - if controlPlaneEndpointIP == "" { - controlPlaneEndpointIP = params.PrivateIP + // Backwards-compatibility: fall back if not specified + controlPlaneEndpoint := params.ControlPlaneEndpoint + if controlPlaneEndpoint == "" { + // TODO: dynamically inject the API server's port. + controlPlaneEndpoint = params.PrivateIP + ":6443" } kubeadmInitResource := &resource.KubeadmInit{ - PublicIP: params.PublicIP, - PrivateIP: params.PrivateIP, - KubeletConfig: ¶ms.KubeletConfig, - ConntrackMax: cfg.ConntrackMax, - UseIPTables: cfg.UseIPTables, - SSHKeyPath: params.SSHKeyPath, - BootstrapToken: params.BootstrapToken, - // TODO: dynamically inject the API server's port. - ControlPlaneEndpoint: fmt.Sprintf("%s:6443", controlPlaneEndpointIP), + PublicIP: params.PublicIP, + PrivateIP: params.PrivateIP, + KubeletConfig: ¶ms.KubeletConfig, + ConntrackMax: cfg.ConntrackMax, + UseIPTables: cfg.UseIPTables, + SSHKeyPath: params.SSHKeyPath, + BootstrapToken: params.BootstrapToken, + ControlPlaneEndpoint: controlPlaneEndpoint, IgnorePreflightErrors: cfg.IgnorePreflightErrors, KubernetesVersion: kubernetesVersion, CloudProvider: params.KubeletConfig.CloudProvider, ImageRepository: params.ImageRepository, - ExternalLoadBalancer: params.ExternalLoadBalancer, AdditionalSANs: params.AdditionalSANs, Namespace: object.String(params.Namespace), NodeName: cfg.HostnameOverride, @@ -596,7 +596,7 @@ func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerS AuthConfigMap: authConfigMap, Namespace: params.Namespace, AddonNamespaces: params.AddonNamespaces, - ExternalLoadBalancer: providerSpec.APIServer.ExternalLoadBalancer, + ControlPlaneEndpoint: providerSpec.ControlPlaneEndpoint, } var paramBuffer bytes.Buffer err := gob.NewEncoder(¶mBuffer).Encode(nodeParams) @@ -1135,7 +1135,7 @@ type NodeParams struct { ProviderConfigMaps map[string]*v1.ConfigMap AuthConfigMap *v1.ConfigMap Namespace string - ExternalLoadBalancer string // used instead of MasterIP if existed + ControlPlaneEndpoint string // used instead of MasterIP if existed AddonNamespaces map[string]string } @@ -1211,7 +1211,6 @@ func (o OS) CreateNodeSetupPlan(params NodeParams) (*plan.Plan, error) { DiscoveryTokenCaCertHash: params.DiscoveryTokenCaCertHash, CertificateKey: params.CertificateKey, IgnorePreflightErrors: cfg.IgnorePreflightErrors, - ExternalLoadBalancer: params.ExternalLoadBalancer, KubernetesVersion: params.KubernetesVersion, } b.AddResource("kubeadm:join", kadmJoinRsrc, plan.DependOn("kubeadm:prejoin")) diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go index e553b341..5c1d7382 100644 --- a/pkg/baremetal/v1alpha3/types.go +++ b/pkg/baremetal/v1alpha3/types.go @@ -27,7 +27,8 @@ type BareMetalClusterSpec struct { CRI ContainerRuntime `json:"cri"` ImageRepository string `json:"imageRepository,omitempty"` - APIServer APIServer `json:"apiServer,omitempty"` + ControlPlaneEndpoint string `json:"controlPlaneEndpoint,omitempty"` + APIServer APIServer `json:"apiServer,omitempty"` KubeletArguments []ServerArgument `json:"kubeletArguments,omitempty"` @@ -65,9 +66,8 @@ type ContainerRuntime struct { } type APIServer struct { - ExternalLoadBalancer string `json:"externalLoadBalancer"` - AdditionalSANs []string `json:"additionalSANs,omitempty"` - ExtraArguments []ServerArgument `json:"extraArguments,omitempty"` + AdditionalSANs []string `json:"additionalSANs,omitempty"` + ExtraArguments []ServerArgument `json:"extraArguments,omitempty"` } type ServerArgument struct { diff --git a/pkg/kubernetes/config/kubeconfig.go b/pkg/kubernetes/config/kubeconfig.go index d76d870f..a3c24989 100644 --- a/pkg/kubernetes/config/kubeconfig.go +++ b/pkg/kubernetes/config/kubeconfig.go @@ -97,8 +97,8 @@ func GetRemoteKubeconfig(sp *specs.Specs, sshKeyPath string, verbose, skipTLSVer } endpoint := sp.GetMasterPublicAddress() - if sp.ClusterSpec.APIServer.ExternalLoadBalancer != "" { - endpoint = sp.ClusterSpec.APIServer.ExternalLoadBalancer + if sp.ClusterSpec.ControlPlaneEndpoint != "" { + endpoint = sp.ClusterSpec.ControlPlaneEndpoint } return Sanitize(configStr, Params{ diff --git a/pkg/plan/resource/kubeadm_init.go b/pkg/plan/resource/kubeadm_init.go index 73b8ed4a..e093e90e 100644 --- a/pkg/plan/resource/kubeadm_init.go +++ b/pkg/plan/resource/kubeadm_init.go @@ -63,9 +63,6 @@ type KubeadmInit struct { // ImageRepository sets the container registry to pull images from. If empty, // `k8s.gcr.io` will be used by default. ImageRepository string `structs:"imageRepository"` - // ExternalLoadBalancer is the name or IP of the external load balancer setup - // in from the the API master nodes. - ExternalLoadBalancer string // AdditionalSANs can hold additional SANs to add to the API server certificate. AdditionalSANs []string // The namespace in which to init kubeadm @@ -105,7 +102,6 @@ func (ki *KubeadmInit) Apply(runner plan.Runner, diff plan.Diff) (bool, error) { ControlPlaneEndpoint: ki.ControlPlaneEndpoint, CloudProvider: ki.CloudProvider, ImageRepository: ki.ImageRepository, - ExternalLoadBalancer: ki.ExternalLoadBalancer, AdditionalSANs: ki.AdditionalSANs, ExtraArgs: ki.ExtraAPIServerArgs, ServiceCIDRBlock: ki.ServiceCIDRBlock, diff --git a/pkg/plan/resource/kubeadm_join.go b/pkg/plan/resource/kubeadm_join.go index b610518d..9b48f6b8 100644 --- a/pkg/plan/resource/kubeadm_join.go +++ b/pkg/plan/resource/kubeadm_join.go @@ -35,7 +35,7 @@ type KubeadmJoin struct { // IgnorePreflightErrors is optionally used to skip kubeadm's preflight checks. IgnorePreflightErrors []string `structs:"ignorePreflightErrors"` // External Load Balancer name or IP address to be used instead of the master's IP - ExternalLoadBalancer string `structs:"externalLoadBalancer"` + ControlPlaneEndpoint string `structs:"controlPlaneEndpoint"` // Kubernetes Version is used to prepare different parameters KubernetesVersion string `structs:"version"` } @@ -53,8 +53,8 @@ func (kj *KubeadmJoin) State() plan.State { func (kj *KubeadmJoin) Apply(runner plan.Runner, diff plan.Diff) (bool, error) { log.Info("joining Kubernetes cluster") apiServerEndpoint := fmt.Sprintf("%s:%d", kj.MasterIP, kj.MasterPort) - if kj.ExternalLoadBalancer != "" { - apiServerEndpoint = fmt.Sprintf("%s:%d", kj.ExternalLoadBalancer, kj.MasterPort) + if kj.ControlPlaneEndpoint != "" { + apiServerEndpoint = fmt.Sprintf("%s:%d", kj.ControlPlaneEndpoint, kj.MasterPort) } kubeadmJoinCmd := kj.kubeadmJoinCmd(apiServerEndpoint) if stdouterr, err := runner.RunCommand(withoutProxy(kubeadmJoinCmd), nil); err != nil { From bdeb39466accbd1dfe6687590927868af5a3d4e2 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 12 May 2020 16:57:52 +0000 Subject: [PATCH 57/72] Update generated files after rebases --- ...cluster.weave.works_baremetalclusters.yaml | 24 +++++++++++ ...cluster.weave.works_baremetalmachines.yaml | 9 ++++ .../v1alpha3/zz_generated.deepcopy.go | 41 +++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml index cca966b9..b833f211 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml @@ -58,6 +58,18 @@ spec: items: type: string type: array + extraArguments: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array type: object authenticationWebhook: properties: @@ -106,6 +118,18 @@ spec: type: string imageRepository: type: string + kubeletArguments: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array os: properties: files: diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml index 3ea999c1..473da5e1 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml @@ -53,6 +53,8 @@ spec: type: string privateInterface: type: string + providerID: + type: string public: description: EndPoint groups the details required to establish a connection. properties: @@ -67,6 +69,13 @@ spec: required: - address type: object + status: + properties: + ready: + type: boolean + required: + - ready + type: object type: object version: v1alpha3 versions: diff --git a/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go index 24ca3b4d..b864fd0b 100644 --- a/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go @@ -16,6 +16,11 @@ func (in *APIServer) DeepCopyInto(out *APIServer) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ExtraArguments != nil { + in, out := &in.ExtraArguments, &out.ExtraArguments + *out = make([]ServerArgument, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServer. @@ -159,6 +164,11 @@ func (in *BareMetalClusterSpec) DeepCopyInto(out *BareMetalClusterSpec) { in.OS.DeepCopyInto(&out.OS) out.CRI = in.CRI in.APIServer.DeepCopyInto(&out.APIServer) + if in.KubeletArguments != nil { + in, out := &in.KubeletArguments, &out.KubeletArguments + *out = make([]ServerArgument, len(*in)) + copy(*out, *in) + } if in.Addons != nil { in, out := &in.Addons, &out.Addons *out = make([]Addon, len(*in)) @@ -184,6 +194,7 @@ func (in *BareMetalMachine) DeepCopyInto(out *BareMetalMachine) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) out.Spec = in.Spec + out.Status = in.Status } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachine. @@ -253,6 +264,21 @@ func (in *BareMetalMachineSpec) DeepCopy() *BareMetalMachineSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalMachineStatus) DeepCopyInto(out *BareMetalMachineStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalMachineStatus. +func (in *BareMetalMachineStatus) DeepCopy() *BareMetalMachineStatus { + if in == nil { + return nil + } + out := new(BareMetalMachineStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerRuntime) DeepCopyInto(out *ContainerRuntime) { *out = *in @@ -319,6 +345,21 @@ func (in *OSConfig) DeepCopy() *OSConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServerArgument) DeepCopyInto(out *ServerArgument) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServerArgument. +func (in *ServerArgument) DeepCopy() *ServerArgument { + if in == nil { + return nil + } + out := new(ServerArgument) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SourceSpec) DeepCopyInto(out *SourceSpec) { *out = *in From 111fd213a74861744d136f1d7c0bfda37d0bba7f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 14 May 2020 17:46:58 +0000 Subject: [PATCH 58/72] Add a 'ready' field to BareMetalCluster status --- ...cluster.weave.works_baremetalclusters.yaml | 7 +++++++ .../controller/wksctl/cluster_controller.go | 19 ++++++++++++++++++- pkg/baremetal/v1alpha3/types.go | 7 ++++++- .../v1alpha3/zz_generated.deepcopy.go | 16 ++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml index b833f211..6dbb0480 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalclusters.yaml @@ -162,6 +162,13 @@ spec: - sshKeyPath - user type: object + status: + properties: + ready: + type: boolean + required: + - ready + type: object type: object version: v1alpha3 versions: diff --git a/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go b/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go index df83054f..c5fea5f9 100644 --- a/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/cluster_controller.go @@ -11,6 +11,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" "sigs.k8s.io/cluster-api/util" + "sigs.k8s.io/cluster-api/util/patch" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -54,13 +55,29 @@ func (a *ClusterReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result, reterr e return ctrl.Result{}, nil } + // Initialize the patch helper + patchHelper, err := patch.NewHelper(bmc, a.client) + if err != nil { + return ctrl.Result{}, err + } + + // Attempt to Patch the BareMetalMachine object and status after each reconciliation. + defer func() { + if err := patchHelper.Patch(ctx, bmc); err != nil { + contextLog.Errorf("failed to patch BareMetalCluster: %v", err) + if reterr == nil { + reterr = err + } + } + }() + // Object still there but with deletion timestamp => run our finalizer if !bmc.ObjectMeta.DeletionTimestamp.IsZero() { a.recordEvent(cluster, corev1.EventTypeNormal, "Delete", "Deleted cluster %v", cluster.Name) return ctrl.Result{}, errors.New("ClusterReconciler#Delete not implemented") } - // FIXME! do we need any more? + bmc.Status.Ready = true // TODO: know whether it is really ready return ctrl.Result{}, nil } diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go index 5c1d7382..578bce4b 100644 --- a/pkg/baremetal/v1alpha3/types.go +++ b/pkg/baremetal/v1alpha3/types.go @@ -12,7 +12,8 @@ type BareMetalCluster struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - Spec BareMetalClusterSpec `json:"spec,omitempty"` + Spec BareMetalClusterSpec `json:"spec,omitempty"` + Status BareMetalClusterStatus `json:"status,omitempty"` } type BareMetalClusterSpec struct { @@ -37,6 +38,10 @@ type BareMetalClusterSpec struct { CloudProvider string `json:"cloudProvider,omitempty"` } +type BareMetalClusterStatus struct { + Ready bool `json:"ready"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type BareMetalClusterList struct { metav1.TypeMeta `json:",inline"` diff --git a/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go index b864fd0b..57f17087 100644 --- a/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/baremetal/v1alpha3/zz_generated.deepcopy.go @@ -96,6 +96,7 @@ func (in *BareMetalCluster) DeepCopyInto(out *BareMetalCluster) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalCluster. @@ -188,6 +189,21 @@ func (in *BareMetalClusterSpec) DeepCopy() *BareMetalClusterSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalClusterStatus) DeepCopyInto(out *BareMetalClusterStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalClusterStatus. +func (in *BareMetalClusterStatus) DeepCopy() *BareMetalClusterStatus { + if in == nil { + return nil + } + out := new(BareMetalClusterStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BareMetalMachine) DeepCopyInto(out *BareMetalMachine) { *out = *in From 5ddd31b0f2ba98f8958489afd88ed5a5999d3f6d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 19 May 2020 13:21:06 +0000 Subject: [PATCH 59/72] Update docunmentation for v1alpha3 --- docs/cluster.md | 84 +++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/docs/cluster.md b/docs/cluster.md index ff33aeee..1b4f8c4e 100644 --- a/docs/cluster.md +++ b/docs/cluster.md @@ -1,9 +1,13 @@ # Cluster Definition -Here's an example of the cluster definition. +Here's an example of the cluster definition. It is spread across two +objects: a `Cluster` which is defined by Kubernetes ClusterAPI and a +`BareMetalCluster` defined by Weaveworks. Here, both objects have the +same name `example`, and the field `infrastructureRef` points from one +to the other. ``` -apiVersion: cluster.k8s.io/v1alpha1 +apiVersion: cluster.x-k8s.io/v1alpha3 kind: Cluster metadata: name: example @@ -14,41 +18,47 @@ spec: pods: cidrBlocks: [192.168.0.0/16] serviceDomain: cluster.local - providerSpec: - value: - apiVersion: baremetalproviderspec/v1alpha1 - kind: BareMetalClusterProviderSpec - sshKeyPath: cluster-key - user: root - os: - files: - - source: - configmap: repo - key: kubernetes.repo - destination: /etc/yum.repos.d/kubernetes.repo - - source: - configmap: repo - key: docker-ce.repo - destination: /etc/yum.repos.d/docker-ce.repo - - source: - configmap: docker - key: daemon.json - destination: /etc/docker/daemon.json - cri: - kind: docker - package: docker-ce - version: 19.03.8 - apiServer: - extraArguments: - - name: alsologtostderr - value: "true" - - name: audit-log-maxsize - value: "10000" - kubeletArguments: - - name: alsologtostderr - value: "true" - - name: container-runtime - value: docker + infrastructureRef: + apiVersion: cluster.weave.works/v1alpha3 + kind: BareMetalCluster + name: example +--- +apiVersion: cluster.weave.works/v1alpha3 +kind: BareMetalCluster +metadata: + name: example +spec: + sshKeyPath: cluster-key + user: root + os: + files: + - source: + configmap: repo + key: kubernetes.repo + destination: /etc/yum.repos.d/kubernetes.repo + - source: + configmap: repo + key: docker-ce.repo + destination: /etc/yum.repos.d/docker-ce.repo + - source: + configmap: docker + key: daemon.json + destination: /etc/docker/daemon.json + cri: + kind: docker + package: docker-ce + version: 19.03.8 + apiServer: + extraArguments: + - name: alsologtostderr + value: "true" + - name: audit-log-maxsize + value: "10000" + kubeletArguments: + - name: alsologtostderr + value: "true" + - name: container-runtime + value: docker ``` ## Passing extra arguments to the API Server From 574a8a6d0660df46628f53342a7af4bd480d283c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 9 Jun 2020 10:49:32 +0000 Subject: [PATCH 60/72] Fix compile error in apply_test --- test/integration/test/apply_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index d79bc497..68b6f232 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -392,6 +392,9 @@ func TestApply(t *testing.T) { assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) assert.NoError(t, baremetalspecv1.AddToScheme(scheme.Scheme)) + clusterManifestPath := configPath("cluster.yaml") + _, c := parseClusterManifest(t, clusterManifestPath) + exe := run.NewExecutor() // Prepare the machines manifest from terraform output. @@ -408,9 +411,7 @@ func TestApply(t *testing.T) { writeYamlManifests(t, configPath("badmachines.yaml"), machines, bmMachines) bmMachines[0].Spec.PrivateAddress = savedAddress - clusterManifestPath := configPath("cluster.yaml") machinesManifestPath := configPath("machines.yaml") - _, c := parseClusterManifest(t, clusterManifestPath) _, m := machine.FirstMaster(machines, bmMachines) assert.NotNil(t, m) ip := m.Spec.Public.Address From aa74436f556a729d4a70fc713f8437676c095a0f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 9 Jun 2020 10:53:18 +0000 Subject: [PATCH 61/72] Avoid failure when controllerImage is blank Blank means use the default, but when ImageRepository is set the current code is failing. --- cmd/wksctl/apply/apply.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/wksctl/apply/apply.go b/cmd/wksctl/apply/apply.go index 4472052c..6bac23ae 100644 --- a/cmd/wksctl/apply/apply.go +++ b/cmd/wksctl/apply/apply.go @@ -147,9 +147,12 @@ func (a *Applier) initiateCluster(clusterManifestPath, machinesManifestPath stri } // TODO(damien): Transform the controller image into an addon. - controllerImage, err := addons.UpdateImage(a.Params.controllerImage, sp.ClusterSpec.ImageRepository) - if err != nil { - return errors.Wrap(err, "failed to apply the cluster's image repository to the WKS controller's image") + controllerImage := a.Params.controllerImage + if controllerImage != "" { + controllerImage, err = addons.UpdateImage(a.Params.controllerImage, sp.ClusterSpec.ImageRepository) + if err != nil { + return errors.Wrap(err, "failed to apply the cluster's image repository to the WKS controller's image") + } } if err := installer.SetupSeedNode(wksos.SeedNodeParams{ From b1b240629152bbd4d6858adac4a3793b5832fa0c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 9 Jun 2020 13:46:39 +0000 Subject: [PATCH 62/72] Fix up incorrect use of PrivateAddress in test --- test/integration/test/apply_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/test/apply_test.go b/test/integration/test/apply_test.go index 68b6f232..5320b68a 100644 --- a/test/integration/test/apply_test.go +++ b/test/integration/test/apply_test.go @@ -406,10 +406,10 @@ func TestApply(t *testing.T) { writeYamlManifests(t, configPath("machines.yaml"), machines, bmMachines) // Generate bad version to check failure return codes - savedAddress := bmMachines[0].Spec.PrivateAddress - bmMachines[0].Spec.PrivateAddress = "192.168.111.111" + savedAddress := bmMachines[0].Spec.Private.Address + bmMachines[0].Spec.Private.Address = "192.168.111.111" writeYamlManifests(t, configPath("badmachines.yaml"), machines, bmMachines) - bmMachines[0].Spec.PrivateAddress = savedAddress + bmMachines[0].Spec.Private.Address = savedAddress machinesManifestPath := configPath("machines.yaml") _, m := machine.FirstMaster(machines, bmMachines) From 8408805db4333cf045f85758e461bd49750e3fd3 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 9 Jun 2020 15:16:25 +0000 Subject: [PATCH 63/72] Remove top-level address and port fields Almost everywhere uses Public.Address or Private.Address, so these other ones are just a source of confusion. --- .../cluster.weave.works_baremetalmachines.yaml | 10 ---------- pkg/baremetal/v1alpha3/types.go | 10 +++------- pkg/kubernetes/config/kubeconfig.go | 14 -------------- pkg/plan/runners/ssh/ssh.go | 12 ++---------- 4 files changed, 5 insertions(+), 41 deletions(-) diff --git a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml index 473da5e1..15a731d1 100644 --- a/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml +++ b/pkg/apis/cluster-api/config/crds/cluster.weave.works_baremetalmachines.yaml @@ -34,10 +34,6 @@ spec: type: object spec: properties: - address: - type: string - port: - type: integer private: description: EndPoint groups the details required to establish a connection. properties: @@ -49,10 +45,6 @@ spec: - address - port type: object - privateAddress: - type: string - privateInterface: - type: string providerID: type: string public: @@ -66,8 +58,6 @@ spec: - address - port type: object - required: - - address type: object status: properties: diff --git a/pkg/baremetal/v1alpha3/types.go b/pkg/baremetal/v1alpha3/types.go index 578bce4b..4f6520fa 100644 --- a/pkg/baremetal/v1alpha3/types.go +++ b/pkg/baremetal/v1alpha3/types.go @@ -111,13 +111,9 @@ type BareMetalMachine struct { } type BareMetalMachineSpec struct { - Address string `json:"address"` - Port uint16 `json:"port,omitempty"` - PrivateAddress string `json:"privateAddress,omitempty"` - PrivateInterface string `json:"privateInterface,omitempty"` - Private EndPoint `json:"private,omitempty"` - Public EndPoint `json:"public,omitempty"` - ProviderID string `json:"providerID,omitempty"` + Private EndPoint `json:"private,omitempty"` + Public EndPoint `json:"public,omitempty"` + ProviderID string `json:"providerID,omitempty"` } type BareMetalMachineStatus struct { diff --git a/pkg/kubernetes/config/kubeconfig.go b/pkg/kubernetes/config/kubeconfig.go index a3c24989..c391fb48 100644 --- a/pkg/kubernetes/config/kubeconfig.go +++ b/pkg/kubernetes/config/kubeconfig.go @@ -8,16 +8,12 @@ import ( yaml "github.com/ghodss/yaml" "github.com/pkg/errors" log "github.com/sirupsen/logrus" - baremetalv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" - "github.com/weaveworks/wksctl/pkg/cluster/machine" "github.com/weaveworks/wksctl/pkg/plan/runners/ssh" "github.com/weaveworks/wksctl/pkg/plan/runners/sudo" "github.com/weaveworks/wksctl/pkg/specs" - "github.com/weaveworks/wksctl/pkg/utilities/path" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" ) // DefaultPath defines the default path @@ -26,16 +22,6 @@ var DefaultClusterName = "kubernetes" var DefaultClusterAdminName = "kubernetes-admin" var DefaultContextName = fmt.Sprintf("%s@%s", DefaultClusterAdminName, DefaultClusterName) -// NewKubeConfig generates a Kubernetes configuration (e.g. for kubectl to use) -// from the provided machines, and places it in the provided directory. -func NewKubeConfig(artifactDirectory string, machines []*clusterv1.Machine, bl []*baremetalv1.BareMetalMachine) (string, error) { - master, bmm := machine.FirstMaster(machines, bl) - if master == nil { - return "", errors.New("at least one master node is required to create a Kubernetes configuration file") - } - return path.WKSResourcePath(artifactDirectory, bmm.Spec.Address), nil -} - // Params groups the various settings to transform Kubernetes configurations. type Params struct { APIServerExternalEndpoint string diff --git a/pkg/plan/runners/ssh/ssh.go b/pkg/plan/runners/ssh/ssh.go index ec77d99d..439925f4 100644 --- a/pkg/plan/runners/ssh/ssh.go +++ b/pkg/plan/runners/ssh/ssh.go @@ -37,16 +37,8 @@ var _ plan.Runner = &Client{} const tcp = "tcp" func NewClientForMachine(m *v1alpha3.BareMetalMachineSpec, user, keyPath string, printOutputs bool) (*Client, error) { - var ip string - var port uint16 - if m.Public.Address != "" { - ip = m.Public.Address - port = m.Public.Port - } else { - // Fall back to the address at the root - ip = m.Address - port = m.Port - } + ip := m.Public.Address + port := m.Public.Port return NewClient(ClientParams{ User: user, Host: ip, From 7123c81adf5cc204b5f33d45cdd197996a6a9272 Mon Sep 17 00:00:00 2001 From: Dennis Marttinen Date: Tue, 9 Jun 2020 14:37:04 +0300 Subject: [PATCH 64/72] Fail parsing if manifest lacks Cluster or BareMetalCluster definition Signed-off-by: Dennis Marttinen --- pkg/specs/parse_test.go | 57 +++++++++++++++++++++++++++++++++++++++++ pkg/specs/specs.go | 9 +++++++ 2 files changed, 66 insertions(+) create mode 100644 pkg/specs/parse_test.go diff --git a/pkg/specs/parse_test.go b/pkg/specs/parse_test.go new file mode 100644 index 00000000..ba08c628 --- /dev/null +++ b/pkg/specs/parse_test.go @@ -0,0 +1,57 @@ +package specs + +import ( + "fmt" + "github.com/stretchr/testify/assert" + baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" + "io/ioutil" + "k8s.io/client-go/kubernetes/scheme" + clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" + "strings" + "testing" +) + +const clusterMissingClusterDefinition = ` +apiVersion: "cluster.weave.works/v1alpha3" +kind: "BareMetalCluster" +metadata: + name: example +spec: + user: "vagrant" +` + +const clusterMissingBareMetalClusterDefinition = ` +apiVersion: "cluster.x-k8s.io/v1alpha3" +kind: Cluster +metadata: + name: example +spec: + clusterNetwork: + services: + cidrBlocks: ["10.96.0.0/12"] + pods: + cidrBlocks: ["192.168.0.0/16"] + infrastructureRef: + kind: BareMetalCluster + name: example +` + +func mergeObjects(a string, b string) string { + return fmt.Sprintf("%s---%s", a, b) +} + +func parseConfig(s string) (err error) { + r := ioutil.NopCloser(strings.NewReader(s)) + _, _, err = ParseCluster(r) + return +} + +func TestParseCluster(t *testing.T) { + assert.NoError(t, clusterv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, baremetalspecv1.AddToScheme(scheme.Scheme)) + assert.NoError(t, parseConfig(mergeObjects(clusterMissingBareMetalClusterDefinition, clusterMissingClusterDefinition))) + + // Verify that the objects individually don't result in a successful parse + assert.Error(t, parseConfig(clusterMissingClusterDefinition)) + assert.Error(t, parseConfig(clusterMissingBareMetalClusterDefinition)) +} diff --git a/pkg/specs/specs.go b/pkg/specs/specs.go index 6e1c775a..e0662767 100644 --- a/pkg/specs/specs.go +++ b/pkg/specs/specs.go @@ -110,6 +110,15 @@ func ParseCluster(r io.ReadCloser) (cluster *clusterv1.Cluster, bmc *baremetalsp return nil, nil, errors.Errorf("unexpected type %T", v) } } + + if cluster == nil { + return nil, nil, errors.New("parsed cluster manifest lacks Cluster definition") + } + + if bmc == nil { + return nil, nil, errors.New("parsed cluster manifest lacks BareMetalCluster definition") + } + return } From b0905790ac8204a615d1dee817b984739ef590ae Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 17 Jun 2020 11:35:54 +0000 Subject: [PATCH 65/72] Clarify parsing error message --- pkg/cluster/machine/machine.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/cluster/machine/machine.go b/pkg/cluster/machine/machine.go index 6cabe519..3324e29b 100644 --- a/pkg/cluster/machine/machine.go +++ b/pkg/cluster/machine/machine.go @@ -7,6 +7,7 @@ import ( "os" "github.com/blang/semver" + "github.com/pkg/errors" log "github.com/sirupsen/logrus" baremetalspecv1 "github.com/weaveworks/wksctl/pkg/baremetal/v1alpha3" "github.com/weaveworks/wksctl/pkg/kubernetes" @@ -56,7 +57,11 @@ func ParseManifest(file string) (ml []*clusterv1.Machine, bl []*baremetalspecv1. if err != nil { return nil, nil, err } - return Parse(f) + ml, bl, err = Parse(f) + if err != nil { + err = errors.Wrapf(err, "parsing %q", file) + } + return } // Parse parses the provided machines io.Reader. From 168742555ae8d36a5dbdc630dd52a26bb9b1fc7f Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 17 Jun 2020 13:53:39 +0000 Subject: [PATCH 66/72] Add 'bootstrap' field to Machine; it's mandatory --- test/integration/container/multimaster_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/integration/container/multimaster_test.go b/test/integration/container/multimaster_test.go index 1de61185..2fb665ba 100644 --- a/test/integration/container/multimaster_test.go +++ b/test/integration/container/multimaster_test.go @@ -90,6 +90,7 @@ const machinesYAML = ` apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-1 + bootstrap: {} --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -115,6 +116,7 @@ const machinesYAML = ` apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-2 + bootstrap: {} --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -140,6 +142,7 @@ const machinesYAML = ` apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: master-3 + bootstrap: {} --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" @@ -165,6 +168,7 @@ const machinesYAML = ` apiVersion: "cluster.weave.works/v1alpha3" kind: BareMetalMachine name: worker-1 + bootstrap: {} --- apiVersion: "cluster.weave.works/v1alpha3" kind: "BareMetalMachine" From b6df6a6215a90750ce5c0b27809383450612f6a7 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 19 Jun 2020 16:45:23 +0000 Subject: [PATCH 67/72] refactor: move annotation key for plans so it can be used by other packages --- .../controller/wksctl/machine_controller.go | 17 ++++++++--------- pkg/plan/recipe/install_plans.go | 5 +++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index a9c2b6a1..8742641c 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -55,7 +55,6 @@ import ( ) const ( - planKey string = "wks.weave.works/node-plan" masterLabel string = "node-role.kubernetes.io/master" originalMasterLabel string = "wks.weave.works/original-master" controllerName string = "wks-controller" @@ -222,7 +221,7 @@ func (a *MachineController) create(ctx context.Context, installer *os.OS, c *bar if err = a.setNodeProviderIDIfNecessary(node); err != nil { return err } - if err = a.setNodeAnnotation(node, planKey, nodePlan.ToJSON()); err != nil { + if err = a.setNodeAnnotation(node, recipe.PlanKey, nodePlan.ToJSON()); err != nil { return err } // CAPI machine controller requires providerID @@ -489,7 +488,7 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM return gerrors.Wrapf(err, "Failed to get node plan for machine %s", machine.Name) } planJSON := nodePlan.ToJSON() - currentPlan := node.Annotations[planKey] + currentPlan := node.Annotations[recipe.PlanKey] if currentPlan == planJSON { contextLog.Info("Machine and node have matching plans; nothing to do") return nil @@ -551,19 +550,19 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM return err } } else if isOriginal { - return a.kubeadmUpOrDowngrade(machine, node, installer, version, planKey, planJSON, recipe.OriginalMaster) + return a.kubeadmUpOrDowngrade(machine, node, installer, version, planJSON, recipe.OriginalMaster) } else { - return a.kubeadmUpOrDowngrade(machine, node, installer, version, planKey, planJSON, recipe.SecondaryMaster) + return a.kubeadmUpOrDowngrade(machine, node, installer, version, planJSON, recipe.SecondaryMaster) } } - return a.kubeadmUpOrDowngrade(machine, node, installer, version, planKey, planJSON, recipe.Worker) + return a.kubeadmUpOrDowngrade(machine, node, installer, version, planJSON, recipe.Worker) } if err = a.performActualUpdate(installer, machine, node, nodePlan, c); err != nil { return err } - if err = a.setNodeAnnotation(node, planKey, planJSON); err != nil { + if err = a.setNodeAnnotation(node, recipe.PlanKey, planJSON); err != nil { return err } // CAPI machine controller requires providerID @@ -577,7 +576,7 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM // kubeadmUpOrDowngrade does upgrade or downgrade a machine. // Parameter k8sversion specified here represents the version of both Kubernetes and Kubeadm. func (a *MachineController) kubeadmUpOrDowngrade(machine *clusterv1.Machine, node *corev1.Node, installer *os.OS, - k8sVersion, planKey, planJSON string, ntype recipe.NodeType) error { + k8sVersion, planJSON string, ntype recipe.NodeType) error { b := plan.NewBuilder() upgradeRes, err := recipe.BuildUpgradePlan(installer.PkgType, k8sVersion, ntype) @@ -602,7 +601,7 @@ func (a *MachineController) kubeadmUpOrDowngrade(machine *clusterv1.Machine, nod return err } log.Info("Finished with uncordon...") - if err = a.setNodeAnnotation(node, planKey, planJSON); err != nil { + if err = a.setNodeAnnotation(node, recipe.PlanKey, planJSON); err != nil { return err } a.recordEvent(machine, corev1.EventTypeNormal, "Update", "updated machine %s", machine.Name) diff --git a/pkg/plan/recipe/install_plans.go b/pkg/plan/recipe/install_plans.go index 7e1f733b..d99ea21d 100644 --- a/pkg/plan/recipe/install_plans.go +++ b/pkg/plan/recipe/install_plans.go @@ -14,6 +14,11 @@ import ( "github.com/weaveworks/wksctl/pkg/utilities/object" ) +const ( + // PlanKey for storing plans as annotations on Nodes + PlanKey string = "wks.weave.works/node-plan" +) + // BuildBasePlan creates a plan for installing the base building blocks for the node func BuildBasePlan(pkgType resource.PkgType) plan.Resource { b := plan.NewBuilder() From cee0d700987ae03b53eed843ed794da643fe260c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 19 Jun 2020 11:13:53 +0000 Subject: [PATCH 68/72] Remove 'initializeMasterPlanIfNecessary' step It's awkward having to do this every time the controller does anything. --- .../controller/wksctl/machine_controller.go | 52 ------------------- 1 file changed, 52 deletions(-) diff --git a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go index 8742641c..1324c62f 100644 --- a/pkg/apis/wksprovider/controller/wksctl/machine_controller.go +++ b/pkg/apis/wksprovider/controller/wksctl/machine_controller.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "encoding/base64" - "encoding/gob" "encoding/json" "errors" "fmt" @@ -231,53 +230,6 @@ func (a *MachineController) create(ctx context.Context, installer *os.OS, c *bar return nil } -// We set the plan annotation for a seed node at the first create of another mode so we -// don't miss any updates. The plan is derived from the original seed node plan and stored in a config map -// for use by the actuator. -func (a *MachineController) initializeMasterPlanIfNecessary(installer *os.OS) error { - - // we also use this method to mark the first master as the "originalMaster" - originalMasterNode, err := a.getOriginalMasterNode() - if err != nil { - return err - } - - if originalMasterNode.Annotations[planKey] == "" { - omAddress := getNodePrivateAddress(originalMasterNode) - if omAddress == "" { - return errors.New("Could not determine master node address") - } - machine, mspec, err := a.findMachineSpecForAddress(omAddress) - if err != nil { - return err - } - installer, closer, err := a.connectTo(machine, c, mspec) - if err != nil { - return err - } - defer closer.Close() - client := a.clientSet.CoreV1().ConfigMaps(a.controllerNamespace) - configMap, err := client.Get(os.SeedNodePlanName, metav1.GetOptions{}) - if err != nil { - return err - } - seedNodePlanParams := configMap.BinaryData["plan"] - var params os.NodeParams - err = gob.NewDecoder(bytes.NewReader(seedNodePlanParams)).Decode(¶ms) - if err != nil { - return err - } - seedNodeStandardNodePlan, err := installer.CreateNodeSetupPlan(params) - if err != nil { - return err - } - if err = a.setNodeAnnotation(originalMasterNode, planKey, seedNodeStandardNodePlan.ToJSON()); err != nil { - return err - } - } - return nil -} - func (a *MachineController) connectTo(c *baremetalspecv1.BareMetalCluster, m *baremetalspecv1.BareMetalMachine) (*os.OS, io.Closer, error) { sshKey, err := a.sshKey() if err != nil { @@ -463,10 +415,6 @@ func (a *MachineController) update(ctx context.Context, c *baremetalspecv1.BareM } defer closer.Close() - // Bootstrap - set plan on seed node if not present before any updates can occur - if err := a.initializeMasterPlanIfNecessary(c); err != nil { - return err - } ids, err := installer.IDs() if err != nil { return gerrors.Wrapf(err, "failed to read machine %s's IDs", machine.Name) From f93f1763ffd62a3a8a00b406d5b14b3ab8947bb1 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 19 Jun 2020 16:48:48 +0000 Subject: [PATCH 69/72] Annotate initial master node with its plan This means the controller will see it as unchanged when it fires up. --- pkg/apis/wksprovider/machine/os/os.go | 36 +++------------------ pkg/plan/resource/kubectl_annotate.go | 45 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 31 deletions(-) create mode 100644 pkg/plan/resource/kubectl_annotate.go diff --git a/pkg/apis/wksprovider/machine/os/os.go b/pkg/apis/wksprovider/machine/os/os.go index b8b17ce7..9737a698 100644 --- a/pkg/apis/wksprovider/machine/os/os.go +++ b/pkg/apis/wksprovider/machine/os/os.go @@ -4,7 +4,6 @@ import ( "bytes" "crypto/rsa" "encoding/base64" - "encoding/gob" "fmt" "io" "io/ioutil" @@ -49,7 +48,6 @@ import ( ) const ( - SeedNodePlanName = "seed-node-standard-plan" ConfigDestDir = "/etc/pki/weaveworks/wksctl" PemDestDir = "/etc/pki/weaveworks/wksctl/pem" authCmapName = "authn-authz" @@ -335,15 +333,13 @@ func (o OS) CreateSeedNodeSetupPlan(params SeedNodeParams) (*plan.Plan, error) { return nil, err } - // Create a config map containing a standard node plan for the seed node so the controller can add it - // to the seed node as an annotation. Otherwise, we won't be able to determine if the seed node is changed - // in a later update (this removes a dependency on flux) - seedNodePlanConfigMapManifest, err := o.createSeedNodePlanConfigMapManifest(params, &cluster.Spec, configMaps, authConfigMap, kubernetesVersion, kubernetesNamespace) + // Set plan as an annotation on node, just like controller does + seedNodePlan, err := o.seedNodeSetupPlan(params, &cluster.Spec, configMaps, authConfigMap, kubernetesVersion, kubernetesNamespace) if err != nil { return nil, err } + b.AddResource("node:plan", &resource.KubectlAnnotateSingleNode{Key: recipe.PlanKey, Value: seedNodePlan.ToJSON()}, plan.DependOn("kubeadm:init")) - configMapManifests["seed-node-plan"] = seedNodePlanConfigMapManifest addAuthConfigMapIfNecessary(configMapManifests, authConfigManifest) // Add config maps to system so controller can use them @@ -583,7 +579,7 @@ func addClusterAPICRDs(b *plan.Builder) ([]string, error) { return crdIDs, nil } -func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalClusterSpec, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion, kubernetesNamespace string) ([]byte, error) { +func (o OS) seedNodeSetupPlan(params SeedNodeParams, providerSpec *baremetalspecv1.BareMetalClusterSpec, providerConfigMaps map[string]*v1.ConfigMap, authConfigMap *v1.ConfigMap, kubernetesVersion, kubernetesNamespace string) (*plan.Plan, error) { nodeParams := NodeParams{ IsMaster: true, MasterIP: params.PrivateIP, @@ -598,20 +594,7 @@ func (o OS) createSeedNodePlanConfigMapManifest(params SeedNodeParams, providerS AddonNamespaces: params.AddonNamespaces, ControlPlaneEndpoint: providerSpec.ControlPlaneEndpoint, } - var paramBuffer bytes.Buffer - err := gob.NewEncoder(¶mBuffer).Encode(nodeParams) - if err != nil { - return nil, err - } - if params.Namespace == "" { - params.Namespace = kubernetesNamespace - } - - seedNodePlanConfigMapManifest, err := planParametersToConfigMapManifest(paramBuffer.Bytes(), params.Namespace) - if err != nil { - return nil, err - } - return seedNodePlanConfigMapManifest, nil + return o.CreateNodeSetupPlan(nodeParams) } func (o OS) applySeedNodePlan(p *plan.Plan) error { @@ -629,15 +612,6 @@ func (o OS) applySeedNodePlan(p *plan.Plan) error { return err } -func planParametersToConfigMapManifest(plan []byte, ns string) ([]byte, error) { - cm := v1.ConfigMap{ - TypeMeta: metav1.TypeMeta{Kind: "ConfigMap", APIVersion: "v1"}, - ObjectMeta: metav1.ObjectMeta{Name: SeedNodePlanName, Namespace: ns}, - BinaryData: map[string][]byte{"plan": plan}, - } - return yaml.Marshal(cm) -} - func createConfigFileResourcesFromFiles(providerSpec *baremetalspecv1.BareMetalClusterSpec, configDir, namespace string) (map[string][]byte, map[string]*v1.ConfigMap, []*resource.File, error) { fileSpecs := providerSpec.OS.Files configMapManifests, err := getConfigMapManifests(fileSpecs, configDir, namespace) diff --git a/pkg/plan/resource/kubectl_annotate.go b/pkg/plan/resource/kubectl_annotate.go new file mode 100644 index 00000000..676ba6cf --- /dev/null +++ b/pkg/plan/resource/kubectl_annotate.go @@ -0,0 +1,45 @@ +package resource + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" + "github.com/weaveworks/wksctl/pkg/plan" +) + +// KubectlAnnotateSingleNode is a resource to apply an annotation to the only node in a cluster +type KubectlAnnotateSingleNode struct { + base + + Key string // Which annotation to apply + Value string // Value of annotation +} + +var _ plan.Resource = plan.RegisterResource(&KubectlAnnotateSingleNode{}) + +// State implements plan.Resource. +func (ka *KubectlAnnotateSingleNode) State() plan.State { + return toState(ka) +} + +// Apply fetches the node name and performs a "kubectl annotate". +func (ka *KubectlAnnotateSingleNode) Apply(runner plan.Runner, diff plan.Diff) (bool, error) { + output, err := runner.RunCommand(withoutProxy("kubectl get nodes -o name"), nil) + if err != nil { + return false, errors.Wrapf(err, "could not fetch node name to annotate") + } + + nodeName := strings.Trim(output, " \n") + if strings.Contains(nodeName, "\n") { + return false, fmt.Errorf("unexpected output in node name: %q", output) + } + + cmd := fmt.Sprintf("kubectl annotate %q %s=%q", nodeName, ka.Key, ka.Value) + + if stdouterr, err := runner.RunCommand(withoutProxy(cmd), nil); err != nil { + return false, errors.Wrapf(err, "failed to apply annotation %s on %s; output %s", ka.Key, nodeName, stdouterr) + } + + return true, nil +} From cd9113230a8837c72c7128d933e5e6378e9cd1b6 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 24 Jun 2020 12:36:58 +0000 Subject: [PATCH 70/72] Put a note in the README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 97130572..e3b60f15 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Weave Kubernetes System Control - `wksctl` +**Please note that the code has recently updated from ClusterAPI v1alpha1 to v1alpha3 and as a result Everything Has Changed** +While this note is in the README you may find inconsistencies in the code, and between the code, examples and documentation. +Sorry about that. Feel free to still open issues and/or ask questions [as below](#getting-help). + `wksctl` allows simple creation of a Kubernetes cluster given a **set of IP addresses** and an **SSH key**. It can be run in a standalone environment but is best used via a [GitOps approach](https://www.weave.works/technologies/gitops/) in which cluster and machine descriptions are stored in Git and the state of the cluster tracks changes to the descriptions. Its features include: From e967587f838dfd0fff185a2bafd6342913324ab8 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 24 Jun 2020 14:48:30 +0000 Subject: [PATCH 71/72] Update vfsdata files --- .../wksprovider/machine/crds/crds_vfsdata.go | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go b/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go index 8cc1f5f3..cb121dcf 100644 --- a/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go +++ b/pkg/apis/wksprovider/machine/crds/crds_vfsdata.go @@ -21,53 +21,53 @@ var CRDs = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 893003009, time.UTC), }, "/cluster.weave.works_baremetalclusters.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.weave.works_baremetalclusters.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), - uncompressedSize: 4582, + modTime: time.Date(2020, 6, 24, 14, 43, 4, 869003008, time.UTC), + uncompressedSize: 5349, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x58\x4b\x93\xdb\x36\x0c\xbe\xeb\x57\x60\xd2\x43\x2e\x95\x9c\x4c\x2e\x1d\xdd\x36\xdb\x76\x26\x93\x64\x67\x67\x77\xbb\x3d\x74\x7a\x80\x48\xd8\x62\x4d\x91\x2c\x1f\xce\x3a\xbf\xbe\x43\x4a\xf2\x4b\x0f\xdb\x49\x7b\x29\x4f\x26\x08\x02\x1f\x3f\x80\x10\xcc\x2c\xcf\xf3\x0c\x8d\x78\x26\xeb\x84\x56\x25\xa0\x11\xf4\xe2\x49\xc5\x99\x2b\xd6\x3f\xb9\x42\xe8\xc5\xe6\x6d\x45\x1e\xdf\x66\x6b\xa1\x78\x09\xb7\xc1\x79\xdd\x3c\x90\xd3\xc1\x32\xfa\x99\x96\x42\x09\x2f\xb4\xca\x1a\xf2\xc8\xd1\x63\x99\x01\xa0\x52\xda\x63\x14\xbb\x38\x05\x60\x5a\x79\xab\xa5\x24\x9b\xaf\x48\x15\xeb\x50\x51\x15\x84\xe4\x64\x93\x87\xde\xff\xe6\x4d\xf1\xae\x78\x93\x01\x30\x4b\x69\xfb\x93\x68\xc8\x79\x6c\x4c\x09\x2a\x48\x99\x01\x28\x6c\xa8\x84\x0a\x2d\x45\x87\x92\xc9\xe0\x3c\x59\x57\x74\x3f\x8a\x2f\x84\x1b\x2a\xbe\x68\xbb\x76\x19\x80\xc4\x8a\x64\x8f\xa1\xd3\x78\xc9\x77\x07\x43\x69\x6a\x7c\x57\x42\xff\x2b\x73\x86\x58\xd4\x5e\x59\x1d\x4c\x09\xe3\x46\x23\x84\xce\x66\xcb\xc9\x7b\xb4\xf4\x39\xa2\xb9\x6d\xf5\xd3\x92\x14\xce\x7f\x1c\x5d\xfe\x24\x9c\x4f\x2a\x46\x06\x8b\x72\xe4\x34\x69\xd5\x09\xb5\x0a\x12\xed\x70\x3d\x03\x70\x4c\x1b\x2a\xe1\x2e\x42\x31\xc8\x88\x67\x00\x1b\x94\x82\x27\xda\x5a\x70\xda\x90\xba\xb9\xff\xf0\xfc\xee\x91\xd5\xd4\x60\x2b\x04\x30\x56\x1b\xb2\x5e\xf4\x67\x88\xe3\x20\x09\x76\x32\x00\x4e\x8e\x59\x61\x92\x45\x78\x1d\x4d\xb5\x3a\xc0\x63\xd8\xc9\x81\xaf\x09\xba\xe0\x11\x07\x97\xdc\x80\x5e\x82\xaf\x85\x03\x4b\xc6\x92\x23\xd5\x26\xc2\x81\x59\x88\x2a\xa8\x40\x57\x7f\x11\xf3\x05\x3c\x92\x8d\x46\xc0\xd5\x3a\x48\x1e\x73\x65\x43\xd6\x83\x25\xa6\x57\x4a\x7c\xdd\x59\x76\xe0\x75\x72\x29\xd1\x53\x47\x61\x3f\x84\xf2\x64\x15\xca\x48\x42\xa0\x1f\x01\x15\x87\x06\xb7\x60\x29\xfa\x80\xa0\x0e\xac\x25\x15\x57\xc0\x67\x6d\x09\x84\x5a\xea\x12\x6a\xef\x8d\x2b\x17\x8b\x95\xf0\x7d\xda\x33\xdd\x34\x41\x09\xbf\x5d\xa4\xe4\x15\x55\xf0\xda\xba\x05\xa7\x0d\xc9\x85\x13\xab\x1c\x2d\xab\x85\x27\xe6\x83\xa5\x05\x1a\x91\x27\xe0\x2a\x65\x7d\xd1\xf0\x1f\x6c\x77\x47\xdc\xeb\x03\xa4\x7e\x1b\xc3\xe6\xbc\x15\x6a\xb5\x13\xa7\x2c\x9a\xe4\x3d\x26\x11\x08\x07\xd8\x6d\x6b\xf1\xef\xe9\x8d\xa2\xc8\xca\xc3\x2f\x8f\x4f\xd0\x3b\x4d\x21\x38\xe6\x3c\xb1\xbd\xdf\xe6\xf6\xc4\x47\xa2\x84\x5a\x92\x6d\x03\xb7\xb4\xba\x49\x16\x49\x71\xa3\x85\xf2\x69\xc2\xa4\x20\x75\x4c\xba\x0b\x55\x23\x7c\x8c\xf4\xdf\x81\x9c\x8f\xf1\x29\xe0\x36\x5d\x7e\xa8\x08\x82\xe1\xe8\x89\x17\xf0\x41\xc1\x2d\x36\x24\x6f\xd1\xd1\x7f\x4e\x7b\x64\xd8\xe5\x91\xd2\xf3\xc4\x1f\xd6\xac\x63\xc5\x96\xad\x9d\xb8\xaf\x0b\xfd\x18\xbb\x43\xe9\x1e\x71\xbe\xab\x79\x07\xc9\xe9\xa9\x19\x08\x4f\xc2\x7c\x13\x77\x76\xa2\x8a\x5c\xbc\x1f\xc9\x58\xcc\x79\xa1\x9c\x47\x29\x21\xce\x52\x24\xda\xaa\x34\x30\x38\x85\xaa\x77\x67\x46\xe5\x93\xf8\x66\x88\x1b\x2a\xa0\xb5\xb8\x1d\x59\x4f\xf5\x7a\x66\xdf\xa4\x61\x83\x16\xa7\x50\x21\xe7\xe9\xa3\x83\xf2\x7e\xf6\xc8\x57\xe0\x3f\x09\x78\x3f\x62\x6a\x0b\x4b\x7c\x68\x3d\x4f\x47\x1b\x88\x67\xac\x4d\x11\x85\x46\xb4\x37\xf1\xd4\xc9\x5c\x3c\xf7\x14\x3c\xde\xdc\x8d\x1e\x7e\x26\xaa\x67\x38\x99\x8b\x68\xec\x0f\x62\xa1\xfd\xa4\x91\xbf\x47\x89\x8a\x0d\x71\x9f\x71\x31\xc5\x69\x3e\x6a\x7c\x94\xc4\x11\x7e\x31\xf8\x3a\x96\x01\x96\x3e\x37\xbf\x53\x55\x6b\xbd\xbe\x86\x51\x86\xac\xa6\xa7\xa7\x4f\x57\x9e\x06\xc0\x11\xb3\xe4\x7f\x15\x72\x34\xd1\x67\xb7\x06\x2b\xff\x35\xf2\xf6\x30\x06\x4b\xc1\xca\x6b\x68\xd4\x56\x7c\xfd\x2e\x16\x6f\x3a\x23\xc4\xbf\x85\xcf\x64\xe2\x37\x85\xdf\x65\xe4\x7f\x15\x14\x26\x75\xe0\xf7\x56\x6f\x04\x1f\xde\xb6\x49\x5c\xcc\x8a\x6b\x22\x77\xda\x85\x5c\x70\xee\x58\xa5\xd9\x1a\x57\xd7\x73\xbc\x19\x76\x9b\x17\xec\x9b\xe6\x39\x82\x1f\x08\x3b\x70\x03\x79\xe7\xfc\x52\xf6\x63\x97\x72\x6f\xf5\xcb\xf6\x62\xe6\x45\x83\x2b\x7a\x20\xa3\x9d\xf0\xda\x5e\xbe\x4f\x0f\xc2\x32\x17\xb0\xa5\x90\xe3\x9f\xbd\x99\xca\x3f\xdf\x22\x40\xdb\x95\x78\xa1\x0e\xfe\x46\x8c\x8d\xb3\x1f\x55\x80\xb6\x0f\x9d\x36\x71\x1e\x09\xb4\x7f\x1c\x97\x62\xd5\xa0\x99\x53\xba\x08\x4f\x1c\x6b\x1a\xc4\xe2\x1b\xec\x4c\xf7\x04\xfd\xc8\xf7\xb8\x67\x74\xd6\x34\xd6\x30\x1d\x02\x99\x68\x4a\xce\x83\xc8\x0f\xc3\x38\xa1\xd1\x06\xe8\xfa\x96\x68\xae\x3f\x98\xdc\xe8\x5c\xfd\x91\xb6\xf7\xe8\xeb\x8b\x2f\x43\x70\x17\xd7\xba\x31\x32\xf2\x58\xff\x8e\xe6\x7b\x0c\x47\xe2\xe8\x67\xbe\xff\x3f\x11\xed\x9f\x2b\xfa\x67\x83\x9d\x2c\xe5\x72\xde\x3d\x52\x1c\x2c\xc7\xef\x91\xdd\x10\x2f\xc1\xdb\xd0\x72\xee\xbc\xb6\xb1\x72\xb6\x12\xe7\xd1\x87\xb4\x1b\x19\x23\xe3\x89\xdf\x9d\xbe\x32\xbc\x7a\x75\xf4\x68\x90\xa6\x4c\xab\xb6\x0d\x74\x25\xfc\xf1\x67\xd6\x5a\x25\xfe\xdc\xa3\x89\xc2\x7f\x02\x00\x00\xff\xff\x7d\x9c\xfd\x86\xe6\x11\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x58\xcd\x92\xdb\x36\x0c\xbe\xeb\x29\x30\xe9\x21\x97\x5a\x4e\x26\x97\x8e\x6f\xdb\x6d\x3a\x93\xc9\xcf\xec\x64\xb7\xdb\x43\xa7\x07\x98\x84\x2d\xd6\x14\xc9\x82\xa4\xb3\x9b\xa7\xef\x90\x92\x6c\xaf\xf5\x63\x7b\x77\xda\x43\x79\x12\x41\x12\xf8\xf8\x01\x02\x20\x15\xb3\xd9\xac\x40\xa7\xee\x89\xbd\xb2\x66\x01\xe8\x14\x3d\x04\x32\x69\xe6\xcb\xcd\x4f\xbe\x54\x76\xbe\x7d\xbb\xa4\x80\x6f\x8b\x8d\x32\x72\x01\xd7\xd1\x07\x5b\x7f\x25\x6f\x23\x0b\xfa\x85\x56\xca\xa8\xa0\xac\x29\x6a\x0a\x28\x31\xe0\xa2\x00\x40\x63\x6c\xc0\x24\xf6\x69\x0a\x20\xac\x09\x6c\xb5\x26\x9e\xad\xc9\x94\x9b\xb8\xa4\x65\x54\x5a\x12\x67\x0b\x9d\xfd\xed\x9b\xf2\x5d\xf9\xa6\x00\x10\x4c\xf9\xf8\x9d\xaa\xc9\x07\xac\xdd\x02\x4c\xd4\xba\x00\x30\x58\xd3\x02\x96\xc8\x94\x0c\x6a\xa1\xa3\x0f\xc4\xbe\x6c\x1f\xca\x6f\x84\x5b\x2a\xbf\x59\xde\xf8\x02\x40\xe3\x92\x74\x87\xa1\xdd\xf1\x30\xdb\x5d\x0c\xb5\xab\xf0\xdd\x02\xba\xa7\xc2\x3b\x12\x69\xf7\x9a\x6d\x74\x0b\x18\x56\x9a\x20\xb4\x3a\x1b\x4e\x7e\x46\xa6\xcf\x09\xcd\x75\xb3\x3f\x2f\x69\xe5\xc3\xc7\xc1\xe5\x4f\xca\x87\xbc\xc5\xe9\xc8\xa8\x07\x6e\x93\x57\xbd\x32\xeb\xa8\x91\xfb\xeb\x05\x80\x17\xd6\xd1\x02\xbe\x24\x28\x0e\x05\xc9\x02\x60\x8b\x5a\xc9\x4c\x5b\x03\xce\x3a\x32\x57\x37\x1f\xee\xdf\xdd\x8a\x8a\x6a\x6c\x84\x00\x8e\xad\x23\x0e\xaa\xbb\x43\x1a\x07\x41\xb0\x93\x01\x48\xf2\x82\x95\xcb\x1a\xe1\x75\x52\xd5\xec\x01\x99\xdc\x4e\x1e\x42\x45\xd0\x3a\x8f\x24\xf8\x6c\x06\xec\x0a\x42\xa5\x3c\x30\x39\x26\x4f\xa6\x09\x84\x03\xb5\x90\xb6\xa0\x01\xbb\xfc\x8b\x44\x28\xe1\x96\x38\x29\x01\x5f\xd9\xa8\x65\x8a\x95\x2d\x71\x00\x26\x61\xd7\x46\x7d\xdf\x69\xf6\x10\x6c\x36\xa9\x31\x50\x4b\x61\x37\x94\x09\xc4\x06\x75\x22\x21\xd2\x8f\x80\x46\x42\x8d\x8f\xc0\x94\x6c\x40\x34\x07\xda\xf2\x16\x5f\xc2\x67\xcb\x04\xca\xac\xec\x02\xaa\x10\x9c\x5f\xcc\xe7\x6b\x15\xba\xb0\x17\xb6\xae\xa3\x51\xe1\x71\x9e\x83\x57\x2d\x63\xb0\xec\xe7\x92\xb6\xa4\xe7\x5e\xad\x67\xc8\xa2\x52\x81\x44\x88\x4c\x73\x74\x6a\x96\x81\x9b\x1c\xf5\x65\x2d\x7f\xe0\xf6\x1d\xf1\xaf\x0f\x90\x86\xc7\xe4\x36\x1f\x58\x99\xf5\x4e\x9c\xa3\x68\x94\xf7\x14\x44\xa0\x3c\x60\x7b\xac\xc1\xbf\xa7\x37\x89\x12\x2b\x5f\xdf\xdf\xde\x41\x67\x34\xbb\xe0\x29\xe7\x99\xed\xfd\x31\xbf\x27\x3e\x11\xa5\xcc\x8a\xb8\x71\xdc\x8a\x6d\x9d\x35\x92\x91\xce\x2a\x13\xf2\x44\x68\x45\xe6\x29\xe9\x3e\x2e\x6b\x15\x92\xa7\xff\x8e\xe4\x43\xf2\x4f\x09\xd7\xf9\xe5\x87\x25\x41\x74\x12\x03\xc9\x12\x3e\x18\xb8\xc6\x9a\xf4\x35\x7a\xfa\xd7\x69\x4f\x0c\xfb\x59\xa2\xf4\x34\xf1\x87\x39\xeb\xe9\xc6\x86\xad\x9d\xb8\xcb\x0b\xdd\x18\x7a\x87\xf2\x7b\x24\xe5\x2e\xe7\x1d\x04\x67\xa0\xba\x27\x3c\x72\xf3\x55\x3a\xd9\x8a\x96\xe4\xd3\xfb\x91\x95\xa5\x98\x57\xc6\x07\xd4\x1a\xd2\x2c\x7b\xa2\xc9\x4a\x3d\x85\x63\xa8\x3a\x73\x6e\x50\x3e\x8a\x6f\x82\xb8\xfe\x06\x64\xc6\xc7\x81\xf5\x9c\xaf\x27\xce\x8d\x2a\x76\xc8\x38\x86\x0a\xa5\xcc\x45\x07\xf5\xcd\xe4\x95\x2f\xc0\x7f\xe4\xf0\x6e\xa4\xd0\x56\x4c\xb2\xaf\x7d\x96\xaf\xd6\x13\x4f\x68\x1b\x23\x0a\x9d\x6a\xde\xc4\x63\x23\x53\xfe\xdc\x53\x70\x7b\xf5\x65\xf0\xf2\x13\x5e\x3d\xc1\xc9\x94\x47\xe9\x21\x30\x5e\xf1\x3a\xd6\x29\x87\x5c\x68\x77\x3a\x40\x61\x32\x5c\xce\xc0\x9d\x46\x4e\x8e\x2f\xd0\x30\xee\x70\x18\x77\x7a\xb3\x94\x4d\x5f\x1e\x62\x53\x7c\x8f\x1e\xc4\x18\xaa\x94\xf4\x44\x2e\xae\xbf\xd3\xb2\xb2\x76\x73\x49\xfc\x08\x14\x15\xdd\xdd\x7d\x1a\xba\xe7\x24\x49\x9e\x04\x53\xf8\x55\xe9\x41\x96\x27\x8f\x46\xd6\x17\x9e\x19\xf3\xc6\xec\x00\x46\x6f\x29\xb2\xbe\x84\x46\xcb\xea\xfb\x8b\x58\xbc\x6a\x95\x90\x7c\x0e\x9f\x59\xc5\x6f\x06\x5f\xa4\xe4\x7f\xe5\x14\xa1\x6d\x94\x37\x6c\xb7\x4a\xf6\x73\xe2\x28\xae\xf6\x13\xe3\x46\xa3\xa1\xf7\x6d\xe3\x72\xfe\x61\x56\x97\xb8\xfd\xb8\x61\x3b\xa9\x3f\x2b\x44\xb1\xc1\xf5\xe5\x0e\xda\xf6\x1b\xf3\x33\xce\x8d\x3b\x29\x81\xef\x09\x5b\x70\x3d\x79\x6b\xfc\x5c\xd7\xa5\x86\xee\x86\xed\xc3\xe3\xd9\xcc\xab\x1a\xd7\xf4\x95\x9c\xf5\x2a\x58\x3e\xff\x5c\xfa\x84\xd4\x14\x46\x2b\xd1\x48\x15\x9a\xae\x40\xcf\x6e\x56\x26\xaa\xce\xe4\xc9\x8b\xdb\x8b\xb1\x2a\xf3\x8c\xb6\xc3\xf6\x28\x98\x22\x67\xa5\xf4\x30\x67\x2f\x2a\xf7\x92\x7c\x50\xe6\xe0\x9b\x75\x68\x9c\x51\xf5\x9b\x8f\x9e\x71\x15\xa7\x91\x40\x93\x42\x56\x6a\x5d\xa3\x9b\xda\x74\x16\x9e\x34\x36\xd4\x8b\xe6\x67\xe8\x99\xee\x47\x20\x87\xc4\x0e\xf7\xc4\x9e\x0d\x0d\x75\xe7\x87\x40\x46\xdb\x93\xd3\x4d\xd1\x81\x1b\x47\x76\x34\x0e\xfa\x8f\x9a\x23\xef\xab\x8f\xf4\x78\x83\xa1\x3a\x3b\x9d\x44\x7f\x76\xa9\x19\x22\x63\x96\x2a\xc8\x93\xf9\x1e\xc3\x13\x71\xb2\x53\x9c\xb8\x82\x0f\x18\xa2\x3f\xe7\x73\x93\x09\xe5\x48\xca\x5c\x5a\xab\x09\xcd\x49\xdc\x59\xc5\x34\xa2\x23\xd1\xfe\x6f\x5d\xf7\xd7\x6c\x27\xcb\xf0\x66\xed\x3f\xba\x83\xe5\xd4\xa0\xf0\x96\xe4\x02\x02\xb7\xc9\xcb\x07\xcb\xa9\x1a\x36\x92\xfd\x95\x51\x08\x72\x81\xe4\x97\xe3\x9f\x6c\xaf\x5e\xe5\x49\xf7\xcf\x2c\x4f\x85\x35\xcd\x57\x90\x5f\xc0\x1f\x7f\x16\x8d\x56\x92\xf7\x1d\x9a\x24\xfc\x27\x00\x00\xff\xff\x80\x82\x2d\xe7\xe5\x14\x00\x00"), }, "/cluster.weave.works_baremetalmachines.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.weave.works_baremetalmachines.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 653639350, time.UTC), - uncompressedSize: 2502, + modTime: time.Date(2020, 6, 24, 14, 43, 4, 893003009, time.UTC), + uncompressedSize: 2453, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\xc1\x8e\x1b\x37\x0c\xbd\xcf\x57\x10\xe9\x21\x97\xce\x38\x41\x2e\xc5\xdc\xd2\x6d\x0e\x8b\x76\x83\x20\x1b\xec\xa5\xe8\x81\x23\xd1\x36\xbb\x1a\x69\x4a\x52\x4e\xb6\x5f\x5f\x48\xe3\xf1\xda\x5e\xef\x16\x05\xda\x5b\xe7\x64\x51\xe4\x23\xf9\x1e\x25\xab\x69\xdb\xb6\xc1\x89\xef\x48\x94\x53\xec\x01\x27\xa6\x6f\x46\xb1\xac\xb4\xbb\xff\x41\x3b\x4e\xab\xdd\xdb\x81\x0c\xdf\x36\xf7\x1c\x7d\x0f\x57\x59\x2d\x8d\x9f\x49\x53\x16\x47\x3f\xd1\x9a\x23\x1b\xa7\xd8\x8c\x64\xe8\xd1\xb0\x6f\x00\x30\xc6\x64\x58\xcc\x5a\x96\x00\x2e\x45\x93\x14\x02\x49\xbb\xa1\xd8\xdd\xe7\x81\x86\xcc\xc1\x93\xd4\x0c\x4b\xfe\xdd\x9b\xee\x5d\xf7\xa6\x01\x70\x42\x35\xfc\x0b\x8f\xa4\x86\xe3\xd4\x43\xcc\x21\x34\x00\x11\x47\xea\x61\x40\xa1\x92\x30\x8c\xe8\xb6\x1c\x49\x3b\x17\xb2\x1a\x49\xf7\x95\x70\x47\xdd\xd7\x24\xf7\xda\x00\x04\x1c\x28\x2c\x35\xec\x3d\xbe\xb5\x87\xc6\x30\x4c\x5b\x7c\xd7\xc3\xf2\xab\xd1\x89\x5c\xf1\xde\x48\xca\x53\x0f\x97\x41\x4b\x09\x7b\xcc\x99\x93\x1f\x51\xe8\xa6\x54\x73\x33\x57\x53\xb7\x02\xab\xfd\x7c\x71\xfb\x17\x56\xab\x2e\x53\xc8\x82\xe1\x42\x37\x75\x57\x39\x6e\x72\x40\x79\xba\xdf\x00\xa8\x4b\x13\xf5\xf0\xb1\x94\x32\xa1\x23\xdf\x00\xec\x30\xb0\xaf\xb4\xcd\xc5\xa5\x89\xe2\xfb\x4f\xd7\x77\xef\x6e\xdd\x96\x46\x9c\x8d\x00\x93\xa4\x89\xc4\x78\xe9\xa1\x7c\x47\x43\x70\xb0\x01\x78\x52\x27\x3c\x55\x44\x78\x5d\xa0\x66\x1f\xf0\x45\x76\x52\xb0\x2d\xc1\x5e\x3c\xf2\xa0\x35\x0d\xa4\x35\xd8\x96\x15\x84\x26\x21\xa5\x38\x0f\xc2\x11\x2c\x14\x17\x8c\x90\x86\xdf\xc9\x59\x07\xb7\x24\x05\x04\x74\x9b\x72\xf0\x65\x56\x76\x24\x06\x42\x2e\x6d\x22\xff\x79\x40\x56\xb0\x54\x53\x06\x34\xda\x53\xb8\x7c\x1c\x8d\x24\x62\x28\x24\x64\xfa\x1e\x30\x7a\x18\xf1\x01\x84\x4a\x0e\xc8\xf1\x08\xad\xba\x68\x07\x37\x49\x08\x38\xae\x53\x0f\x5b\xb3\x49\xfb\xd5\x6a\xc3\xb6\x8c\xbd\x4b\xe3\x98\x23\xdb\xc3\xaa\x0e\x2f\x0f\xd9\x92\xe8\xca\xd3\x8e\xc2\x4a\x79\xd3\xa2\xb8\x2d\x1b\x39\xcb\x42\x2b\x9c\xb8\xad\x85\xc7\x3a\xf5\xdd\xe8\xbf\x93\xfd\x19\xd1\xd7\x47\x95\xda\x43\x91\x4d\x4d\x38\x6e\x0e\xe6\x3a\x45\xcf\xf2\x5e\x86\x08\x58\x01\xf7\x61\x73\xfd\x8f\xf4\x16\x53\x61\xe5\xf3\x87\xdb\x2f\xb0\x24\xad\x12\x9c\x72\x5e\xd9\x7e\x0c\xd3\x47\xe2\x0b\x51\x1c\xd7\x24\xb3\x70\x6b\x49\x63\x45\xa4\xe8\xa7\xc4\xd1\xea\xc2\x05\xa6\x78\x4a\xba\xe6\x61\x64\x2b\x4a\xff\x91\x49\xad\xe8\xd3\xc1\x55\x3d\xfc\x30\x10\xe4\xc9\xa3\x91\xef\xe0\x3a\xc2\x15\x8e\x14\xae\x50\xe9\x3f\xa7\xbd\x30\xac\x6d\xa1\xf4\xef\x89\x3f\xbe\xb3\x4e\x1d\x67\xb6\x0e\xe6\xe5\x5e\x58\xbe\x4b\x67\xa8\x9e\x23\xef\x85\xf4\xcc\xf8\x4c\xf2\x8a\x93\xc4\x2e\x3b\x97\x81\xde\x90\x9c\x7a\x0b\xef\xd0\xe8\x3c\xe0\x64\x5c\x3e\x44\xff\xa9\x6a\x56\xaf\xb0\xf9\x88\x7a\x32\xe4\x30\xeb\xc4\x42\xbe\x9c\xa3\x72\xad\x0e\x81\x75\x0b\x58\x4e\x5c\x24\x57\xe2\xbb\x33\xe8\xe7\xfa\x7c\xa1\xd7\x17\xfb\x7d\xae\xe7\x97\xfb\x86\x43\xe5\xe7\x71\xed\x52\xc5\x13\x7b\xc9\x72\x91\xd8\x33\x65\xe1\x91\xd7\xf7\xff\x54\xbc\x39\xec\xba\x5c\x3d\x6b\x74\x4f\x74\x79\x3e\x30\x0f\x81\xdd\xff\x32\x1e\xbe\x7f\x43\xc6\x4b\xd8\x97\x70\x2f\x84\x9f\x99\x1e\x9f\x23\xcb\xb3\xe0\x60\xab\x34\xb5\xfb\x47\xc8\xd1\x36\x80\x96\xbb\xd4\xf7\x60\x92\xe7\xff\x7f\xb5\x24\xb8\xa1\xbd\x45\x0d\x2d\xd7\x68\x74\x8e\x26\x23\xff\xf1\xfc\x15\xf1\xea\xd5\xc9\xa3\xa0\x2e\x5d\x8a\x9e\xe7\x77\x14\xfc\xfa\x5b\x33\xa3\x92\xbf\x5b\xaa\x29\xc6\xbf\x02\x00\x00\xff\xff\x48\x89\x29\x52\xc6\x09\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\x3f\x93\xdc\xb6\x0f\xed\xf5\x29\x30\xfe\x15\x6e\x7e\xd2\xda\x73\x4d\x46\x5d\x72\x76\x71\x93\x9c\xc7\xe3\xf3\x5c\x93\x49\x01\x91\xb8\x5d\xe4\x28\x52\x01\xc0\xb5\x2f\x9f\x3e\x43\x6a\xb5\xff\xbc\x9b\xa4\x48\xba\xb0\x92\x40\xf2\xe1\xe1\x01\x20\xd9\xb4\x6d\xdb\xe0\xc4\x8f\x24\xca\x29\xf6\x80\x13\xd3\x57\xa3\x58\xfe\xb4\x7b\xfe\x4e\x3b\x4e\xab\xed\xdb\x81\x0c\xdf\x36\xcf\x1c\x7d\x0f\xb7\x59\x2d\x8d\x9f\x48\x53\x16\x47\xef\xe8\x89\x23\x1b\xa7\xd8\x8c\x64\xe8\xd1\xb0\x6f\x00\x30\xc6\x64\x58\xcc\x5a\x7e\x01\x5c\x8a\x26\x29\x04\x92\x76\x4d\xb1\x7b\xce\x03\x0d\x99\x83\x27\xa9\x1e\x16\xff\xdb\x37\xdd\x4d\xf7\xa6\x01\x70\x42\x75\xfb\x67\x1e\x49\x0d\xc7\xa9\x87\x98\x43\x68\x00\x22\x8e\xd4\xc3\x80\x42\xc5\x61\x18\xd1\x6d\x38\x92\x76\x2e\x64\x35\x92\xee\x0b\xe1\x96\xba\x2f\x49\x9e\xb5\x01\x08\x38\x50\x58\x38\xec\x56\x7c\x6d\xf7\x81\x61\x98\x36\x78\xd3\xc3\xf2\xd5\xe8\x44\xae\xac\x5e\x4b\xca\x53\x0f\x97\x41\x0b\x85\x1d\xe6\xac\xc9\x0f\x28\x74\x5f\xd8\xdc\xcf\x6c\xea\x54\x60\xb5\x1f\x2f\x4e\xff\xc4\x6a\x75\xc9\x14\xb2\x60\xb8\x10\x4d\x9d\x55\x8e\xeb\x1c\x50\xbe\x9d\x6f\x00\xd4\xa5\x89\x7a\xf8\x50\xa8\x4c\xe8\xc8\x37\x00\x5b\x0c\xec\xab\x6c\x33\xb9\x34\x51\xfc\xfe\xe3\xdd\xe3\xcd\x83\xdb\xd0\x88\xb3\x11\x60\x92\x34\x91\x18\x2f\x31\x94\x71\x54\x04\x7b\x1b\x80\x27\x75\xc2\x53\x45\x84\xd7\x05\x6a\x5e\x03\xbe\xa4\x9d\x14\x6c\x43\xb0\x4b\x1e\x79\xd0\xea\x06\xd2\x13\xd8\x86\x15\x84\x26\x21\xa5\x38\x17\xc2\x11\x2c\x94\x25\x18\x21\x0d\xbf\x92\xb3\x0e\x1e\x48\x0a\x08\xe8\x26\xe5\xe0\x4b\xad\x6c\x49\x0c\x84\x5c\x5a\x47\xfe\x7d\x8f\xac\x60\xa9\xba\x0c\x68\xb4\x93\x70\x19\x1c\x8d\x24\x62\x28\x22\x64\xfa\x3f\x60\xf4\x30\xe2\x0b\x08\x15\x1f\x90\xe3\x11\x5a\x5d\xa2\x1d\xdc\x27\x21\xe0\xf8\x94\x7a\xd8\x98\x4d\xda\xaf\x56\x6b\xb6\xa5\xec\x5d\x1a\xc7\x1c\xd9\x5e\x56\xb5\x78\x79\xc8\x96\x44\x57\x9e\xb6\x14\x56\xca\xeb\x16\xc5\x6d\xd8\xc8\x59\x16\x5a\xe1\xc4\x6d\x25\x1e\x6b\xd5\x77\xa3\xff\x9f\xec\x7a\x44\x5f\x1f\x31\xb5\x97\x92\x36\x35\xe1\xb8\xde\x9b\x6b\x15\x5d\xd5\xbd\x14\x11\xb0\x02\xee\xb6\xcd\xfc\x0f\xf2\x16\x53\x51\xe5\xd3\xfb\x87\xcf\xb0\x38\xad\x29\x38\xd5\xbc\xaa\x7d\xd8\xa6\x07\xe1\x8b\x50\x1c\x9f\x48\xe6\xc4\x3d\x49\x1a\x2b\x22\x45\x3f\x25\x8e\x56\x7f\x5c\x60\x8a\xa7\xa2\x6b\x1e\x46\xb6\x92\xe9\xdf\x32\xa9\x95\xfc\x74\x70\x5b\x9b\x1f\x06\x82\x3c\x79\x34\xf2\x1d\xdc\x45\xb8\xc5\x91\xc2\x2d\x2a\xfd\xeb\xb2\x17\x85\xb5\x2d\x92\xfe\xb5\xf0\xc7\x67\xd6\xe9\xc2\x59\xad\xbd\x79\x39\x17\x96\x71\xa9\x87\x66\x3b\x6f\xd1\xe8\xd4\x78\x96\xd0\xf7\xd1\x7f\xac\xaa\xd6\x43\x66\x6e\x22\x4f\x86\x1c\x66\x25\x59\xc8\x97\x4a\x2f\x07\xdf\x10\x58\x37\x80\xa5\x27\x22\xb9\xb2\xbf\x3b\x83\xbe\xc6\xa4\x0c\xf4\x5e\x48\x2f\x4c\x5c\x91\x63\x8f\x99\xc4\xae\x6f\x2a\xad\xb6\x26\x39\x9b\x5f\x98\x9f\xef\x6b\x17\x16\xdf\xd8\x8b\x97\xe6\x92\x83\x33\xed\x77\x51\x6e\xd9\x93\xdc\xbd\x3b\xc7\xbf\x1a\xc8\x94\x87\xc0\xee\xbf\x4c\xec\xc7\x3f\x91\x89\xcb\xcd\x61\x68\x59\xff\x4e\x7b\x08\xa1\x7f\xb9\x9c\xc1\x21\xa5\x40\x78\x7c\x4d\x5c\x8a\xa3\x9d\x21\xfe\x9c\xd1\x99\xe9\xf0\xba\x58\x6e\xf9\xbd\xad\xd2\x6b\x77\x6f\x8a\xa3\x69\x00\x2d\x47\xa3\xef\xc1\x24\xcf\xd7\xb9\x5a\x12\x5c\xd3\xce\x72\x08\x19\x9d\xa3\xc9\xc8\x7f\x38\x7f\x14\xbc\x7a\x75\x72\xc7\xd7\x5f\x97\xa2\xe7\xf9\x59\x04\x3f\xff\xd2\xcc\xa8\xe4\x1f\x17\x36\xc5\xf8\x47\x00\x00\x00\xff\xff\x67\x71\x95\xa1\x95\x09\x00\x00"), }, "/cluster.x-k8s.io_clusters.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.x-k8s.io_clusters.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 729003002, time.UTC), uncompressedSize: 11151, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\x1b\xb7\x11\x7f\xe7\xa7\xd8\x71\x1e\xdc\xcc\x98\xc7\xc4\xce\x74\x3a\x7c\x73\xa5\xa4\xa3\xb6\xb1\x39\x92\xea\x17\x8f\x1f\x96\x87\x3d\x1e\x2a\x1c\x70\x05\x70\xa4\x99\x4c\xbe\x7b\x67\x01\x1c\x79\x24\x71\x14\xe5\x8c\xd3\x3e\xe8\x5e\x24\xe2\xcf\x62\x77\xb1\x7f\x7e\x0b\x60\x32\x9d\x4e\x27\xd8\xca\x0f\x64\x9d\x34\x7a\x0e\xd8\x4a\xfa\xec\x49\xf3\x2f\x57\x3c\xfc\xc5\x15\xd2\xcc\xd6\xdf\x2f\xc9\xe3\xf7\x93\x07\xa9\xc5\x1c\xae\x3a\xe7\x4d\x73\x4b\xce\x74\xb6\xa4\x6b\xaa\xa4\x96\x5e\x1a\x3d\x69\xc8\xa3\x40\x8f\xf3\x09\x00\x6a\x6d\x3c\x72\xb3\xe3\x9f\x00\xa5\xd1\xde\x1a\xa5\xc8\x4e\x57\xa4\x8b\x87\x6e\x49\xcb\x4e\x2a\x41\x36\xac\xd0\xaf\xbf\xfe\xae\x78\x53\x7c\x37\x01\x28\x2d\x85\xe9\xf7\xb2\x21\xe7\xb1\x69\xe7\xa0\x3b\xa5\x26\x00\x1a\x1b\x9a\x43\xa9\x3a\xe7\xc9\xba\x22\xfd\x53\x7c\x9e\x46\x6e\x27\xae\xa5\x32\xb0\x20\x44\xe0\x0b\xd5\xc2\x4a\xed\xc9\x5e\x19\xd5\x35\x91\x9f\x29\xfc\xfd\xee\xfd\xbb\x05\xfa\x7a\x0e\x85\xf3\xe8\x3b\x57\xb4\x35\x3a\x0a\xbc\x0a\x72\xa5\x95\xad\x0f\x1c\x5d\x45\xfa\x10\x47\x81\xeb\xca\x1a\xd0\xc1\x82\xb4\x90\x7a\x35\x5b\x58\xb3\x96\xcc\xfb\xc1\x0f\x12\xb3\x6b\x52\xe4\xb9\xf1\x27\x94\x8a\x44\x20\x1c\x59\x5f\xec\x16\xf2\xdb\x96\xe6\xe0\xbc\x95\x7a\x35\x01\x58\x59\xd3\xb5\x3b\xd1\xf6\x12\xc5\x89\xbd\x22\xd1\xd3\xca\x58\xd9\xff\x9e\xf6\xe3\xa7\xd8\xca\xd0\x92\xb6\x29\xb6\x86\x16\x25\x9d\xff\xc7\xb0\xf5\x9f\xd2\xf9\xd0\xd3\xaa\xce\xa2\xda\xab\x33\x34\xba\xda\x58\xff\x6e\xbf\x24\x2f\x11\x3b\xa4\x5e\x75\x0a\xed\x6e\xfc\x04\xc0\x95\x86\x85\x08\xc3\x5b\x2c\x83\xa4\xae\x5b\xda\x64\x1f\x89\x44\xd4\xde\x1c\x7e\xfd\x6d\x02\xb0\x46\x25\x45\xd8\xdd\xd8\x69\x5a\xd2\x6f\x17\x37\x1f\xde\xdc\x95\x35\x35\x18\x1b\x47\xb6\x41\x3a\xf0\x35\x41\x1c\x09\x95\xb1\xe1\x67\xcf\x3e\xbc\x5d\xdc\xa4\xd9\xad\x35\x2d\x59\xbf\xd3\x13\x7f\x03\x4b\xdf\xb5\x1d\xad\xf3\x92\x19\x89\x63\x40\xb0\x6d\x53\x5c\x30\x59\x28\x09\x70\x71\x69\x53\x81\xaf\xa5\x03\x4b\xad\x25\x47\x3a\x5a\xfb\x80\x2c\xf0\x10\xd4\x60\x96\xff\xa6\xd2\x17\x70\x47\x96\x89\xb0\x76\x3b\x25\xd8\x21\xd6\x64\x3d\x58\x2a\xcd\x4a\xcb\x5f\x76\x94\x1d\x78\x13\x96\x54\xe8\x29\x6d\x53\xff\x05\x3b\xd6\xa8\x58\x85\x1d\xbd\x02\xd4\x02\x1a\xdc\x82\x25\x5e\x03\x3a\x3d\xa0\x16\x86\xb8\x02\x7e\x36\x96\x40\xea\xca\xcc\xa1\xf6\xbe\x75\xf3\xd9\x6c\x25\x7d\xef\xdb\xa5\x69\x9a\x4e\x4b\xbf\x9d\x05\x0f\x95\xcb\xce\x1b\xeb\x66\x82\xd6\xa4\x66\x4e\xae\xa6\x68\xcb\x5a\x7a\x2a\x7d\x67\x69\x86\xad\x9c\x06\xc6\x75\x70\xed\xa2\x11\xdf\xec\x36\xfa\xe5\x80\xd3\x23\xc3\x8e\x5f\xb0\xcb\x51\xbd\xb3\x7d\xf2\xee\x62\x9a\x16\xf9\xdf\xab\x97\x9b\x58\x2b\xb7\x3f\xde\xdd\x43\xbf\x68\xd8\x82\x43\x9d\x07\x6d\xef\xa7\xb9\xbd\xe2\x59\x51\x52\x57\x64\xe3\xc6\x55\xd6\x34\x81\x22\x69\xd1\x1a\xa9\x7d\xb2\x24\x49\xfa\x50\xe9\xae\x5b\x36\xd2\xf3\x4e\xff\xa7\x23\xe7\x79\x7f\x0a\xb8\x0a\x11\x0e\x96\x04\x5d\x2b\xd0\x93\x28\xe0\x46\xc3\x15\x36\xa4\xae\xd0\xd1\x57\x57\x3b\x6b\xd8\x4d\x59\xa5\x8f\x2b\x7e\x18\x98\x0f\x07\x46\x6d\xed\x9a\xfb\xd0\x99\xdd\xa1\xe4\x81\x77\x2d\x95\x07\x9e\x21\xc8\x49\xcb\xd6\xeb\xd1\x13\xdb\xfc\x30\xf2\x8c\xfb\x22\x7f\xc9\x6d\xdf\x91\xdf\x18\xfb\x70\xd8\x37\xe2\xff\x3a\x8e\x65\xf7\xa9\xe4\xaa\xb3\xc1\xeb\x8a\xa3\x99\x63\xeb\x41\x8c\x01\xd1\x20\x16\xc6\xfa\xd3\xee\xa3\x65\xdf\x2e\x6e\xf6\xa3\x83\x7e\x64\x25\x93\xe0\x2d\x37\xf1\x3f\x6f\x17\x37\xc9\xc8\x92\x73\x67\xa8\x02\x2c\xd9\xc0\xd9\x74\xae\xa9\xc2\x4e\x05\x3b\x82\x3f\xff\xf0\xc3\x9b\x63\xee\xf9\xab\x8c\x6d\xd0\xcf\xd9\xe1\xdf\xbc\xce\xf4\xc7\xed\xe3\x70\xb0\x3a\xd0\x74\x92\xdf\x88\x8c\xe4\x47\xa2\xdd\xd7\xb4\xd3\xa6\x45\xbd\xa2\xe4\x12\x9b\x5a\x96\x35\x2c\x8c\xe8\x7b\x1d\xa0\x25\x40\xa5\x4c\x19\x0c\x3d\x43\xf8\x9c\xc2\xf9\x2b\xa5\xb0\x7f\x55\xa6\x7c\x18\xe9\x07\x90\x9e\x9a\xd1\xce\x11\xbb\xce\x0d\x41\x6b\x71\x9b\x19\xc1\xce\xcb\x66\x9a\x5b\x62\x3a\xe0\x6f\x54\xd7\x47\xae\xd2\x7f\x8e\xec\x5a\x96\x74\x6d\x1a\x94\xfa\x51\x9d\xc7\x61\x21\x9d\x87\xdc\x95\x66\xbb\x9c\x4e\xcf\x8a\xdc\x4f\xfc\x9d\xbb\x9c\xc8\xc0\x87\x9b\xc5\xf3\x2e\x8f\xee\xf2\x68\x57\x02\xb5\x0b\x85\x9a\x7e\x4c\x59\xe4\x7c\x14\xcb\x4c\x18\xe4\xaa\xc3\x74\xd4\x39\xe2\x80\x01\x29\x57\xf0\xb6\x9c\xf0\xbd\x91\xbe\x8e\x79\x2b\x52\x86\x96\x49\x3f\x25\x1e\xd6\xc6\x3d\x1e\x06\xd9\x8a\x78\x60\x30\x5c\xa3\x93\xf5\xf4\xb1\xcf\xc5\xd8\x27\x5d\xb4\x27\xbd\x7a\xb2\x39\xb7\x97\xc4\xe2\xfb\x3e\xe6\x7e\x19\x03\xbf\x27\xa4\x8e\xd9\xd5\x34\x68\xe5\xa4\x91\xb9\xfc\x12\x1b\xba\xa5\xea\x62\xf3\xb9\xa5\x2a\xc0\x25\x0d\xa6\x8d\x65\x0e\x58\xaa\xc8\x92\x66\x58\x64\x00\x79\xd7\xd7\x52\x90\x9d\xa6\xb4\x55\x9e\x08\x3d\x80\x51\xe8\xa1\x36\x4a\xf4\x29\xdd\xa3\x54\x2e\x84\xa8\x76\x50\xe0\x84\xce\xc4\x04\x04\x2e\x4e\x48\xf2\x14\xec\xb3\xf5\x13\xf3\x72\x06\x9b\x67\xd5\xc0\x5b\x9e\xf0\x78\x84\xe1\xd4\x8b\xee\x9f\x6c\x79\x95\x24\x25\x42\x21\xf8\xd8\xaa\x2f\x6f\xaa\xb8\x4c\x40\xa7\x51\xc3\x92\x4a\x3a\x80\xf9\x20\xb5\xf3\x84\x22\x36\x66\x63\x18\x83\x38\x4b\x69\xfc\xab\x88\x45\x13\xe4\xdd\x97\x06\x9e\xd3\x04\xc6\x4a\x29\xd4\xaa\xb3\xbf\x99\xc8\x6b\x96\x26\x96\x25\x39\x17\x21\x58\x43\xda\xbf\xda\xd5\xa9\x09\x9d\xdd\x71\x4f\xd1\xa0\x96\x15\x39\x5f\xa4\x15\xc8\xba\x8f\xaf\x3f\xe5\x74\x06\xf0\x93\xb1\x40\x9f\xb1\x69\x15\xbd\x02\x19\xb5\xbc\x03\xd7\xbd\x9d\x49\x17\x15\xb1\xa3\x17\x02\x92\xcc\x0b\x8e\x8c\x4b\x92\xc0\x9b\x20\xa8\xc7\x87\x10\x4e\x30\x81\x7d\x25\x1f\x68\x0e\x2f\xd8\x5e\x07\x2c\xfe\xca\x51\xe7\xb7\x17\x59\x9a\x7f\xda\xd4\x64\x09\x5e\xf0\x90\x17\x91\xb1\x5d\xfd\x14\x83\x55\xb5\x0b\x8f\x91\xc1\x60\xea\xde\xca\xd5\x8a\x2c\xe5\xb5\x19\xa2\x30\x83\xed\x6f\xc1\x58\x96\x5d\x9b\x01\x81\x40\x96\xf7\x2c\x81\x41\x71\xc2\xf0\xc7\xd7\x9f\x46\xb8\x3d\xd4\x13\x48\x2d\xe8\x33\xbc\x06\xa9\xa3\x56\x5a\x23\xbe\x2d\xe0\x3e\x58\xc4\x56\x7b\xfc\xcc\xeb\x94\xb5\x71\xa4\xc1\x68\x95\xcb\x78\xc0\xd2\xd6\xb8\x26\x70\xa6\x21\xd8\x90\x52\xd3\x88\xce\x05\x6c\x70\xcb\xf2\xf7\xdb\xc5\x16\x86\xd0\x22\x47\xd0\x61\x65\x9a\xa5\x7a\xff\xfe\xfa\xfd\x3c\x72\xc5\x26\xb4\xd2\xcc\x0a\x57\x3c\x95\xe4\x50\xc3\x85\x67\xac\xa2\xd8\x26\x83\x3a\xba\x68\x1c\x9c\xb0\x6a\x06\x1a\x59\xb2\x41\x52\x82\xaa\xe3\xba\xa6\x78\xf9\x54\x6f\x3d\x2e\x21\xfb\x2f\x53\x4a\x1e\x07\x86\xff\x51\x41\x76\x91\x58\xe1\x5c\xe8\x51\xb1\xde\x0d\xec\xf9\xac\x58\x0f\xdd\x92\xac\x26\x4f\x41\x32\x61\x4a\xc7\x42\x95\xd4\x7a\x37\x33\x6b\xce\x90\xb4\x99\x31\x22\x94\x7a\x35\x65\x43\x9c\x46\x4b\x70\xb3\x70\xce\x34\xfb\x26\xfc\xf9\x22\x29\xc2\x11\xd0\x65\xa2\x84\xa1\x7f\x84\x3c\xbc\x8e\x9b\x3d\x59\x9c\x3e\x39\x5e\x9a\x95\x5e\xde\xa5\x34\x7b\x3c\x93\x5d\xa2\xc7\x2b\xe1\xc0\x68\x1f\x3d\xb3\x3e\xd2\xa0\x88\x21\x17\xf5\xf6\xab\x9b\x2d\x2b\xb2\xb3\xcc\xcf\x76\x9a\xa0\xc8\x14\xb5\xe0\xff\x9d\x74\x9e\xdb\x9f\xac\xb9\x4e\x5e\xe0\xa4\xff\xba\xb9\xfe\x63\x8c\xb9\x93\x4f\xf6\xc8\x51\xb0\x26\x75\x65\xd1\x79\xdb\x05\x7d\x3e\x06\xd7\x6e\x8e\x47\xc7\xf3\xad\xaf\x0f\xd3\x0e\xd9\xe4\xfe\x53\xb8\xd5\x1f\xbe\x70\x48\x76\x28\xc5\x8e\x8f\x67\xd0\x96\xf9\x9e\x41\xdb\x33\x68\x7b\x06\x6d\xcf\xa0\x6d\xf0\x3d\x83\xb6\x67\xd0\xb6\xff\x9e\x41\xdb\xff\x2d\x68\x6b\xb1\x73\xa7\x47\x77\x07\x82\x2d\xc2\x10\x28\x51\x87\x1b\xbd\x74\xf0\xda\xda\x90\x50\x06\x6f\x17\xd2\xe1\x79\x6b\x0d\xa7\xee\x9c\x1a\xc3\x09\x59\x42\x56\x1c\x6f\x51\x29\x90\xde\x01\x3a\x67\x4a\x89\x9e\x44\x62\xf1\xe4\xcc\x3f\xf2\xbf\x34\x46\xd1\x01\x08\xc9\xdf\xd4\xc5\xfb\xf4\xc9\x88\x3c\xfd\x5d\x5d\x7c\xb3\x30\xbc\xad\x33\xcb\x70\x58\xfa\x65\xd7\x75\x83\xe3\xc7\x1b\x2d\xbd\x44\x25\x7f\x79\x44\xb3\x57\xf9\x39\x3b\x9e\x64\x75\x7a\x7c\x0d\x35\x9e\x3a\xd9\x92\x48\x83\xdc\x53\xb8\x54\x7d\xc7\x27\xac\x28\xb6\x4f\x38\x63\x45\xb1\x3d\xcf\x6a\x88\x0d\x28\xb6\x97\xb3\x53\xa1\x54\x9d\x4d\x37\x46\x27\x98\x7a\xf8\x6a\x65\x1c\x77\x1f\x70\xfc\xd3\x90\x60\xb8\x9e\x3d\x7d\x24\xd1\x9b\x24\xa3\xf0\xc4\x40\xce\xd9\x23\x4f\x05\xdc\xf8\x70\x13\xb4\x71\x07\xb6\xef\x0d\x74\x5a\x90\x75\x9e\x2d\xbb\x36\x1b\x68\x50\x6f\x7b\x7a\xfd\xec\x0c\xdd\x7d\xb1\x51\x0e\xce\xab\xd5\x16\x5c\x8b\x1a\xb0\xb4\xc6\x65\xae\xc0\xce\x5f\x37\xa1\x8f\x91\x73\xec\x32\xea\x32\x45\x0e\x37\xeb\xcc\xbd\xd3\x61\x25\xb3\x5b\x39\xd6\x73\x95\xa5\x50\x63\x35\xd0\x60\x1b\x50\xda\x7e\x00\xea\xa3\x62\x6c\x84\x83\xbe\xf8\x82\x46\xae\xea\x70\xf5\xc3\x28\x36\x5d\x3b\xe4\xc1\xde\xd9\x6b\xc9\x43\xab\xcf\xcb\x3d\x6a\xf6\x5c\x58\x92\x6d\xf6\x46\xcf\x90\xf1\x60\x93\xc7\xb2\x20\x80\xeb\xa4\xc7\xa5\x8a\xd7\x9b\x2c\xc6\x72\x7b\xe4\x31\x0d\x96\x35\x93\x3e\x27\x55\xce\x6f\x1e\x91\x79\xdc\x25\xd2\x36\x39\x25\x23\x74\x39\x12\x25\x85\x63\x06\xef\x65\xa6\xb6\xd8\x3d\x13\x39\x2a\xaa\xc7\xca\xe5\x51\x16\xd3\xb2\x3f\x93\x73\xb8\x3a\xd9\x92\x1c\xfb\x69\x28\x57\x1c\xe1\xf6\xcf\xa5\x3a\x28\x54\x4f\xd1\xf4\xd0\xa3\x62\x56\x96\x8a\x9a\x0c\x18\xe2\xa4\x2b\x55\x7f\x73\x13\x42\x7e\x7c\x34\xb4\x91\x4a\x71\xaa\x73\xe4\x63\x31\xb8\x5b\x7f\x4d\x40\xd6\x1a\x0b\x4d\x5c\x3d\x2f\x5f\xc6\x57\x92\x7c\xb7\x84\xee\x14\x78\xe5\xc4\x8b\x23\x2f\x95\x6e\x28\x4d\x36\xeb\x9e\x93\xce\x9b\x07\xd2\xa9\x5e\x3d\xb0\xd0\xd6\x9a\x95\xc5\xa6\x41\x9f\x39\x77\x09\xaf\xad\x5a\x4b\x3e\xfb\xc8\x64\x54\x11\xc7\x87\x44\x8f\x65\x9c\xe3\x63\x22\xce\x39\x29\x82\xef\x92\xf4\xa9\x01\xe6\xc2\xe5\x19\x83\xcc\x79\x54\x78\xf1\x78\x1e\x17\xf1\x88\xe3\x0b\xea\x08\x3d\x7d\x9c\xce\xcc\xf5\xc1\x1d\x4b\xdf\x65\x55\x05\xf0\x63\xb1\x2a\xfa\x37\x93\xaf\xe0\xb6\xd3\x3a\xfc\x73\x1f\xc2\x0c\xfa\xf0\x23\x3e\x94\x04\xf2\xe5\x85\xaa\xce\xb8\xda\x51\xd3\xfe\x5d\xe9\xf7\xa8\xda\x1a\xdf\xec\xdb\xd2\x3b\xd0\xf8\x24\x73\xd0\x1d\xdf\x56\x90\x98\x83\xb7\x5d\xd4\xb2\xf3\xc6\xb2\xcb\xc6\x96\x3d\xf4\xc2\x92\x11\x2d\x89\xc1\x53\xc9\xf8\xf6\xf2\x45\x3c\x49\xe8\x1f\x57\x86\x9f\xa5\xd1\x31\x21\xb9\x39\x7c\xfc\x34\x89\x54\x49\x7c\xe8\xb9\xe1\xc6\xff\x06\x00\x00\xff\xff\x1d\xe7\x0a\x25\x8f\x2b\x00\x00"), }, "/cluster.x-k8s.io_machinedeployments.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.x-k8s.io_machinedeployments.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 729003002, time.UTC), uncompressedSize: 27896, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x6d\x6f\xdc\x38\x92\xf0\xf7\xfc\x8a\x82\x17\x83\x24\x40\x77\xdb\xc9\xec\xdb\x63\xe0\xf9\xe0\x8d\x67\xf6\x7c\x9b\x71\x82\x38\x33\x87\xc3\xce\xe2\xc0\x96\xaa\xbb\x79\x96\x48\x2d\x49\xd9\xee\x59\x2c\x70\x7f\xe3\xfe\xde\xfd\x92\x03\xab\x48\xbd\x74\x4b\x94\xec\x71\xf6\x76\xf4\x25\x71\x4b\x2a\x16\x8b\xf5\x5e\x45\xea\xc5\x72\xb9\x7c\x21\x2a\xf9\x03\x1a\x2b\xb5\x3a\x07\x51\x49\x7c\x70\xa8\xfc\x5f\x76\x75\xfb\x7b\xbb\x92\xfa\xf4\xee\xcd\x1a\x9d\x78\xf3\xe2\x56\xaa\xfc\x1c\xde\xd5\xd6\xe9\xf2\x13\x5a\x5d\x9b\x0c\x2f\x71\x23\x95\x74\x52\xab\x17\x25\x3a\x91\x0b\x27\xce\x5f\x00\x08\xa5\xb4\x13\xfe\x67\xeb\xff\x04\xc8\xb4\x72\x46\x17\x05\x9a\xe5\x16\xd5\xea\xb6\x5e\xe3\xba\x96\x45\x8e\x86\x46\x88\xe3\xdf\x9d\xad\xbe\x5e\x9d\xbd\x00\xc8\x0c\xd2\xeb\x9f\x65\x89\xd6\x89\xb2\x3a\x07\x55\x17\xc5\x0b\x00\x25\x4a\x3c\x87\x52\x64\x3b\xa9\x30\xc7\xaa\xd0\xfb\x12\x95\xb3\xab\xac\xa8\xad\x43\xb3\x7a\x58\x32\xde\x2f\x6c\x85\x19\x21\x93\xe7\x84\xa1\x28\x3e\x1a\xa9\x1c\x9a\x77\xba\xa8\x4b\xc6\x6c\x09\xff\x7a\xf3\xe1\xfa\xa3\x70\xbb\x73\x58\x59\x27\x5c\x6d\x57\xd5\x4e\x58\x24\xac\x73\xb4\x99\x91\x95\x23\xdc\xbe\xe3\x21\x2f\x9b\x21\x81\x9f\x07\x5b\x67\x3b\x10\x16\x6e\x32\x51\x48\xb5\xfd\xbe\x3a\x0d\xff\xbb\xd4\xf7\xea\xf4\x53\xad\x94\x54\xdb\xd3\x6f\x85\x2c\x30\x3f\xfd\x5e\xdd\x2a\x7d\xaf\x08\x3c\x4f\xe5\x63\x33\x9c\xdb\x57\x78\x0e\xd6\x19\xa9\xb6\x23\xb8\x19\xac\x0a\x99\x09\x7b\x8c\xde\x67\xed\x44\x01\xaa\x2e\xd7\x68\x40\x6f\x40\x69\xb5\x74\x68\x4a\xa9\x84\xc3\x3c\x12\xcc\x82\x13\x66\x8b\xfe\x97\xf5\x1e\xdc\x4e\x5a\x68\x69\xd8\x41\xea\x53\x77\x1c\xc6\xcb\x93\x6e\x8b\x66\x04\x31\x71\x27\x64\x21\xd6\x05\x7e\x9a\x8d\x61\xf3\x4a\x8b\xdc\x2b\x83\x22\xdf\xc3\x46\x1b\x10\x0e\x0a\x14\xd6\x41\x29\xd5\x27\xff\xeb\x0d\x66\x5a\xe5\xf6\x75\x07\xcb\x8b\x08\x61\x36\x9a\x04\x7f\x3e\x8a\x8c\xce\x1c\xda\xad\x7a\xc4\x13\xf9\x7e\x10\xa5\xad\xd1\x75\x75\x0e\x47\xac\xca\x6f\x46\x59\x11\x0e\xb7\xda\xc8\xf8\xf7\x32\x3e\xbf\x14\x95\xa4\x5f\x58\x12\x8f\x18\x92\xee\x15\xd2\xba\x3f\x0d\xdf\x7f\x2f\x2d\x3f\x53\x15\xb5\x11\xc5\x90\x14\xd1\x6d\xbb\xd3\xc6\x5d\xb7\x08\x2d\xa1\xcc\xf9\x86\x54\xdb\xba\x10\x66\xe0\xcd\x17\x00\x36\xd3\x7e\xb6\xf4\x62\x25\x32\xf4\xef\xd8\x7a\x6d\x82\xaa\x08\xc0\x6c\x26\x0a\xe4\xff\x02\x14\x62\x8d\xc5\x0d\x16\x98\x39\x6d\xfa\x2b\x65\xc3\xaf\xe1\x49\x2f\xcc\x71\xdd\xe2\x83\x15\x66\x7d\x81\x80\x20\x92\x87\x0f\x0e\xc8\x0e\xff\x76\x0e\x7f\xfb\xfb\x0b\x80\x3b\x51\xc8\x9c\xf4\x0d\x23\xa6\x2b\x54\x17\x1f\xaf\x7e\xf8\xfa\x26\xdb\x61\x29\x22\xb6\x13\xea\x40\x5a\x70\x3b\x04\x7e\x87\x78\xd8\xff\x79\x4c\x63\xb8\xf8\x78\x15\x20\x56\x46\x57\x68\x5c\xb3\xd4\xfe\xea\xe8\xe3\xe6\xb7\x83\xb1\x5f\x7a\xe4\xf8\x19\xc8\xbd\x06\x46\x1e\x3a\xe8\x51\xcc\xc1\x32\x12\x7a\xc3\x7c\x6a\xb0\x32\x68\x51\xb1\x4e\xee\x80\x05\x12\x44\x05\x7a\xfd\x9f\x98\xb9\x15\xdc\xa0\xf1\x40\x3c\x0b\xd4\x45\xee\xd5\xf6\x1d\x1a\x07\x06\x33\xbd\x55\xf2\xa7\x06\xb2\x05\xa7\x69\xc8\x42\x38\x0c\x5c\x15\x2f\xd2\xb1\x4a\x14\x9e\xac\x35\x2e\x40\x28\xaf\x7e\xf6\x60\xd0\x8f\x01\xb5\xea\x40\xa3\x47\xec\x0a\xbe\xd3\x06\x41\xaa\x8d\x3e\x87\x9d\x73\x95\x3d\x3f\x3d\xdd\x4a\x17\x2d\x50\xa6\xcb\xb2\x56\xd2\xed\x4f\xc9\x8e\xc8\x75\xed\xb4\xb1\xa7\x39\xde\x61\x71\x6a\xe5\x76\x29\x4c\xb6\x93\x0e\x33\x57\x1b\x3c\x15\x95\x5c\x12\xe2\x8a\x0c\xd0\xaa\xcc\x7f\xd5\xf0\xe0\xcb\x0e\xa6\x07\xea\x96\x2f\x12\xad\x51\xba\x7b\xc1\xf2\xeb\x2c\xc2\x6b\x8c\x7f\x4b\x5e\xff\x93\xa7\xca\xa7\x6f\x6e\x3e\x43\x1c\x94\x96\xa0\x4f\x73\xa2\x76\xfb\x9a\x6d\x09\xef\x09\x25\xd5\x06\x0d\x2f\xdc\xc6\xe8\x92\x20\xa2\xca\x2b\x2d\x95\xa3\x3f\xb2\x42\x46\x71\x8f\x97\xad\xd7\xa5\x74\x7e\xa5\xff\x5a\xa3\x75\x7e\x7d\x56\xf0\x8e\xec\x30\xac\x11\xea\x2a\xf7\x66\x60\x05\x57\x0a\xde\x89\x12\x8b\x77\xc2\xe2\x17\x27\xbb\xa7\xb0\x5d\x7a\x92\x4e\x13\xbe\xeb\x3e\xf4\x1f\x64\x6a\x35\x3f\x47\xb3\x3e\xb8\x42\x47\x52\x79\x53\x61\xd6\x93\x91\x1c\xad\x34\x9e\x8f\x9d\x70\xe8\xb9\x7f\x58\x8d\x8e\xcb\xa7\xbf\x82\x42\xf6\xaa\xae\x7f\xe3\x00\x9d\x77\xed\x73\x51\x3d\x78\x45\xcf\x72\x89\xf1\x36\x2f\x75\x60\x8a\x35\x16\x5a\x6d\xed\x01\x54\xf0\xeb\x79\xf0\x5b\x29\xd5\x7b\x54\x5b\xaf\xe2\xde\x1c\xdc\x1a\xa4\x70\x78\xa7\x6b\x4c\x93\xc8\x7f\x27\x95\x2c\xeb\xb2\x63\x0e\x2d\xbf\x45\xba\xed\x7e\x27\xbd\xdb\x03\x0a\xef\x8b\x3d\xfb\x6b\xad\x9b\x71\x84\x7d\xd0\x27\x6b\x64\x93\xba\x82\x4b\xdc\x88\xba\x20\x3e\x85\x33\x78\x15\xde\x83\x7b\x59\x14\xfe\xa9\x4c\x2b\x2b\x73\xf4\x0b\x25\x7a\x46\xbe\x7b\x09\x0b\x56\x6b\xe5\xff\x95\xa4\x7e\x09\xf6\xeb\x83\xe7\x36\xda\x94\xc2\x91\x15\xfe\xfa\xed\x20\x9d\x5a\xfb\xdc\x5e\x95\xa8\x2d\xe6\x49\xfa\x5c\xa9\x5c\x7a\x5b\xed\xd7\x55\xb8\xc0\x5c\x5d\x6b\xc0\x30\x0e\x97\x8d\xc7\x5c\x6b\x5d\xa0\xe8\xab\xe2\xca\xe8\xad\x41\x6b\x2f\x51\xe4\x85\x54\x38\x67\x91\x3e\x93\x89\x79\xa0\x85\x72\xd2\xb3\x99\xea\x2d\x93\xe8\xe2\xe4\x34\x94\xe2\x16\x9b\x81\x8e\x28\xba\xc6\x0d\x69\x04\x42\xbf\xb3\x06\x4e\xfb\x45\xd9\x90\x0b\xbb\xa2\x31\x3b\x50\x5b\xdf\x9e\x96\xef\x08\xa8\xbf\x2f\x55\x8d\x1e\x4a\x65\x74\x86\xd6\x06\x50\xd0\xb5\x8a\xde\x4c\x08\xff\x30\x7b\xeb\x70\x2f\x9d\xe7\xaf\x8f\x07\x44\xf9\xe6\x21\x43\xcc\x31\x3f\x1a\xc6\xa0\xb0\xf4\x1a\x73\x90\xad\xcd\xc6\x3b\x21\x9e\x20\x07\x4b\x13\xfc\x01\xb8\xd6\x0e\x79\xed\x46\x09\x42\xd0\x82\x0e\x45\xeb\x64\x49\x5c\x9e\xd7\x26\x6a\x7a\xa2\xb9\x18\x5e\xf8\x86\xc9\x07\x84\x19\x7e\x7b\x76\x66\x0f\x59\xe3\x69\xac\x1a\xfd\x9a\x24\x9f\x5c\x37\x42\x1c\x15\x60\xf4\x6a\xfb\xb2\xf8\xc6\x2f\xaf\xb4\x6c\xe4\xc8\xe2\x1c\x8c\x16\xd0\xcf\xa5\xf5\xd6\xae\x96\x76\x07\x6b\x74\xf7\x88\x0a\xf0\xc1\x23\x22\x1d\xfc\x84\x46\xd3\x7a\x7a\xca\x79\x7d\x2d\x37\xf2\x58\x10\x9e\x3a\xdb\x3b\xe9\x9d\x9c\x7f\x91\xd6\x69\xb3\x7f\x2f\x4b\xe9\x26\x25\xa4\x55\x61\xba\xc8\xa3\xc6\xbf\x41\x9e\xb2\x41\x27\x3c\x93\x68\x10\x45\xa1\xef\xc1\xf3\xf2\x5a\x64\xb7\x87\xf8\xc2\x31\x65\x9e\x89\x12\x70\xb0\x04\xcf\x42\xa8\xe8\x40\x27\x89\xf3\xde\x3b\xe0\xcd\xa3\xa4\x31\x5a\xbe\xf8\xe6\x81\xa7\xd6\x23\xd8\xfd\x4e\xdb\x63\x55\xdc\x84\x48\xc2\x60\x00\xd7\x09\x93\xa2\x4c\x7a\x81\xd1\xf4\xd4\x66\xd3\x7f\xe2\x30\x90\xea\x5e\x57\x0e\xca\xda\x07\x82\xc2\x65\xbb\xae\x4f\x0d\x0e\xcb\xca\x3b\xa0\x2f\x2d\x47\x12\x47\x02\x35\x66\xbf\x19\x65\x97\xed\xbe\x79\xf0\x2e\x98\x6d\x13\x15\x09\x5a\x1d\xbe\xc0\x9c\xe0\xe3\x2d\xcf\x58\x45\x9f\x92\xde\x0f\x93\x06\x39\x35\x31\x00\x19\x88\x2f\xbb\x4f\x11\xe9\x2e\xae\x2f\x87\xd8\x03\x40\x3a\x2c\x07\x51\x3c\x40\xf2\x22\x81\x48\xf0\x5c\xe3\x1d\xd2\x7c\x5e\x39\x0b\xa9\x8e\x55\x14\x5f\xec\x9f\x2f\x40\xc0\x2d\xee\xd9\x95\xf7\xd1\x42\x85\x46\x34\x20\x0c\x16\xc1\x0a\xa2\x7f\x8a\x1e\x0a\x7e\xfd\x20\xd4\xd4\xa2\xf0\x75\x8b\xfb\xb1\x5b\x07\xd3\xf5\xe3\x05\xc7\x8a\xe7\xed\x7f\x68\xcc\x71\x33\x55\x51\x55\x85\xc4\xb1\x49\xc2\xa0\x7b\xd5\xb9\x37\xe6\x4d\xb5\x57\xa4\xc8\x4c\xb4\x1b\x02\xb6\x21\x00\x93\xf8\xa5\x65\x72\x7a\xfe\xda\xc9\x8a\x94\x52\x02\x6b\x8b\xc4\x7b\x31\x8a\xfa\xc1\xc7\xb1\x0d\x70\xe6\xa8\x2b\xb5\xf0\x86\xce\xff\x43\xf2\x4c\x86\x36\x01\xf2\x52\xa3\xbd\xd6\x8e\x9e\xfd\x59\x24\x61\xa4\x66\x12\x84\x1f\x26\x06\x55\x20\x8c\x11\x7b\xf2\x37\x3b\x41\x96\x5d\xc1\x15\x7b\xcd\x71\x7e\x89\x49\x48\xeb\x03\x1d\x6d\xe2\xcc\x29\x38\xe6\x21\x18\x38\x29\x94\x35\x52\x96\x0c\xcb\xca\xed\x23\xf4\x04\xd0\x66\xd1\xa4\x8d\xa4\xd4\xa6\x47\xaf\x91\x81\x12\x30\xbd\x5b\xc1\xc3\x93\x6d\xe1\x77\x38\x60\x2f\xc8\x7b\x09\xae\x06\x05\x9c\xc2\xe1\x56\x66\x50\xa2\xd9\xa6\xf0\xac\xbc\x9e\x1a\x5f\xba\x84\x26\xe1\x6b\xc6\xda\xc6\x87\x08\xdf\xc1\x67\x82\xda\x39\xf2\xa0\xf9\x5a\x7a\x5e\x1f\xb9\x93\x5c\xde\xc1\x88\x70\x1e\x56\xa4\xbe\xc9\xde\x0d\xce\xbe\x9b\x25\x4e\xeb\xa7\x09\xfa\x1c\xdb\x0c\x1e\x94\xb5\x6f\x29\x2a\xcf\xd9\x7f\xf3\xea\x94\x18\xe5\xef\x50\x09\x69\xec\x0a\x2e\x28\xbd\x36\x10\xe6\xf8\xab\xfb\x7c\x70\x68\xbb\xa0\x3d\x54\x69\xc1\xd3\xfc\x4e\x14\xc1\xd5\x17\x0a\xb0\xc0\xf2\x30\x53\x10\x2f\xbd\x39\xb2\x68\x0b\xb6\xee\xa4\x44\x37\x12\x0b\xca\x75\x9c\xdc\xe2\xfe\x64\xd1\x93\x3c\x90\xc3\xaa\xf4\xe4\x4a\x9d\xb0\x91\x38\x92\x83\x68\x67\x40\xab\x62\x0f\x27\x74\xef\x64\x75\x64\x04\x07\xc1\x26\x0d\x63\x82\x23\x46\x6f\x05\x59\x3a\x32\x32\x47\x7e\x63\x2f\x68\xe0\x77\x3c\x65\x6b\x8b\xec\x38\x92\x90\x02\x46\x3f\x29\x7a\x41\x03\x61\x84\xdb\xf9\x48\x99\xbc\x9f\xc7\x38\x29\xde\x17\xa5\x9a\x42\x2e\xdc\x51\xaa\xe1\x08\xe5\x4f\xfc\x74\xc8\xf6\x78\x9a\x6f\xe4\x16\x2a\x61\x44\x69\x57\xf0\x91\x2d\x0d\xaf\x80\x1c\x48\x7c\xdc\x84\x29\x7e\xde\x57\xc3\x5c\xf8\xff\xe3\x08\x8c\xcf\xd0\x72\x4c\x19\xf7\x52\x3c\xdc\xd4\x66\x3b\x38\x17\x7f\x09\xb5\xff\xb0\x19\xbb\xb9\x4c\xb8\xbb\xc7\x4f\x25\x35\x58\x3f\xaf\xd7\x8d\xa2\xdb\x58\xa1\xcd\xfb\x93\xa7\x24\x14\xc5\x95\xd9\x0e\xf3\xba\x18\x08\x40\x9b\x29\xac\xf5\x1d\xf6\x72\x4d\xc7\x20\xc9\x56\xd7\x18\x81\x7a\xa3\xb7\xb6\xba\xa8\xdd\xb8\x62\x0f\x40\x5e\xe1\xc3\x39\xfc\xe6\x35\x50\x6c\x5f\xa1\xc9\x50\x39\xb1\xc5\xa1\xc8\x8e\x9f\x7d\x73\xf6\xd5\xeb\x71\x6b\x40\x66\xc7\x63\x11\x82\xdc\x33\xe6\x8c\x87\xef\x55\x5b\x9e\x91\x16\xce\x56\x70\x11\x10\x0c\x88\x8c\xdb\x17\x0f\xaf\xc8\xea\x82\x42\x65\x4a\x60\x76\xd0\x5c\xef\xc1\xe8\x5a\xe5\xcc\xa6\xbd\xd8\x73\x14\xe2\x1b\x1f\x8a\x88\xb2\x2a\xf0\x1c\xee\x77\xa8\x38\x64\x90\x96\xdc\x1f\xa7\xe1\xeb\xb3\xaf\x58\x3f\x79\x09\x6b\x63\x15\x3f\xad\x51\x98\xb4\x92\xa2\xc0\x1c\xea\x0a\x64\x59\x62\x2e\x85\xc3\x62\x1f\x07\xc0\x28\x7a\x51\x98\xac\x13\xc6\xd9\x05\x55\xfb\xc6\xad\x62\xf4\x3c\xdd\x41\x21\xc9\x87\x9d\x14\x06\xe2\x7d\xbb\x3c\xb9\x26\xaa\x23\x65\x34\xc6\x67\xff\xf5\xd9\x57\xc3\x71\xfb\x07\x95\x21\x41\x6e\x20\xee\xc4\x1d\xc2\xda\x47\xa0\xb7\xb2\x28\x30\x5f\x8c\x73\xd3\x11\xa9\xfa\x24\xd9\xd4\xc6\xed\xd0\x2c\x00\x95\x8d\xd9\x0e\x3f\x37\x3f\xaf\x29\x16\xed\x8a\x8e\xe1\xf2\x27\x08\xe7\x45\x9b\xd3\x25\x9d\xf4\x49\x20\xee\x88\x3d\xf1\x97\x70\x50\x6a\xeb\xc6\xc9\xf0\x72\x4c\xcf\x74\x58\xf8\x17\xab\x6d\x6a\x35\x9e\xfe\x6c\x80\x1f\x92\x73\x5c\xb9\x1c\x28\x91\x51\x90\x8f\x53\x2e\x5f\x40\x35\xe4\xfa\x5e\xad\x7a\xca\x29\x25\xc9\x51\x69\x91\x65\x09\xea\xaa\x97\x60\x1e\x51\x20\xa3\x30\x0f\x15\x4b\x3f\x6b\x74\x20\x2d\x1e\x57\xff\xf4\xef\x88\x41\x53\xf1\x4e\x9f\x80\xf3\xb5\xce\xb8\xfa\x26\x15\xd0\x53\x2a\xde\x59\xa2\x3c\xf8\x22\x89\xf5\x38\x9a\x7e\x36\x8d\xf4\x6f\x74\x51\xe8\x7b\x4e\xd4\x58\xee\x6a\xf0\xda\xe1\x58\xd9\xb6\x8a\xe2\xf1\xca\xb1\xc5\xbd\x31\x39\x5e\x5d\x14\x05\xa9\x0b\x1b\x18\x3c\x01\xb7\xa3\x47\xda\xbe\x81\xdf\x3d\x42\x5f\x24\xc3\x0a\xba\x39\xe5\x7a\x79\x9f\x89\x87\x6b\x12\x59\xf0\xae\x36\x06\x95\x2b\xf6\x21\xf1\x55\xec\xc1\xd6\x55\xa5\x8d\xa3\xfa\x13\x3b\x5b\x83\xd3\xf2\x6e\x77\xcf\xd5\x3a\x69\x18\xda\xdf\x9b\xf4\xc2\x12\x2a\x69\x74\xaa\x31\x99\x96\x76\x8a\xc3\x43\xe1\xd7\x75\x48\xfb\xf4\x75\x57\x53\xc4\xe1\xa2\xd0\xa3\x92\x72\x03\x55\xc0\x41\x44\x5e\xde\x38\xa1\x72\x61\xf2\x30\x95\x97\x2f\x6d\xf3\xf2\x17\xaf\x6b\xc6\x81\x86\x58\x69\xca\x01\x3e\x6a\x8d\x1a\x78\x64\x76\x28\x0a\xf3\xc2\xf5\x83\xe6\x81\x16\x83\x90\x70\xa9\x95\x75\xa6\xa6\xe9\xe6\x14\xfc\x71\x59\xdb\x47\x95\xd6\x69\x93\xd0\x16\xa1\x48\xd3\x29\x75\x7b\x7b\x2d\xf6\xa4\x68\xd0\x79\xb5\x81\x0f\xa1\x1d\xc0\x69\x5d\x90\x3a\x26\x98\xe3\x06\x5f\xe5\x60\xd0\x19\x89\x77\x08\xc2\xac\xa5\x33\xc2\xec\x3b\x8b\xfb\x79\x87\x7b\x52\x73\xde\x79\xfa\x6b\x8d\x66\xcf\x2a\x23\x91\xd6\x6a\xcb\x8f\x94\x6e\x33\x77\x98\xb3\xca\x2d\x75\x2e\x37\x7b\xaf\xd5\x98\x8d\x8e\x5b\x11\xce\x4f\x4f\x6f\xeb\x35\x1a\x85\x0e\x89\x7b\x72\x9d\xd9\xd3\xda\xa2\x59\x6e\x6b\x99\xe3\x69\x67\x41\x87\x5d\x91\xc9\xac\x05\xc0\x16\x95\x8f\xac\x71\xa8\xa0\x3c\xb8\x88\x27\x7f\xec\xbc\x11\x56\x51\x57\xcc\x34\x7e\x8e\x1b\xf9\xb0\xf0\x61\x6a\xc8\xb0\x8f\x53\x9b\x88\x61\x16\x7e\x59\x22\x12\x20\xa0\x56\xf2\xaf\x75\xa8\x55\x7f\xb8\x7e\xff\xef\x70\xf5\x2d\xc9\x39\x8d\xc6\x99\x81\x9d\x18\x37\x9f\x1c\x4b\xa0\xf2\xc2\x70\x27\x73\xea\x3b\x08\x9d\x28\x4d\x5a\xc1\x23\xb7\x68\x2b\xe2\x06\x5d\x6d\x54\x82\xd3\x42\xbf\x09\xb7\x3e\x34\x2a\x26\x97\x9b\x0d\x1a\x4a\x78\xec\x84\x6a\xc1\x55\xc2\x5a\x2e\x55\x26\xac\x3c\x73\x39\x81\x12\x85\xd5\x5c\x77\x2e\xd7\x52\x79\xee\x60\xc6\x0e\x84\xb0\xf5\x66\x23\x1f\x38\x5d\x11\xe7\x34\x01\x76\x27\x58\x35\x5a\x8f\x4e\xdb\x60\x04\xa6\x2e\xbc\xa5\xb3\x07\xf4\x5c\x24\xf9\x37\x48\x94\x33\xb5\xca\x44\x53\x37\x41\x28\xa8\xfe\x1f\xdb\x09\x18\xcb\x26\xf5\x16\xcb\xbd\x49\xc3\xc9\xc8\x86\x69\x6a\x15\xd2\xe6\x9e\x27\x56\xf0\xa3\x3a\x5e\xb6\xa6\x86\x95\x94\x5f\x0f\x25\xb2\x53\xce\x2b\x42\x49\x12\xbb\xe8\x0c\xc0\x94\xbf\xfe\xf0\x39\x2c\xfe\x38\x44\xf8\xf5\xd9\xff\x83\x25\x48\x65\x1d\x8a\x7c\x01\x32\x30\x00\x4a\xef\xa5\x84\xd7\xe1\xed\xd9\x1b\x78\x17\xfa\x10\xb4\x81\xdf\x9c\x9d\xa5\xd5\xd6\x27\x2e\x18\x73\xe7\xcd\x67\x59\xa2\xae\x1d\x48\x2e\xea\x73\xce\xb5\x2b\x06\x19\x69\x90\x09\x47\x74\xe3\xfd\xd7\x98\xa0\xe3\xd2\x70\x51\x68\xe7\x30\x6f\xd3\x62\x81\x83\x83\x4a\xf2\x9a\x6e\xd8\x07\xf0\xd7\xab\x28\xd3\xc5\x1e\xc4\x86\x5b\x45\x30\xd6\xf9\xb9\xfb\xa0\x19\xee\x93\x87\xb4\xbc\xa0\xa7\x76\x28\x72\x34\x89\xb0\xff\x47\x05\x17\x54\x13\xc9\x9b\x74\x50\xd4\x24\xfd\x4a\xe5\x97\x36\xa5\x32\xc7\xb2\xd2\x0e\x55\xb6\x3f\x49\x6a\xcf\x84\x81\x2b\x46\x93\xba\xf0\xe5\xad\xe9\x77\x9c\xd0\x0d\xa5\x8a\x5b\xdc\xdb\x4e\x01\xac\x1f\xcb\xd9\xb4\x7a\xd3\x66\x2b\x94\xfc\x89\x2c\x59\xd3\x04\xfa\x13\xc2\x2b\x6a\xac\xa4\x5f\xb9\xa0\xf5\xba\x63\xac\x46\xd2\xef\x10\x13\xde\x4d\x0d\xcc\x72\x3f\x2b\xb5\x0a\x90\x22\x6a\xdb\x36\x6c\x80\x6d\xee\x64\x16\x9b\xf1\xc6\x63\xb8\xf9\x96\x91\xd7\xe5\xc9\x46\x51\xcd\x35\x86\x2f\x89\x75\x63\x49\x27\x08\xad\x17\x71\xa9\x40\x70\x67\x6d\x25\x32\x5c\xc1\x95\x6d\x94\xe3\xb8\x6a\xf0\x6e\x01\xb7\x9f\xab\x6d\xe3\xd8\xd8\x05\x88\xc2\xed\x74\xbd\xdd\x81\xd5\x64\xaf\xc2\x0d\xd2\xcd\xd4\x38\x90\xd0\x5f\x41\xe6\x29\x67\x4c\xfd\x79\x5d\x0d\xe9\x17\x83\xbb\x30\x45\xe5\xbd\x47\xe3\x63\x42\x42\x7b\x1c\x62\xed\x74\x29\x9c\xcc\xbc\x66\x58\x35\xa2\x5b\x19\x59\x0a\x23\xbd\x3c\x2b\x87\x2a\xf7\x41\xb6\x36\x4d\x33\x3d\xb4\xc2\x96\x76\xbf\x38\x71\x5c\x07\xdc\xf2\xa6\xc7\x7f\xb0\xa3\xb0\x55\x10\xa3\x30\x67\x71\x8b\xcc\xbd\x5a\xd8\x48\x34\xf6\x57\xb4\x66\x69\xc6\x49\x88\x68\xb3\xe2\xf3\x5c\xa9\xa6\x61\xb9\xd7\x27\xc8\xbf\x04\x2e\x42\x91\xed\xd8\x0c\x24\xeb\x79\x0d\xf7\xad\xe0\x42\x71\x61\xaf\x45\xe6\xb8\x40\xe3\x87\xf9\xf1\x24\xe7\xb8\xee\xc7\x31\xf5\xd7\x99\xcf\x02\xd6\xb5\xeb\xbe\x12\x6b\xdf\x99\x50\x5a\x79\x6e\x38\xe8\xf4\x1d\x37\x00\xd7\x9a\x23\xec\xa0\x49\x42\xda\xa0\x75\x1c\x28\x51\xa0\x2b\xfe\xa3\x23\x44\xb0\x9c\xe1\x4e\xe8\x9e\xd7\xc0\x9d\xd0\xda\x62\x33\x58\xf4\xde\x42\xe9\xf3\xc7\x71\xd3\xff\x5d\x10\x6a\x01\x97\xd7\x37\xff\xf1\xfe\xe2\x0f\xdf\xbc\x9f\x60\xc2\x79\xcc\xd6\xcc\xc7\x3e\xd9\xea\xe8\x7b\x85\xe6\x13\x92\xfb\x99\x8d\x9b\x94\x7e\xbb\x4d\x68\x16\x89\x84\xc8\xb1\x62\x31\x8d\x7d\x30\xb1\x0f\xfb\x6a\x03\x17\xef\xdf\x8f\xe7\xe7\xc2\xfb\xc1\xf4\x53\x0f\x4a\x9b\xfb\xcd\xb1\x40\xc7\xde\x75\xdb\x57\x1a\x68\x3e\x0a\x72\x2b\xcc\x5a\x6c\xbd\x9f\x53\x70\xf7\x4e\xeb\xb3\x07\x08\xd2\xeb\x3a\x25\xb6\x8c\xae\xe8\x18\x90\xf1\x34\xb3\xf3\xda\x54\x28\x40\xe5\xcc\x9e\xd1\x95\x96\xf1\x25\x84\x42\x4f\xb3\xe6\xdf\xe7\x40\x24\xd7\x8d\x78\xbe\x6d\x3b\x64\x3e\x0b\x49\x3b\x67\xbc\xfc\x7d\xde\xa1\x21\xb9\x08\x9c\x52\xa6\x6c\x1a\xc5\x0e\x5a\x21\xcf\xcf\xeb\xfd\x16\xf8\x98\x08\x4d\x94\xd1\x7b\xcb\xfe\xa1\xc7\x2a\x6d\x2d\x14\x15\x19\x14\xcf\xb7\xa6\x64\x65\x9b\x28\x83\x00\x14\xe8\x60\xaf\x6b\x08\xaa\x72\x4f\x51\xdf\xbd\x6a\xc3\x57\xd2\x3b\xbd\x5f\x66\x34\x20\x04\x26\xa2\x40\xa5\x95\x73\x11\xdb\xa5\x89\x43\x95\x5b\x78\x9f\xda\x47\x48\x61\x2f\x0a\x6b\x87\xf1\x75\x02\xb0\xa4\xe1\x4c\x70\x2a\x3b\xa0\x69\xb9\xc6\x55\xd3\x74\x7f\x10\x8c\x6e\x93\x38\xbe\xfa\xdd\x51\x1f\xaf\xe2\x26\x89\x18\x34\x19\x5e\x96\x44\xaf\x0b\xcc\xed\x89\x00\x58\x17\x3a\xbb\xa5\xd5\xbe\xf4\x32\xf8\x38\xe4\xbc\xb8\x99\x1a\x17\x70\x71\x7d\xe9\x1d\x72\x4a\x1a\x7a\x58\x4d\x2c\x79\xb2\xd1\x06\xb7\x94\x24\x8f\xf0\xc7\xad\x06\x5f\x1b\xa9\x44\x21\x7f\xa2\x10\x3f\xe6\x98\x19\x68\x2b\x1b\x41\x5f\x34\x9b\x0d\x26\x40\xde\xe2\x7e\xc9\x7a\x9e\x12\x39\x50\x2b\x27\x8b\xb8\xcf\x24\xf2\x38\xfd\x51\xea\xbb\x64\x1b\x6c\xff\x72\x1a\x36\xa2\xb0\x5e\x78\x35\x0b\x73\x63\x43\x16\x3e\x18\xb3\x68\x40\x21\xe6\x16\x4e\x18\xe3\x13\xa8\xd0\x94\x92\x7a\x17\x26\x60\xeb\x0e\x39\x17\xa0\x3d\x5f\xde\x4b\x8b\xf0\xeb\xb7\x6f\xe1\xd5\xf7\x2a\xb4\x25\x53\x1e\xe9\x1b\xe5\xa4\xdb\xbf\x1e\xee\x65\xee\x5f\xeb\x36\x6f\x31\x87\x7d\x86\x7a\xbe\xfb\x57\xab\x76\x9e\xc2\x37\x07\x4b\x40\xba\xb5\xd9\xa8\x13\x55\xdb\xc4\x94\xa6\x15\xdf\xe3\x66\x74\xb8\x9f\x66\x62\x2e\xbc\xc3\xe6\x50\x34\xff\x8f\xf6\xa9\x8c\xcd\x7a\x52\x0d\xa4\x22\x97\xa1\x49\x5f\x77\xf6\x84\x8c\x4e\xfa\xf9\x1c\xe8\x47\xcd\xa5\x96\x8f\x5a\xbf\xef\xaf\x2e\x9f\x77\x26\xb5\x7c\x96\x45\x49\xf7\xa3\x01\x15\x72\x5b\x93\x92\x78\xc8\x73\x49\xe2\x76\x32\x6c\x5b\x7a\x6a\x4e\xa4\x1e\x12\x01\xf1\x54\xd7\x5d\x12\xc0\xe1\xb6\xa9\x78\x1d\x54\x55\x38\xf1\x93\x35\x51\x69\xb7\x8d\x65\x8d\x3b\x71\x27\xb5\x89\xbf\x87\xaa\xcf\xb0\xa2\xf8\xc2\x22\xeb\xa7\xb3\x14\x2a\x5f\xf2\x66\x8e\xa7\x54\x62\xd6\x5a\x3b\xeb\x8c\xa8\x66\xb9\xee\x7f\x88\x4f\x73\x1f\x5f\xab\x66\x29\x3e\x2a\xb4\x0f\xbe\xb8\x8a\xc2\x5b\xa3\x46\x97\x19\x55\x26\x2a\x5b\x73\xcf\x34\x59\x37\xd2\xd1\x31\xe6\xe6\xce\xa1\x50\x58\xfd\x9f\xff\xfa\x6f\xdb\xe2\x59\xa5\x18\xbc\xc4\x6c\x27\x94\xb4\xe5\x98\xde\x9e\xe3\x56\x31\x12\x9f\x70\xb4\x27\xe2\x88\x2c\xef\xe2\x1b\x83\x64\x69\x50\x8f\x59\x73\xb3\x0c\xa9\xc5\x2c\x29\xd2\xfd\x7a\xd2\x4e\x7b\x1a\x1d\x26\x25\x9c\x90\x85\x8d\x1d\x84\x61\xd4\x24\x50\x1f\xc9\xc4\x12\x49\xb3\xd9\xc3\x6b\x1d\x7b\xda\xb6\x4c\x3b\x1d\x92\x9f\xfb\x76\xc5\x57\x97\xc2\xa5\xba\xb0\x39\x28\xd1\xb5\x0b\x75\x71\x24\x0b\x26\x66\xda\xd2\x79\xee\xee\x7c\x87\xf7\xb9\x5c\xde\xd9\x16\x02\x98\x8b\x69\xb3\xf5\x63\x30\x7b\x79\xb5\x61\x54\xb8\x7d\xc5\xf3\x4b\x25\x31\xc3\xde\x96\xe4\x98\xf4\x9f\x00\x1c\xf7\x31\x7b\x0d\x61\x62\xa2\x21\x78\x44\x21\x35\xdb\x6e\x69\xa6\xed\x3e\xe9\x05\x05\x08\xbb\xc2\xe9\x0c\x81\xd3\x3f\xea\x10\x63\x8a\x8c\xb6\xaf\xd1\xe6\xd1\x92\xa2\xa2\x78\xfa\x43\x50\x92\x37\xfe\xce\xaa\x14\x4a\x6e\xd0\xba\x55\x18\x0d\x8d\xfd\xf3\xdb\xbf\x4c\xd1\x1b\xe0\x5b\x6d\x00\xb9\x53\x65\xd1\x84\x00\x71\xb3\x70\xc7\xb5\x26\x62\x35\xb0\x27\xc1\x36\xb9\xd0\x4a\xc7\xac\xc0\x3d\x11\xc3\x89\x5b\xaa\xfa\x88\x90\xb8\x29\xe4\x2d\x9e\xc3\x09\xed\xac\x6f\x51\xff\x9b\x37\x6a\x7f\x9f\x8a\x34\x00\x5e\xdd\x53\xb8\x77\xe2\x1f\x3f\x61\x84\x1b\xf7\xb3\xbb\xed\x75\x3e\xe2\xdc\x32\x62\xe4\x76\xcb\xdb\x10\x77\x08\xe8\xad\x00\xb5\x3f\xca\x8d\x0f\x2b\x1b\x60\x69\xd3\x1b\xaf\x6e\x09\xeb\x68\xa2\x7f\x7e\xfb\x97\x13\x78\xd5\x42\xf4\x74\x9b\x86\xa8\x72\x7c\x80\xb7\x4d\x72\xa3\xd2\xf9\xeb\xd0\xba\x64\xf7\xca\x89\x07\x6a\x7b\xda\x69\x8b\x8a\x6b\x2d\xc9\x10\x9f\x2f\xca\xe5\x50\x9e\xf9\x1e\x8b\x62\xc9\x79\xc9\x1c\xee\x79\x5b\x44\x64\x05\x2e\x52\x55\xc2\xb8\x54\xdf\x51\xbc\x3a\xbb\xfc\x3f\x7f\xb8\xfc\x70\x1e\x37\x5e\x59\xb9\x55\xb1\xee\x43\xd1\x62\xa8\x54\x25\x0a\xa7\xf1\x6a\xab\x82\x35\x33\xa9\xb7\x63\x3b\xa1\xb6\x4d\x52\x61\x53\x7b\x03\x3e\xd2\xa3\xd7\x5e\xb3\x35\xcd\x74\x38\xf1\xcb\x0a\x28\x1e\x31\xf5\xe9\xa0\xe2\x49\x61\x85\x1d\xf6\xc6\x33\xad\x32\xac\x9c\x3d\xd5\x77\x68\xee\x24\xde\x9f\xde\x6b\x73\x2b\xd5\x76\xe9\x85\x62\x19\x12\x90\x9c\x47\x3d\x9d\x13\x6e\x3c\x72\xa6\xc9\xfc\xfd\xf8\x74\x39\xc1\x94\x98\xf3\xb4\xe8\x3d\x0f\x4d\x28\xb7\x7c\xfa\x6c\x24\x89\x0e\xd1\x53\x3c\x80\xc6\xa9\x3f\x84\xe2\xc5\x95\xb7\xf1\xcf\x92\xf6\x9e\x05\x2a\x45\xce\x26\x4a\xa8\xfd\x17\x17\x27\x4f\x78\xea\xa5\xcb\xf6\xcb\xe0\x54\x91\xef\x4f\x3b\xd4\x2d\x15\x8f\x9f\x8d\xd2\x93\xf1\xee\x53\x22\xde\x67\x11\xb2\xe9\x48\x78\xf6\x34\x67\x84\x9a\x00\x63\x7d\x78\x83\x64\x38\xf1\x3e\x72\x9b\xd9\xf6\xd4\x68\x9d\x7f\x0f\xa9\xf1\x94\x92\x33\xc8\x0a\x5d\xe7\x4b\xa9\xa4\x8b\x1e\x3e\xf0\x20\xbc\xfd\x4f\xc9\x62\xd1\x8d\x8f\x82\x53\x37\x21\x3a\xa5\xf7\xf7\x82\x41\xfa\x88\xdc\x60\x4c\x1e\x1c\xb5\xb8\x5c\x62\x65\x90\x3a\x29\xce\xd9\x6a\x93\x55\x4b\x82\xdc\x09\x1b\x2b\x2d\xf1\x5d\x0f\xff\xee\x8d\x28\xaa\x9d\xf8\x9a\x0c\x68\xac\x71\x85\x2c\x28\xc8\x74\x8a\x52\x04\x53\x19\x7d\xf5\x15\xdc\xdc\x4b\xda\xef\xac\xc1\x93\xf6\x06\x33\x83\x74\x28\xd3\x2a\xe5\x88\xcd\x5a\xff\xbc\x07\x6f\xf6\x12\xf7\xd1\x18\x3a\xcf\xc4\xd2\x5d\xf2\xda\x92\x93\xa5\xbc\xf1\x10\x93\x84\xc5\x1e\x5c\xeb\x34\xc4\xd8\x4d\x33\xbe\xd6\x3f\x8f\x6a\x93\x12\x93\x38\x12\x66\x90\x9a\x8f\x3f\x1a\x26\x51\x76\xa6\x23\x63\x12\x7b\x98\x13\x47\xc5\xcc\xa6\xc1\x46\xc8\xa2\x36\x78\xa9\x3d\x89\x67\x4d\xf1\xdb\xee\x1b\x71\x92\x01\x0c\xe4\xfc\x6b\x27\x8f\x94\x28\xf9\xf5\xfa\x89\x41\xaa\x15\x17\x86\xb9\xc3\x45\xf0\x2e\x70\x86\xd5\x1b\x73\x5c\xd7\xb4\xad\xad\xb1\xe9\x2d\xac\x5f\xf4\x91\x9f\x4a\x25\xa9\x36\x46\x34\xdd\xb4\x89\x4c\xca\xc1\x51\x32\x07\x6f\xc5\x6c\x4a\x28\xc8\xf7\xd3\x2a\xe3\xe9\x1b\x3a\x9b\xb1\xcd\x9e\x68\x6a\x8e\xe4\x72\xad\x3a\x40\xad\xc9\xc8\xfc\x9c\x7c\xd1\xbc\x9c\xc4\x73\xe4\x23\x66\x29\xb6\x59\x79\x88\x2f\x94\x83\x78\x74\xfe\x81\xf3\x0b\x49\x98\xff\xb0\xdc\xc3\x17\xc8\x3b\xfc\x03\x72\x0e\x8f\xce\x37\x4c\x5b\xa6\xc7\xe4\x1a\xe6\xb5\xc3\xfa\x6b\x4e\x9e\x61\x38\x8f\x90\x04\x9b\xcc\x31\x24\x72\x08\x53\x7c\x3c\x98\x5f\x48\xe6\x0f\xa6\xf2\xae\xc7\xb9\x85\xe9\xdc\x41\x3a\xe3\x38\x9d\x57\x98\xa5\x31\xa6\xf2\x09\xbf\x9c\x5c\xc2\xac\xe9\x4e\xe5\x10\xfe\x69\xf3\x07\xb3\x67\x37\x99\x37\x78\x42\xce\xe0\x1f\x97\x13\x98\x59\xca\x9c\x9d\x0b\x78\x4a\x1e\x60\x7e\x35\xe5\x97\x94\x03\x98\x45\xd9\x89\xd8\xff\x9f\x34\xee\x7f\x8e\xe8\x25\x3a\x83\x57\x97\xb3\xfc\xd5\x8f\xcd\xe3\xd1\xad\x8f\x25\xfb\x50\x39\x6e\x69\x33\xe5\xdc\xc7\xed\x34\x71\x4b\x4b\xe3\x96\x76\x82\xf1\xc3\xf3\xbf\xe2\x33\xa3\x40\xaf\x2e\xe9\x70\x48\x24\x73\xc8\xfe\x80\xce\x1b\x97\x26\xd3\xc6\xa0\xad\x34\x47\x87\xb1\xf9\x30\x59\xcd\x86\x68\x6e\x1b\xb3\xd5\xf8\xe6\xeb\x3d\xec\xe4\x76\x87\x06\x0a\xcf\xcc\x74\x6c\x62\x5d\x22\x37\xdc\x77\x4e\x6e\x1e\x07\x1c\xf6\x26\xd3\xb1\x22\x99\xb0\xe4\x58\xc4\x70\x44\xd4\x4e\xd3\x8e\xdd\xe0\x25\x74\x00\xa6\x72\x29\x2d\x15\xdf\x15\x28\xd4\xb2\xae\xa0\xd0\x5b\x99\xc5\x30\xa9\x03\x36\xd3\x65\x25\x0c\xda\xf1\xd3\x4b\xe2\xe5\x34\x91\x91\x7c\xac\x0d\x99\xc2\xda\x75\x36\xef\xba\x66\xd4\xa0\x4d\xa6\xb7\xcc\x6c\xd1\x3b\x98\x5b\x2f\xbf\x74\xd4\xa7\x85\x3f\x35\xd2\xc2\x63\xad\xe0\xdf\x8e\xa7\x9d\x08\x81\xa8\xa7\x5e\x66\x1e\xb5\xa5\xde\x2c\x9d\xc1\x96\x5d\xf8\x40\xcc\x66\xe6\x8b\xbe\x23\x92\xd0\xb7\xed\x4a\x77\xe8\xc6\x4d\xd2\xd4\x32\x16\xbd\x2d\xd1\x0e\xe5\xa5\x7a\x14\x62\x10\x8d\x78\x74\x5c\x7b\xa2\xc3\x85\xa2\xd6\xb4\xe6\x0e\x93\x5b\x5a\xda\xe6\x98\xf2\x32\x9b\x73\x82\x6f\x7f\x6f\x7d\x54\x16\x76\x58\x85\x3d\x47\x8a\xbc\x76\xbf\xcc\xd2\x6a\x8a\xc4\x73\xad\x30\x2e\xe3\x38\x9a\x35\x9f\xd6\xdc\xac\x4f\xbb\xd6\x2a\xa7\x8e\xf1\x52\x98\xdb\xb0\xc9\x80\x5b\xf2\x26\x76\xdc\x31\xad\x9b\x23\x3a\x79\x83\x28\xf1\x63\xe6\xea\x70\x66\x19\xef\x3f\xf0\x22\xd4\x91\xad\x51\x88\x2c\x73\x5e\xf7\xf8\x48\x95\x82\x89\xde\x22\x75\xf7\x23\xd3\x91\x8d\x1b\x41\x7e\x6d\xb2\xb4\x77\xc0\x6d\x91\xa7\xa6\x22\xe6\x49\x45\x7c\x97\xb6\xd8\x3d\x15\x3b\x74\xbe\x77\x6c\xc4\xe9\x08\x49\x4c\x17\xce\xd4\x5a\x25\x0a\xee\xb7\x5e\x23\x74\xf6\x96\xc5\x9d\xa2\xc7\xfd\x1a\xa3\x67\x0f\x4c\x4c\x36\xd5\x6f\xb5\x6c\xc7\x19\xbc\xdb\x49\xa5\x0d\xde\x3f\xca\xb1\x0c\x3c\xf5\xf8\x63\xa1\x86\x30\x1e\xc3\x65\x09\x07\xc7\xd3\xf3\x8f\x71\x0b\xfd\x8b\x89\xc1\xc2\xe1\xf3\x9d\xc7\x26\x0e\xb1\xe6\x0f\x4d\x74\x59\x41\xaf\xc3\x36\xe6\x9f\x75\x8e\xf5\xd1\x57\x1b\xd2\x9b\xff\x9f\xf4\x01\x87\xa3\xc5\x39\xfc\xa0\xc3\xf4\x67\x15\xda\xeb\x69\x47\xa1\x46\x62\xfd\xb1\xd9\x70\x35\x79\xf2\x57\x77\x6f\x56\x24\x75\xd0\x55\x83\x47\x1f\x27\x10\xfd\xed\xaf\x67\x23\x4a\x9f\x1e\x49\xe2\x46\x5f\x0b\xe9\x1e\x1b\x49\x09\x0e\x3e\x68\x82\x5f\xe7\xde\xa3\x14\x37\xf0\xf5\xaa\xf9\x5e\xc9\x02\x3a\x1f\x2c\x59\x40\xf8\x62\xc9\x02\xf8\x93\x25\xd4\xf8\x1f\x3e\x5b\x72\x94\x90\x18\xd5\x02\xbd\x0f\x6d\x3c\x8a\xab\x1e\xfb\xcd\x8d\x9f\xcb\x1c\xb3\x8e\x4f\x7e\xea\xd7\x55\x8e\xa8\xde\x61\x9e\x57\x6e\x87\xd2\x84\xdd\xab\x1d\xef\x36\xaa\x96\x23\x62\x7f\xc1\x73\x80\x5f\xc6\x8f\x70\x44\x7f\x9e\x76\x83\x88\xee\xc9\xaa\xcd\x61\xaa\x6b\xda\x26\x3d\x98\xa2\x09\xa9\x4e\x46\x94\xb2\x85\x77\x5a\xe6\x1e\x2d\xa3\x6d\x85\x19\xc9\xd3\x7a\x1f\xf6\x43\x86\xee\xbd\xf0\xd2\xd8\x06\xa5\xee\xf6\x94\x00\x38\xe0\x45\x67\x3f\x2c\xe9\x78\xbb\x90\x06\xeb\x04\x60\x20\xd6\xde\x7f\x21\xdc\x8f\xf1\x8c\x9b\x62\x1f\xb5\x93\xf5\x57\xf4\xcf\xb2\x79\xf9\x30\x28\x1b\x15\x86\xce\x29\x4e\x4f\x12\x89\xce\xfb\x4f\x12\x8c\xf6\xe4\xea\xe4\xf1\x3b\xe4\x2c\xd1\x01\xce\xce\xaf\x45\xe3\xf7\x86\x4f\x99\xa4\x78\x39\x7a\xc0\x6f\xce\xce\xbe\xea\xd8\x85\x4c\x54\x22\x93\x7c\xbc\x29\xee\x69\xab\x6c\xd8\xb3\xbf\xc6\xf1\x78\xa3\xc1\x23\x1e\x1e\xe6\x39\x4e\x69\x07\x7b\x74\x1d\xe0\x9d\xb3\xaa\xf9\x15\x46\xdb\xe3\x71\x04\xb2\x39\x91\x62\xe4\x4c\x9a\xa7\x89\x56\xd8\x7e\xf8\xa4\x35\x7d\x0e\x0d\xc2\xdd\xb1\xe2\xe0\xb4\xc1\xe8\x85\x50\x72\xfa\x39\x26\x3a\xe0\xc3\x1c\xfc\xd4\x7e\xc0\x2b\x94\xc0\xdb\xdf\xc2\x67\xb6\xf8\xcb\x48\x9d\xdb\xe1\xe8\x91\xfc\x9c\x36\xaf\xf0\x0f\x4e\x1b\xb1\xc5\xf0\x4b\xeb\x24\x89\x2c\xc3\xca\x61\xde\xf9\x24\x11\x7f\x01\xe9\x84\xeb\x03\xf1\x73\x46\xf4\x67\xf3\x01\x01\x7b\x0e\x7f\xfe\xcb\x8b\x50\x6c\xce\x7f\x88\xd8\xf8\x1f\xff\x37\x00\x00\xff\xff\xb0\x21\x1d\xfe\xf8\x6c\x00\x00"), }, "/cluster.x-k8s.io_machinehealthchecks.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.x-k8s.io_machinehealthchecks.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 729003002, time.UTC), uncompressedSize: 6835, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x59\x4d\x73\xdb\xbc\x11\xbe\xeb\x57\xec\xa8\x87\x5c\x2c\x3a\x69\x2e\x1d\xdd\x3c\x4e\x66\xea\x36\x71\x32\x71\xde\xf4\xd0\xe9\x01\x02\x57\xe2\xd6\xf8\x60\x01\x50\xb6\xfa\x4e\xfe\x7b\x67\x01\xf0\x43\x24\x45\xbb\xf3\x4e\x70\x49\x04\x80\x8b\x07\xbb\x8b\x67\x3f\xbc\xda\x6c\x36\x2b\x51\xd3\x0f\x74\x9e\xac\xd9\x82\xa8\x09\x9f\x03\x1a\xfe\xe5\x8b\xc7\xbf\xf8\x82\xec\xf5\xf1\xdd\x0e\x83\x78\xb7\x7a\x24\x53\x6e\xe1\xb6\xf1\xc1\xea\x6f\xe8\x6d\xe3\x24\x7e\xc0\x3d\x19\x0a\x64\xcd\x4a\x63\x10\xa5\x08\x62\xbb\x02\x10\xc6\xd8\x20\x78\xda\xf3\x4f\x00\x69\x4d\x70\x56\x29\x74\x9b\x03\x9a\xe2\xb1\xd9\xe1\xae\x21\x55\xa2\x8b\x27\xb4\xe7\x1f\xdf\x16\xef\x8b\xb7\x2b\x00\xe9\x30\x7e\xfe\x9d\x34\xfa\x20\x74\xbd\x05\xd3\x28\xb5\x02\x30\x42\xe3\x16\xb4\x90\x15\x19\xac\x50\xa8\x50\xc9\x0a\xe5\xa3\x2f\xa4\x6a\x7c\x40\x57\x3c\x6f\x12\xf0\x95\xaf\x51\x46\x34\x65\x19\x21\x0a\xf5\xd5\x91\x09\xe8\x6e\xad\x6a\x74\x82\xb6\x81\xbf\x3d\x7c\xb9\xff\x2a\x42\xb5\x85\x82\x3f\x28\xb4\x78\xfe\xcd\x24\xc1\xa7\x88\xbd\x44\x2f\x1d\xd5\x21\x22\xfc\x2c\x9e\x49\x37\x1a\x4c\xa3\x77\xe8\xc0\xee\xa1\x69\x37\xb7\xa0\x3c\x08\xa5\xec\x13\x96\xf1\xeb\x84\xf7\xf3\x58\x68\x38\xd5\xb8\x05\x1f\x1c\x99\xc3\x04\x46\x10\xa1\xf1\x05\x3e\xd7\x28\x03\x96\x9f\xb3\xd8\x29\x98\xfb\x0e\x44\x77\xb4\x6c\x9c\x43\x13\xd4\x09\xb4\x35\x14\xac\x3b\x83\xf1\x71\x4e\x64\x82\xc2\x8a\x39\xa0\xbb\x80\x25\x8b\xfd\xeb\x25\xb5\xdc\xa6\x75\xb0\x3b\x8f\xee\x88\x25\x8c\x75\x32\x00\x71\x3b\x95\x35\x86\x70\x70\xb6\xa9\xb7\x30\xb1\x68\x12\xd1\xfa\x94\x08\x78\xb0\x8e\xda\xdf\x9b\x76\xff\x46\xd4\x14\x67\x92\xc7\xe6\xcb\xa6\xf3\x6e\xd9\x57\xe2\xa2\x22\x1f\xfe\x7e\x61\xc3\x27\xf2\x21\x6e\xaa\x55\xe3\x84\x9a\xf5\xb7\xb8\xee\x2b\xeb\xc2\x7d\x8f\x69\x03\xba\x92\xfd\xff\xf2\x26\x32\x87\x46\x09\x37\x27\x66\x05\xe0\xa5\xe5\xdb\x47\x29\xb5\x90\xd1\x60\xbe\xd9\xb9\xfc\xc4\xb2\xe4\x64\x88\x2d\xfc\xfe\x73\x05\x70\x14\x8a\xca\xf8\x40\xd2\xa2\xad\xd1\xdc\x7c\xbd\xfb\xf1\xfe\x41\x56\xa8\x45\x9a\x9c\x78\xee\xf8\x96\x40\x1e\x42\x85\x90\x3e\x82\xbd\x75\xf1\xe7\xcc\x5d\xe1\xe6\xeb\x5d\x96\x59\x3b\x5b\xa3\x0b\x9d\xd6\x79\x0c\x28\xa4\x9b\x1b\x9d\xfe\x86\xe1\xa5\x3d\x50\x32\x69\x60\x3a\x3b\x3f\x7d\x2c\xc1\x27\x14\x76\x0f\xa1\x22\x0f\x0e\x6b\x87\x1e\x4d\xa2\x91\x81\x58\xe0\x2d\xc2\x80\xdd\xfd\x1b\x65\x28\xe0\x81\x1d\xce\x79\x36\x45\xa3\x4a\x66\x9a\x23\xba\x00\x0e\xa5\x3d\x18\xfa\x6f\x27\xd9\x43\xb0\xf1\x48\x25\x02\x66\xf3\xb6\x23\xb2\x82\x11\x8a\x15\xdb\xe0\x15\x08\x53\x82\x16\x27\x70\xc8\x67\x40\x63\x06\xd2\xe2\x16\x5f\xc0\x67\xeb\x10\xc8\xec\xed\x16\xaa\x10\x6a\xbf\xbd\xbe\x3e\x50\x68\x49\x53\x5a\xad\x1b\x43\xe1\x74\x1d\xa9\x8f\x76\x4d\xb0\xce\x5f\x97\x78\x44\x75\xed\xe9\xb0\x11\x4e\x56\x14\x50\x86\xc6\xe1\xb5\xa8\x69\x13\x81\x9b\xc8\x99\x85\x2e\xff\xd4\x99\xff\xcd\x00\xe9\x88\x35\xd2\x88\x5e\x7e\x51\xef\xec\xe2\x6c\x68\x91\x3f\x4b\xf8\x7b\xf5\xf2\x14\x6b\xe5\xdb\xc7\x87\xef\xd0\x1e\x1a\x4d\x70\xae\xf3\xa8\xed\xfe\x33\xdf\x2b\x9e\x15\x45\x66\x8f\x2e\x19\x6e\xef\xac\x8e\x12\xd1\x94\xb5\x25\x13\xe2\x0f\xa9\x08\xcd\xb9\xd2\x7d\xb3\xd3\x14\xd8\xd2\xff\x69\xd0\x07\xb6\x4f\x01\xb7\x31\x74\xc0\x0e\xa1\xa9\x4b\x11\xb0\x2c\xe0\xce\xc0\xad\xd0\xa8\x6e\x85\xc7\x5f\xae\x76\xd6\xb0\xdf\xb0\x4a\x5f\x56\xfc\x30\xe2\x9d\x6f\x4c\xda\xea\xa6\xdb\x40\x34\x6b\xa1\x87\x1a\x25\xed\x49\x46\x3f\x1f\x70\x79\xa6\x50\x88\x2f\x10\x6a\xab\x48\x9e\x06\x32\xe6\xde\x21\x8f\xcc\x81\xcc\x26\xe7\x0b\x63\xc6\xee\xf7\xb5\x3c\xc0\xdc\x9a\xde\x1f\xb6\xcb\xc9\xa4\xd9\xf8\x3b\x54\xd6\x1c\xfc\x48\x2a\xb0\xdd\x46\x73\x9a\xcc\x27\x34\x07\x8e\x20\xef\x46\x4b\xb3\x9a\x8c\xdf\x0c\x42\xe4\x18\xb9\x30\xa7\x2f\xfb\xf1\xe4\x66\x12\x36\xe6\x56\x67\x4e\x1a\x69\xe2\xc6\x9c\x60\xdf\xb8\x50\xa1\x03\x87\x1a\x4b\x4a\xa6\xe0\x8b\x1b\x75\x6a\xa3\x39\xd0\x1e\x44\x00\x6d\x7d\x80\xf5\x30\x9e\xaf\x27\x0a\xe9\xa2\xb1\x47\x15\xe3\x2d\xec\x4e\xb0\x4e\x3f\xac\x5b\x83\x70\x08\xec\xe5\x59\xc0\xb9\xf6\x8c\x2d\xf1\x21\x08\x17\x9a\x9a\xb3\x1f\xdb\x84\x45\x3b\xb6\xa1\x1c\x2c\x67\x53\x10\x2a\x61\x92\xd1\xca\xc6\xa5\x7b\x3c\x51\xa8\x6c\x13\x40\x44\xd1\xf0\x44\x4a\xc1\x0e\x27\xa0\xa5\x35\x9e\x4a\x74\x58\x32\x51\x56\xe2\x88\xb0\x17\xa4\xb0\x8c\x6c\x98\xbf\xea\x14\x84\xe5\xd8\xe6\x17\xd5\xdd\xde\x7b\xf1\x1a\x9f\xc4\x0e\x55\xb7\x95\x11\x68\x11\x64\xd5\xab\xf2\xa9\xb2\xbe\x7b\x13\x2d\x1a\x7c\x46\x27\xc9\xe7\x1c\xa7\x1f\x97\x1e\x47\x32\x4e\x90\xd5\xc7\x67\xe6\x31\xdf\x27\xa8\x0b\xd0\xc6\x1f\x24\x36\xe5\xf4\x81\x1f\x8b\x3a\x07\xce\x64\x46\xac\x24\xa6\xc8\x19\xc9\x00\xdf\x2b\x3c\xdb\x15\xbd\xe1\xe6\xfe\xc3\x54\xa3\x3c\x28\xa0\x9e\x85\x38\x76\xe2\x05\x20\x99\xfe\x3b\xdd\x56\x22\xc4\x84\x5c\x90\x99\x3e\xe6\x34\x52\x90\xbb\x02\x01\x8f\x78\x4a\xf1\x90\x43\x6e\x8d\x4e\x74\x22\x1c\xc6\x48\x1a\xe9\xe2\x11\x4f\x71\x53\x0e\x8e\xb3\x52\x97\x8c\x92\xc6\x23\x4e\x5e\xfe\x85\xeb\xf2\x79\x99\xb5\xd2\xbd\x79\x22\xa2\xe2\xa9\xee\xaa\xa2\xae\x15\xe1\xa5\x4b\xc2\x2c\x77\x0d\xd6\x2e\x13\x48\x3b\x5a\x8d\xbc\x12\x76\xa7\xc0\x3e\x8e\x26\x15\xbf\xf1\x49\x9d\xec\x5f\x15\xd5\xec\xff\x62\x01\xb5\xc7\xe8\x7b\x6d\x2a\xf2\x83\xd3\xc1\x4e\x78\xf2\xa8\x3b\x73\x05\xf7\x36\xf0\x3f\x1f\x9f\x89\xc3\xab\x30\xe3\x67\x32\x1c\x1f\x2c\xfa\x7b\x1b\xe2\xde\x3f\xa4\x92\x04\xea\x95\x0a\x49\x9b\xa3\x83\x1a\x10\xce\x89\x13\xdf\x6b\x98\xa9\xf8\x02\xee\x52\x48\x6a\xef\xb7\x70\x09\xf2\x9c\x2d\x58\xd7\xde\x3c\x66\x98\xe9\x88\x24\x5c\x37\x3e\x26\x17\xc6\x9a\x0d\xea\x3a\x9c\x5a\xe9\x0b\x42\x3b\xa3\x91\x6f\x55\x69\xdd\x99\xbe\x2e\x1c\xb4\x20\x93\xb9\x2b\x1d\xff\x9d\xb9\x3a\x7d\x93\xb2\x5e\xc5\x25\x00\xb3\x37\xab\x20\x66\x6d\x5c\xe7\x90\x04\x8d\xee\xb0\x84\xb3\x66\x9e\xba\x6c\xba\x05\x26\x49\xe3\x15\xb6\x6d\x37\x45\xbc\xb3\x7b\x32\xed\x94\xf3\x07\x6d\xd8\xd7\x2f\xac\x2c\x9a\x77\x36\xad\x7a\x1d\xaa\x48\xdf\x31\xbc\xcc\xde\x7e\xd8\x1c\x58\xe6\xa7\x17\xf4\x33\x8d\x19\xe9\xd0\xc4\xbe\x5a\xd4\xec\xd9\xbf\x33\x9d\x46\x47\xf9\x09\xb5\x20\xe7\x0b\xb8\x89\xf5\xa1\x9a\xb7\xec\x70\x3f\x99\x5c\x9e\xf5\xa2\x59\x2a\x79\x60\x9d\x1f\x85\x62\xaa\x67\xe2\x30\x80\x2a\x12\xff\xac\xc8\x98\x61\x9e\x47\xb4\xab\x1c\x5d\x99\x44\xf7\x84\x2a\x16\x0c\xeb\x47\x3c\xad\xaf\xce\x5e\x1e\xd0\x3c\x95\xae\xef\xcc\x3a\x05\x89\xc9\x3b\x68\xe3\x4c\x4a\xa5\xd6\x71\x6d\x5d\x4c\x82\xe0\xac\xd8\xc5\xc0\xb8\xe0\x11\x17\x97\xba\x56\xcd\xad\x35\xc9\xea\x13\x53\x9f\x59\xf1\xb7\xe9\xfe\xfe\x42\x7d\x0a\x10\xeb\x9b\x7e\x07\x87\xa1\x09\xe0\x12\x03\x3a\xcd\x69\xfd\x53\x85\x31\xd5\xcc\xe9\x18\xf9\x61\xe6\xd5\x21\x2c\x52\xa2\xd0\x8b\x9d\x48\x64\xed\x48\xab\x77\xc4\xc5\x33\x19\xc6\x63\x0f\x24\x85\x82\x2f\xdf\xae\x80\x0a\x2c\x62\xc6\x6a\x4e\x33\x10\xc9\x73\xf1\x72\x35\xcd\xe4\xb9\x0a\xc8\xa8\x7a\x28\xa3\x6d\x17\x88\xe4\x05\xcd\x9d\x87\xbc\x7b\x3e\xa4\x03\x14\x2d\x76\x21\x3e\xa5\x72\x95\x73\x58\x10\x10\x52\x42\x1c\x0b\x2a\xda\x13\xe7\xa6\x2c\xad\x4d\x75\x0b\x80\x7f\x54\x68\xba\x62\xa6\xec\x8f\x98\x91\x5c\x09\x0f\x3b\x44\xd3\x3e\xac\x03\x1d\xd1\xe4\x3e\x4b\x6c\x86\x88\x00\x0a\x85\x4f\x39\x45\x7b\x74\xdb\x21\x88\x7a\x9a\x4b\xd8\x2e\xd8\x73\xb2\x75\x39\x1d\xca\xed\x9e\xd9\x77\xb1\x50\x5d\xa5\xf1\x02\x53\x85\xf9\xb2\xe2\x75\xdf\xf2\xf2\x2f\x40\x75\x39\x6e\x6c\xb2\x2e\x66\x16\xf2\x45\xe6\x56\x4e\xf5\xd4\x38\x0b\x94\xa1\xc9\xdc\x45\xb7\xbe\x50\xaf\x8e\x43\xcb\x1c\xdc\xcd\xb0\xf6\x3e\x9b\x6f\xf3\xd1\xb3\xc9\x19\x32\x7a\xb1\x8f\x30\x71\x8a\xf3\x52\x90\x4b\x53\x87\x32\xf5\x7f\xbb\x56\x6c\xf6\x68\xbb\x9f\x6b\x01\xb6\x1d\x9f\xd7\x74\x16\xce\xfa\xb6\x8b\xc4\x19\x6c\x10\x6a\xd0\x23\x9f\x74\xc8\xa5\x6d\x4c\xae\x8b\x63\xb1\x9a\x17\x26\x26\x1b\xf6\x40\x46\x8b\x7b\xeb\xb4\x08\xb1\xfc\x7f\xff\xe7\xa9\x39\x49\x37\x7a\x0b\x6f\x67\xad\x39\xd7\x31\x18\x77\xdb\xff\xaf\xfb\xbd\x74\xaf\x7c\x8f\x69\xcd\xfd\xab\xef\x35\xe3\x46\xa3\xa9\xfe\x6f\x2f\xef\x84\xaa\x2b\xf1\xbe\x9f\xcb\x7f\x20\x49\x5d\xfb\xc1\x32\xd7\x1f\xec\x59\x5b\x08\xae\xc1\xdc\x9d\xb6\x4e\x1c\x30\xcf\xf4\x7e\x2a\xa4\xc4\x3a\x60\x39\x68\x91\xa7\xa6\xfc\x3a\x75\x4d\xda\xfe\x7a\xfc\xd9\x07\xa8\x2d\xfc\xf3\x5f\xab\x24\x15\xcb\x1f\x2d\x1a\x9e\xfc\x5f\x00\x00\x00\xff\xff\x91\x66\xe2\xd0\xb3\x1a\x00\x00"), }, "/cluster.x-k8s.io_machines.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.x-k8s.io_machines.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 729003002, time.UTC), uncompressedSize: 16637, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5c\xdb\x6e\xe4\xc6\xd1\xbe\xd7\x53\x14\xd6\x17\xb2\x01\x0d\xc7\x6b\xdf\x18\x73\xb7\xff\x1e\xfe\x28\xf6\xae\x85\xd5\xda\x09\xe0\xf8\xa2\x87\x5d\x24\x3b\x22\xbb\xe9\x3e\x48\x9a\x18\x06\xf2\x1a\x79\xbd\x3c\x49\x50\x7d\xe0\x61\x48\x8e\x46\x92\xd7\xd9\x00\xe2\x8d\x76\xc8\x66\x75\x55\x75\x1d\xbe\xea\x6a\xee\xc9\x6a\xb5\x3a\x61\xad\xf8\x11\xb5\x11\x4a\x6e\x80\xb5\x02\x6f\x2d\x4a\xfa\x65\xb2\xab\x6f\x4c\x26\xd4\xfa\xfa\xf9\x16\x2d\x7b\x7e\x72\x25\x24\xdf\xc0\x4b\x67\xac\x6a\xde\xa3\x51\x4e\xe7\xf8\x0a\x0b\x21\x85\x15\x4a\x9e\x34\x68\x19\x67\x96\x6d\x4e\x00\x98\x94\xca\x32\xba\x6d\xe8\x27\x40\xae\xa4\xd5\xaa\xae\x51\xaf\x4a\x94\xd9\x95\xdb\xe2\xd6\x89\x9a\xa3\xf6\x33\xa4\xf9\xaf\xbf\xcc\xbe\xce\xbe\x3c\x01\xc8\x35\xfa\xd7\x3f\x88\x06\x8d\x65\x4d\xbb\x01\xe9\xea\xfa\x04\x40\xb2\x06\x37\xd0\xb0\xbc\x12\x12\x4d\x96\xd7\xce\x58\xd4\xd9\xed\x2a\x70\x7b\x62\x5a\xcc\x3d\x0b\x9c\x7b\xbe\x58\x7d\xa1\x85\xb4\xa8\x5f\xaa\xda\x35\x81\x9f\x15\xfc\xf9\xf2\xfb\x77\x17\xcc\x56\x1b\xc8\xe8\x85\xac\xd5\xea\x5a\x70\xd4\xe7\xaf\x3c\xbb\x1c\x4d\xae\x45\x6b\x3d\x53\x17\xf1\x19\xc4\x87\x81\x83\x8b\xf1\x1b\x76\xd7\xe2\x06\x8c\xd5\x42\x96\x93\x19\x2c\xb3\xce\x64\x6d\xc5\x0c\x4e\xc9\xbf\x0d\xa2\x40\x18\x05\xc6\xe5\x15\x30\x03\x1f\x50\x37\x42\x32\x2b\x64\xb9\xbe\x40\xc9\xe9\xef\x7b\x27\x25\xfd\x7d\xc3\x44\x8d\x1c\xd0\xe6\x43\x86\x3a\xf2\x47\xf0\x22\x15\xc7\xf7\x58\x64\xf4\xea\x94\xa5\x77\x8a\xa3\xa7\x0a\xcc\x18\x95\x0b\x66\x91\xc3\x8d\xb0\x15\xd8\x4a\x98\xa4\xfc\xc1\xdc\xf4\xc2\xbb\x44\xaa\xd5\x42\x69\x61\x77\x1b\x78\x3e\xc7\x4e\xa9\x95\x6b\x37\x30\x59\xb8\x40\x2b\xd9\x0b\xb3\x58\x2a\x2d\xd2\xef\x55\x1a\xbf\x62\xad\xf0\x77\x82\x35\xbe\x1d\xb0\x52\x0b\x63\xbf\x1d\xde\xfd\x4e\x18\x1b\x38\xaa\x9d\x66\x75\x6f\x35\xfe\xa6\xa9\x94\xb6\xef\xfa\x29\x57\xd0\xb0\xf0\x40\xc8\xd2\xd5\x4c\x6f\x06\x82\x9a\x5c\x91\x10\x7e\x78\xcb\x72\xe4\x74\xcf\x6d\x75\x74\x83\x48\x22\x28\x77\x03\xbf\xfe\x76\x02\x70\xcd\x6a\xc1\xbd\x11\x87\x87\xaa\x45\xf9\xe2\xe2\xfc\xc7\xaf\x2f\xf3\x0a\x1b\x16\x6e\x2e\xd8\x82\x30\x60\x2b\x84\x30\x12\x0a\xa5\xfd\xcf\xc4\x3e\xbc\xb8\x38\x8f\x6f\xb7\x5a\xb5\xa8\x6d\xa7\x27\xba\x06\x0e\xdd\xdd\xdb\x9b\xe7\x94\x18\x09\x63\x80\x93\x0b\x63\x98\x30\x3a\x22\x72\x30\x61\x6a\x55\x84\x25\xd7\xd8\x6a\x34\x28\x83\x53\x0f\xc8\x02\x0d\x61\x12\xd4\xf6\xef\x98\xdb\x0c\x2e\x51\x13\x11\xd2\xae\xab\x39\xf9\xfd\x35\x6a\x0b\x1a\x73\x55\x4a\xf1\x8f\x8e\xb2\x01\xab\xfc\x94\x35\xb3\x18\x97\x29\x5d\xde\x5d\x25\xab\x49\x85\x0e\xcf\x80\x49\x0e\x0d\xdb\x81\x46\x9a\x03\x9c\x1c\x50\xf3\x43\x4c\x06\x6f\x95\x46\x10\xb2\x50\x1b\xa8\xac\x6d\xcd\x66\xbd\x2e\x85\x4d\x21\x2c\x57\x4d\xe3\xa4\xb0\xbb\xb5\x0f\x44\x62\xeb\xac\xd2\x66\xcd\xf1\x1a\xeb\xb5\x11\xe5\x8a\xe9\xbc\x12\x16\x73\xeb\x34\xae\x59\x2b\x56\x9e\x71\xe9\x23\x58\xd6\xf0\xcf\xba\x85\x3e\x1d\x70\xba\x67\xd8\xe1\xf2\x76\xb9\xa8\x77\xb2\x4f\x5a\x5d\x16\x5f\x0b\xfc\xf7\xea\xa5\x5b\xa4\x95\xf7\xaf\x2f\x3f\x40\x9a\xd4\x2f\xc1\x58\xe7\x5e\xdb\xfd\x6b\xa6\x57\x3c\x29\x4a\xc8\x02\x75\x58\xb8\x42\xab\xc6\x53\x44\xc9\x5b\x25\xa4\xf5\x3f\xf2\x5a\xa0\x1c\x2b\xdd\xb8\x6d\x23\x2c\xad\xf4\x2f\x0e\x8d\xa5\xf5\xc9\xe0\xa5\x0f\xe4\xb0\x45\x70\x2d\xa7\x28\x90\xc1\xb9\x84\x97\xac\xc1\xfa\x25\x33\xf8\xd1\xd5\x4e\x1a\x36\x2b\x52\xe9\xdd\x8a\x1f\xe6\x9f\xf1\xc0\xa0\xad\xee\x76\xca\x10\xb3\x2b\x14\x3d\xf0\xb2\xc5\x7c\xe4\x19\x1c\x8d\xd0\x64\xbd\x96\x59\x24\x9b\x1f\x46\x9e\x65\x5f\xa4\x6b\xab\x94\x35\x56\xb3\x76\x7c\x7b\x6f\xe2\xff\x4b\xa3\x82\x79\x68\x2c\x50\xa3\xa4\xc5\x57\xc0\xa0\x56\x39\xab\x49\x62\x97\x5b\xb8\xa9\x44\x5e\x01\xca\x9c\xb5\xc6\x79\xff\xd9\x23\x0c\x50\x08\xac\xb9\xf7\xb1\x5c\xc9\x42\x94\x4e\xa3\x17\x23\x72\xfd\xef\x7f\xfe\xcb\xf4\x7c\xb5\x64\x75\x0d\xe6\x15\x93\xc2\x34\xd9\x1e\xb1\x25\xb1\x20\xa4\xf5\x42\x94\xef\xb1\x98\x3e\xda\x13\xef\x65\x1a\x39\x2b\x5e\xc7\x0a\xa4\x44\xbc\xa2\x55\x12\x85\xc8\x67\x08\xc3\xd0\x33\x98\x85\x4a\x91\xac\x49\x50\x1f\xa1\x80\xa3\x65\xa2\x36\x19\x7c\xa8\x70\x30\x9b\x30\xa0\xda\x00\x0b\x66\x09\x13\x37\x75\xad\x6e\xc0\x19\xd4\x66\x4d\x92\x33\xb2\x59\x7a\x10\x38\xda\xf5\x2b\x95\xbd\x62\x96\xf9\xbc\xa8\x9c\xf7\xab\x59\x92\x12\x91\xfb\x20\x39\x00\x41\xfb\x3a\xbe\x4b\xcf\xb0\x18\xd6\x17\x15\xfe\xe2\xe2\x3c\x85\xf3\x10\xc5\x3b\x35\xd8\xb9\xd9\x61\xc9\xad\x86\x97\xb7\x2a\x0f\x24\x8e\xe1\xe0\xf4\xbc\x08\x53\xfa\x40\xe7\xd7\xb9\x15\x98\xe3\x28\x63\x80\x90\xc6\x22\x23\x0d\x2d\xd0\x24\x34\x09\x14\x13\x34\xc6\x77\xce\x42\x68\x8b\x11\xb4\xcf\x34\x96\x09\x09\x2c\x24\x5e\x8f\x79\xd6\xff\xaf\x16\x89\x7a\x59\x80\xe5\x39\x1a\x13\xbc\xba\x41\x69\xcf\x3a\xfc\x15\x1d\xfe\x92\x9e\x64\x0d\x93\xa2\x40\x63\xb3\x38\x0b\x6a\xf3\xd3\x57\x3f\x2f\xe9\x11\xe0\x8d\xd2\x80\xb7\xac\x69\x6b\x3c\x03\x11\xb4\xdf\xc5\xec\x81\x2d\x7a\xa5\x74\x34\xbd\x29\x09\xb9\xac\x07\x68\x15\x8f\xc2\xdf\x78\xa1\x2d\xbb\x42\x50\x51\x68\x87\x50\x8b\x2b\xdc\xc0\x33\x0f\x69\x7b\x56\x7f\x25\x60\xf5\xdb\xb3\x45\xba\x9f\xdf\x54\xa8\x11\x9e\xd1\xb0\x67\x81\xc1\x2e\x3d\x7b\x14\x18\xed\xa7\x67\xd4\xbb\x9d\xd5\xa2\x2c\x51\x7b\x2c\x34\x7f\xf9\xbc\x43\xf1\xfc\x0b\x50\x9a\xf4\x20\xd5\x80\x88\x27\x4d\xeb\x18\x3c\x1d\xf9\x84\xf1\x9f\xbe\xfa\xf9\x00\xd7\x63\xbd\x81\x90\x1c\x6f\xe1\x2b\x10\x32\x68\xa8\x55\xfc\x0b\x72\x7f\x9a\x61\x27\x2d\xbb\xa5\xb9\xf2\x4a\x19\x5c\xd6\xb0\x92\xf5\x8e\x24\xaf\xd8\x35\x82\x51\x0d\xc2\x0d\xd6\xf5\x2a\x24\x02\x0e\x37\x6c\x47\xba\x48\x4b\x48\xd6\xc7\xa0\x65\xda\xde\x61\xbd\x09\x1c\x7d\xf8\xfe\xd5\xf7\x9b\xc0\x1d\x99\x57\x29\x89\x25\x4a\xb0\x85\x20\xb8\x43\x38\x27\x24\x6d\x6f\x9b\x62\x1a\xd6\xd3\x65\x5c\x30\x26\x8a\xef\x15\x93\x25\x06\xa9\x11\x0a\x47\xa9\x34\x3b\x7d\xa8\x87\xef\xa3\x97\xe1\x35\x83\x64\xf6\x03\xcb\x7f\x09\x0f\xdc\x4b\x44\x5f\xb1\x1c\x25\xe2\xbb\x81\xed\x1f\x14\x91\xca\x59\x2d\xd1\xa2\x97\x92\xab\xdc\x90\x80\x39\xb6\xd6\xac\xd5\x35\xea\x6b\x81\x37\xeb\x1b\xa5\xaf\x84\x2c\x57\x64\xac\xab\x60\x11\x66\xed\x4b\x9e\xf5\x67\xfe\xcf\xa3\x24\xf2\x55\xc9\xf1\x62\xf9\xe1\x7f\x84\x6c\x34\x8f\x59\x3f\x58\xb4\x94\xe8\xef\x93\xf9\x4e\x2f\x23\x74\xd8\x7f\x9b\xdc\x25\x60\xa7\x58\xd3\xc4\x48\xbc\xe8\x66\xbe\xd6\xe5\x21\x84\x33\xb9\xfb\xe8\xe6\x4d\x8a\x75\x9a\x78\xda\xad\x22\x58\x58\x31\xc9\xe9\xdf\x46\x18\x4b\xf7\x1f\xac\x49\x27\x8e\x74\xec\x1f\xce\x5f\xfd\x31\x46\xef\xc4\x83\xbd\x78\x16\xd7\x77\xe2\xec\x15\x01\xb3\x62\x3e\xf3\xd8\x2d\xa6\x90\x00\xf1\x7b\x10\x4a\x14\x7a\x24\x90\xd7\xca\xf1\x95\x90\x62\x3a\x55\x20\xeb\x91\x26\x04\xe2\x26\x83\xf3\x02\xa4\xa8\xcf\x86\x78\x3b\x81\x14\x8d\x0d\x61\x94\x18\xac\xe3\xb6\xce\x2c\x55\x8f\x48\x32\xf8\x9b\x84\x57\x54\xe4\xe5\x54\x7c\x6d\x42\x36\x0b\xd9\xa1\x62\x06\xb6\x88\x84\x74\xd3\x73\xa2\x7b\xfd\x9c\xd5\x6d\xc5\xbe\x9e\x87\x90\x92\xc3\x8d\xa8\x6b\x2a\xe8\x34\x36\xea\x3a\xbc\xc3\x62\xda\x48\x78\x31\x83\xcb\x1b\x61\xc9\x4d\x14\x90\x9a\x2e\x31\xd7\xe8\xb7\x4a\xb2\xb9\x74\x7c\x70\xad\xf8\xe8\xfd\x3b\x97\x65\x3c\x5d\xda\x07\x19\x82\x10\xe3\x9f\x06\x04\x62\xac\xd2\x33\xc5\x0f\x44\xe8\x31\x5e\xd0\xb8\x40\xc7\xad\xcf\x22\xcd\xb8\x66\x71\x7d\xee\xa7\x8d\x45\xab\x8d\x7b\x5b\x73\x1a\x1a\x17\x51\xfd\xb8\x39\xd5\xc4\xc7\x21\xba\x45\xb8\xb9\xc5\x5a\xc9\x72\xaa\x23\xab\xf6\x99\x6f\x84\xfc\x0e\x65\x69\xab\xb4\x6f\x77\x84\x4c\x05\x13\xb5\xd3\xf8\x4a\x91\xda\x0e\xb2\xfe\x66\x38\x32\x31\x1f\x5f\x07\x1e\xee\x0e\xf6\xb8\x92\x99\x4e\x2b\x4e\x8d\xd1\xd4\x33\x78\xeb\x8c\x85\x86\x91\xa5\x32\xb8\xc2\x5d\xf2\xab\xd1\x5c\x14\xc2\xdb\x60\x29\x9c\xa0\xf2\x5c\x99\x16\xf5\x9f\x70\xda\xb1\xd2\x0b\x59\x68\x16\x6a\x72\xa7\x71\xa6\x0a\x1e\x69\xe0\x7c\x7f\x74\xaa\x84\x7f\x71\x7e\x67\x61\xaf\x24\xce\xfd\x3e\x7b\x97\xc2\x26\x3c\xab\x82\x86\x73\xd8\xee\x08\x61\x8e\x59\xe9\xaa\xe8\xfb\xd4\xf2\x87\xeb\xcb\xc7\xd4\x96\x07\x03\xc4\xc1\x9a\xf2\x51\xf5\x24\xb0\x79\x37\x7e\x70\x2d\x19\x78\x9d\x8f\xac\xbf\x7f\x1d\xf9\xfb\xd7\x90\x1f\xa3\x7e\xfc\x28\xb5\xe3\x47\xab\x1b\x1f\x51\x33\xfa\xda\x70\x69\xcf\xe8\x01\xf5\xe2\xa0\x2e\x9c\xa5\x7a\xdf\x5a\x71\x5a\x13\xce\x92\xbd\xbb\x4e\x3c\xe8\xad\x4b\xf5\xe1\xa7\x5f\x1b\x1e\x14\x6b\xa9\x26\xfc\xe4\xea\xc1\x3b\xa5\x58\xac\x03\x3f\xc9\x1a\xf0\xa0\x38\x47\xd4\x7e\x8f\xab\xfb\x96\x76\x58\xfe\x17\x6a\xbe\x83\x9a\x5b\xa8\xf5\x3e\xb1\x3a\xef\x21\x48\xb9\xef\xd3\x1f\xc4\x5a\x7d\x73\x3e\x41\x4d\xc1\x49\xe7\x85\xc8\x43\x7b\xa0\x97\x3d\x01\xce\x48\x79\x9a\x90\xb6\x3b\x3f\xae\x83\x54\xc3\x22\xac\xe9\x11\xe8\x70\x0c\x91\x67\x06\x0c\xfa\xb4\x31\xc5\xde\x94\x1b\x15\xef\xd2\x79\xae\xb4\x46\xd3\xaa\x50\x59\xf8\xe4\xd9\x77\xd9\x47\xf3\x09\xd3\xe1\xc5\x39\x3e\x2b\x51\x56\xa8\xa1\x26\xe3\xa3\x84\x69\x5c\x43\xe9\x58\x15\xc3\xee\x79\x06\xaf\x03\xaa\x00\x67\x10\x72\x66\x7c\x32\x8d\x03\xa6\xa8\xd0\x59\x65\x72\x56\xa7\x8c\x39\x20\x44\x22\xf6\x5a\x79\x59\x23\x93\x2b\xd7\x42\xad\x4a\x91\xa7\x3c\xd3\xbf\x3e\xd3\x3b\x6a\x5a\xa6\xd1\xf4\x6d\x6d\xab\xbc\x5a\xfc\x3f\x0a\x9f\x42\x9c\xed\x9f\x32\xdb\xeb\xd7\x7b\xf3\x0c\x45\xc2\x34\x94\x23\x4b\x24\x90\x54\x92\xff\x10\x46\x66\x06\xbe\xed\xac\x38\xcc\x91\xc1\x5f\xa6\xe2\x4c\xa5\x87\x12\x25\x6a\x91\x13\x2b\x2b\x55\xac\xac\xc6\xc1\x32\x17\x4a\x0f\x24\x3c\xdb\x4b\xc8\x87\x56\x6a\xa0\x56\xab\xa8\x1c\x67\xdb\x1a\x3b\x24\xc1\xfa\x29\xc8\xbb\x92\xa9\xd6\xc2\x78\xe4\xd0\x1d\x7e\x99\x50\x7e\x21\x95\xf5\x16\x10\x47\x06\x75\x0a\x03\xbf\x38\xd4\x84\x94\xba\x76\xf0\xd5\x37\x86\x10\xbf\xf1\x5d\xe3\x88\x26\x50\x02\x5b\x58\x26\x61\x94\x07\x20\x5c\x49\x1c\x2d\x8f\x93\x03\x3d\xf7\x6b\x25\x39\x30\x4d\xce\xa5\xaf\x66\x14\x40\x7a\xe3\x58\xa3\x1d\x5b\x77\xda\x9a\x30\x68\x93\xd7\xb1\xdc\xba\xd0\x80\x23\x92\xd1\xa4\xa9\xe8\x99\xd0\x1c\xd9\x3e\xf9\x3a\x55\x39\x1e\xd0\x8e\x94\x4d\xe0\x33\xcd\xe3\xcf\x19\x14\xcc\xe3\x32\x32\xee\xa5\xba\x30\x19\x7b\xb2\x85\xa5\xea\x6a\x31\xa0\x5d\xcf\x67\xb0\x51\xc8\x9a\x3b\x8e\x91\x9a\xce\x03\xe3\xed\xb6\x68\x7a\xbd\x4d\xd8\xa6\xe0\x81\x4c\xda\x68\x5a\xa9\xe1\x59\xef\xc8\xe3\x7d\xc5\x38\xed\xb7\x4e\x8c\x69\x41\x98\x64\xd4\x43\x59\x56\x3d\xbd\xd1\xdd\xc1\xb6\xc6\xe8\xfe\xa4\x6e\x3e\xd9\x9f\x76\xbf\x63\x1f\xce\xd5\x9c\x2c\xa8\x2e\xf5\xec\xc3\x01\xaa\xa1\x02\xd5\xd6\x1b\xf8\x83\xda\xf6\x8c\x73\x8d\xc6\x4c\x4b\xe5\x71\x29\x9c\x46\x85\x6a\x3e\x39\x5e\xf7\x32\x30\x43\xe0\x1d\x79\x2a\x8a\x52\x58\x9f\xac\xda\x38\xcc\xe7\xaa\x1d\xf9\xeb\x42\x81\xdf\x83\x99\x7d\x82\xc2\x62\x33\x53\xe5\xcf\x29\x2e\xca\xd0\xef\x86\x12\x00\xd0\x4d\xc8\x94\xe9\xf0\x11\x85\x92\x53\x93\x04\x9b\xb2\x7f\xb8\x7d\x1d\x5f\x9b\xdf\x81\x1e\xf1\xf4\x61\x90\x93\x17\x27\x83\x23\xb7\x88\xef\x9e\xee\xed\x78\x2a\xff\xda\x19\x50\x94\x53\x05\xfc\x49\x19\x4b\x20\xe6\x0c\x5e\xdf\x86\x23\x49\xe7\x17\x0b\x1b\xd6\x4a\xc3\xb9\x4c\x63\x1e\xc0\xf0\x9c\x5f\x85\x6b\x95\x78\x9b\x79\x42\x24\xa7\xf0\x62\x79\x73\x3c\x3c\x62\x5a\xb3\x71\x00\xed\xfc\xf7\x3d\x32\xbe\x3b\xee\x9c\x8a\x1f\x9a\xe0\x55\xe7\x5f\xe3\x7d\xd7\xc3\x91\x72\xab\x14\x81\x86\xb9\x1d\xc5\xb7\x68\x0c\x2b\x0f\xef\x86\x3e\x7b\x33\x1a\x3b\x4a\x1f\x11\x7e\xf8\x4d\x84\xb8\xe3\xe0\xf7\x29\x66\x10\x3f\x03\x1b\x8e\x5a\xd6\xc4\xee\xb6\xc6\xc6\x9f\x56\x93\xb9\xa8\xd3\x69\xac\xce\x48\xd2\xfe\x79\xbf\x41\xd4\x28\x3d\x5d\x81\x6b\xd4\x5b\x65\xb0\xdb\x55\x72\xc2\xfa\xfc\x4e\xbe\x54\xab\xb2\xf4\x1b\x01\x92\x43\xe5\x1a\x26\x63\x56\xf3\x42\xf9\x0d\xff\x0f\xfb\xa7\xbd\xa0\x3b\xae\x10\xf7\xa7\xe2\x99\x2c\x12\xd4\xbb\xa7\x66\xd2\x08\x2b\xae\x11\x50\x6b\x7f\x5a\x85\x24\x1e\x1e\x38\x81\x82\x6a\xb0\x19\x24\x4a\xe3\x34\x02\xde\xb6\x98\xdb\x10\xa5\xb6\x08\x85\xb8\x25\xd8\xe4\xac\xa2\x28\x90\xfb\xdc\x41\x58\x1f\xac\x68\x10\x3e\xf7\x59\x95\x22\xab\x98\xdb\x98\x74\x96\x95\x68\xbe\x38\x83\xad\xeb\xb7\xe3\x84\xe4\x84\xbd\xe3\x89\x1d\xa3\x1a\xb4\x15\xa9\x81\x62\x9e\x93\x9c\x35\x28\xad\x9f\xe6\x46\xab\x19\xf7\x88\x87\x4f\xbb\xa5\x38\x0d\xdb\x3f\x10\x83\xd3\xf8\xec\xcf\x60\xcb\x29\x48\xef\x8f\x10\xce\x0b\xdf\x30\xe9\x58\x1d\xa0\x40\x2c\xcb\x86\xd8\xad\x03\xcb\x1e\x45\x77\x86\x12\xd4\x3c\xe5\xd2\xaf\x8e\x47\x16\x61\xe3\x30\x57\xcd\xd6\x1f\xe2\x55\xd2\x13\x30\x68\xad\x90\xa5\x49\xf6\x49\x32\x9c\xc5\x33\x8c\x9e\x9f\xa9\x75\x6a\x04\x27\x8d\x6b\x5b\xa5\x6d\x48\xde\xfb\xb2\x45\x1d\x84\x12\xc2\x08\x32\xb4\xc1\xc2\x0b\x6b\xb0\x9e\x9e\x4e\xd8\x22\x69\x3f\xd7\x22\x2d\x6f\x23\x4c\x77\x54\x8c\x7b\x3b\x7c\x21\x77\xd1\xb4\xc8\x89\x86\x96\xa5\xf2\xdc\x4d\x01\x3d\x77\x3a\x39\x4c\xe7\x40\xdd\x82\xbc\x4d\xd0\x30\x67\xd2\xe3\x5d\xce\x03\x30\xf7\x2e\x9a\xb6\x0c\x27\x34\x93\xe7\xc5\x4a\x89\x49\xbe\x8e\x3e\x14\x5a\x57\x63\x5d\x9c\x1a\xb2\xbe\xd6\xd9\x49\x9f\xea\xae\x0e\xc6\x7b\x64\xe6\x0e\x80\x96\xc2\x4d\x18\x7a\x64\xb4\x99\x01\xd4\x8f\x89\x36\xc6\xe5\xb9\x90\x33\x3d\xcf\xb0\x7d\x3b\x0a\x34\x29\x89\x7a\xd3\x6e\x35\x86\xa3\xbb\x5d\x84\x99\x44\x94\x19\x13\xb9\x7f\x84\x99\x46\x94\x99\xce\xd3\x3d\x23\xcc\x7c\x44\x99\xa2\xde\x7b\x45\x98\x99\x88\x32\xa1\x78\xdf\x08\xb3\x18\x51\xe6\x10\xfa\x51\x11\xe6\x70\x44\x99\xe9\x09\xdd\x1d\x61\x8e\x88\x28\x53\xba\x47\x44\x98\xbb\x22\xca\x84\xe8\xdd\x11\xe6\xb8\x88\x32\xad\xda\x0e\x45\x98\x63\x22\xca\x4c\x0d\xfc\x88\x08\xb3\x5f\xed\xdc\x05\xb0\xf6\xfb\x84\x4b\x28\x6b\x4c\x77\x0e\x8f\xdf\x13\x7a\xd5\xcc\xd8\x1f\xc2\x31\xef\x83\x0c\x7e\xd7\x8f\xeb\xb6\xd5\xd0\xc0\x4d\x85\xc1\xe4\xfc\x77\x2e\x89\xcb\xa4\x6e\x22\x3e\x0d\x05\x31\xac\x28\x39\x35\x90\x50\x81\x6c\x80\xe6\x59\x51\x50\x38\x56\xdf\xf1\xd3\x96\x83\x22\xbc\x0b\x63\x42\x78\x8d\xc7\xe2\x55\x74\x83\xe1\x5e\x9c\xff\x10\x46\x14\x20\x2c\xe0\xad\x30\x76\x52\x8a\x3c\x35\x54\x9f\x1a\xaa\x4f\x0d\xd5\xa7\x86\xea\x53\x43\x75\x7c\x3d\x35\x54\x9f\x1a\xaa\xfd\xf5\xd4\x50\xfd\x74\x1b\xaa\x04\xd6\x0e\xf7\x52\x3d\x9c\xeb\x3f\x35\x0c\xd9\xc7\x6b\xd8\xf6\x58\xaf\xdb\xb2\xf5\x0d\x1b\x2a\x34\x27\x0c\xbe\xce\xca\x2c\x9d\x9f\x3c\x83\xf8\x2d\xf3\xd9\xf0\x43\xe7\x33\xe8\xbf\x6c\xfe\x28\xcd\x95\x94\xe1\xc6\x42\x0c\x90\xd7\xa0\xd3\xa2\x03\x83\xd3\x62\x48\x2e\x00\xc5\x98\xe7\xf6\xba\x2f\xcc\xff\xf2\xc5\xdd\xd6\x6d\xb7\xf5\xac\x79\xb5\xe9\xeb\xef\x6e\xbf\xdf\x23\xcf\x71\xc9\x92\xc1\xb9\x25\xea\x01\x6e\x51\xbd\x1c\x1b\x3b\xbe\x2e\x9e\x12\x35\x58\xb8\xda\x97\xef\x28\xf9\xca\x19\xd4\xf0\xc3\x5f\x03\x9a\xf5\xdf\xff\xc5\x05\x3d\x52\xd1\x33\x16\xb4\x77\xab\xff\x8a\xbf\x3f\x83\x1c\xef\xc5\xaf\xee\xc3\xc7\xe2\xa3\x23\xca\xa1\x3f\xb3\x01\xab\x5d\xc8\xaf\xc6\x2a\xcd\x4a\x8c\x77\xfa\xce\x0f\x01\xc2\xd6\x22\x1f\x7c\xb1\x1d\x3e\x01\x7f\x16\x90\x49\xfa\xc6\xdb\xff\xcc\x69\x59\xc2\x7f\x3f\x00\x3f\xfd\x7c\x02\xf1\xfc\xe7\x8f\x89\x1b\xba\xf9\x9f\x00\x00\x00\xff\xff\xff\x19\xa6\x71\xfd\x40\x00\x00"), }, "/cluster.x-k8s.io_machinesets.yaml": &vfsgen۰CompressedFileInfo{ name: "cluster.x-k8s.io_machinesets.yaml", - modTime: time.Date(2020, 6, 19, 10, 31, 18, 617639352, time.UTC), + modTime: time.Date(2020, 6, 24, 14, 43, 4, 729003002, time.UTC), uncompressedSize: 25364, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x3d\xed\x6e\x1c\x37\x92\xff\xf5\x14\x85\xd9\x1f\xb2\x81\x99\x91\xed\xec\x1d\xf6\xf4\x4f\x6b\x39\x81\x6e\x6d\xd9\xb0\xb4\x39\x1c\xe2\xe0\xc0\xe9\xae\x99\xe1\xa9\x9b\xec\x90\x6c\x8d\x26\x41\x80\x7b\x8d\x7b\xbd\x7b\x92\x43\x15\xc9\xfe\x98\xe9\x2f\x29\x72\x76\xd3\x7f\x62\xf5\xb0\x8b\xc5\xfa\xae\x62\x91\x39\x59\x2c\x16\x27\xa2\x90\xdf\xa3\xb1\x52\xab\x73\x10\x85\xc4\x07\x87\x8a\xfe\xb2\xcb\xbb\xbf\xd8\xa5\xd4\x67\xf7\xaf\x57\xe8\xc4\xeb\x93\x3b\xa9\xd2\x73\x78\x5b\x5a\xa7\xf3\xcf\x68\x75\x69\x12\xbc\xc4\xb5\x54\xd2\x49\xad\x4e\x72\x74\x22\x15\x4e\x9c\x9f\x00\x08\xa5\xb4\x13\xf4\xda\xd2\x9f\x00\x89\x56\xce\xe8\x2c\x43\xb3\xd8\xa0\x5a\xde\x95\x2b\x5c\x95\x32\x4b\xd1\xf0\x0c\x71\xfe\xfb\x57\xcb\x6f\x96\xaf\x4e\x00\x12\x83\xfc\xf9\xad\xcc\xd1\x3a\x91\x17\xe7\xa0\xca\x2c\x3b\x01\x50\x22\xc7\x73\xc8\x45\xb2\x95\x0a\x2d\x3a\xbb\x4c\xb2\xd2\x3a\x34\xcb\x87\x85\x47\xf8\xc4\x16\x98\x30\x16\x69\xca\xa8\x89\xec\x93\x91\xca\xa1\x79\xab\xb3\x32\xf7\x28\x2d\xe0\xdf\x6f\x3e\x5e\x7f\x12\x6e\x7b\x0e\x4b\xeb\x84\x2b\xed\xd2\x60\x91\xc9\x44\x58\xc6\x38\x45\x9b\x18\x59\x38\xc6\xeb\x56\x3b\x91\x81\x2a\xf3\x15\x1a\xd0\x6b\x50\x5a\x2d\x1c\x9a\x5c\x2a\xe1\x30\xad\xb0\x01\x27\xcc\x06\xe9\xcd\x6a\x0f\x6e\x2b\x6d\x03\x4f\x06\xea\x91\xff\xdc\x9c\xc7\xed\x0b\x3c\x07\x42\x6f\x83\xa6\x07\x31\x71\x2f\x64\x26\x56\x19\x7e\x9e\x8c\x61\xf5\x49\x8d\xdc\x0b\x83\x22\xdd\xc3\x5a\x1b\x10\x0e\x32\x14\xd6\x41\x2e\xd5\x67\x7a\x7b\x83\x89\x56\xa9\x7d\xd9\xc0\xf2\x22\x42\x98\x8c\x26\xc3\x9f\x8e\xa2\x47\x67\x0a\xed\x96\x2d\xe2\x89\x74\xdf\x89\xd2\xc6\xe8\xb2\x38\x87\x23\x71\xf0\x5f\x46\x41\x14\x0e\x37\xda\xc8\xf8\xf7\x22\x8e\x5f\x88\x42\xf2\x1b\x2f\xe6\x1f\xfc\xe4\x37\x81\x71\x99\xb4\xee\x6f\x07\x3f\xbc\x97\xd6\xff\x58\x64\xa5\x11\x59\x4b\x28\xf9\xbd\xdd\x6a\xe3\xae\xeb\xb9\x17\x90\x87\x1f\xa4\xda\x94\x99\x30\xe7\x6d\xf9\xb0\x89\xa6\x15\xf1\x17\x85\x48\x30\xa5\x77\xe5\xca\x04\x5d\x0b\x50\x6c\x22\x32\xf4\xff\x04\xc8\xc4\x0a\xb3\x1b\xcc\x30\x71\xda\xb4\xb9\x61\xc3\xdb\x30\x92\x94\x22\xf2\x26\x0e\x2c\x30\x69\x0b\x3d\x80\xff\xf8\x70\x60\x87\x7e\xf8\x77\xe7\xf0\xcb\xaf\x27\x00\xf7\x22\x93\x29\x2b\xac\x47\x4c\x17\xa8\x2e\x3e\x5d\x7d\xff\xcd\x4d\xb2\xc5\x5c\x44\x6c\x5b\xe2\x50\x13\x12\xa4\x05\xb7\x45\xf0\x83\x59\x40\xe9\xcf\x06\x39\xe1\xe2\xd3\x55\x80\x51\x18\x5d\xa0\x71\x15\x03\xe9\x69\x98\xb0\xea\xdd\xc1\x6c\xa7\x84\x8e\x1f\x03\x29\x19\x2d\xf4\x73\x06\xd3\x83\x29\x58\x3f\xbb\x5e\x7b\xe9\x33\x58\x18\xb4\xa8\xbc\x19\x6b\x80\x05\x56\x2f\x05\x7a\xf5\xdf\x98\xb8\x25\xdc\xa0\x21\x20\xc4\xed\x32\x4b\xc9\xd2\xdd\xa3\x71\x60\x30\xd1\x1b\x25\x7f\xae\x20\x5b\x70\x9a\xa7\xcc\x84\xc3\x20\x39\xf1\x61\xeb\xa4\x44\x46\x84\x2c\x71\x0e\x42\x91\x51\xd9\x83\x41\x9a\x03\x4a\xd5\x80\xc6\x43\xec\x12\x3e\x68\x83\x20\xd5\x5a\x9f\xc3\xd6\xb9\xc2\x9e\x9f\x9d\x6d\xa4\x8b\x46\x3b\xd1\x79\x5e\x2a\xe9\xf6\x67\x6c\x7a\xe5\xaa\x74\xda\xd8\xb3\x14\xef\x31\x3b\xb3\x72\xb3\x10\x26\xd9\x4a\x87\x89\x2b\x0d\x9e\x89\x42\x2e\x18\x71\xc5\x36\x7b\x99\xa7\x7f\xaa\xa4\xee\xb4\x81\xa9\x57\x39\xeb\x8c\x54\x9b\xea\x35\x2b\x4c\x2f\xdd\x49\x6b\x88\xc1\x22\x7c\xe6\xf1\xaf\xc9\x4b\xaf\x88\x2a\x9f\xdf\xdd\xdc\x42\x9c\x94\x59\xd0\xa6\x39\x53\xbb\xfe\xcc\xd6\x84\x27\x42\x49\xb5\x46\xe3\x19\xb7\x36\x3a\x67\x88\xa8\xd2\x42\x4b\xe5\xf8\x8f\x24\x93\xa8\xda\x44\xb7\xe5\x2a\x97\x8e\x38\xfd\x53\x89\xd6\x11\x7f\x96\xf0\x96\x5d\x17\xac\x10\xca\x22\x25\xe3\xbe\x84\x2b\x05\x6f\x45\x8e\xd9\x5b\x61\xf1\xab\x93\x9d\x28\x6c\x17\x44\xd2\x71\xc2\x37\x3d\x6e\x7b\xa0\xa7\x56\xf5\x3a\x3a\xc4\x4e\x0e\xd5\x7a\x78\x53\x60\xd2\x52\x8e\x14\xad\x34\x24\xc0\x4e\x38\x24\xb1\x3f\xb0\x8a\xfd\x1a\x49\x4f\x30\xac\x64\xce\xda\x3f\x1c\x20\xf0\xb6\x1e\x17\x2d\x01\x19\x6c\xaf\x89\x18\x7f\xf6\xcc\x0d\x62\xb0\xc2\x4c\xab\x8d\x3d\x80\x0a\xc4\xc1\x83\x77\xb9\x54\xef\x51\x6d\xc8\x8c\xbd\x3e\xf8\xa9\x93\xa6\x1e\xbb\x0c\x1d\x7e\xd2\x99\x4c\xf6\x83\x98\x5f\x36\x06\xb6\x08\x57\xf8\x57\xa5\xc5\x94\xb4\x5e\xa6\xc4\xe1\xf5\x1e\x94\x4e\xb1\x0b\xeb\x30\x25\xec\xb6\xa8\x20\xd5\x3b\x45\x46\x5e\xaa\xcd\x12\x2e\x71\x2d\xca\x8c\x85\x13\x66\x9f\x85\x4a\x75\x3e\x5b\x02\x7c\x4f\x06\x37\x98\x02\x10\x06\x8f\x60\x86\xb1\x73\x98\x5d\xe3\x0e\xad\x9b\xcd\x61\xf6\x31\x4b\xe9\x5f\x07\x63\x51\x95\xf9\xe1\x2a\x17\xe0\x3f\x3f\x7a\xed\x81\x1d\xbd\xf6\x90\xa7\xd2\xf7\x20\xe8\x18\x24\xf1\x87\xf6\xd8\x28\x20\xb9\x54\x32\x2f\xf3\x46\x34\x61\xc3\x00\xf2\x1e\xbb\xad\x4c\xb6\x47\x24\x11\xa0\x70\x97\xed\x7d\x6c\x59\x47\x6d\xd1\x70\xaf\xd0\x47\x24\x6d\x9a\xbf\x82\x17\x71\xdc\x4e\x72\x00\xda\x7e\x56\x48\x16\xdf\xca\x14\x49\x51\xea\xa8\x4b\x58\xb0\x5a\x2b\xfa\xaf\x64\x07\xc7\xb0\x5f\x1e\x7c\xbf\xd6\x26\x17\x8e\x83\x98\x6f\xde\x74\x92\xaf\x0e\x6f\xea\x27\xfa\xe1\x41\xc2\x45\x17\x5e\xa9\x54\x45\xa9\xa8\xd5\x11\xcc\x12\x6e\x49\xb5\xd8\x46\xb3\xc1\x3c\x98\x0e\x82\x88\x4a\x4b\xc6\xba\x94\x76\x0b\x2b\x74\x3b\x44\x05\xf8\x40\x20\xa4\x83\x9f\xd1\x68\xf6\x5a\xa5\x22\x63\x23\xd7\x92\x2c\x67\x83\x90\x47\x10\x5f\x1f\x6a\xea\xd3\x68\x11\xa3\x9c\x41\x5a\x9c\xc6\x08\xc9\x2f\x92\x83\x26\xf8\xa9\x44\xb3\x07\x7d\x8f\xa6\x11\x83\x6e\x85\x8b\xf2\x90\x0b\xd7\x21\x44\x44\xca\x40\x38\x48\x74\xa9\xdc\x12\xde\x33\xb8\x3b\xdc\x5b\xa6\x40\x50\x4a\x06\x95\x97\x14\x63\x13\x20\x90\x0a\xb4\x49\xbb\x49\xeb\x85\xc8\x27\x48\x75\xfc\x5b\x1b\xdb\x25\x5c\xb5\x60\x35\xa2\x23\x70\x98\x17\x14\x51\x9c\x9e\x1e\x1b\x16\x5e\x68\x77\xa8\x40\x19\x98\x51\xe8\x90\xdd\x56\xaa\x13\x4b\x1e\x2b\xc1\xc2\xd9\x33\xa2\xc9\xbd\xc4\xdd\xd9\x4e\x9b\x3b\xa9\x36\x8b\x9d\x74\xdb\x85\x37\xbd\xf6\xcc\x03\x3d\xfb\x13\xff\x77\x11\xe9\xdf\xf2\x56\x30\xe0\x15\xe8\xe1\x55\xbc\x7b\x20\x57\x6e\xeb\x1c\x71\x80\x81\x87\x1f\x04\x3e\x4a\xeb\x48\xa0\x3d\x3f\x23\x26\xec\xcf\xa5\xc1\x9c\xa3\x84\x0e\xc8\x00\xb7\xcc\xc4\x7a\x14\x59\x50\xb8\xb8\xbe\xc4\xb4\x6b\xbc\x74\x98\x77\xa2\x78\x80\xe4\xc5\x00\x22\x21\x02\x8a\xbf\xb0\x70\x10\xcb\x85\x54\xc7\x6c\xf3\x8f\x97\xa3\x39\x08\x12\x2d\x1f\x12\x52\xd4\x59\xa0\x11\x15\x08\x83\x1c\x4c\xb2\x40\xdc\xe1\xbe\x21\x7f\xdd\x0b\x1f\x62\x8a\x7f\xee\xf0\xc8\xe5\xf5\x2c\x97\xe6\x0b\xb6\x25\x8b\x1a\xe0\xb1\xa2\x57\xd5\x52\x45\x51\x64\xb2\xc3\xe9\xd5\xcf\xb1\xd3\x6e\xfc\xd6\xe7\x43\xea\x27\x52\x64\x22\xda\x15\x01\xeb\x50\xd2\x93\xf8\xd4\x7a\x72\x92\x7c\x6d\x65\x41\x7a\x29\x06\xb0\xb6\xc8\xb2\x17\xa3\x71\xef\x90\x23\x70\x2f\x51\x57\x6a\x0e\xd7\xda\xd1\x7f\xde\x3d\x48\x8a\x30\x85\x4a\x07\x40\x5e\x6a\xb4\xd7\xda\xf1\xd8\xdf\x44\x12\x8f\xd4\x44\x82\x04\x7b\x45\x02\xaa\x40\x18\x23\xf6\xec\x4e\x1b\xc1\xba\x5d\xc2\x95\x8f\xc5\xe2\xfa\x06\x16\x21\x2d\x05\xcc\xda\xc4\x95\x73\x92\x15\xe3\x14\x02\xce\x76\x6c\x85\x5c\x43\xc1\xbc\x70\xfb\x08\x7d\x00\x68\xc5\x34\x69\x23\x29\xb5\x69\xd1\xab\x67\xa2\x01\x98\x2b\x84\x30\x3d\xbb\x3f\xff\x8d\x4f\xfc\x32\x4a\xbe\x21\x2d\x99\x04\x9c\xb8\x08\x87\x1b\x99\x40\x8e\x66\x33\x84\x67\x41\x76\xaa\x9f\x75\x03\x96\xc4\x3f\x13\x78\x1b\x07\x31\xbe\x9d\x63\x82\xd9\x49\xbb\x27\x5a\x90\xac\xf7\xfc\x32\xc8\xde\xce\xcc\x62\x1a\x56\x6c\xbe\xd9\x4d\x76\xae\xbe\x59\xa7\x1b\xb6\x4f\x23\xf4\x39\xf6\x19\x7e\x52\x6f\x7d\x73\x51\x90\x64\xff\x42\xe6\x94\x05\xe5\x57\x28\x84\x34\x76\x09\x17\x5c\x91\xc9\xba\x39\xdb\x1c\x2f\x55\xf0\xbd\x35\x68\x82\x2a\x2d\x10\xcd\xef\x45\x46\xa6\x9e\x0c\x87\x02\xcc\xd8\xf0\x77\x82\xd4\xeb\x23\x8f\x36\x87\xdd\x56\x5b\x6f\xc5\xd7\x12\x33\xce\x99\x67\x77\xb8\x9f\xcd\x5b\x9a\x07\xb2\xdb\x94\xce\xae\xd4\xcc\x3b\x89\x23\x3d\x88\x7e\x06\xb4\xca\xf6\x30\xe3\xdf\x66\xcb\x23\x27\xd8\x09\x76\xd0\x31\x0e\x48\x44\xef\x4f\x31\x5c\x19\x8c\xd7\x6e\xc3\xa0\xe8\x5f\x42\xd6\xc7\xce\xc5\x0f\x5c\x05\xa7\x57\x45\x41\x5b\x71\x4c\x6a\x0a\xd8\x39\xb6\x0a\x01\xbf\x5c\x83\x54\xb6\x5c\xaf\x65\x22\x89\x51\x31\x00\xe6\x55\xa6\x48\x59\x39\x45\xad\x1f\x63\xa9\x61\x8d\x06\x55\xd2\x9d\xb0\x25\x5c\x06\xaf\x0a\x16\xb6\xf1\x2f\x82\xe6\xc2\x94\xc2\x56\x2b\x3e\x72\xc9\x83\x11\x52\x47\x6a\xdf\x49\xaa\xd3\x1b\x27\x54\x2a\x4c\x1a\x88\x74\x7a\x6a\xab\x8f\xbf\x7a\xb1\x22\x4e\x74\x18\xfb\x8d\xad\x8e\x9e\xa3\x2d\x82\x8e\x21\x93\xed\x02\x4c\xb3\x9d\x07\x15\xc1\x1a\x83\xe0\xfd\x4a\x65\x9d\x29\x79\xb9\x29\x6b\xa2\xaf\x55\x91\x8a\x5b\xa7\x0d\xf6\x3b\x6f\x8a\x90\x41\x34\xeb\x57\x14\xfd\x8b\x3d\x89\x1f\x45\x0a\xab\x3d\xe0\x43\xa8\xf1\x39\xad\x33\xce\x2d\x19\x66\x2f\x48\xd2\x65\x83\xce\x48\xbc\x47\x10\x66\x25\x9d\x11\x66\xdf\x60\xee\xed\x96\x22\x3e\x43\x9e\xd4\xf9\x6c\xc6\x67\x9e\x03\x31\x46\x9d\xea\x72\xec\x63\xee\x31\xf5\x35\x87\x5c\xa7\x72\xbd\x27\x77\x17\xc2\xfc\x23\xd9\xe9\xce\x19\x4a\x8b\x66\xb1\x29\x65\x8a\x67\x0d\x86\x76\xc9\x03\x8c\xbb\x10\x80\x0d\x2a\x32\x73\xd8\x55\x33\xea\x64\xe2\xec\xbb\xc6\x17\x81\x8b\xba\xf0\x42\x43\x6b\x5c\xcb\x87\xb9\x2f\xc3\x70\x56\xd5\x4f\x6d\x26\x86\x99\x13\x5b\x22\x12\x20\xa0\x54\xf2\xa7\x32\x94\xa3\x3e\x5e\xbf\xff\x4f\xb8\xfa\x96\xcd\x0e\xcf\xe6\xcd\xf4\x56\xf4\xc7\xb6\xbe\x92\x88\x8a\x94\xe1\x5e\xa6\x5c\x4c\x0c\xe5\xe5\xca\xc6\x13\x72\xf3\xba\xe8\x65\xd0\x95\x46\x0d\x48\x5a\x28\x22\xfb\x7a\x66\x65\xe2\x52\xb9\x66\x6b\xc5\x46\x52\xd5\xe0\x0a\x61\x2d\x4d\x7b\x7b\x58\x4f\x6d\x3e\x5e\xca\x19\x94\xc8\x6c\x48\x47\xf3\x95\x54\x24\x1d\x5e\xb0\x03\x21\xd8\x78\x3e\x78\xdf\x11\xd7\x34\x02\x76\x2b\xbc\xa5\xb6\x84\x4e\xbd\x4f\x00\xa6\xcc\xc8\x56\xda\x03\x7a\xce\x07\xe5\x37\x68\x94\x33\xa5\x4a\x44\xb5\x57\x84\x90\x71\x89\x2f\x56\x0c\x3d\x96\x55\x1c\x44\x24\xcb\xc5\x5d\x3f\xef\x2b\x8f\x19\x97\xa9\x55\xc8\x61\x48\x26\x96\xf0\x45\x1d\xb3\xad\xaa\x72\x0c\xea\x2f\x41\x89\xe2\x94\x7a\x8e\x20\x87\xaf\xf3\xc6\x04\x9e\xf2\xd7\x1f\x6f\x03\xf3\xfb\x21\xc2\x9f\x5f\xfd\x1b\x2c\xc8\x89\x39\x14\xe9\x1c\x64\x10\x00\x94\x6e\x8b\x26\x7c\x0e\x6f\x5e\xbd\x86\xb7\xc1\xff\x68\x03\xff\xf2\xea\xd5\xb0\xd9\xfa\x8c\xc2\x6a\x15\xca\xe9\xb7\x32\x47\x5d\x3a\x90\x2a\x95\x89\x70\x3e\x00\x6e\xaa\x41\xc2\x16\x44\xe9\xfe\xd0\x7a\x85\xb0\xd6\xa5\x4a\x63\xb4\xe4\x64\x8e\x20\xb2\x4c\x3b\x87\x69\x1d\xa3\x04\x09\x0e\x26\x89\x2c\x5d\x77\x58\x4a\xcf\x8b\xa8\xd3\xd9\x1e\xc4\xda\x57\x83\x03\xe0\x80\x28\x56\xd3\x7d\x26\x48\x8b\x0b\x1e\xb5\x45\x91\xa2\x79\xd9\x1f\x91\x7f\x51\x70\xc1\x09\x6a\xea\xa3\x23\xb9\x86\x68\x49\x48\x79\x1b\xb5\xac\xaf\xec\x4a\x65\x8a\x79\xa1\x1d\xaa\x64\x7f\x58\xa0\x8d\xcf\xa8\x83\xcb\x7a\x23\x6c\xf8\xfa\xde\xf4\x83\x8f\xae\x43\xde\xd8\x59\x0d\x4b\x84\xe2\x8d\x15\x3b\x6c\xde\xb4\xd9\x08\x25\x7f\x66\x4f\x56\xed\xd7\xfe\x8c\xf0\x82\xf7\x47\xf9\xad\xaf\x2e\xbc\x6c\x38\xab\x9e\x5c\x08\x62\xf6\x51\x15\x24\xac\xdf\x7a\xe6\xc8\x8f\x0d\x51\xdd\x9a\x60\x03\x6c\x73\x2f\x93\xb8\xc3\xd6\x9f\xcb\x4d\xf7\x8c\x9e\x2f\x4f\x76\x8a\x6a\xaa\x33\x3c\x65\xd1\x8d\xf9\x75\x50\x5a\x52\x71\xa9\x40\xf8\x4d\xf0\x42\x24\xb8\x84\x2b\x5b\x19\xc7\x7e\xd3\x40\x61\x81\x6f\xc3\x50\x9b\x3a\xba\x9d\x83\xc8\xdc\x56\x97\x9b\x2d\x58\xcd\xfe\x2a\x86\xbd\x64\x9b\x49\xcb\x77\x03\xf6\x2b\xe8\xbc\xd3\x71\xd3\xad\x69\x21\x89\x19\x7e\x6b\x55\x14\x14\x3d\x1a\x49\x4e\x98\xd0\xee\x87\x58\x3a\x9d\x0b\x27\x13\xb2\x0c\xcb\x4a\x75\x0b\x23\x73\x61\x24\xe9\xb3\x72\xa8\x52\x4c\x79\x5b\x20\x36\x95\x40\xad\x6c\xc3\xe1\x57\xa2\xd5\x5a\x6e\xca\x80\x5b\x5a\xf5\xba\x74\x6e\x13\xd6\x06\xa2\x17\xe6\x24\x69\x09\x9b\x45\x12\x8d\xfd\x13\xf3\x6c\x58\x70\x06\x54\xb4\xe2\xf8\xb4\x50\xaa\xea\x3b\x68\x6d\x65\xf9\x37\x41\x8a\x50\x24\x5b\xef\x06\x06\x8b\x2b\x95\xf4\x2d\xe1\x42\xf9\x2a\x4b\x8d\xcc\x71\xb6\x4c\xd3\x7c\x99\xa5\x7e\xb3\xe0\x4b\x9f\xf9\x6b\xac\x67\x0e\xab\xd2\x35\x3f\x89\x89\x62\x22\x94\x56\x24\x0d\x07\xdb\xf7\xfd\x0e\xe0\x5a\x3b\x92\xda\x68\x49\x38\x9e\x6e\x06\x0e\x14\xbf\x93\xd9\xe1\x3f\x1a\x4a\x04\x8b\x09\xe1\x84\x6e\x45\x0d\xbe\xaf\x81\x92\xfc\x38\x59\x8c\xde\x42\x1d\xea\x4b\xbf\xeb\xff\x10\x94\x5a\xc0\xe5\xf5\xcd\x7f\xbd\xbf\xf8\xeb\xbb\xf7\x23\x42\x38\x4d\xd8\xaa\xf5\xd8\x27\x7b\x1d\xbd\x53\x68\x3e\x57\xc9\xf2\x24\x59\x7b\x1f\x2a\xf7\x91\x10\x29\x16\x5e\x4d\xe3\xde\x47\x6c\xae\xb8\x5a\xc3\xc5\xfb\xf7\xbd\x64\x89\xdf\x07\xd7\xcf\x1b\x02\x5b\x71\x8f\x3e\xea\xf6\x9b\xaa\x1c\x5d\xd7\x5b\xc7\x81\xe6\xbd\x20\x37\xc2\xac\xc4\x86\xe2\x9c\x2c\x0b\x05\x81\x18\xfc\x05\x08\xdc\x9a\xa4\xc4\xc6\xa3\x2b\x1a\x0e\x64\x3e\x24\x13\x8a\xab\x42\xca\x99\xbd\x47\x57\x5a\x8f\x2f\x23\x14\x1a\x15\xb4\x7f\x3f\x05\x22\x87\x6e\x2c\xf3\xd5\xe0\x20\x67\x94\x6f\x12\x24\x43\xfa\x77\xbb\x45\xc3\x7a\x11\x24\x25\x1f\xf2\x69\x9c\x3b\x68\x85\x7e\x7d\x64\xf7\x6b\xe0\x7d\x2a\x34\x52\xd3\x6c\xb1\xfd\x63\x4b\x54\xea\xc2\x14\x2a\x76\x28\x24\xb7\x26\xf7\xc6\xb6\x63\xc7\xb0\x7e\x32\x74\xb0\xd7\x65\xbd\xaf\x4e\x68\xef\x54\x9d\xbe\xb2\xdd\x69\xbd\x99\x50\x0d\x0e\x42\xc4\x89\x4a\xad\xe7\x22\xb6\x42\xb0\x84\x2a\x37\xa7\x98\x9a\x32\xa4\xd0\x36\xe6\xad\x43\x3f\x9f\x00\x2c\x5b\x38\x13\x82\xca\x06\x68\x66\x57\xbf\x69\x1a\xdf\xac\x81\xde\xde\xa7\xe3\xa7\xbd\x55\xf5\xe9\x2a\x76\x3e\xc5\xa4\x29\x94\xbb\x06\x36\x1e\x60\x6a\x81\x1a\x60\x95\xe9\xe4\x8e\xb9\xcd\x2d\x12\x8f\x43\x8e\xd4\xcd\x94\x38\x87\x8b\xeb\x4b\x0a\xc8\xb9\x02\x48\xb0\xaa\x5c\x72\xb6\xd6\x06\x37\x86\x92\x8c\x08\xbf\xdf\x6b\xf8\x67\x2d\x95\xc8\xe4\xcf\x9c\xe2\x93\x2e\xd6\x40\x6b\xdd\x08\xf6\xa2\xea\x20\x1a\x01\x79\x87\xfb\x85\xb7\xf3\x5c\xc8\x81\x52\x39\x99\xc5\xe6\xb1\x28\xe3\xfc\x47\xae\xef\x9b\xdb\xe1\x23\x70\x9d\x86\xb5\xc8\x2c\x29\xaf\xf6\xca\x5c\xf9\x90\x39\x25\x63\x16\x0d\x28\xc4\xd4\xc2\xcc\x63\x3c\x83\x02\x4d\x2e\xb9\x90\x3c\x02\x5b\x37\xc8\x39\x07\x4d\x72\xb9\x93\x16\xe1\xcf\x6f\xde\xc0\x8b\xbf\xab\xc2\xe8\x04\xad\xe5\x3a\xd2\x3b\xe5\xa4\xdb\xbf\xec\x6e\x7b\x68\x3f\xab\xba\x6e\x31\x45\x7c\x56\x5a\x67\x28\x86\x50\xad\xcd\xce\x53\xe4\xe6\x80\x05\x6c\x5b\xab\xee\xbb\x68\xda\x46\x96\x34\x6e\xf8\x1e\xb7\xa2\xc3\x26\xb9\x91\xb5\xf8\xb6\xb9\x43\xd5\xfc\x07\x35\x9f\xf5\xad\x7a\xd4\x0c\x0c\x65\x2e\x5d\x8b\xbe\x6e\xb4\x7d\xf5\x2e\xfa\xf9\x02\xe8\x47\xad\xa5\x94\x8f\xe2\xdf\xdf\xaf\x2e\x9f\x77\x25\xa5\x7c\x16\xa6\x0c\x6f\x0e\x02\x6f\x03\xd6\x2e\x65\x60\x10\x49\xc9\xc0\xcf\x83\x69\xdb\x82\xa8\x39\x52\x7a\x18\x48\x88\xc7\xb6\x40\x07\x01\x1c\xf6\x42\xc6\xe7\x60\x57\xc5\x17\x7e\x92\x2a\x2b\x6d\xb6\x43\xae\x70\x2b\xee\xa5\x36\xf1\x7d\xd8\x84\xea\x36\x14\x5f\x59\x65\x69\x39\x0b\xa1\xd2\x85\xef\xc7\x7e\xca\x4e\xcc\x4a\x6b\x67\x9d\x11\xc5\xa4\xd0\xfd\xaf\x71\xb4\xdf\x54\xad\xcd\x2c\xe7\x47\x99\xa6\xe4\xcb\xef\xa2\xf4\xb4\xe1\xc5\x07\x55\x22\x0a\x5b\xfa\x06\x16\xf6\x6e\x6c\xa3\x63\xce\x8d\x4c\xda\xd0\x03\xf5\x7f\xff\xf3\xbf\xb6\xc6\xb3\x18\x12\xf0\x1c\x93\xad\x50\xd2\xe6\x7d\x76\x7b\x4a\x58\xe5\x91\xf8\x8c\xeb\x21\x95\x6f\x37\xb1\xc6\x2f\x3a\xc9\x52\xa1\x1e\xab\xe6\x66\x11\x4a\x8b\xc9\xa0\x4a\xb7\xf7\x93\xb6\x9a\x68\x74\x58\x94\x70\x42\x66\x36\x6e\xe7\x86\x59\x07\x81\x52\x26\x13\xb7\x48\x08\xbb\x2c\xd3\x3b\x8e\x2a\xec\x59\xdd\xbf\xe2\x74\x28\x7e\xee\x6b\x8e\x2f\x2f\x85\x1b\x6a\x89\xf1\x49\x89\x2e\x7d\x55\x87\x42\x14\xae\xe7\x4c\xf4\xa5\xd3\xc2\xdd\xe9\x01\xef\x73\x85\xbc\x93\x3d\x04\x78\x29\xe6\x33\x13\x8f\xc1\xec\xf4\x6a\xed\x51\xe1\xca\x29\xcb\x4b\x21\x31\xc1\xd6\x39\x83\x58\xf4\x1f\x01\x1c\x0f\x27\x90\x85\x30\xb1\xd0\x10\x22\xa2\x50\x9a\xad\xcf\x29\x50\xf2\x35\xd8\xe3\xe4\x1f\xde\xb4\xe1\xe3\x3e\x67\xdf\xe9\x90\x63\x8a\x84\xe2\x44\xdf\x18\x9e\x73\x56\x64\xcb\x64\x4b\xc9\x52\x30\x92\x37\xf4\xcb\x32\x17\x4a\xae\xd1\xba\x65\x98\x0d\x8d\xfd\xe1\xcd\x8f\x63\xf4\x06\xf8\x56\x1b\xc0\x07\x91\x17\x19\xce\xab\x14\xe0\x60\x5b\x9e\x6b\x3e\x3a\x88\x17\xc3\x1e\x05\x5b\xd5\x42\x0b\x1d\xab\x02\x3b\x26\x86\x13\x77\xbc\xeb\x23\x42\xe1\x26\x93\x77\x78\x0e\x33\x3e\x20\x53\xa3\xfe\x0b\x39\xb5\x5f\xc7\x32\x0d\x80\x17\x3b\x4e\xf7\x66\x34\x7c\xe6\x11\xae\xc2\xcf\x66\x67\xfb\x74\xc4\x7d\x5b\x9d\x91\x9b\x0d\xb7\x19\xf3\xe9\x06\xf2\x02\x2f\x29\x19\x95\x6b\x4a\x2b\x2b\x60\xc3\xae\x37\x3e\xcd\x2d\xac\xa3\x85\xfe\xf0\xe6\xc7\x19\xbc\xa8\x21\x12\xdd\xc6\x21\xaa\x14\x1f\xe0\x4d\x55\xdc\x28\x74\xfa\x32\xf4\x56\xd9\xbd\x72\xe2\x81\xe6\x4c\xb6\xda\xa2\xf2\x7b\x2d\x83\x29\xbe\x7f\xb8\x96\xc3\x75\xe6\x1d\x66\xd9\xc2\xd7\x25\x53\xd8\xf9\x1e\xb5\x28\x0a\x7e\x93\xaa\x10\xc6\x81\x5e\x8f\xc2\x6c\x1c\xdd\xb9\xfd\x78\xf9\xf1\xdc\x63\x4b\x62\xbb\x51\x71\xdf\x87\xb3\xc5\xb0\x53\x35\xb0\x71\x1a\x9f\x7a\x57\xb0\x0c\x9d\x2a\x1a\xc8\x0b\x6d\xaa\xa2\xc2\xba\x24\x07\xbe\x1c\x0e\xe0\x1e\x61\x69\xc6\xd3\x89\x3f\x56\x42\xf1\x88\xa5\x8f\x27\x15\x4f\x4a\x2b\x7e\x5b\x53\x34\xe7\x19\x67\x53\xd2\x8d\x47\xae\x74\xb0\x7e\xdf\xbf\x5c\x5f\x60\x1a\x58\xf3\xb8\xea\x3d\x0f\x4d\xb8\xb6\x7c\xf6\x6c\x24\x89\x01\xd1\x53\x22\x80\x2a\xa8\x3f\x84\x42\xea\xca\xb1\xea\x34\x6d\x6f\x79\xa0\x5c\xa4\xde\x45\x09\xb5\xff\xea\xea\x44\x84\x2f\x0d\xcd\xbd\x5f\x84\xa0\x8a\x63\x7f\x3e\x81\x62\x79\xf3\xf8\xd9\x28\x3d\x9a\xef\x3e\x25\xe3\x7d\x16\x25\x1b\xcf\x84\x27\x2f\x73\x42\xaa\x09\xd0\xd7\x87\xd7\x49\x86\x19\xc5\xc8\x75\x65\x9b\xa8\x51\x07\xff\x04\xa9\x8a\x94\x06\x57\x90\x64\xba\x4c\x17\x52\x49\x17\x23\x7c\xf0\x93\xf8\x5e\x6c\x25\xb3\x79\x33\x3f\x0a\x41\xdd\x88\xea\xe4\x14\xef\x05\x87\xf4\x09\x55\xca\xd1\x20\xc7\x69\xf0\x45\xc1\x25\x16\x06\xb9\x93\xe2\xdc\x7b\x6d\xf6\x6a\x83\x20\xb7\xc2\xc6\x9d\x96\xf8\x2d\xc1\xbf\x7f\x2d\xb2\x62\x2b\xbe\x61\x07\x1a\xf7\xb8\x42\x15\x14\xe4\x70\x89\x52\x04\x57\x19\x63\xf5\x25\xdc\xec\x24\x9f\x79\xd1\x40\xa4\xbd\xc1\xc4\x20\x1f\xaa\x5e\x0e\x05\x62\x93\xf8\x9f\xb6\xe0\x4d\x66\x71\x1b\x8d\xae\x23\x8b\x96\x7f\xed\x6e\x4a\x6d\x3e\x5c\x37\xee\x12\x92\xc0\xec\x4e\x5e\x0f\x43\x8c\xdd\x34\xfd\xbc\xfe\x6d\x54\x1b\xd5\x98\x81\x53\x9f\x9d\xd4\x7c\xfc\xe9\xcf\x81\x6d\x67\x3e\x15\x3a\x70\xa0\x64\xe0\x34\xe8\x64\x1a\xac\x85\xcc\x4a\x83\x97\x9a\x48\x3c\x69\x89\xdf\x36\xbf\x88\x8b\x0c\x60\x20\xf5\x6f\x1b\x75\xa4\x81\x2d\xbf\x83\x7e\x66\xb5\xf4\x1b\xc3\xbe\xc3\x45\xf8\x23\x39\x1e\x56\x6b\xce\x7e\x5b\x53\xb7\xb6\xc6\xa6\xb7\xc0\xbf\x18\x23\x3f\x95\x4a\x52\xad\x8d\xa8\xba\x69\x07\x2a\x29\xed\x12\xfe\xe1\x57\xb1\x9a\x12\x36\xe4\xdb\x65\x95\xfe\xf2\x4d\xbb\x39\x1b\x34\x37\x47\xfa\xed\x5a\x75\x80\x5a\x55\x91\xf9\x2d\xf5\xa2\x69\x35\x89\xe7\xa8\x47\x4c\x32\x6c\x93\xea\x10\x5f\xa9\x06\xf1\xe8\xfa\x83\xaf\x2f\x0c\xc2\xfc\xdd\x6a\x0f\x5f\xa1\xee\xf0\x3b\xd4\x1c\x1e\x5d\x6f\x18\xf7\x4c\x8f\xa9\x35\x4c\x6b\x87\xa5\x67\x4a\x9d\xa1\xbb\x8e\x30\x08\x76\xb0\xc6\x30\x50\x43\x18\x93\xe3\xce\xfa\xc2\x60\xfd\x60\xac\xee\x7a\x5c\x5b\x18\xaf\x1d\x0c\x57\x1c\xc7\xeb\x0a\x93\x2c\xc6\x58\x3d\xe1\x8f\x53\x4b\x98\xb4\xdc\xb1\x1a\xc2\x3f\x6d\xfd\x60\xf2\xea\x46\xeb\x06\x4f\xa8\x19\xfc\x7e\x35\x81\x89\x5b\x99\x93\x6b\x01\x4f\xa9\x03\x4c\xdf\x4d\xf9\x23\xd5\x00\x26\x51\x76\x24\xf7\xff\x27\xcd\xfb\x9f\x23\x7b\x89\xc1\xe0\xd5\xe5\xa4\x78\xf5\x53\x35\x3c\x86\xf5\x71\xcb\x3e\xec\x1c\xd7\xb4\x19\x0b\xee\xe3\x71\x9a\x78\xa4\xa5\x0a\x4b\x1b\xc9\xf8\xe1\x1d\x10\x71\x4c\x2f\xd0\xab\x4b\xbe\x88\x04\xd9\x1d\xfa\x78\x40\xa7\x55\x48\x93\x68\x63\xd0\x16\xda\x67\x87\xb1\xf9\x70\x70\x37\x1b\xa2\xbb\xad\xdc\x56\x15\x9b\xaf\xf6\xb0\x95\x9b\x2d\x1a\xc8\x48\x98\xf9\x5a\x94\x32\x47\xdf\x70\xdf\xb8\x64\xad\x1f\xf0\x3b\x1f\x79\x41\x69\x11\x12\x61\x39\xb0\x88\xe9\x88\x28\x9d\xe6\x9b\xcf\x42\x94\xd0\x00\x38\x54\x4b\xa9\xa9\xf8\x36\x43\xa1\x16\x65\x01\x99\xde\xc8\x24\xa6\x49\x0d\xb0\x89\xce\x0b\x61\xb0\xbe\x77\xae\xbf\x41\x41\xfb\x8b\x7c\xb8\x53\x8b\x5d\x61\xe9\xea\x3b\x44\x84\xab\x66\x0d\xd6\x64\xfc\xc8\xcc\x06\x29\xc0\xdc\x90\xfe\x1a\x7f\x6a\xf4\x6f\x95\xb6\xf8\xb9\x96\xf0\x1f\xc7\xcb\x1e\x48\x81\xb8\xa7\x5e\x26\x84\xda\x42\xaf\x17\xce\x60\x2d\x2e\xfe\x0a\xc0\x6a\xe5\xf3\x76\x20\x32\x60\x6f\x6b\x4e\x37\xe8\xe6\x9b\xa4\xb9\x65\x2c\x46\x5b\xa2\x9e\x8a\xb4\xba\x17\x62\x50\x8d\x78\x8f\x47\x24\xe1\x12\x2e\x14\xb7\xa6\x55\xbf\x78\x72\x4b\xcb\xc7\x1c\x87\xa2\xcc\xea\xf2\xaf\xbb\xbf\x58\xca\xca\xc2\x09\xab\x70\xe6\x48\x71\xd4\x4e\x6c\x96\x56\x73\x26\x9e\x6a\x85\x91\x8d\xfd\x68\x96\xfe\x0a\xb6\x8a\x3f\x35\xaf\x55\xca\x1d\xe3\xb9\x30\x77\xe1\x90\x81\x6f\xc9\x1b\x39\x71\xe7\x69\x1d\xf3\xf9\x70\x40\x94\xe5\x31\x71\x65\xb8\x40\xc2\x9f\x3f\x20\x15\x6a\xe8\x56\x2f\x44\xaf\x73\x64\x7b\x28\x53\xe5\x64\xa2\xc5\xa4\xad\xa8\x0f\x0b\xf2\x15\x3f\x6b\xc1\x71\xed\xe0\xd6\xde\x81\xb4\x45\x99\x1a\xcb\x98\x47\x0d\xf1\xfd\xb0\xc7\x6e\x99\xd8\xae\x4b\xfb\x62\x23\x4e\x43\x49\x62\xb9\x70\xa2\xd5\xca\x51\xf8\x7e\xeb\x15\x42\xe3\x6c\x59\x3c\x29\x7a\xdc\xaf\xd1\x73\xa1\xca\xe8\x62\x87\xfa\xad\x16\xf5\x3c\x9d\xbf\x36\x4a\x69\x9d\xbf\x1f\xd5\x58\x3a\x46\x3d\xfe\x8c\x7e\x17\xc6\x7d\xb8\x2c\xe0\xe0\x96\xc9\x5e\xb8\xe1\xba\xc8\xc6\xb0\xbe\x4b\xe8\x78\x60\x8b\xdd\x7a\x15\x8e\x2a\x3f\xed\x1e\xba\xa3\xdb\x53\x87\xef\x1e\x68\xdd\x95\x55\x5f\xe8\x55\x5d\x16\x30\xf9\x1a\xd5\xe6\xe3\xcf\x7e\xb4\x2f\x75\x3a\x39\x1a\xf2\x84\xfb\xaf\x42\x19\xf1\x03\x5a\x2b\x36\x47\x01\x7f\xaf\x70\x86\xcf\xfc\xd1\xcf\x41\x7a\xcc\xae\x54\x5d\x03\xa8\xee\xf7\xf1\xdd\xec\x02\xc2\x25\xb8\x19\x11\x7f\x95\x61\xce\xd7\x5e\xaa\x44\x66\x5d\xda\xd0\xb8\x3b\xcb\xce\x61\xa5\xdd\x36\x96\x29\xc3\x11\x54\xb2\x79\xdf\xb6\x16\xd4\xb4\x91\xcb\xf6\xe8\x23\xf0\x71\x68\xa1\x0b\xee\x2a\xab\x0e\x2f\xdb\x32\x49\xa4\x4a\x5c\x28\xb4\xd8\x52\x3a\x66\x29\x31\x25\x5e\x20\xc1\x36\xb1\x30\xe8\xcf\x0b\x1d\xb7\xf3\xef\xb6\x32\xc3\x4e\xe4\xea\x42\x56\xae\xfd\xbe\xc5\x4a\x5b\xac\xaa\x5d\x8d\xc9\x8e\x80\x66\x7a\xc3\xa7\x2c\x68\xdd\xdb\x32\x17\x2a\x58\xfc\xc2\x1f\x32\xfb\xa2\x48\x1a\x2d\xc6\xee\xb8\x50\x39\x0b\xdd\xea\xe4\x35\xba\x80\x3a\x23\x94\x95\x4e\xde\x23\xa0\x31\xdc\xcb\x45\x4c\x13\xad\x83\x22\x94\x81\x85\xf7\x06\x01\x1f\x0a\x3e\xea\xe2\x0d\xe2\xb1\xf0\xca\x07\x0a\x4a\x9a\x67\xed\xfc\xbd\x69\x7c\x00\xf7\x05\xfb\x9a\x70\x6a\x92\x7c\xa5\xd8\xa0\x7d\xe9\x8f\x68\xf5\x15\x0c\xe3\xa1\xdd\x70\xe1\x9a\xce\xd1\x6d\x89\x10\x64\xa2\x4b\x95\x8a\x1c\x95\xe3\x69\x76\x46\x07\x27\xd5\xdc\x02\x89\xf7\x83\x74\x5c\x79\x66\x0b\x4c\x20\x5c\x20\xdb\xee\x94\x6b\xc7\xe1\xcd\x33\x36\x21\x3c\xe0\x1b\x1b\x54\x29\x8e\xbb\xdd\x59\x38\x42\x12\xd6\x8c\x79\x97\x31\x64\xe5\x18\xb7\xd2\x85\x40\xf6\x5d\xbc\x6b\x41\xaa\xee\x12\xa7\x3f\x64\x1f\x6e\xa0\xe0\x2b\x0c\x9d\x93\x6a\x53\x1d\x67\xa2\xb5\xcc\x5b\x27\x68\x05\x1f\x33\xb0\x65\x51\x68\xe3\x3a\xc2\xa0\x10\x45\x74\xad\x31\xd0\xc4\x07\xfc\x56\x36\x6e\x86\x6e\x0a\x86\x74\x16\xb3\x63\x3f\xb2\x42\x3e\x0c\x64\x64\x64\x7f\x2e\x6d\xd5\xa8\x99\xb2\xa4\x5e\xa8\x7d\x10\x3d\xb2\x13\x4d\xc9\xd3\x49\x52\x1e\x8b\x69\xb8\x5d\xc9\xe3\x14\x6c\x46\xc5\xa8\x0f\x31\xc0\x0a\x47\x86\x45\x9a\xfa\xb0\x98\xad\x50\x2c\x6e\x1e\xc1\x6c\x5c\x29\x1c\x52\x1c\xa1\xd2\x33\x6d\x58\xd1\xea\x13\xe2\xf5\x7a\x4f\x2d\x09\x6c\x51\xba\xa3\xcd\xc4\x7e\xcb\x59\x66\xd9\x9e\xef\xfe\xc1\xf4\x09\x0e\xa5\x72\x23\xbe\xa3\x93\xa2\xe5\x2c\x5e\x24\xe4\x92\x6d\x24\x89\x7f\x77\xb4\xc0\x03\x19\x8e\x57\xcb\xc4\xf7\xcf\xed\x5c\xa2\xe3\xfd\xae\x3a\xa0\x3b\xb8\xd2\x8f\x47\xc3\xc1\xe0\x3a\xe3\x13\x7a\xc7\xe7\x7c\x79\x21\xba\xe3\x50\x96\xc1\x04\x95\x23\x1b\x13\xfd\xfe\xa4\x75\xfd\xeb\x9f\x27\xaf\xab\x75\x51\xf9\xa3\x98\x47\x9e\xbf\x62\x61\x97\x53\x87\x8b\xde\x4c\xdf\x1f\xec\x8b\x57\x85\x7a\x58\xbb\x78\x16\x89\xf3\xf2\x6a\x3f\x3d\xee\xf0\x09\x7f\x77\xf2\x8c\x83\x8b\xd9\xf3\x30\xf5\x49\xb7\x87\x12\xa3\x3a\x18\x73\x2c\xd7\xff\xa8\x5b\x3d\xab\x93\x7b\xa2\x79\x25\x61\x75\x0b\xa1\x77\x46\x9d\x46\x23\x38\x6a\x8f\x28\xef\xec\xdc\x6b\x49\xb6\xc2\x19\x4d\x16\x98\xe5\x75\xb5\x0f\x67\xd7\x43\xa7\x75\xf8\xa8\xef\x30\x69\xf3\x28\x61\x00\x1c\xf0\xe2\x7b\x7a\x16\x85\x30\x22\x0f\x5b\x16\x8d\x62\x19\x88\x15\xe5\x9a\x8c\xfb\x31\x9e\xf1\x02\x83\x47\xdd\x3a\x30\x76\x4d\x67\x8f\x9d\xeb\x4e\x02\x0e\xee\x8a\x87\xee\x60\xff\xe0\x55\xfd\x3f\x77\x08\x6d\x21\xf5\xbb\xf0\x7f\x62\xf0\x17\xfb\x37\x7e\x0e\xd7\xf1\xa4\xe7\x7c\xa0\xcb\xbf\x70\xda\x50\x80\xeb\xdf\xd4\xd9\x84\x48\x12\x2c\x1c\xa6\x8d\x6b\xf6\xfd\x05\xfe\x33\x6f\xd1\xe3\xdd\xfc\xfc\x27\x05\xe7\xd2\x5f\x39\x05\x3f\xfc\x78\x12\x1a\x30\xd2\xef\x23\x36\xf4\xf2\xff\x03\x00\x00\xff\xff\x11\x20\x6e\x1e\x14\x63\x00\x00"), From 2b644aaf0f395a4e965fd6c9109c421e27fc17b3 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 24 Jun 2020 14:49:25 +0000 Subject: [PATCH 72/72] Update go.sum --- go.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.sum b/go.sum index 38488fce..fa25d207 100644 --- a/go.sum +++ b/go.sum @@ -125,6 +125,7 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/dlespiau/kube-test-harness v0.0.0-20190930170435-ec3f93e1a754 h1:Qd6djMDE2KFeLwuKQ4B316XYt101DFoymbgoxFHeKCY= github.com/dlespiau/kube-test-harness v0.0.0-20190930170435-ec3f93e1a754/go.mod h1:rTr8X4qZPRmQKsyAjhECPi+zPnmlcmv5W9s1F11oBSo= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo= @@ -472,6 +473,7 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=