Merge pull request #62563 from devdattakulkarni/client-go-details

Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Updated README to include client-go<->controller diagram

The sample-controller makes extensive use of various mechanisms
available in client-go. For writing custom controllers/operators
it will be helpful if there is precise description of how the
client-go library works and how/where it interfaces with
custom controller code.

Recently we published a blog post with these details here:

https://medium.com/@cloudark/kubernetes-custom-controllers-b6c7d0668fdf

This patch includes the diagram from the post, as was recommended
by @sttts on https://github.com/kubernetes/sample-controller/issues/13

**What this PR does / why we need it**:

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #

**Special notes for your reviewer**:

**Release note**:

```release-note

```

Kubernetes-commit: 773def0194ecc1cd845ea9a01da761d5a0390e6e
This commit is contained in:
Kubernetes Publisher 2018-05-14 05:23:12 -07:00
commit 9ec2064685
14 changed files with 1718 additions and 1210 deletions

380
Godeps/Godeps.json generated
View File

@ -156,763 +156,763 @@
}, },
{ {
"ImportPath": "k8s.io/api/admissionregistration/v1alpha1", "ImportPath": "k8s.io/api/admissionregistration/v1alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/admissionregistration/v1beta1", "ImportPath": "k8s.io/api/admissionregistration/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/apps/v1", "ImportPath": "k8s.io/api/apps/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/apps/v1beta1", "ImportPath": "k8s.io/api/apps/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/apps/v1beta2", "ImportPath": "k8s.io/api/apps/v1beta2",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/authentication/v1", "ImportPath": "k8s.io/api/authentication/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/authentication/v1beta1", "ImportPath": "k8s.io/api/authentication/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/authorization/v1", "ImportPath": "k8s.io/api/authorization/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/authorization/v1beta1", "ImportPath": "k8s.io/api/authorization/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/autoscaling/v1", "ImportPath": "k8s.io/api/autoscaling/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/autoscaling/v2beta1", "ImportPath": "k8s.io/api/autoscaling/v2beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/batch/v1", "ImportPath": "k8s.io/api/batch/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/batch/v1beta1", "ImportPath": "k8s.io/api/batch/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/batch/v2alpha1", "ImportPath": "k8s.io/api/batch/v2alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/certificates/v1beta1", "ImportPath": "k8s.io/api/certificates/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/core/v1", "ImportPath": "k8s.io/api/core/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/events/v1beta1", "ImportPath": "k8s.io/api/events/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/extensions/v1beta1", "ImportPath": "k8s.io/api/extensions/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/networking/v1", "ImportPath": "k8s.io/api/networking/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/policy/v1beta1", "ImportPath": "k8s.io/api/policy/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/rbac/v1", "ImportPath": "k8s.io/api/rbac/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/rbac/v1alpha1", "ImportPath": "k8s.io/api/rbac/v1alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/rbac/v1beta1", "ImportPath": "k8s.io/api/rbac/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/scheduling/v1alpha1", "ImportPath": "k8s.io/api/scheduling/v1alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/settings/v1alpha1", "ImportPath": "k8s.io/api/settings/v1alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/storage/v1", "ImportPath": "k8s.io/api/storage/v1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/storage/v1alpha1", "ImportPath": "k8s.io/api/storage/v1alpha1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/api/storage/v1beta1", "ImportPath": "k8s.io/api/storage/v1beta1",
"Rev": "8ab7c6a2fbd1724a52514855629cec31a8f86929" "Rev": "53d615ae3f440f957cb9989d989d597f047262d9"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/errors", "ImportPath": "k8s.io/apimachinery/pkg/api/errors",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/meta", "ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/resource", "ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion", "ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/fields", "ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/labels", "ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime", "ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/selection", "ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/types", "ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/cache", "ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/clock", "ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/diff", "ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/errors", "ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/framer", "ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr", "ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/json", "ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/net", "ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime", "ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/sets", "ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation", "ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/wait", "ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml", "ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/version", "ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/watch", "ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "5937a4130a6bf81b86b03a6c6e7cd974a5018f59" "Rev": "13b73596e4b63e03203e86f6d9c7bcc1b937c62f"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery", "ImportPath": "k8s.io/client-go/discovery",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery/fake", "ImportPath": "k8s.io/client-go/discovery/fake",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers", "ImportPath": "k8s.io/client-go/informers",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration", "ImportPath": "k8s.io/client-go/informers/admissionregistration",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps", "ImportPath": "k8s.io/client-go/informers/apps",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1", "ImportPath": "k8s.io/client-go/informers/apps/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta1", "ImportPath": "k8s.io/client-go/informers/apps/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta2", "ImportPath": "k8s.io/client-go/informers/apps/v1beta2",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling", "ImportPath": "k8s.io/client-go/informers/autoscaling",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch", "ImportPath": "k8s.io/client-go/informers/batch",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1", "ImportPath": "k8s.io/client-go/informers/batch/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1beta1", "ImportPath": "k8s.io/client-go/informers/batch/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates", "ImportPath": "k8s.io/client-go/informers/certificates",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core", "ImportPath": "k8s.io/client-go/informers/core",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core/v1", "ImportPath": "k8s.io/client-go/informers/core/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events", "ImportPath": "k8s.io/client-go/informers/events",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events/v1beta1", "ImportPath": "k8s.io/client-go/informers/events/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions", "ImportPath": "k8s.io/client-go/informers/extensions",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/internalinterfaces", "ImportPath": "k8s.io/client-go/informers/internalinterfaces",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking", "ImportPath": "k8s.io/client-go/informers/networking",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking/v1", "ImportPath": "k8s.io/client-go/informers/networking/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy", "ImportPath": "k8s.io/client-go/informers/policy",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy/v1beta1", "ImportPath": "k8s.io/client-go/informers/policy/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac", "ImportPath": "k8s.io/client-go/informers/rbac",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1", "ImportPath": "k8s.io/client-go/informers/rbac/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling", "ImportPath": "k8s.io/client-go/informers/scheduling",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings", "ImportPath": "k8s.io/client-go/informers/settings",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage", "ImportPath": "k8s.io/client-go/informers/storage",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1", "ImportPath": "k8s.io/client-go/informers/storage/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1beta1", "ImportPath": "k8s.io/client-go/informers/storage/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes", "ImportPath": "k8s.io/client-go/kubernetes",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/scheme", "ImportPath": "k8s.io/client-go/kubernetes/scheme",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1", "ImportPath": "k8s.io/client-go/listers/apps/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta1", "ImportPath": "k8s.io/client-go/listers/apps/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta2", "ImportPath": "k8s.io/client-go/listers/apps/v1beta2",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1", "ImportPath": "k8s.io/client-go/listers/batch/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1beta1", "ImportPath": "k8s.io/client-go/listers/batch/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/core/v1", "ImportPath": "k8s.io/client-go/listers/core/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/events/v1beta1", "ImportPath": "k8s.io/client-go/listers/events/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/networking/v1", "ImportPath": "k8s.io/client-go/listers/networking/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/policy/v1beta1", "ImportPath": "k8s.io/client-go/listers/policy/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1", "ImportPath": "k8s.io/client-go/listers/rbac/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1", "ImportPath": "k8s.io/client-go/listers/storage/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1beta1", "ImportPath": "k8s.io/client-go/listers/storage/v1beta1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/version", "ImportPath": "k8s.io/client-go/pkg/version",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest", "ImportPath": "k8s.io/client-go/rest",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest/watch", "ImportPath": "k8s.io/client-go/rest/watch",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/testing", "ImportPath": "k8s.io/client-go/testing",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/auth", "ImportPath": "k8s.io/client-go/tools/auth",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/cache", "ImportPath": "k8s.io/client-go/tools/cache",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd", "ImportPath": "k8s.io/client-go/tools/clientcmd",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api", "ImportPath": "k8s.io/client-go/tools/clientcmd/api",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/metrics", "ImportPath": "k8s.io/client-go/tools/metrics",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/pager", "ImportPath": "k8s.io/client-go/tools/pager",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/record", "ImportPath": "k8s.io/client-go/tools/record",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/reference", "ImportPath": "k8s.io/client-go/tools/reference",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/transport", "ImportPath": "k8s.io/client-go/transport",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/buffer", "ImportPath": "k8s.io/client-go/util/buffer",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/cert", "ImportPath": "k8s.io/client-go/util/cert",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/flowcontrol", "ImportPath": "k8s.io/client-go/util/flowcontrol",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/homedir", "ImportPath": "k8s.io/client-go/util/homedir",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/integer", "ImportPath": "k8s.io/client-go/util/integer",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/retry", "ImportPath": "k8s.io/client-go/util/retry",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/workqueue", "ImportPath": "k8s.io/client-go/util/workqueue",
"Rev": "62c4633c17ed12226e4dad9d21e856df3c737862" "Rev": "421cf66e414f22e74ac90df608a0ac34811c9ea0"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto", "ImportPath": "k8s.io/kube-openapi/pkg/util/proto",

View File

@ -23,6 +23,13 @@ Changes should not be made to these files manually, and when creating your own
controller based off of this implementation you should not copy these files and controller based off of this implementation you should not copy these files and
instead run the `update-codegen` script to generate your own. instead run the `update-codegen` script to generate your own.
## Details
The sample controller uses [client-go library](https://github.com/kubernetes/client-go/tree/master/tools/cache) extensively.
The details of interaction points of the sample controller with various mechanisms from this library are
explained [here](docs/controller-client-go.md).
## Purpose ## Purpose
This is an example of how to build a kube-like controller with a single type. This is an example of how to build a kube-like controller with a single type.

View File

@ -0,0 +1,64 @@
# client-go under the hood
The [client-go](https://github.com/kubernetes/client-go/) library contains various mechanisms that you can use when
developing your custom controllers. These mechanisms are defined in the
[tools/cache folder](https://github.com/kubernetes/client-go/tree/master/tools/cache) of the library.
Here is a pictorial representation showing how the various components in
the client-go library work and their interaction points with the custom
controller code that you will write.
<p align="center">
<img src="images/client-go-controller-interaction.jpeg" height="600" width="700"/>
</p>
## client-go components
* Reflector: A reflector, which is defined in [type *Reflector* inside package *cache*](https://github.com/kubernetes/client-go/blob/master/tools/cache/reflector.go),
watches the Kubernetes API for the specified resource type (kind).
The function in which this is done is *ListAndWatch*.
The watch could be for an in-built resource or it could be for a custom resource.
When the reflector receives notification about existence of new
resource instance through the watch API, it gets the newly created object
using the corresponding listing API and puts it in the Delta Fifo queue
inside the *watchHandler* function.
* Informer: An informer defined in the [base controller inside package *cache*](https://github.com/kubernetes/client-go/blob/master/tools/cache/controller.go) pops objects from the Delta Fifo queue.
The function in which this is done is *processLoop*. The job of this base controller
is to save the object for later retrieval, and to invoke our controller passing it the object.
* Indexer: An indexer provides indexing functionality over objects.
It is defined in [type *Indexer* inside package *cache*](https://github.com/kubernetes/client-go/blob/master/tools/cache/index.go). A typical indexing use-case is to create an index based on object labels. Indexer can
maintain indexes based on several indexing functions.
Indexer uses a thread-safe data store to store objects and their keys.
There is a default function named *MetaNamespaceKeyFunc* defined in [type Store inside package cache](https://github.com/kubernetes/client-go/blob/master/tools/cache/store.go)
that generates an objects key as `<namespace>/<name>` combination for that object.
## Custom Controller components
* Informer reference: This is the reference to the Informer instance that knows
how to work with your custom resource objects. Your custom controller code needs
to create the appropriate Informer.
* Indexer reference: This is the reference to the Indexer instance that knows
how to work with your custom resource objects. Your custom controller code needs
to create this. You will be using this reference for retrieving objects for
later processing.
The base controller in client-go provides the *NewIndexerInformer* function to create Informer and Indexer.
In your code you can either [directly invoke this function](https://github.com/kubernetes/client-go/blob/master/examples/workqueue/main.go#L174) or [use factory methods for creating an informer.](https://github.com/kubernetes/sample-controller/blob/master/main.go#L61)
* Resource Event Handlers: These are the callback functions which will be called by
the Informer when it wants to deliver an object to your controller. The typical
pattern to write these functions is to obtain the dispatched objects key
and enqueue that key in a work queue for further processing.
* Work queue: This is the queue that you create in your controller code to decouple
delivery of an object from its processing. Resource event handler functions are written
to extract the delivered objects key and add that to the work queue.
* Process Item: This is the function that you create in your code which processes items
from the work queue. There can be one or more other functions that do the actual processing.
These functions will typically use the [Indexer reference](https://github.com/kubernetes/client-go/blob/master/examples/workqueue/main.go#L73), or a Listing wrapper to retrieve the object corresponding to the key.

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

File diff suppressed because it is too large Load Diff

View File

@ -439,6 +439,34 @@ message ConfigMapList {
repeated ConfigMap items = 2; repeated ConfigMap items = 2;
} }
// ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.
message ConfigMapNodeConfigSource {
// Namespace is the metadata.namespace of the referenced ConfigMap.
// This field is required in all cases.
optional string namespace = 1;
// Name is the metadata.name of the referenced ConfigMap.
// This field is required in all cases.
optional string name = 2;
// UID is the metadata.UID of the referenced ConfigMap.
// This field is currently reqired in Node.Spec.
// TODO(#61643): This field will be forbidden in Node.Spec when #61643 is resolved.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// +optional
optional string uid = 3;
// ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap.
// This field is forbidden in Node.Spec.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// +optional
optional string resourceVersion = 4;
// KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure
// This field is required in all cases.
optional string kubeletConfigKey = 5;
}
// Adapts a ConfigMap into a projected volume. // Adapts a ConfigMap into a projected volume.
// //
// The contents of the target ConfigMap's Data field will be presented in a // The contents of the target ConfigMap's Data field will be presented in a
@ -1815,7 +1843,8 @@ message NodeCondition {
// NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. // NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.
message NodeConfigSource { message NodeConfigSource {
optional ObjectReference configMapRef = 1; // ConfigMap is a reference to a Node's ConfigMap
optional ConfigMapNodeConfigSource configMap = 2;
} }
// NodeDaemonEndpoints lists ports opened by daemons running on the Node. // NodeDaemonEndpoints lists ports opened by daemons running on the Node.

View File

@ -57,7 +57,6 @@ func addKnownTypes(scheme *runtime.Scheme) error {
&Endpoints{}, &Endpoints{},
&EndpointsList{}, &EndpointsList{},
&Node{}, &Node{},
&NodeConfigSource{},
&NodeList{}, &NodeList{},
&NodeProxyOptions{}, &NodeProxyOptions{},
&Binding{}, &Binding{},

45
vendor/k8s.io/api/core/v1/types.go generated vendored
View File

@ -3640,12 +3640,49 @@ type NodeSpec struct {
DoNotUse_ExternalID string `json:"externalID,omitempty" protobuf:"bytes,2,opt,name=externalID"` DoNotUse_ExternalID string `json:"externalID,omitempty" protobuf:"bytes,2,opt,name=externalID"`
} }
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. // NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.
type NodeConfigSource struct { type NodeConfigSource struct {
metav1.TypeMeta `json:",inline"` // For historical context, regarding the below kind, apiVersion, and configMapRef deprecation tags:
ConfigMapRef *ObjectReference `json:"configMapRef,omitempty" protobuf:"bytes,1,opt,name=configMapRef"` // 1. kind/apiVersion were used by the kubelet to persist this struct to disk (they had no protobuf tags)
// 2. configMapRef and proto tag 1 were used by the API to refer to a configmap,
// but used a generic ObjectReference type that didn't really have the fields we needed
// All uses/persistence of the NodeConfigSource struct prior to 1.11 were gated by alpha feature flags,
// so there was no persisted data for these fields that needed to be migrated/handled.
// +k8s:deprecated=kind
// +k8s:deprecated=apiVersion
// +k8s:deprecated=configMapRef,protobuf=1
// ConfigMap is a reference to a Node's ConfigMap
ConfigMap *ConfigMapNodeConfigSource `json:"configMap,omitempty" protobuf:"bytes,2,opt,name=configMap"`
}
// ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.
type ConfigMapNodeConfigSource struct {
// Namespace is the metadata.namespace of the referenced ConfigMap.
// This field is required in all cases.
Namespace string `json:"namespace" protobuf:"bytes,1,opt,name=namespace"`
// Name is the metadata.name of the referenced ConfigMap.
// This field is required in all cases.
Name string `json:"name" protobuf:"bytes,2,opt,name=name"`
// UID is the metadata.UID of the referenced ConfigMap.
// This field is currently reqired in Node.Spec.
// TODO(#61643): This field will be forbidden in Node.Spec when #61643 is resolved.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// +optional
UID types.UID `json:"uid,omitempty" protobuf:"bytes,3,opt,name=uid"`
// ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap.
// This field is forbidden in Node.Spec.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// +optional
ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,4,opt,name=resourceVersion"`
// KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure
// This field is required in all cases.
KubeletConfigKey string `json:"kubeletConfigKey" protobuf:"bytes,5,opt,name=kubeletConfigKey"`
} }
// DaemonEndpoint contains information about a single Daemon endpoint. // DaemonEndpoint contains information about a single Daemon endpoint.

View File

@ -262,6 +262,19 @@ func (ConfigMapList) SwaggerDoc() map[string]string {
return map_ConfigMapList return map_ConfigMapList
} }
var map_ConfigMapNodeConfigSource = map[string]string{
"": "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.",
"namespace": "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.",
"name": "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.",
"uid": "UID is the metadata.UID of the referenced ConfigMap. This field is currently reqired in Node.Spec.",
"resourceVersion": "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec.",
"kubeletConfigKey": "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.",
}
func (ConfigMapNodeConfigSource) SwaggerDoc() map[string]string {
return map_ConfigMapNodeConfigSource
}
var map_ConfigMapProjection = map[string]string{ var map_ConfigMapProjection = map[string]string{
"": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", "": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.",
"items": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", "items": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.",
@ -969,7 +982,8 @@ func (NodeCondition) SwaggerDoc() map[string]string {
} }
var map_NodeConfigSource = map[string]string{ var map_NodeConfigSource = map[string]string{
"": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", "": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.",
"configMap": "ConfigMap is a reference to a Node's ConfigMap",
} }
func (NodeConfigSource) SwaggerDoc() map[string]string { func (NodeConfigSource) SwaggerDoc() map[string]string {

View File

@ -631,6 +631,22 @@ func (in *ConfigMapList) DeepCopyObject() runtime.Object {
return nil return nil
} }
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ConfigMapNodeConfigSource) DeepCopyInto(out *ConfigMapNodeConfigSource) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapNodeConfigSource.
func (in *ConfigMapNodeConfigSource) DeepCopy() *ConfigMapNodeConfigSource {
if in == nil {
return nil
}
out := new(ConfigMapNodeConfigSource)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) { func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) {
*out = *in *out = *in
@ -2360,13 +2376,12 @@ func (in *NodeCondition) DeepCopy() *NodeCondition {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) {
*out = *in *out = *in
out.TypeMeta = in.TypeMeta if in.ConfigMap != nil {
if in.ConfigMapRef != nil { in, out := &in.ConfigMap, &out.ConfigMap
in, out := &in.ConfigMapRef, &out.ConfigMapRef
if *in == nil { if *in == nil {
*out = nil *out = nil
} else { } else {
*out = new(ObjectReference) *out = new(ConfigMapNodeConfigSource)
**out = **in **out = **in
} }
} }
@ -2383,14 +2398,6 @@ func (in *NodeConfigSource) DeepCopy() *NodeConfigSource {
return out return out
} }
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *NodeConfigSource) 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. // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NodeDaemonEndpoints) DeepCopyInto(out *NodeDaemonEndpoints) { func (in *NodeDaemonEndpoints) DeepCopyInto(out *NodeDaemonEndpoints) {
*out = *in *out = *in

View File

@ -26,18 +26,12 @@ import (
type Clock interface { type Clock interface {
Now() time.Time Now() time.Time
Since(time.Time) time.Duration Since(time.Time) time.Duration
After(d time.Duration) <-chan time.Time After(time.Duration) <-chan time.Time
NewTimer(d time.Duration) Timer NewTimer(time.Duration) Timer
Sleep(d time.Duration) Sleep(time.Duration)
Tick(d time.Duration) <-chan time.Time NewTicker(time.Duration) Ticker
} }
var (
_ = Clock(RealClock{})
_ = Clock(&FakeClock{})
_ = Clock(&IntervalClock{})
)
// RealClock really calls time.Now() // RealClock really calls time.Now()
type RealClock struct{} type RealClock struct{}
@ -62,8 +56,10 @@ func (RealClock) NewTimer(d time.Duration) Timer {
} }
} }
func (RealClock) Tick(d time.Duration) <-chan time.Time { func (RealClock) NewTicker(d time.Duration) Ticker {
return time.Tick(d) return &realTicker{
ticker: time.NewTicker(d),
}
} }
func (RealClock) Sleep(d time.Duration) { func (RealClock) Sleep(d time.Duration) {
@ -137,7 +133,7 @@ func (f *FakeClock) NewTimer(d time.Duration) Timer {
return timer return timer
} }
func (f *FakeClock) Tick(d time.Duration) <-chan time.Time { func (f *FakeClock) NewTicker(d time.Duration) Ticker {
f.lock.Lock() f.lock.Lock()
defer f.lock.Unlock() defer f.lock.Unlock()
tickTime := f.time.Add(d) tickTime := f.time.Add(d)
@ -149,7 +145,9 @@ func (f *FakeClock) Tick(d time.Duration) <-chan time.Time {
destChan: ch, destChan: ch,
}) })
return ch return &fakeTicker{
c: ch,
}
} }
// Move clock by Duration, notify anyone that's called After, Tick, or NewTimer // Move clock by Duration, notify anyone that's called After, Tick, or NewTimer
@ -242,8 +240,8 @@ func (*IntervalClock) NewTimer(d time.Duration) Timer {
// Unimplemented, will panic. // Unimplemented, will panic.
// TODO: make interval clock use FakeClock so this can be implemented. // TODO: make interval clock use FakeClock so this can be implemented.
func (*IntervalClock) Tick(d time.Duration) <-chan time.Time { func (*IntervalClock) NewTicker(d time.Duration) Ticker {
panic("IntervalClock doesn't implement Tick") panic("IntervalClock doesn't implement NewTicker")
} }
func (*IntervalClock) Sleep(d time.Duration) { func (*IntervalClock) Sleep(d time.Duration) {
@ -258,11 +256,6 @@ type Timer interface {
Reset(d time.Duration) bool Reset(d time.Duration) bool
} }
var (
_ = Timer(&realTimer{})
_ = Timer(&fakeTimer{})
)
// realTimer is backed by an actual time.Timer. // realTimer is backed by an actual time.Timer.
type realTimer struct { type realTimer struct {
timer *time.Timer timer *time.Timer
@ -325,3 +318,31 @@ func (f *fakeTimer) Reset(d time.Duration) bool {
return active return active
} }
type Ticker interface {
C() <-chan time.Time
Stop()
}
type realTicker struct {
ticker *time.Ticker
}
func (t *realTicker) C() <-chan time.Time {
return t.ticker.C
}
func (t *realTicker) Stop() {
t.ticker.Stop()
}
type fakeTicker struct {
c <-chan time.Time
}
func (t *fakeTicker) C() <-chan time.Time {
return t.c
}
func (t *fakeTicker) Stop() {
}

View File

@ -22,6 +22,7 @@ import (
"net/url" "net/url"
"sort" "sort"
"strings" "strings"
"sync"
"time" "time"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
@ -32,6 +33,7 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/version" "k8s.io/apimachinery/pkg/version"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
@ -191,33 +193,7 @@ func (d *DiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (r
// serverResources returns the supported resources for all groups and versions. // serverResources returns the supported resources for all groups and versions.
func (d *DiscoveryClient) serverResources() ([]*metav1.APIResourceList, error) { func (d *DiscoveryClient) serverResources() ([]*metav1.APIResourceList, error) {
apiGroups, err := d.ServerGroups() return ServerResources(d)
if err != nil {
return nil, err
}
result := []*metav1.APIResourceList{}
failedGroups := make(map[schema.GroupVersion]error)
for _, apiGroup := range apiGroups.Groups {
for _, version := range apiGroup.Versions {
gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version}
resources, err := d.ServerResourcesForGroupVersion(version.GroupVersion)
if err != nil {
// TODO: maybe restrict this to NotFound errors
failedGroups[gv] = err
continue
}
result = append(result, resources)
}
}
if len(failedGroups) == 0 {
return result, nil
}
return result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
} }
// ServerResources returns the supported resources for all groups and versions. // ServerResources returns the supported resources for all groups and versions.
@ -253,6 +229,33 @@ func (d *DiscoveryClient) serverPreferredResources() ([]*metav1.APIResourceList,
return ServerPreferredResources(d) return ServerPreferredResources(d)
} }
// ServerResources uses the provided discovery interface to look up supported resources for all groups and versions.
func ServerResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) {
apiGroups, err := d.ServerGroups()
if err != nil {
return nil, err
}
groupVersionResources, failedGroups := fetchGroupVersionResources(d, apiGroups)
// order results by group/version discovery order
result := []*metav1.APIResourceList{}
for _, apiGroup := range apiGroups.Groups {
for _, version := range apiGroup.Versions {
gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version}
if resources, ok := groupVersionResources[gv]; ok {
result = append(result, resources)
}
}
}
if len(failedGroups) == 0 {
return result, nil
}
return result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
}
// ServerPreferredResources uses the provided discovery interface to look up preferred resources // ServerPreferredResources uses the provided discovery interface to look up preferred resources
func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) { func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) {
serverGroupList, err := d.ServerGroups() serverGroupList, err := d.ServerGroups()
@ -260,9 +263,9 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList,
return nil, err return nil, err
} }
result := []*metav1.APIResourceList{} groupVersionResources, failedGroups := fetchGroupVersionResources(d, serverGroupList)
failedGroups := make(map[schema.GroupVersion]error)
result := []*metav1.APIResourceList{}
grVersions := map[schema.GroupResource]string{} // selected version of a GroupResource grVersions := map[schema.GroupResource]string{} // selected version of a GroupResource
grApiResources := map[schema.GroupResource]*metav1.APIResource{} // selected APIResource for a GroupResource grApiResources := map[schema.GroupResource]*metav1.APIResource{} // selected APIResource for a GroupResource
gvApiResourceLists := map[schema.GroupVersion]*metav1.APIResourceList{} // blueprint for a APIResourceList for later grouping gvApiResourceLists := map[schema.GroupVersion]*metav1.APIResourceList{} // blueprint for a APIResourceList for later grouping
@ -270,10 +273,9 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList,
for _, apiGroup := range serverGroupList.Groups { for _, apiGroup := range serverGroupList.Groups {
for _, version := range apiGroup.Versions { for _, version := range apiGroup.Versions {
groupVersion := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} groupVersion := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version}
apiResourceList, err := d.ServerResourcesForGroupVersion(version.GroupVersion)
if err != nil { apiResourceList, ok := groupVersionResources[groupVersion]
// TODO: maybe restrict this to NotFound errors if !ok {
failedGroups[groupVersion] = err
continue continue
} }
@ -315,6 +317,41 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList,
return result, &ErrGroupDiscoveryFailed{Groups: failedGroups} return result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
} }
// fetchServerResourcesForGroupVersions uses the discovery client to fetch the resources for the specified groups in parallel
func fetchGroupVersionResources(d DiscoveryInterface, apiGroups *metav1.APIGroupList) (map[schema.GroupVersion]*metav1.APIResourceList, map[schema.GroupVersion]error) {
groupVersionResources := make(map[schema.GroupVersion]*metav1.APIResourceList)
failedGroups := make(map[schema.GroupVersion]error)
wg := &sync.WaitGroup{}
resultLock := &sync.Mutex{}
for _, apiGroup := range apiGroups.Groups {
for _, version := range apiGroup.Versions {
groupVersion := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version}
wg.Add(1)
go func() {
defer wg.Done()
defer utilruntime.HandleCrash()
apiResourceList, err := d.ServerResourcesForGroupVersion(groupVersion.String())
// lock to record results
resultLock.Lock()
defer resultLock.Unlock()
if err != nil {
// TODO: maybe restrict this to NotFound errors
failedGroups[groupVersion] = err
} else {
groupVersionResources[groupVersion] = apiResourceList
}
}()
}
}
wg.Wait()
return groupVersionResources, failedGroups
}
// ServerPreferredResources returns the supported resources with the version preferred by the // ServerPreferredResources returns the supported resources with the version preferred by the
// server. // server.
func (d *DiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { func (d *DiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) {

View File

@ -225,6 +225,16 @@ func NewRootDeleteAction(resource schema.GroupVersionResource, name string) Dele
return action return action
} }
func NewRootDeleteSubresourceAction(resource schema.GroupVersionResource, subresource string, name string) DeleteActionImpl {
action := DeleteActionImpl{}
action.Verb = "delete"
action.Resource = resource
action.Subresource = subresource
action.Name = name
return action
}
func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl { func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl {
action := DeleteActionImpl{} action := DeleteActionImpl{}
action.Verb = "delete" action.Verb = "delete"
@ -235,6 +245,17 @@ func NewDeleteAction(resource schema.GroupVersionResource, namespace, name strin
return action return action
} }
func NewDeleteSubresourceAction(resource schema.GroupVersionResource, subresource, namespace, name string) DeleteActionImpl {
action := DeleteActionImpl{}
action.Verb = "delete"
action.Resource = resource
action.Subresource = subresource
action.Namespace = namespace
action.Name = name
return action
}
func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl { func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl {
action := DeleteCollectionActionImpl{} action := DeleteCollectionActionImpl{}
action.Verb = "delete-collection" action.Verb = "delete-collection"

View File

@ -45,7 +45,7 @@ func newDelayingQueue(clock clock.Clock, name string) DelayingInterface {
ret := &delayingType{ ret := &delayingType{
Interface: NewNamed(name), Interface: NewNamed(name),
clock: clock, clock: clock,
heartbeat: clock.Tick(maxWait), heartbeat: clock.NewTicker(maxWait),
stopCh: make(chan struct{}), stopCh: make(chan struct{}),
waitingForAddCh: make(chan *waitFor, 1000), waitingForAddCh: make(chan *waitFor, 1000),
metrics: newRetryMetrics(name), metrics: newRetryMetrics(name),
@ -67,10 +67,7 @@ type delayingType struct {
stopCh chan struct{} stopCh chan struct{}
// heartbeat ensures we wait no more than maxWait before firing // heartbeat ensures we wait no more than maxWait before firing
// heartbeat clock.Ticker
// TODO: replace with Ticker (and add to clock) so this can be cleaned up.
// clock.Tick will leak.
heartbeat <-chan time.Time
// waitingForAddCh is a buffered channel that feeds waitingForAdd // waitingForAddCh is a buffered channel that feeds waitingForAdd
waitingForAddCh chan *waitFor waitingForAddCh chan *waitFor
@ -138,6 +135,7 @@ func (pq waitForPriorityQueue) Peek() interface{} {
func (q *delayingType) ShutDown() { func (q *delayingType) ShutDown() {
q.Interface.ShutDown() q.Interface.ShutDown()
close(q.stopCh) close(q.stopCh)
q.heartbeat.Stop()
} }
// AddAfter adds the given item to the work queue after the given delay // AddAfter adds the given item to the work queue after the given delay
@ -209,7 +207,7 @@ func (q *delayingType) waitingLoop() {
case <-q.stopCh: case <-q.stopCh:
return return
case <-q.heartbeat: case <-q.heartbeat.C():
// continue the loop, which will add ready items // continue the loop, which will add ready items
case <-nextReadyAt: case <-nextReadyAt: