Merge pull request #60021 from nikhita/sample-controller-subresources

Automatic merge from submit-queue (batch tested with PRs 60102, 59970, 60021, 62011, 62080). 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>.

sample-controller: add status subresource support

Builds on top of https://github.com/kubernetes/kubernetes/pull/55168.

**DO NOT MERGE** until https://github.com/kubernetes/kubernetes/pull/55168 is merged. Adding a hold.
/hold

Update: It is now merged! 🎉

This PR:

- Adds an example to show how to use the `/status` subresource with custom resources.
- Generates `UpdateStatus` for the `Foo` resource.
- Updates the comment in the controller to mention that `UpdateStatus` can now be used. Note: this is not enabled by default because subresources require the feature gate to be enabled and are not on by default.
- Updates the README to add feature gate information and examples for `CustomResourceSubresources`.
- Updates the README to remove feature gate information for CRD validation since the current example uses `apps/v1` deployments (and thus requires v1.9 anyway).

**Release note**:

```release-note
NONE
```

/assign sttts munnerz

Kubernetes-commit: 7bde13f191f0791a87fe5e2575feb3d4849de536
This commit is contained in:
Kubernetes Publisher 2018-04-05 18:47:05 -07:00
commit e933a6fa9c
14 changed files with 303 additions and 195 deletions

324
Godeps/Godeps.json generated
View File

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

View File

@ -79,17 +79,44 @@ type User struct {
To validate custom resources, use the [`CustomResourceValidation`](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation) feature.
This feature is beta and enabled by default in v1.9. If you are using v1.8, enable the feature using
the `CustomResourceValidation` feature gate on the [kube-apiserver](https://kubernetes.io/docs/admin/kube-apiserver):
This feature is beta and enabled by default in v1.9.
### Example
The schema in [`crd-validation.yaml`](./artifacts/examples/crd-validation.yaml) applies the following validation on the custom resource:
`spec.replicas` must be an integer and must have a minimum value of 1 and a maximum value of 10.
In the above steps, use `crd-validation.yaml` to create the CRD:
```sh
--feature-gates=CustomResourceValidation=true
# create a CustomResourceDefinition supporting validation
$ kubectl create -f artifacts/examples/crd-validation.yaml
```
## Subresources
Custom Resources support `/status` and `/scale` subresources as an
[alpha feature](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#subresources) in v1.10.
Enable this feature using the `CustomResourceSubresources` feature gate on the [kube-apiserver](https://kubernetes.io/docs/admin/kube-apiserver):
```sh
--feature-gates=CustomResourceSubresources=true
```
### Example
The schema in the [example CRD](./artifacts/examples/crd.yaml) applies the following validation on the custom resource:
`spec.replicas` must be an integer and must have a minimum value of 1 and a maximum value of 10.
The CRD in [`crd-status-subresource.yaml`](./artifacts/examples/crd-status-subresource.yaml) enables the `/status` subresource
for custom resources.
This means that [`UpdateStatus`](./controller.go#L330) can be used by the controller to update only the status part of the custom resource.
To understand why only the status part of the custom resource should be updated, please refer to the [Kubernetes API conventions](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status).
In the above steps, use `crd-status-subresource.yaml` to create the CRD:
```sh
# create a CustomResourceDefinition supporting the status subresource
$ kubectl create -f artifacts/examples/crd-status-subresource.yaml
```
## Cleanup

View File

@ -0,0 +1,13 @@
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: foos.samplecontroller.k8s.io
spec:
group: samplecontroller.k8s.io
version: v1alpha1
names:
kind: Foo
plural: foos
scope: Namespaced
subresources:
status: {}

View File

@ -0,0 +1,20 @@
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: foos.samplecontroller.k8s.io
spec:
group: samplecontroller.k8s.io
version: v1alpha1
names:
kind: Foo
plural: foos
scope: Namespaced
validation:
openAPIV3Schema:
properties:
spec:
properties:
replicas:
type: integer
minimum: 1
maximum: 10

View File

@ -9,12 +9,3 @@ spec:
kind: Foo
plural: foos
scope: Namespaced
validation:
openAPIV3Schema:
properties:
spec:
properties:
replicas:
type: integer
minimum: 1
maximum: 10

View File

@ -327,10 +327,10 @@ func (c *Controller) updateFooStatus(foo *samplev1alpha1.Foo, deployment *appsv1
// Or create a copy manually for better performance
fooCopy := foo.DeepCopy()
fooCopy.Status.AvailableReplicas = deployment.Status.AvailableReplicas
// Until #38113 is merged, we must use Update instead of UpdateStatus to
// update the Status block of the Foo resource. UpdateStatus will not
// allow changes to the Spec of the resource, which is ideal for ensuring
// nothing other than resource status has been updated.
// If the CustomResourceSubresources feature gate is not enabled,
// we must use Update instead of UpdateStatus to update the Status block of the Foo resource.
// UpdateStatus will not allow changes to the Spec of the resource,
// which is ideal for ensuring nothing other than resource status has been updated.
_, err := c.sampleclientset.SamplecontrollerV1alpha1().Foos(foo.Namespace).Update(fooCopy)
return err
}

View File

@ -21,7 +21,6 @@ import (
)
// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Foo is a specification for a Foo resource

View File

@ -100,6 +100,18 @@ func (c *FakeFoos) Update(foo *v1alpha1.Foo) (result *v1alpha1.Foo, err error) {
return obj.(*v1alpha1.Foo), err
}
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
func (c *FakeFoos) UpdateStatus(foo *v1alpha1.Foo) (*v1alpha1.Foo, error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateSubresourceAction(foosResource, "status", c.ns, foo), &v1alpha1.Foo{})
if obj == nil {
return nil, err
}
return obj.(*v1alpha1.Foo), err
}
// Delete takes name of the foo and deletes it. Returns an error if one occurs.
func (c *FakeFoos) Delete(name string, options *v1.DeleteOptions) error {
_, err := c.Fake.

View File

@ -37,6 +37,7 @@ type FoosGetter interface {
type FooInterface interface {
Create(*v1alpha1.Foo) (*v1alpha1.Foo, error)
Update(*v1alpha1.Foo) (*v1alpha1.Foo, error)
UpdateStatus(*v1alpha1.Foo) (*v1alpha1.Foo, error)
Delete(name string, options *v1.DeleteOptions) error
DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
Get(name string, options v1.GetOptions) (*v1alpha1.Foo, error)
@ -120,6 +121,22 @@ func (c *foos) Update(foo *v1alpha1.Foo) (result *v1alpha1.Foo, err error) {
return
}
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
func (c *foos) UpdateStatus(foo *v1alpha1.Foo) (result *v1alpha1.Foo, err error) {
result = &v1alpha1.Foo{}
err = c.client.Put().
Namespace(c.ns).
Resource("foos").
Name(foo.Name).
SubResource("status").
Body(foo).
Do().
Into(result)
return
}
// Delete takes name of the foo and deletes it. Returns an error if one occurs.
func (c *foos) Delete(name string, options *v1.DeleteOptions) error {
return c.client.Delete().

View File

@ -82,7 +82,7 @@ func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error {
func (obj *Unstructured) UnstructuredContent() map[string]interface{} {
if obj.Object == nil {
obj.Object = make(map[string]interface{})
return make(map[string]interface{})
}
return obj.Object
}

View File

@ -53,19 +53,18 @@ func (u *UnstructuredList) EachListItem(fn func(runtime.Object) error) error {
}
// UnstructuredContent returns a map contain an overlay of the Items field onto
// the Object field. Items always overwrites overlay. Changing "items" in the
// returned object will affect items in the underlying Items field, but changing
// the "items" slice itself will have no effect.
// TODO: expose SetUnstructuredContent on runtime.Unstructured that allows
// items to be changed.
// the Object field. Items always overwrites overlay.
func (u *UnstructuredList) UnstructuredContent() map[string]interface{} {
out := u.Object
if out == nil {
out = make(map[string]interface{})
out := make(map[string]interface{}, len(u.Object)+1)
// shallow copy every property
for k, v := range u.Object {
out[k] = v
}
items := make([]interface{}, len(u.Items))
for i, item := range u.Items {
items[i] = item.Object
items[i] = item.UnstructuredContent()
}
out["items"] = items
return out

View File

@ -411,8 +411,7 @@ func (c *unstructuredConverter) ToUnstructured(obj interface{}) (map[string]inte
var u map[string]interface{}
var err error
if unstr, ok := obj.(Unstructured); ok {
// UnstructuredContent() mutates the object so we need to make a copy first
u = unstr.DeepCopyObject().(Unstructured).UnstructuredContent()
u = unstr.UnstructuredContent()
} else {
t := reflect.TypeOf(obj)
value := reflect.ValueOf(obj)
@ -449,12 +448,20 @@ func DeepCopyJSON(x map[string]interface{}) map[string]interface{} {
func DeepCopyJSONValue(x interface{}) interface{} {
switch x := x.(type) {
case map[string]interface{}:
if x == nil {
// Typed nil - an interface{} that contains a type map[string]interface{} with a value of nil
return x
}
clone := make(map[string]interface{}, len(x))
for k, v := range x {
clone[k] = DeepCopyJSONValue(v)
}
return clone
case []interface{}:
if x == nil {
// Typed nil - an interface{} that contains a type []interface{} with a value of nil
return x
}
clone := make([]interface{}, len(x))
for i, v := range x {
clone[i] = DeepCopyJSONValue(v)

View File

@ -234,9 +234,9 @@ type Object interface {
// to JSON allowed.
type Unstructured interface {
Object
// UnstructuredContent returns a non-nil, mutable map of the contents of this object. Values may be
// UnstructuredContent returns a non-nil map with this object's contents. Values may be
// []interface{}, map[string]interface{}, or any primitive type. Contents are typically serialized to
// and from JSON.
// and from JSON. SetUnstructuredContent should be used to mutate the contents.
UnstructuredContent() map[string]interface{}
// SetUnstructuredContent updates the object content to match the provided map.
SetUnstructuredContent(map[string]interface{})

View File

@ -880,6 +880,29 @@ func StrategicMergeMapPatchUsingLookupPatchMeta(original, patch JSONMap, schema
return mergeMap(original, patch, schema, mergeOptions)
}
// MergeStrategicMergeMapPatchUsingLookupPatchMeta merges strategic merge
// patches retaining `null` fields and parallel lists. If 2 patches change the
// same fields and the latter one will override the former one. If you don't
// want that happen, you need to run func MergingMapsHaveConflicts before
// merging these patches. Applying the resulting merged merge patch to a JSONMap
// yields the same as merging each strategic merge patch to the JSONMap in
// succession.
func MergeStrategicMergeMapPatchUsingLookupPatchMeta(schema LookupPatchMeta, patches ...JSONMap) (JSONMap, error) {
mergeOptions := MergeOptions{
MergeParallelList: false,
IgnoreUnmatchedNulls: false,
}
merged := JSONMap{}
var err error
for _, patch := range patches {
merged, err = mergeMap(merged, patch, schema, mergeOptions)
if err != nil {
return nil, err
}
}
return merged, nil
}
// handleDirectiveInMergeMap handles the patch directive when merging 2 maps.
func handleDirectiveInMergeMap(directive interface{}, patch map[string]interface{}) (map[string]interface{}, error) {
if directive == replaceDirective {