kubernetes/hack
Kubernetes Submit Queue 6e856480c0
Merge pull request #55168 from nikhita/customresources-subresources
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>.

apiextensions: add subresources for custom resources

Fixes #38113
Fixes #58778

**Related**:
- Proposal: https://github.com/kubernetes/community/pull/913
- For custom resources to work with `kubectl scale`: https://github.com/kubernetes/kubernetes/pull/58283

**Add types**:

- Add `CustomResourceSubResources` type to CRD.
    - Fix proto generation for `CustomResourceSubResourceStatus`: https://github.com/kubernetes/kubernetes/pull/55970.
- Add feature gate for `CustomResourceSubResources`.
    - Update CRD strategy: if feature gate is disabled, this feature is dropped (i.e. set to `nil`).
- Add validation for `CustomResourceSubResources`:
    - `SpecReplicasPath` should not be empty and should be a valid json path under `.spec`. If there is no value under the given path in the CustomResource, the `/scale` subresource will return an error on GET.
    - `StatusReplicasPath` should not be empty and should be a valid json path under `.status`. If there is no value under the given path in the CustomResource, the status replica value in the /scale subresource will default to 0.
    - If present, `LabelSelectorPath` should be a valid json path. If there is no value under `LabelSelectorPath` in the CustomResource, the status label selector value in the `/scale` subresource will default to the empty string.
    - `ScaleGroupVersion` should be `autoscaling/v1`.
    - If `CustomResourceSubResources` is enabled, only `properties` is allowed under the root schema for CRD validation.

**Add status and scale subresources**:

- Use helper functions from `apimachinery/pkg/apis/meta/v1/unstructured/helpers.go`.
    - Improve error handling: https://github.com/kubernetes/kubernetes/pull/56563, https://github.com/kubernetes/kubernetes/pull/58215.
- Introduce Registry interface for storage.
- Update storage:
    - Introduce `CustomResourceStorage` which acts as storage for the custom resource and its status and scale subresources. Note: storage for status and scale is only enabled when the feature gate is enabled _and_ the respective fields are enabled in the CRD.
    - Introduce `StatusREST` and its `New()`, `Get()` and `Update()` methods.
    - Introduce `ScaleREST` and its `New()`, `Get()` and `Update()` methods.
        - Get and Update use the json paths from the CRD and use it to return an `autoscaling/v1.Scale` object.
- Update strategy:
    - In `PrepareForCreate`,
         - Clear `.status`.
         - Set `.metadata.generation` = 1
    - In `PrepareForUpdate`,
         - Do not update `.status`.
             - If both the old and new objects have `.status` and it is changed, set it back to its old value.
             - If the old object has a `.status` but the new object doesn't, set it to the old value.
             - If old object did not have a `.status` but the new object does, delete it.
         - Increment generation if spec changes i.e. in the following cases:
             - If both the old and new objects had `.spec` and it changed.
             - If the old object did not have `.spec` but the new object does.
             - If the old object had a `.spec` but the new object doesn't.
     - In `Validate` and `ValidateUpdate`,
        - ensure that values at `specReplicasPath` and `statusReplicasPath` are >=0 and < maxInt32.
        - make sure there are no errors in getting the value at all the paths.
    - Introduce `statusStrategy` with its methods.
        - In `PrepareForUpdate`:
            - Do not update `.spec`.
                - If both the old and new objects have `.spec` and it is changed, set it back to its old value.
                - If the old object has a `.spec` but the new object doesn't, set it to the old value.
                - If old object did not have a `.spec` but the new object does, delete it.
             - Do not update `.metadata`.
        - In `ValidateStatusUpdate`:
            - For CRD validation, validate only under `.status`.
            - Validate value at `statusReplicasPath` as above. If `labelSelectorPath` is a path under `.status`, then validate it as well.
- Plug into the custom resource handler:
    - Store all three storage - customResource, status and scale in `crdInfo`.
    - Use the storage as per the subresource in the request.
    - Use the validator as per the subresource (for status, only use the schema for `status`, if present).
    - Serve the endpoint as per the subresource - see `serveResource`, `serveStatus` and `serveScale`.
- Update discovery by adding the `/status` and `/scale` resources, if enabled.

**Add tests**:

- Add unit tests in `etcd_test.go`.
- Add integration tests.
    - In `subresources_test.go`, use the [polymporphic scale client](https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/client-go/scale) to get and update `Scale`.
    -  Add a test to check everything works fine with yaml in `yaml_test.go`.

**Release note**:

```release-note
`/status` and `/scale` subresources are added for custom resources.
```
2018-02-22 13:37:35 -08:00
..
boilerplate Update boilerplate for 2018 2018-01-01 22:57:59 -08:00
cmd/teststale Autogenerated: hack/update-bazel.sh 2018-02-16 13:43:01 -08:00
e2e-internal Remove all traces of federation 2017-10-26 13:37:37 -07:00
gen-swagger-doc Switch to k8s.gcr.io vanity domain 2018-02-07 21:14:19 -08:00
jenkins Save benchmark data in perfdash-friendly format. 2018-02-14 14:22:18 +01:00
lib gke-certificates-controller: rm -rf 2018-02-15 12:01:00 -08:00
make-rules Merge pull request #60131 from soltysh/integration_fixes_followup 2018-02-22 10:35:47 -08:00
testdata update -o name format to kind.group/name 2018-02-15 10:33:06 -05:00
verify-flags Add multi-vc configuration for e2e tests 2018-01-18 15:29:27 -08:00
.golint_failures add subresources for custom resources 2018-02-22 23:26:09 +05:30
autogenerated_placeholder.txt
benchmark-go.sh
BUILD Autogenerated: hack/update-bazel.sh 2018-02-16 13:43:01 -08:00
build-cross.sh
build-go.sh
build-ui.sh
cherry_pick_pull.sh Add parent PR title to cherry-picked PR title 2017-11-25 13:36:13 +08:00
dev-build-and-push.sh
dev-build-and-up.sh
dev-push-hyperkube.sh
e2e_test.go Fix e2e_test.go 2017-07-05 14:24:25 -07:00
e2e-node-test.sh Fix typo in e2e-node-test.sh 2017-09-19 18:10:21 +05:30
e2e.go Add signal handler for catching Ctrl-C on hack/e2e 2017-08-23 16:05:46 -07:00
generate-bindata.sh cluster: move logging library to hack/ 2018-01-13 16:37:50 -08:00
generate-docs.sh Remove all traces of federation 2017-10-26 13:37:37 -07:00
get-build.sh
ginkgo-e2e.sh cluster: remove unused functions 2018-02-01 07:23:50 -08:00
godep-restore.sh Remove unneeded code 2018-01-30 09:29:51 -08:00
godep-save.sh Enforce OWNERS file in Godeps and vendor dirs 2018-02-15 13:30:30 -08:00
grab-profiles.sh remove deprecated /proxy paths 2018-02-20 14:42:19 -08:00
import-restrictions.yaml Expose single annotation/label via downward API 2017-11-21 19:21:10 -08:00
install-etcd.sh
list-feature-tests.sh Fix list-features script 2017-08-27 22:20:04 -04:00
local-up-cluster.sh StorageProtection Brought to Beta in 1.10 Release 2018-02-21 16:05:43 +01:00
lookup_pull.py update url information to prevent http 304 redirection 2017-05-25 14:05:02 +08:00
OWNERS Add liggitt to hack approvers 2018-01-18 20:50:18 -05:00
print-workspace-status.sh bazel: support using SOURCE_DATE_EPOCH to override date 2018-02-08 21:12:03 -08:00
run-in-gopath.sh
test-cmd.sh
test-go.sh
test-integration.sh Remove unnecessary wrapper flags 2017-06-07 12:31:01 -04:00
test-update-storage-objects.sh set default enabled admission plugins by official document 2018-02-22 11:02:02 +08:00
update_owners.py Remove myself from a bunch of places 2017-07-20 12:10:46 +02:00
update-all.sh Force use of Makefile for update 2018-01-22 15:11:16 -08:00
update-api-reference-docs.sh
update-bazel.sh Update bazelbuild/rules_go, kubernetes/repo-infra, and gazelle dependencies 2018-02-16 13:41:43 -08:00
update-cloudprovider-gce.sh Fix lint and bazel 2018-01-09 23:09:08 -08:00
update-codegen.sh Partial revert of fb5caac2da 2018-02-14 11:31:51 -08:00
update-generated-device-plugin-dockerized.sh Create pkg/kubelet/apis/deviceplugin/v1beta1 directory. 2018-02-08 17:04:43 -08:00
update-generated-device-plugin.sh Added script to generate the Device Plugin API 2017-08-15 14:59:42 -07:00
update-generated-docs.sh Remove all traces of federation 2017-10-26 13:37:37 -07:00
update-generated-kms-dockerized.sh Add verify script for kms generated file 2018-02-08 01:29:56 +00:00
update-generated-kms.sh Add generated script for kms api pb file 2018-02-08 01:00:38 +00:00
update-generated-protobuf-dockerized.sh add --go-header-file to use kube boilerplate 2018-02-13 12:34:54 +05:30
update-generated-protobuf.sh
update-generated-runtime-dockerized.sh Increment CRI version from v1alpha1 to v1alpha2 2018-02-07 09:06:26 +01:00
update-generated-runtime.sh
update-generated-swagger-docs.sh Promote v1alpha1 meta to v1beta1 2018-02-02 14:00:45 -05:00
update-godep-licenses.sh hack: fix godep license parsing for gopkg.in packages 2017-11-22 09:38:17 -08:00
update-gofmt.sh
update-openapi-spec.sh
update-staging-godeps-dockerized.sh Clean up godep scripts to be self-contained 2017-09-29 15:16:03 -07:00
update-staging-godeps.sh Dockerize update-staging-godeps 2017-07-25 12:26:57 -07:00
update-swagger-spec.sh Merge pull request #58303 from php-coder/fix_verify-swagger-spec_sript 2018-01-17 02:43:58 -08:00
update-translations.sh
verify-all.sh
verify-api-groups.sh Fixup after k8s.io/{kube-gen -> code-generator} rename 2017-08-17 17:55:12 +02:00
verify-api-reference-docs.sh Ignore OWNERS files in hack/verify-api-reference-docs.sh 2017-10-18 11:15:08 -07:00
verify-bazel.sh Route verify-bazel output to stderr 2018-02-07 21:39:38 -08:00
verify-boilerplate.sh Route verify-boilerplate output to stderr 2018-02-07 21:41:31 -08:00
verify-cli-conventions.sh More cli sanity verifications 2017-05-18 15:44:49 -03:00
verify-cloudprovider-gce.sh Fix lint and bazel 2018-01-09 23:09:08 -08:00
verify-codegen.sh Add sample CustomResourceDefinition controller 2017-10-19 00:21:57 +01:00
verify-description.sh pkg/apis/core: fixup package names 2017-11-09 12:14:07 +01:00
verify-flags-underscore.py some small fix in verify-flags-underscore 2017-08-14 14:55:42 +08:00
verify-generated-device-plugin.sh Create pkg/kubelet/apis/deviceplugin/v1beta1 directory. 2018-02-08 17:04:43 -08:00
verify-generated-docs.sh Remove all traces of federation 2017-10-26 13:37:37 -07:00
verify-generated-files-remake.sh Add debugging to the codegen process 2017-08-25 14:08:42 -07:00
verify-generated-kms.sh Add verify script for kms generated file 2018-02-08 01:29:56 +00:00
verify-generated-protobuf.sh Treat staging repos as authoritative for all files 2018-01-09 15:18:27 -08:00
verify-generated-runtime.sh Increment CRI version from v1alpha1 to v1alpha2 2018-02-07 09:06:26 +01:00
verify-generated-swagger-docs.sh Ignore .import-restrictions when checking against generated docs 2017-10-13 07:09:38 -04:00
verify-godep-licenses.sh Route verify-godep-licenses output to stderr 2018-02-07 21:45:02 -08:00
verify-godeps.sh Enforce OWNERS file in Godeps and vendor dirs 2018-02-15 13:30:30 -08:00
verify-gofmt.sh Route verify-gofmt output to stderr 2018-02-07 21:39:49 -08:00
verify-golint.sh Invert .linted_packages into .golint_failures. 2017-07-17 14:37:40 -07:00
verify-govet.sh Run hack/verify-govet.sh as part of verify make target 2017-06-21 11:10:25 -07:00
verify-import-boss.sh Fixup after k8s.io/{kube-gen -> code-generator} rename 2017-08-17 17:55:12 +02:00
verify-imports.sh import-verifier: use yaml for inline comments 2017-10-25 16:53:26 +02:00
verify-linkcheck.sh
verify-no-vendor-cycles.sh Bugfix: verify-no-vendor-cycles.sh detects wrong cycles 2017-08-01 21:09:53 -07:00
verify-openapi-spec.sh Pipe error message from openapi/swaggerspec verify checks to stderr 2018-02-14 10:31:33 -08:00
verify-pkg-names.sh remove reference to v1alpha1 2017-11-21 13:00:40 -08:00
verify-readonly-packages.sh
verify-staging-godeps.sh Add in godeps verification for hack/lib/ and build/ 2018-01-26 13:29:35 -08:00
verify-swagger-spec.sh Pipe error message from openapi/swaggerspec verify checks to stderr 2018-02-14 10:31:33 -08:00
verify-symbols.sh
verify-test-images.sh
verify-test-owners.sh