diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 8dc22ab5..4edb6245 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -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", diff --git a/README.md b/README.md index e2776a21..7d2ab577 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/artifacts/examples/crd-status-subresource.yaml b/artifacts/examples/crd-status-subresource.yaml new file mode 100644 index 00000000..af74dbc5 --- /dev/null +++ b/artifacts/examples/crd-status-subresource.yaml @@ -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: {} diff --git a/artifacts/examples/crd-validation.yaml b/artifacts/examples/crd-validation.yaml new file mode 100644 index 00000000..36469161 --- /dev/null +++ b/artifacts/examples/crd-validation.yaml @@ -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 diff --git a/artifacts/examples/crd.yaml b/artifacts/examples/crd.yaml index 36469161..4a457068 100644 --- a/artifacts/examples/crd.yaml +++ b/artifacts/examples/crd.yaml @@ -9,12 +9,3 @@ spec: kind: Foo plural: foos scope: Namespaced - validation: - openAPIV3Schema: - properties: - spec: - properties: - replicas: - type: integer - minimum: 1 - maximum: 10 diff --git a/controller.go b/controller.go index a98ff1f9..c3fa44bc 100644 --- a/controller.go +++ b/controller.go @@ -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 } diff --git a/pkg/apis/samplecontroller/v1alpha1/types.go b/pkg/apis/samplecontroller/v1alpha1/types.go index 1f6eb1f9..74ffc672 100644 --- a/pkg/apis/samplecontroller/v1alpha1/types.go +++ b/pkg/apis/samplecontroller/v1alpha1/types.go @@ -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 diff --git a/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/fake/fake_foo.go b/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/fake/fake_foo.go index 23adabb9..b8ae1df3 100644 --- a/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/fake/fake_foo.go +++ b/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/fake/fake_foo.go @@ -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. diff --git a/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/foo.go b/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/foo.go index 6867c7e0..667edf52 100644 --- a/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/foo.go +++ b/pkg/client/clientset/versioned/typed/samplecontroller/v1alpha1/foo.go @@ -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(). diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index 2a133304..b5643795 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -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 } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go index 57d78a09..bf3fd023 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go @@ -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 diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go index f6f7c10d..91920535 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go @@ -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) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go index 9d00f165..cfe819e0 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go @@ -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{}) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 2f6ade2b..6be328f7 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -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 {