diff --git a/federation/registry/cluster/registry.go b/federation/registry/cluster/registry.go index 0cb919ea09b..c1a54436f06 100644 --- a/federation/registry/cluster/registry.go +++ b/federation/registry/cluster/registry.go @@ -68,7 +68,7 @@ func (s *storage) GetCluster(ctx genericapirequest.Context, name string, options } func (s *storage) CreateCluster(ctx genericapirequest.Context, cluster *federation.Cluster) error { - _, err := s.Create(ctx, cluster) + _, err := s.Create(ctx, cluster, false) return err } diff --git a/federation/registry/cluster/strategy.go b/federation/registry/cluster/strategy.go index 4688bc7ecbf..c278fd73905 100644 --- a/federation/registry/cluster/strategy.go +++ b/federation/registry/cluster/strategy.go @@ -48,12 +48,12 @@ func ClusterToSelectableFields(cluster *federation.Cluster) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { cluster, ok := obj.(*federation.Cluster) if !ok { - return nil, nil, fmt.Errorf("given object is not a cluster.") + return nil, nil, false, fmt.Errorf("given object is not a cluster.") } - return labels.Set(cluster.ObjectMeta.Labels), ClusterToSelectableFields(cluster), nil + return labels.Set(cluster.ObjectMeta.Labels), ClusterToSelectableFields(cluster), cluster.Initializers != nil, nil } func MatchCluster(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { diff --git a/pkg/master/thirdparty/thirdparty.go b/pkg/master/thirdparty/thirdparty.go index 50df6f763c8..27788c89486 100644 --- a/pkg/master/thirdparty/thirdparty.go +++ b/pkg/master/thirdparty/thirdparty.go @@ -297,7 +297,7 @@ func (m *ThirdPartyResourceServer) migrateThirdPartyResourceData(gvk schema.Grou // Store CustomResource. obj := &unstructured.Unstructured{Object: objMap} createCtx := request.WithNamespace(ctx, obj.GetNamespace()) - if _, err := storage.Create(createCtx, obj); err != nil { + if _, err := storage.Create(createCtx, obj, false); err != nil { errs = append(errs, fmt.Errorf("can't create CustomResource for TPR data %q: %v", item.Name, err)) continue } diff --git a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go index eaa997206bd..8876a40b42a 100644 --- a/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go +++ b/pkg/registry/admissionregistration/externaladmissionhookconfiguration/strategy.go @@ -106,15 +106,15 @@ func MatchExternalAdmissionHookConfiguration(label labels.Selector, field fields } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { ic, ok := obj.(*admissionregistration.ExternalAdmissionHookConfiguration) if !ok { - return nil, nil, fmt.Errorf("Given object is not a ExternalAdmissionHookConfiguration.") + return nil, nil, false, fmt.Errorf("Given object is not a ExternalAdmissionHookConfiguration.") } - return labels.Set(ic.ObjectMeta.Labels), ExternalAdmissionHookConfigurationToSelectableFields(ic), nil + return labels.Set(ic.ObjectMeta.Labels), ExternalAdmissionHookConfigurationToSelectableFields(ic), ic.Initializers != nil, nil } // ExternalAdmissionHookConfigurationToSelectableFields returns a field set that represents the object. func ExternalAdmissionHookConfigurationToSelectableFields(ic *admissionregistration.ExternalAdmissionHookConfiguration) fields.Set { - return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, true) + return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, false) } diff --git a/pkg/registry/admissionregistration/initializerconfiguration/strategy.go b/pkg/registry/admissionregistration/initializerconfiguration/strategy.go index c872c13bd99..6484e5c70b2 100644 --- a/pkg/registry/admissionregistration/initializerconfiguration/strategy.go +++ b/pkg/registry/admissionregistration/initializerconfiguration/strategy.go @@ -106,15 +106,15 @@ func MatchInitializerConfiguration(label labels.Selector, field fields.Selector) } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { ic, ok := obj.(*admissionregistration.InitializerConfiguration) if !ok { - return nil, nil, fmt.Errorf("Given object is not a InitializerConfiguration.") + return nil, nil, false, fmt.Errorf("Given object is not a InitializerConfiguration.") } - return labels.Set(ic.ObjectMeta.Labels), InitializerConfigurationToSelectableFields(ic), nil + return labels.Set(ic.ObjectMeta.Labels), InitializerConfigurationToSelectableFields(ic), ic.ObjectMeta.Initializers != nil, nil } // InitializerConfigurationToSelectableFields returns a field set that represents the object. func InitializerConfigurationToSelectableFields(ic *admissionregistration.InitializerConfiguration) fields.Set { - return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, true) + return generic.ObjectMetaFieldsSet(&ic.ObjectMeta, false) } diff --git a/pkg/registry/apps/controllerrevision/strategy.go b/pkg/registry/apps/controllerrevision/strategy.go index 86b01fe4339..89cb78ab9e6 100644 --- a/pkg/registry/apps/controllerrevision/strategy.go +++ b/pkg/registry/apps/controllerrevision/strategy.go @@ -90,12 +90,12 @@ func ControllerRevisionToSelectableFields(revision *apps.ControllerRevision) fie } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { history, ok := obj.(*apps.ControllerRevision) if !ok { - return nil, nil, errors.New("supplied object is not an ControllerRevision") + return nil, nil, false, errors.New("supplied object is not an ControllerRevision") } - return labels.Set(history.ObjectMeta.Labels), ControllerRevisionToSelectableFields(history), nil + return labels.Set(history.ObjectMeta.Labels), ControllerRevisionToSelectableFields(history), history.Initializers != nil, nil } // MatchControllerRevision returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/apps/controllerrevision/strategy_test.go b/pkg/registry/apps/controllerrevision/strategy_test.go index 97ce1be419a..bba85db130c 100644 --- a/pkg/registry/apps/controllerrevision/strategy_test.go +++ b/pkg/registry/apps/controllerrevision/strategy_test.go @@ -140,10 +140,13 @@ func TestControllerRevisionToSelectableFields(t *testing.T) { func TestGetAttrs(t *testing.T) { rev := newControllerRevision("validname", "validns", newObject(), 0) - labelSet, fieldSet, err := GetAttrs(rev) + labelSet, fieldSet, uninitialized, err := GetAttrs(rev) if err != nil { t.Fatal(err) } + if uninitialized { + t.Errorf("unexpected attrs") + } if fieldSet.Get("metadata.name") != rev.Name { t.Errorf("expeted %s found %s", rev.Name, fieldSet.Get("metadata.name")) } diff --git a/pkg/registry/apps/statefulset/storage/storage_test.go b/pkg/registry/apps/statefulset/storage/storage_test.go index 070e75781cf..e7d5ac830fa 100644 --- a/pkg/registry/apps/statefulset/storage/storage_test.go +++ b/pkg/registry/apps/statefulset/storage/storage_test.go @@ -42,7 +42,7 @@ func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) // createStatefulSet is a helper function that returns a StatefulSet with the updated resource version. func createStatefulSet(storage *REST, ps apps.StatefulSet, t *testing.T) (apps.StatefulSet, error) { ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), ps.Namespace) - obj, err := storage.Create(ctx, &ps) + obj, err := storage.Create(ctx, &ps, false) if err != nil { t.Errorf("Failed to create StatefulSet, %v", err) } diff --git a/pkg/registry/apps/statefulset/strategy.go b/pkg/registry/apps/statefulset/strategy.go index 3dc2c7031ea..eda0b2a1fe8 100644 --- a/pkg/registry/apps/statefulset/strategy.go +++ b/pkg/registry/apps/statefulset/strategy.go @@ -112,12 +112,12 @@ func StatefulSetToSelectableFields(statefulSet *apps.StatefulSet) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { statefulSet, ok := obj.(*apps.StatefulSet) if !ok { - return nil, nil, fmt.Errorf("given object is not an StatefulSet.") + return nil, nil, false, fmt.Errorf("given object is not an StatefulSet.") } - return labels.Set(statefulSet.ObjectMeta.Labels), StatefulSetToSelectableFields(statefulSet), nil + return labels.Set(statefulSet.ObjectMeta.Labels), StatefulSetToSelectableFields(statefulSet), statefulSet.Initializers != nil, nil } // MatchStatefulSet is the filter used by the generic etcd backend to watch events diff --git a/pkg/registry/authentication/tokenreview/storage.go b/pkg/registry/authentication/tokenreview/storage.go index f1ddd5a1572..0f3d73ac35f 100644 --- a/pkg/registry/authentication/tokenreview/storage.go +++ b/pkg/registry/authentication/tokenreview/storage.go @@ -39,7 +39,7 @@ func (r *REST) New() runtime.Object { return &authentication.TokenReview{} } -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { tokenReview, ok := obj.(*authentication.TokenReview) if !ok { return nil, apierrors.NewBadRequest(fmt.Sprintf("not a TokenReview: %#v", obj)) @@ -76,7 +76,3 @@ func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtim return tokenReview, nil } - -func (r *REST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} diff --git a/pkg/registry/authorization/localsubjectaccessreview/rest.go b/pkg/registry/authorization/localsubjectaccessreview/rest.go index 61d526a39e6..d36f17582e1 100644 --- a/pkg/registry/authorization/localsubjectaccessreview/rest.go +++ b/pkg/registry/authorization/localsubjectaccessreview/rest.go @@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object { return &authorizationapi.LocalSubjectAccessReview{} } -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { localSubjectAccessReview, ok := obj.(*authorizationapi.LocalSubjectAccessReview) if !ok { return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a LocaLocalSubjectAccessReview: %#v", obj)) @@ -69,7 +69,3 @@ func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtim return localSubjectAccessReview, nil } - -func (r *REST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} diff --git a/pkg/registry/authorization/selfsubjectaccessreview/rest.go b/pkg/registry/authorization/selfsubjectaccessreview/rest.go index 1c77f9351bc..4498b5f5a70 100644 --- a/pkg/registry/authorization/selfsubjectaccessreview/rest.go +++ b/pkg/registry/authorization/selfsubjectaccessreview/rest.go @@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object { return &authorizationapi.SelfSubjectAccessReview{} } -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { selfSAR, ok := obj.(*authorizationapi.SelfSubjectAccessReview) if !ok { return nil, apierrors.NewBadRequest(fmt.Sprintf("not a SelfSubjectAccessReview: %#v", obj)) @@ -72,7 +72,3 @@ func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtim return selfSAR, nil } - -func (r *REST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} diff --git a/pkg/registry/authorization/subjectaccessreview/rest.go b/pkg/registry/authorization/subjectaccessreview/rest.go index 3b54f1f4275..1583a32ac04 100644 --- a/pkg/registry/authorization/subjectaccessreview/rest.go +++ b/pkg/registry/authorization/subjectaccessreview/rest.go @@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object { return &authorizationapi.SubjectAccessReview{} } -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { subjectAccessReview, ok := obj.(*authorizationapi.SubjectAccessReview) if !ok { return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a SubjectAccessReview: %#v", obj)) @@ -62,7 +62,3 @@ func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtim return subjectAccessReview, nil } - -func (r *REST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} diff --git a/pkg/registry/authorization/subjectaccessreview/rest_test.go b/pkg/registry/authorization/subjectaccessreview/rest_test.go index bb485b97b98..b278538249b 100644 --- a/pkg/registry/authorization/subjectaccessreview/rest_test.go +++ b/pkg/registry/authorization/subjectaccessreview/rest_test.go @@ -176,7 +176,7 @@ func TestCreate(t *testing.T) { } rest := NewREST(auth) - result, err := rest.Create(genericapirequest.NewContext(), &authorizationapi.SubjectAccessReview{Spec: tc.spec}) + result, err := rest.Create(genericapirequest.NewContext(), &authorizationapi.SubjectAccessReview{Spec: tc.spec}, false) if err != nil { if tc.expectedErr != "" { if !strings.Contains(err.Error(), tc.expectedErr) { diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go b/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go index b6ffc6bde45..e7b05126e18 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go @@ -91,12 +91,12 @@ func AutoscalerToSelectableFields(hpa *autoscaling.HorizontalPodAutoscaler) fiel } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { hpa, ok := obj.(*autoscaling.HorizontalPodAutoscaler) if !ok { - return nil, nil, fmt.Errorf("given object is not a horizontal pod autoscaler.") + return nil, nil, false, fmt.Errorf("given object is not a horizontal pod autoscaler.") } - return labels.Set(hpa.ObjectMeta.Labels), AutoscalerToSelectableFields(hpa), nil + return labels.Set(hpa.ObjectMeta.Labels), AutoscalerToSelectableFields(hpa), hpa.Initializers != nil, nil } func MatchAutoscaler(label labels.Selector, field fields.Selector) storage.SelectionPredicate { diff --git a/pkg/registry/batch/cronjob/strategy.go b/pkg/registry/batch/cronjob/strategy.go index c85eebb1e59..a78b9176d4d 100644 --- a/pkg/registry/batch/cronjob/strategy.go +++ b/pkg/registry/batch/cronjob/strategy.go @@ -112,12 +112,12 @@ func CronJobToSelectableFields(cronJob *batch.CronJob) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { cronJob, ok := obj.(*batch.CronJob) if !ok { - return nil, nil, fmt.Errorf("Given object is not a scheduled job.") + return nil, nil, false, fmt.Errorf("given object is not a scheduled job.") } - return labels.Set(cronJob.ObjectMeta.Labels), CronJobToSelectableFields(cronJob), nil + return labels.Set(cronJob.ObjectMeta.Labels), CronJobToSelectableFields(cronJob), cronJob.Initializers != nil, nil } // MatchCronJob is the filter used by the generic etcd backend to route diff --git a/pkg/registry/batch/job/strategy.go b/pkg/registry/batch/job/strategy.go index 4bfdb3213f8..d0192700167 100644 --- a/pkg/registry/batch/job/strategy.go +++ b/pkg/registry/batch/job/strategy.go @@ -174,12 +174,12 @@ func JobToSelectableFields(job *batch.Job) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { job, ok := obj.(*batch.Job) if !ok { - return nil, nil, fmt.Errorf("Given object is not a job.") + return nil, nil, false, fmt.Errorf("given object is not a job.") } - return labels.Set(job.ObjectMeta.Labels), JobToSelectableFields(job), nil + return labels.Set(job.ObjectMeta.Labels), JobToSelectableFields(job), job.Initializers != nil, nil } // MatchJob is the filter used by the generic etcd backend to route diff --git a/pkg/registry/certificates/certificates/registry.go b/pkg/registry/certificates/certificates/registry.go index 05d3bb63a59..bff6e9dfb89 100644 --- a/pkg/registry/certificates/certificates/registry.go +++ b/pkg/registry/certificates/certificates/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListCSRs(ctx genericapirequest.Context, options *metainternalv } func (s *storage) CreateCSR(ctx genericapirequest.Context, csr *certificates.CertificateSigningRequest) error { - _, err := s.Create(ctx, csr) + _, err := s.Create(ctx, csr, false) return err } diff --git a/pkg/registry/certificates/certificates/strategy.go b/pkg/registry/certificates/certificates/strategy.go index e8b625de737..15a3794e6f7 100644 --- a/pkg/registry/certificates/certificates/strategy.go +++ b/pkg/registry/certificates/certificates/strategy.go @@ -178,12 +178,12 @@ func (csrApprovalStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, ol } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { sa, ok := obj.(*certificates.CertificateSigningRequest) if !ok { - return nil, nil, fmt.Errorf("not a CertificateSigningRequest") + return nil, nil, false, fmt.Errorf("not a CertificateSigningRequest") } - return labels.Set(sa.Labels), SelectableFields(sa), nil + return labels.Set(sa.Labels), SelectableFields(sa), sa.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/configmap/registry.go b/pkg/registry/core/configmap/registry.go index 1d4c9c6f623..c5e8fcab939 100644 --- a/pkg/registry/core/configmap/registry.go +++ b/pkg/registry/core/configmap/registry.go @@ -69,7 +69,7 @@ func (s *storage) GetConfigMap(ctx genericapirequest.Context, name string, optio } func (s *storage) CreateConfigMap(ctx genericapirequest.Context, cfg *api.ConfigMap) (*api.ConfigMap, error) { - obj, err := s.Create(ctx, cfg) + obj, err := s.Create(ctx, cfg, false) if err != nil { return nil, err } diff --git a/pkg/registry/core/configmap/strategy.go b/pkg/registry/core/configmap/strategy.go index 2e45c2bb708..abb663882fd 100644 --- a/pkg/registry/core/configmap/strategy.go +++ b/pkg/registry/core/configmap/strategy.go @@ -91,12 +91,12 @@ func ConfigMapToSelectableFields(cfg *api.ConfigMap) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { cfg, ok := obj.(*api.ConfigMap) if !ok { - return nil, nil, fmt.Errorf("given object is not a ConfigMap") + return nil, nil, false, fmt.Errorf("given object is not a ConfigMap") } - return labels.Set(cfg.ObjectMeta.Labels), ConfigMapToSelectableFields(cfg), nil + return labels.Set(cfg.ObjectMeta.Labels), ConfigMapToSelectableFields(cfg), cfg.Initializers != nil, nil } // MatchConfigMap returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/endpoint/strategy.go b/pkg/registry/core/endpoint/strategy.go index d095eca276d..c50894b2e69 100644 --- a/pkg/registry/core/endpoint/strategy.go +++ b/pkg/registry/core/endpoint/strategy.go @@ -82,12 +82,12 @@ func (endpointsStrategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { endpoints, ok := obj.(*api.Endpoints) if !ok { - return nil, nil, fmt.Errorf("invalid object type %#v", obj) + return nil, nil, false, fmt.Errorf("invalid object type %#v", obj) } - return endpoints.Labels, EndpointsToSelectableFields(endpoints), nil + return endpoints.Labels, EndpointsToSelectableFields(endpoints), endpoints.Initializers != nil, nil } // MatchEndpoints returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/event/strategy.go b/pkg/registry/core/event/strategy.go index 924dc795ee6..77ea252b482 100644 --- a/pkg/registry/core/event/strategy.go +++ b/pkg/registry/core/event/strategy.go @@ -73,12 +73,12 @@ func (eventStrategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { event, ok := obj.(*api.Event) if !ok { - return nil, nil, fmt.Errorf("not an event") + return nil, nil, false, fmt.Errorf("not an event") } - return labels.Set(event.Labels), EventToSelectableFields(event), nil + return labels.Set(event.Labels), EventToSelectableFields(event), event.Initializers != nil, nil } func MatchEvent(label labels.Selector, field fields.Selector) storage.SelectionPredicate { diff --git a/pkg/registry/core/limitrange/strategy.go b/pkg/registry/core/limitrange/strategy.go index 24bb511cbdc..7f49d635a4f 100644 --- a/pkg/registry/core/limitrange/strategy.go +++ b/pkg/registry/core/limitrange/strategy.go @@ -88,12 +88,12 @@ func (limitrangeStrategy) Export(genericapirequest.Context, runtime.Object, bool } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { lr, ok := obj.(*api.LimitRange) if !ok { - return nil, nil, fmt.Errorf("given object is not a limit range.") + return nil, nil, false, fmt.Errorf("given object is not a limit range.") } - return labels.Set(lr.ObjectMeta.Labels), LimitRangeToSelectableFields(lr), nil + return labels.Set(lr.ObjectMeta.Labels), LimitRangeToSelectableFields(lr), lr.Initializers != nil, nil } func MatchLimitRange(label labels.Selector, field fields.Selector) storage.SelectionPredicate { diff --git a/pkg/registry/core/namespace/registry.go b/pkg/registry/core/namespace/registry.go index dc5d422df55..e71282515a2 100644 --- a/pkg/registry/core/namespace/registry.go +++ b/pkg/registry/core/namespace/registry.go @@ -67,7 +67,7 @@ func (s *storage) GetNamespace(ctx genericapirequest.Context, namespaceName stri } func (s *storage) CreateNamespace(ctx genericapirequest.Context, namespace *api.Namespace) error { - _, err := s.Create(ctx, namespace) + _, err := s.Create(ctx, namespace, false) return err } diff --git a/pkg/registry/core/namespace/storage/storage.go b/pkg/registry/core/namespace/storage/storage.go index 1d41ec1accd..f1c7ffc2df2 100644 --- a/pkg/registry/core/namespace/storage/storage.go +++ b/pkg/registry/core/namespace/storage/storage.go @@ -92,8 +92,8 @@ func (r *REST) List(ctx genericapirequest.Context, options *metainternalversion. return r.store.List(ctx, options) } -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.store.Create(ctx, obj) +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { + return r.store.Create(ctx, obj, includeUninitialized) } func (r *REST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { diff --git a/pkg/registry/core/namespace/storage/storage_test.go b/pkg/registry/core/namespace/storage/storage_test.go index bae2ca9eaaa..fdc57efe2b8 100644 --- a/pkg/registry/core/namespace/storage/storage_test.go +++ b/pkg/registry/core/namespace/storage/storage_test.go @@ -67,7 +67,7 @@ func TestCreateSetsFields(t *testing.T) { defer storage.store.DestroyFunc() namespace := validNewNamespace() ctx := genericapirequest.NewContext() - _, err := storage.Create(ctx, namespace) + _, err := storage.Create(ctx, namespace, false) if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/registry/core/namespace/strategy.go b/pkg/registry/core/namespace/strategy.go index 6826bdfcc13..e0d05b18f8e 100644 --- a/pkg/registry/core/namespace/strategy.go +++ b/pkg/registry/core/namespace/strategy.go @@ -138,12 +138,12 @@ func (namespaceFinalizeStrategy) PrepareForUpdate(ctx genericapirequest.Context, } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { namespaceObj, ok := obj.(*api.Namespace) if !ok { - return nil, nil, fmt.Errorf("not a namespace") + return nil, nil, false, fmt.Errorf("not a namespace") } - return labels.Set(namespaceObj.Labels), NamespaceToSelectableFields(namespaceObj), nil + return labels.Set(namespaceObj.Labels), NamespaceToSelectableFields(namespaceObj), namespaceObj.Initializers != nil, nil } // MatchNamespace returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/node/registry.go b/pkg/registry/core/node/registry.go index 2fab505dbbe..1e064fef510 100644 --- a/pkg/registry/core/node/registry.go +++ b/pkg/registry/core/node/registry.go @@ -56,7 +56,7 @@ func (s *storage) ListNodes(ctx genericapirequest.Context, options *metainternal } func (s *storage) CreateNode(ctx genericapirequest.Context, node *api.Node) error { - _, err := s.Create(ctx, node) + _, err := s.Create(ctx, node, false) return err } diff --git a/pkg/registry/core/node/strategy.go b/pkg/registry/core/node/strategy.go index e023364d756..16eea39e8e1 100644 --- a/pkg/registry/core/node/strategy.go +++ b/pkg/registry/core/node/strategy.go @@ -148,12 +148,12 @@ func NodeToSelectableFields(node *api.Node) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { nodeObj, ok := obj.(*api.Node) if !ok { - return nil, nil, fmt.Errorf("not a node") + return nil, nil, false, fmt.Errorf("not a node") } - return labels.Set(nodeObj.ObjectMeta.Labels), NodeToSelectableFields(nodeObj), nil + return labels.Set(nodeObj.ObjectMeta.Labels), NodeToSelectableFields(nodeObj), nodeObj.Initializers != nil, nil } // MatchNode returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/persistentvolume/strategy.go b/pkg/registry/core/persistentvolume/strategy.go index 4d40ec5be8d..33dfd905f75 100644 --- a/pkg/registry/core/persistentvolume/strategy.go +++ b/pkg/registry/core/persistentvolume/strategy.go @@ -102,12 +102,12 @@ func (persistentvolumeStatusStrategy) ValidateUpdate(ctx genericapirequest.Conte } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { persistentvolumeObj, ok := obj.(*api.PersistentVolume) if !ok { - return nil, nil, fmt.Errorf("not a persistentvolume") + return nil, nil, false, fmt.Errorf("not a persistentvolume") } - return labels.Set(persistentvolumeObj.Labels), PersistentVolumeToSelectableFields(persistentvolumeObj), nil + return labels.Set(persistentvolumeObj.Labels), PersistentVolumeToSelectableFields(persistentvolumeObj), persistentvolumeObj.Initializers != nil, nil } // MatchPersistentVolume returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/persistentvolumeclaim/strategy.go b/pkg/registry/core/persistentvolumeclaim/strategy.go index 386ed5c196a..c653d505c8e 100644 --- a/pkg/registry/core/persistentvolumeclaim/strategy.go +++ b/pkg/registry/core/persistentvolumeclaim/strategy.go @@ -98,12 +98,12 @@ func (persistentvolumeclaimStatusStrategy) ValidateUpdate(ctx genericapirequest. } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { persistentvolumeclaimObj, ok := obj.(*api.PersistentVolumeClaim) if !ok { - return nil, nil, fmt.Errorf("not a persistentvolumeclaim") + return nil, nil, false, fmt.Errorf("not a persistentvolumeclaim") } - return labels.Set(persistentvolumeclaimObj.Labels), PersistentVolumeClaimToSelectableFields(persistentvolumeclaimObj), nil + return labels.Set(persistentvolumeclaimObj.Labels), PersistentVolumeClaimToSelectableFields(persistentvolumeclaimObj), persistentvolumeclaimObj.Initializers != nil, nil } // MatchPersistentVolumeClaim returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/pod/storage/eviction.go b/pkg/registry/core/pod/storage/eviction.go index acda808a0df..2c2d522bb91 100644 --- a/pkg/registry/core/pod/storage/eviction.go +++ b/pkg/registry/core/pod/storage/eviction.go @@ -71,7 +71,7 @@ func (r *EvictionREST) New() runtime.Object { } // Create attempts to create a new eviction. That is, it tries to evict a pod. -func (r *EvictionREST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *EvictionREST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { eviction := obj.(*policy.Eviction) obj, err := r.store.Get(ctx, eviction.Name, &metav1.GetOptions{}) @@ -145,11 +145,6 @@ func (r *EvictionREST) Create(ctx genericapirequest.Context, obj runtime.Object) return &metav1.Status{Status: metav1.StatusSuccess}, nil } -// CreateInitialized will ensure the pod is evicted. -func (r *EvictionREST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} - // checkAndDecrement checks if the provided PodDisruptionBudget allows any disruption. func (r *EvictionREST) checkAndDecrement(namespace string, podName string, pdb policy.PodDisruptionBudget) (ok bool, err error) { if pdb.Status.ObservedGeneration < pdb.Generation { diff --git a/pkg/registry/core/pod/storage/storage.go b/pkg/registry/core/pod/storage/storage.go index 79964908ddb..0e1a7d61bec 100644 --- a/pkg/registry/core/pod/storage/storage.go +++ b/pkg/registry/core/pod/storage/storage.go @@ -130,7 +130,7 @@ func (r *BindingREST) New() runtime.Object { var _ = rest.Creater(&BindingREST{}) // Create ensures a pod is bound to a specific host. -func (r *BindingREST) Create(ctx genericapirequest.Context, obj runtime.Object) (out runtime.Object, err error) { +func (r *BindingREST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (out runtime.Object, err error) { binding := obj.(*api.Binding) // TODO: move me to a binding strategy @@ -143,11 +143,6 @@ func (r *BindingREST) Create(ctx genericapirequest.Context, obj runtime.Object) return } -// CreateInitialized will ensure the pod is bound. -func (r *BindingREST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} - // setPodHostAndAnnotations sets the given pod's host to 'machine' if and only if it was // previously 'oldMachine' and merges the provided annotations with those of the pod. // Returns the current state of the pod, or an error. diff --git a/pkg/registry/core/pod/storage/storage_test.go b/pkg/registry/core/pod/storage/storage_test.go index 726d19afa03..d096a1ce4ba 100644 --- a/pkg/registry/core/pod/storage/storage_test.go +++ b/pkg/registry/core/pod/storage/storage_test.go @@ -185,7 +185,7 @@ func TestIgnoreDeleteNotFound(t *testing.T) { } // create pod - _, err = registry.Create(testContext, pod) + _, err = registry.Create(testContext, pod, false) if err != nil { t.Errorf("Unexpected error: %v", err) } @@ -222,7 +222,7 @@ func TestCreateSetsFields(t *testing.T) { defer server.Terminate(t) defer storage.Store.DestroyFunc() pod := validNewPod() - _, err := storage.Create(genericapirequest.NewDefaultContext(), pod) + _, err := storage.Create(genericapirequest.NewDefaultContext(), pod, false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -486,7 +486,7 @@ func TestEtcdCreate(t *testing.T) { defer server.Terminate(t) defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() - _, err := storage.Create(ctx, validNewPod()) + _, err := storage.Create(ctx, validNewPod(), false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -495,7 +495,7 @@ func TestEtcdCreate(t *testing.T) { _, err = bindingStorage.Create(ctx, &api.Binding{ ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, Target: api.ObjectReference{Name: "machine"}, - }) + }, false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -521,7 +521,7 @@ func TestEtcdCreateBindingNoPod(t *testing.T) { _, err := bindingStorage.Create(ctx, &api.Binding{ ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, Target: api.ObjectReference{Name: "machine"}, - }) + }, false) if err == nil { t.Fatalf("Expected not-found-error but got nothing") } @@ -544,7 +544,7 @@ func TestEtcdCreateFailsWithoutNamespace(t *testing.T) { defer storage.Store.DestroyFunc() pod := validNewPod() pod.Namespace = "" - _, err := storage.Create(genericapirequest.NewContext(), pod) + _, err := storage.Create(genericapirequest.NewContext(), pod, false) // Accept "namespace" or "Namespace". if err == nil || !strings.Contains(err.Error(), "amespace") { t.Fatalf("expected error that namespace was missing from context, got: %v", err) @@ -556,7 +556,7 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) { defer server.Terminate(t) defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() - _, err := storage.Create(ctx, validNewPod()) + _, err := storage.Create(ctx, validNewPod(), false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -569,7 +569,7 @@ func TestEtcdCreateWithContainersNotFound(t *testing.T) { Annotations: map[string]string{"label1": "value1"}, }, Target: api.ObjectReference{Name: "machine"}, - }) + }, false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -591,7 +591,7 @@ func TestEtcdCreateWithConflict(t *testing.T) { defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() - _, err := storage.Create(ctx, validNewPod()) + _, err := storage.Create(ctx, validNewPod(), false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -605,12 +605,12 @@ func TestEtcdCreateWithConflict(t *testing.T) { }, Target: api.ObjectReference{Name: "machine"}, } - _, err = bindingStorage.Create(ctx, &binding) + _, err = bindingStorage.Create(ctx, &binding, false) if err != nil { t.Fatalf("unexpected error: %v", err) } - _, err = bindingStorage.Create(ctx, &binding) + _, err = bindingStorage.Create(ctx, &binding, false) if err == nil || !errors.IsConflict(err) { t.Fatalf("expected resource conflict error, not: %v", err) } @@ -621,7 +621,7 @@ func TestEtcdCreateWithExistingContainers(t *testing.T) { defer server.Terminate(t) defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() - _, err := storage.Create(ctx, validNewPod()) + _, err := storage.Create(ctx, validNewPod(), false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -630,7 +630,7 @@ func TestEtcdCreateWithExistingContainers(t *testing.T) { _, err = bindingStorage.Create(ctx, &api.Binding{ ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "foo"}, Target: api.ObjectReference{Name: "machine"}, - }) + }, false) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -680,10 +680,10 @@ func TestEtcdCreateBinding(t *testing.T) { for k, test := range testCases { storage, bindingStorage, _, server := newStorage(t) - if _, err := storage.Create(ctx, validNewPod()); err != nil { + if _, err := storage.Create(ctx, validNewPod(), false); err != nil { t.Fatalf("%s: unexpected error: %v", k, err) } - if _, err := bindingStorage.Create(ctx, &test.binding); !test.errOK(err) { + if _, err := bindingStorage.Create(ctx, &test.binding, false); !test.errOK(err) { t.Errorf("%s: unexpected error: %v", k, err) } else if err == nil { // If bind succeeded, verify Host field in pod's Spec. @@ -705,7 +705,7 @@ func TestEtcdUpdateNotScheduled(t *testing.T) { defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() - if _, err := storage.Create(ctx, validNewPod()); err != nil { + if _, err := storage.Create(ctx, validNewPod(), false); err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/registry/core/pod/strategy.go b/pkg/registry/core/pod/strategy.go index 60fd93fed6e..00a3c4f991e 100644 --- a/pkg/registry/core/pod/strategy.go +++ b/pkg/registry/core/pod/strategy.go @@ -165,12 +165,12 @@ func (podStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { pod, ok := obj.(*api.Pod) if !ok { - return nil, nil, fmt.Errorf("not a pod") + return nil, nil, false, fmt.Errorf("not a pod") } - return labels.Set(pod.ObjectMeta.Labels), PodToSelectableFields(pod), nil + return labels.Set(pod.ObjectMeta.Labels), PodToSelectableFields(pod), pod.Initializers != nil, nil } // MatchPod returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/podtemplate/strategy.go b/pkg/registry/core/podtemplate/strategy.go index 5f925daece3..87012c541cb 100644 --- a/pkg/registry/core/podtemplate/strategy.go +++ b/pkg/registry/core/podtemplate/strategy.go @@ -89,12 +89,12 @@ func PodTemplateToSelectableFields(podTemplate *api.PodTemplate) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { pt, ok := obj.(*api.PodTemplate) if !ok { - return nil, nil, fmt.Errorf("given object is not a pod template.") + return nil, nil, false, fmt.Errorf("given object is not a pod template.") } - return labels.Set(pt.ObjectMeta.Labels), PodTemplateToSelectableFields(pt), nil + return labels.Set(pt.ObjectMeta.Labels), PodTemplateToSelectableFields(pt), pt.Initializers != nil, nil } func MatchPodTemplate(label labels.Selector, field fields.Selector) storage.SelectionPredicate { diff --git a/pkg/registry/core/replicationcontroller/registry.go b/pkg/registry/core/replicationcontroller/registry.go index 02eff75fe7f..df0d7418d02 100644 --- a/pkg/registry/core/replicationcontroller/registry.go +++ b/pkg/registry/core/replicationcontroller/registry.go @@ -74,7 +74,7 @@ func (s *storage) GetController(ctx genericapirequest.Context, controllerID stri } func (s *storage) CreateController(ctx genericapirequest.Context, controller *api.ReplicationController) (*api.ReplicationController, error) { - obj, err := s.Create(ctx, controller) + obj, err := s.Create(ctx, controller, false) if err != nil { return nil, err } diff --git a/pkg/registry/core/replicationcontroller/storage/storage_test.go b/pkg/registry/core/replicationcontroller/storage/storage_test.go index ea102580a3e..258676fdc4c 100644 --- a/pkg/registry/core/replicationcontroller/storage/storage_test.go +++ b/pkg/registry/core/replicationcontroller/storage/storage_test.go @@ -55,7 +55,7 @@ func newStorage(t *testing.T) (ControllerStorage, *etcdtesting.EtcdTestServer) { // createController is a helper function that returns a controller with the updated resource version. func createController(storage *REST, rc api.ReplicationController, t *testing.T) (api.ReplicationController, error) { ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), rc.Namespace) - obj, err := storage.Create(ctx, &rc) + obj, err := storage.Create(ctx, &rc, false) if err != nil { t.Errorf("Failed to create controller, %v", err) } diff --git a/pkg/registry/core/replicationcontroller/strategy.go b/pkg/registry/core/replicationcontroller/strategy.go index d3ff54cf8b1..fd19c5d49ac 100644 --- a/pkg/registry/core/replicationcontroller/strategy.go +++ b/pkg/registry/core/replicationcontroller/strategy.go @@ -145,12 +145,12 @@ func ControllerToSelectableFields(controller *api.ReplicationController) fields. } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { rc, ok := obj.(*api.ReplicationController) if !ok { - return nil, nil, fmt.Errorf("Given object is not a replication controller.") + return nil, nil, false, fmt.Errorf("given object is not a replication controller.") } - return labels.Set(rc.ObjectMeta.Labels), ControllerToSelectableFields(rc), nil + return labels.Set(rc.ObjectMeta.Labels), ControllerToSelectableFields(rc), rc.Initializers != nil, nil } // MatchController is the filter used by the generic etcd backend to route diff --git a/pkg/registry/core/resourcequota/storage/storage_test.go b/pkg/registry/core/resourcequota/storage/storage_test.go index d5c17781313..d9a47659324 100644 --- a/pkg/registry/core/resourcequota/storage/storage_test.go +++ b/pkg/registry/core/resourcequota/storage/storage_test.go @@ -87,7 +87,7 @@ func TestCreateSetsFields(t *testing.T) { defer storage.Store.DestroyFunc() ctx := genericapirequest.NewDefaultContext() resourcequota := validNewResourceQuota() - _, err := storage.Create(genericapirequest.NewDefaultContext(), resourcequota) + _, err := storage.Create(genericapirequest.NewDefaultContext(), resourcequota, false) if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/pkg/registry/core/resourcequota/strategy.go b/pkg/registry/core/resourcequota/strategy.go index 252567d625f..6211e8f4bb0 100644 --- a/pkg/registry/core/resourcequota/strategy.go +++ b/pkg/registry/core/resourcequota/strategy.go @@ -101,12 +101,12 @@ func (resourcequotaStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { resourcequotaObj, ok := obj.(*api.ResourceQuota) if !ok { - return nil, nil, fmt.Errorf("not a resourcequota") + return nil, nil, false, fmt.Errorf("not a resourcequota") } - return labels.Set(resourcequotaObj.Labels), ResourceQuotaToSelectableFields(resourcequotaObj), nil + return labels.Set(resourcequotaObj.Labels), ResourceQuotaToSelectableFields(resourcequotaObj), resourcequotaObj.Initializers != nil, nil } // MatchResourceQuota returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/secret/registry.go b/pkg/registry/core/secret/registry.go index 21ecbc6d09f..cfe8d98569e 100644 --- a/pkg/registry/core/secret/registry.go +++ b/pkg/registry/core/secret/registry.go @@ -67,7 +67,7 @@ func (s *storage) GetSecret(ctx genericapirequest.Context, name string, options } func (s *storage) CreateSecret(ctx genericapirequest.Context, secret *api.Secret) (*api.Secret, error) { - obj, err := s.Create(ctx, secret) + obj, err := s.Create(ctx, secret, false) return obj.(*api.Secret), err } diff --git a/pkg/registry/core/secret/strategy.go b/pkg/registry/core/secret/strategy.go index 9e0236b3b12..59150c6402d 100644 --- a/pkg/registry/core/secret/strategy.go +++ b/pkg/registry/core/secret/strategy.go @@ -97,12 +97,12 @@ func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exac } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { secret, ok := obj.(*api.Secret) if !ok { - return nil, nil, fmt.Errorf("not a secret") + return nil, nil, false, fmt.Errorf("not a secret") } - return labels.Set(secret.Labels), SelectableFields(secret), nil + return labels.Set(secret.Labels), SelectableFields(secret), secret.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/core/service/registry.go b/pkg/registry/core/service/registry.go index e37afb50074..0b7dad98bb0 100644 --- a/pkg/registry/core/service/registry.go +++ b/pkg/registry/core/service/registry.go @@ -58,7 +58,7 @@ func (s *storage) ListServices(ctx genericapirequest.Context, options *metainter } func (s *storage) CreateService(ctx genericapirequest.Context, svc *api.Service) (*api.Service, error) { - obj, err := s.Create(ctx, svc) + obj, err := s.Create(ctx, svc, false) if err != nil { return nil, err } diff --git a/pkg/registry/core/service/rest.go b/pkg/registry/core/service/rest.go index cc8ec6472e6..a369708579d 100644 --- a/pkg/registry/core/service/rest.go +++ b/pkg/registry/core/service/rest.go @@ -77,7 +77,8 @@ func NewStorage(registry Registry, endpoints endpoint.Registry, serviceIPs ipall } } -func (rs *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +// TODO: implement includeUninitialized by refactoring this to move to store +func (rs *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { service := obj.(*api.Service) if err := rest.BeforeCreate(Strategy, ctx, obj); err != nil { @@ -192,11 +193,6 @@ func (rs *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runti return out, err } -// TODO: fix services to support initialization by using generic.Store -func (rs *REST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return rs.Create(ctx, obj) -} - func (rs *REST) Delete(ctx genericapirequest.Context, id string) (runtime.Object, error) { service, err := rs.registry.GetService(ctx, id, &metav1.GetOptions{}) if err != nil { diff --git a/pkg/registry/core/service/rest_test.go b/pkg/registry/core/service/rest_test.go index ebd863c3732..511be537859 100644 --- a/pkg/registry/core/service/rest_test.go +++ b/pkg/registry/core/service/rest_test.go @@ -101,7 +101,7 @@ func TestServiceRegistryCreate(t *testing.T) { }, } ctx := genericapirequest.NewDefaultContext() - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -225,7 +225,7 @@ func TestServiceRegistryCreateMultiNodePortsService(t *testing.T) { ctx := genericapirequest.NewDefaultContext() for _, test := range testCases { - created_svc, err := storage.Create(ctx, test.svc) + created_svc, err := storage.Create(ctx, test.svc, false) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -296,7 +296,7 @@ func TestServiceStorageValidatesCreate(t *testing.T) { } ctx := genericapirequest.NewDefaultContext() for _, failureCase := range failureCases { - c, err := storage.Create(ctx, &failureCase) + c, err := storage.Create(ctx, &failureCase, false) if c != nil { t.Errorf("Expected nil object") } @@ -425,7 +425,7 @@ func TestServiceRegistryExternalService(t *testing.T) { }}, }, } - _, err := storage.Create(ctx, svc) + _, err := storage.Create(ctx, svc, false) if err != nil { t.Errorf("Failed to create service: %#v", err) } @@ -500,7 +500,7 @@ func TestServiceRegistryUpdateExternalService(t *testing.T) { }}, }, } - if _, err := storage.Create(ctx, svc1); err != nil { + if _, err := storage.Create(ctx, svc1, false); err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -543,7 +543,7 @@ func TestServiceRegistryUpdateMultiPortExternalService(t *testing.T) { }}, }, } - if _, err := storage.Create(ctx, svc1); err != nil { + if _, err := storage.Create(ctx, svc1, false); err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -740,7 +740,7 @@ func TestServiceRegistryIPAllocation(t *testing.T) { }, } ctx := genericapirequest.NewDefaultContext() - created_svc1, _ := storage.Create(ctx, svc1) + created_svc1, _ := storage.Create(ctx, svc1, false) created_service_1 := created_svc1.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) @@ -762,7 +762,7 @@ func TestServiceRegistryIPAllocation(t *testing.T) { }}, }} ctx = genericapirequest.NewDefaultContext() - created_svc2, _ := storage.Create(ctx, svc2) + created_svc2, _ := storage.Create(ctx, svc2, false) created_service_2 := created_svc2.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) @@ -795,7 +795,7 @@ func TestServiceRegistryIPAllocation(t *testing.T) { }, } ctx = genericapirequest.NewDefaultContext() - created_svc3, err := storage.Create(ctx, svc3) + created_svc3, err := storage.Create(ctx, svc3, false) if err != nil { t.Fatal(err) } @@ -822,7 +822,7 @@ func TestServiceRegistryIPReallocation(t *testing.T) { }, } ctx := genericapirequest.NewDefaultContext() - created_svc1, _ := storage.Create(ctx, svc1) + created_svc1, _ := storage.Create(ctx, svc1, false) created_service_1 := created_svc1.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) @@ -850,7 +850,7 @@ func TestServiceRegistryIPReallocation(t *testing.T) { }, } ctx = genericapirequest.NewDefaultContext() - created_svc2, _ := storage.Create(ctx, svc2) + created_svc2, _ := storage.Create(ctx, svc2, false) created_service_2 := created_svc2.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) @@ -877,7 +877,7 @@ func TestServiceRegistryIPUpdate(t *testing.T) { }, } ctx := genericapirequest.NewDefaultContext() - created_svc, _ := storage.Create(ctx, svc) + created_svc, _ := storage.Create(ctx, svc, false) created_service := created_svc.(*api.Service) if created_service.Spec.Ports[0].Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Ports[0].Port) @@ -931,7 +931,7 @@ func TestServiceRegistryIPLoadBalancer(t *testing.T) { }, } ctx := genericapirequest.NewDefaultContext() - created_svc, _ := storage.Create(ctx, svc) + created_svc, _ := storage.Create(ctx, svc, false) created_service := created_svc.(*api.Service) if created_service.Spec.Ports[0].Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Ports[0].Port) @@ -985,7 +985,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocation(t *testing. ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeLocal, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Errorf("Unexpected failure creating service %v", err) } @@ -1023,7 +1023,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortAllocationBeta(t *test }}, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Errorf("Unexpected failure creating service %v", err) } @@ -1059,7 +1059,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocation(t *test HealthCheckNodePort: randomNodePort, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Fatalf("Unexpected failure creating service :%v", err) } @@ -1101,7 +1101,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortUserAllocationBeta(t * }}, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Fatalf("Unexpected failure creating service :%v", err) } @@ -1137,7 +1137,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortNegative(t *testing.T) HealthCheckNodePort: int32(-1), }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { return } @@ -1167,7 +1167,7 @@ func TestServiceRegistryExternalTrafficHealthCheckNodePortNegativeBeta(t *testin }}, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { return } @@ -1192,7 +1192,7 @@ func TestServiceRegistryExternalTrafficGlobal(t *testing.T) { ExternalTrafficPolicy: api.ServiceExternalTrafficPolicyTypeGlobal, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Errorf("Unexpected failure creating service %v", err) } @@ -1229,7 +1229,7 @@ func TestServiceRegistryExternalTrafficGlobalBeta(t *testing.T) { }}, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Errorf("Unexpected failure creating service %v", err) } @@ -1265,7 +1265,7 @@ func TestServiceRegistryExternalTrafficAnnotationClusterIP(t *testing.T) { }}, }, } - created_svc, err := storage.Create(ctx, svc) + created_svc, err := storage.Create(ctx, svc, false) if created_svc == nil || err != nil { t.Errorf("Unexpected failure creating service %v", err) } diff --git a/pkg/registry/core/service/strategy.go b/pkg/registry/core/service/strategy.go index e01920ece65..7736f6c2cce 100644 --- a/pkg/registry/core/service/strategy.go +++ b/pkg/registry/core/service/strategy.go @@ -104,12 +104,12 @@ func (svcStrategy) Export(ctx genericapirequest.Context, obj runtime.Object, exa } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { service, ok := obj.(*api.Service) if !ok { - return nil, nil, fmt.Errorf("Given object is not a service") + return nil, nil, false, fmt.Errorf("given object is not a service") } - return labels.Set(service.ObjectMeta.Labels), ServiceToSelectableFields(service), nil + return labels.Set(service.ObjectMeta.Labels), ServiceToSelectableFields(service), service.Initializers != nil, nil } func MatchServices(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { diff --git a/pkg/registry/core/serviceaccount/registry.go b/pkg/registry/core/serviceaccount/registry.go index 0a733d5a808..4fa100244ff 100644 --- a/pkg/registry/core/serviceaccount/registry.go +++ b/pkg/registry/core/serviceaccount/registry.go @@ -67,7 +67,7 @@ func (s *storage) GetServiceAccount(ctx genericapirequest.Context, name string, } func (s *storage) CreateServiceAccount(ctx genericapirequest.Context, serviceAccount *api.ServiceAccount) error { - _, err := s.Create(ctx, serviceAccount) + _, err := s.Create(ctx, serviceAccount, false) return err } diff --git a/pkg/registry/core/serviceaccount/strategy.go b/pkg/registry/core/serviceaccount/strategy.go index 40a3f7d94d9..2ff37ecd94a 100644 --- a/pkg/registry/core/serviceaccount/strategy.go +++ b/pkg/registry/core/serviceaccount/strategy.go @@ -80,12 +80,12 @@ func (strategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { sa, ok := obj.(*api.ServiceAccount) if !ok { - return nil, nil, fmt.Errorf("not a serviceaccount") + return nil, nil, false, fmt.Errorf("not a serviceaccount") } - return labels.Set(sa.Labels), SelectableFields(sa), nil + return labels.Set(sa.Labels), SelectableFields(sa), sa.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/extensions/daemonset/strategy.go b/pkg/registry/extensions/daemonset/strategy.go index cc06e0a9cb0..80e03dc1665 100644 --- a/pkg/registry/extensions/daemonset/strategy.go +++ b/pkg/registry/extensions/daemonset/strategy.go @@ -131,12 +131,12 @@ func DaemonSetToSelectableFields(daemon *extensions.DaemonSet) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { ds, ok := obj.(*extensions.DaemonSet) if !ok { - return nil, nil, fmt.Errorf("given object is not a ds.") + return nil, nil, false, fmt.Errorf("given object is not a ds.") } - return labels.Set(ds.ObjectMeta.Labels), DaemonSetToSelectableFields(ds), nil + return labels.Set(ds.ObjectMeta.Labels), DaemonSetToSelectableFields(ds), ds.Initializers != nil, nil } // MatchSetDaemon is the filter used by the generic etcd backend to route diff --git a/pkg/registry/extensions/deployment/registry.go b/pkg/registry/extensions/deployment/registry.go index 45d95224000..88f147e2aad 100644 --- a/pkg/registry/extensions/deployment/registry.go +++ b/pkg/registry/extensions/deployment/registry.go @@ -66,7 +66,7 @@ func (s *storage) GetDeployment(ctx genericapirequest.Context, deploymentID stri } func (s *storage) CreateDeployment(ctx genericapirequest.Context, deployment *extensions.Deployment) (*extensions.Deployment, error) { - obj, err := s.Create(ctx, deployment) + obj, err := s.Create(ctx, deployment, false) if err != nil { return nil, err } diff --git a/pkg/registry/extensions/deployment/storage/storage.go b/pkg/registry/extensions/deployment/storage/storage.go index 22a28882144..701ccf1494e 100644 --- a/pkg/registry/extensions/deployment/storage/storage.go +++ b/pkg/registry/extensions/deployment/storage/storage.go @@ -123,7 +123,7 @@ func (r *RollbackREST) New() runtime.Object { var _ = rest.Creater(&RollbackREST{}) -func (r *RollbackREST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *RollbackREST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { rollback, ok := obj.(*extensions.DeploymentRollback) if !ok { return nil, errors.NewBadRequest(fmt.Sprintf("not a DeploymentRollback: %#v", obj)) @@ -144,10 +144,6 @@ func (r *RollbackREST) Create(ctx genericapirequest.Context, obj runtime.Object) }, nil } -func (r *RollbackREST) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return r.Create(ctx, obj) -} - func (r *RollbackREST) rollbackDeployment(ctx genericapirequest.Context, deploymentID string, config *extensions.RollbackConfig, annotations map[string]string) error { if _, err := r.setDeploymentRollback(ctx, deploymentID, config, annotations); err != nil { err = storeerr.InterpretGetError(err, extensions.Resource("deployments"), deploymentID) diff --git a/pkg/registry/extensions/deployment/storage/storage_test.go b/pkg/registry/extensions/deployment/storage/storage_test.go index 67042f546f1..b3c14f69f5a 100644 --- a/pkg/registry/extensions/deployment/storage/storage_test.go +++ b/pkg/registry/extensions/deployment/storage/storage_test.go @@ -340,10 +340,10 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) { storage, server := newStorage(t) rollbackStorage := storage.Rollback - if _, err := storage.Deployment.Create(ctx, validNewDeployment()); err != nil { + if _, err := storage.Deployment.Create(ctx, validNewDeployment(), false); err != nil { t.Fatalf("%s: unexpected error: %v", k, err) } - if _, err := rollbackStorage.Create(ctx, &test.rollback); !test.errOK(err) { + if _, err := rollbackStorage.Create(ctx, &test.rollback, false); !test.errOK(err) { t.Errorf("%s: unexpected error: %v", k, err) } else if err == nil { // If rollback succeeded, verify Rollback field of deployment @@ -372,7 +372,7 @@ func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) { Name: name, UpdatedAnnotations: map[string]string{}, RollbackTo: extensions.RollbackConfig{Revision: 1}, - }) + }, false) if err == nil { t.Fatalf("Expected not-found-error but got nothing") } diff --git a/pkg/registry/extensions/deployment/strategy.go b/pkg/registry/extensions/deployment/strategy.go index 2dd0574ff88..819ca5e965f 100644 --- a/pkg/registry/extensions/deployment/strategy.go +++ b/pkg/registry/extensions/deployment/strategy.go @@ -126,12 +126,12 @@ func DeploymentToSelectableFields(deployment *extensions.Deployment) fields.Set } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { deployment, ok := obj.(*extensions.Deployment) if !ok { - return nil, nil, fmt.Errorf("given object is not a deployment.") + return nil, nil, false, fmt.Errorf("given object is not a deployment.") } - return labels.Set(deployment.ObjectMeta.Labels), DeploymentToSelectableFields(deployment), nil + return labels.Set(deployment.ObjectMeta.Labels), DeploymentToSelectableFields(deployment), deployment.Initializers != nil, nil } // MatchDeployment is the filter used by the generic etcd backend to route diff --git a/pkg/registry/extensions/ingress/strategy.go b/pkg/registry/extensions/ingress/strategy.go index 2f619237618..add1e0a3276 100644 --- a/pkg/registry/extensions/ingress/strategy.go +++ b/pkg/registry/extensions/ingress/strategy.go @@ -106,12 +106,12 @@ func IngressToSelectableFields(ingress *extensions.Ingress) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { ingress, ok := obj.(*extensions.Ingress) if !ok { - return nil, nil, fmt.Errorf("Given object is not an Ingress.") + return nil, nil, false, fmt.Errorf("given object is not an Ingress.") } - return labels.Set(ingress.ObjectMeta.Labels), IngressToSelectableFields(ingress), nil + return labels.Set(ingress.ObjectMeta.Labels), IngressToSelectableFields(ingress), ingress.Initializers != nil, nil } // MatchIngress is the filter used by the generic etcd backend to ingress diff --git a/pkg/registry/extensions/networkpolicy/storage/storage_test.go b/pkg/registry/extensions/networkpolicy/storage/storage_test.go index 65e03392ab6..2850ea20147 100644 --- a/pkg/registry/extensions/networkpolicy/storage/storage_test.go +++ b/pkg/registry/extensions/networkpolicy/storage/storage_test.go @@ -45,7 +45,7 @@ func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { // createNetworkPolicy is a helper function that returns a NetworkPolicy with the updated resource version. func createNetworkPolicy(storage *REST, np extensions.NetworkPolicy, t *testing.T) (extensions.NetworkPolicy, error) { ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), np.Namespace) - obj, err := storage.Create(ctx, &np) + obj, err := storage.Create(ctx, &np, false) if err != nil { t.Errorf("Failed to create NetworkPolicy, %v", err) } diff --git a/pkg/registry/extensions/networkpolicy/strategy.go b/pkg/registry/extensions/networkpolicy/strategy.go index 327262f73dc..63eb28b719f 100644 --- a/pkg/registry/extensions/networkpolicy/strategy.go +++ b/pkg/registry/extensions/networkpolicy/strategy.go @@ -99,12 +99,12 @@ func NetworkPolicyToSelectableFields(networkPolicy *extensions.NetworkPolicy) fi } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { networkPolicy, ok := obj.(*extensions.NetworkPolicy) if !ok { - return nil, nil, fmt.Errorf("given object is not a NetworkPolicy.") + return nil, nil, false, fmt.Errorf("given object is not a NetworkPolicy.") } - return labels.Set(networkPolicy.ObjectMeta.Labels), NetworkPolicyToSelectableFields(networkPolicy), nil + return labels.Set(networkPolicy.ObjectMeta.Labels), NetworkPolicyToSelectableFields(networkPolicy), networkPolicy.Initializers != nil, nil } // MatchNetworkPolicy is the filter used by the generic etcd backend to watch events diff --git a/pkg/registry/extensions/podsecuritypolicy/strategy.go b/pkg/registry/extensions/podsecuritypolicy/strategy.go index 1f3d3ddb01b..d9213619da3 100644 --- a/pkg/registry/extensions/podsecuritypolicy/strategy.go +++ b/pkg/registry/extensions/podsecuritypolicy/strategy.go @@ -77,12 +77,12 @@ func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.O } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { psp, ok := obj.(*extensions.PodSecurityPolicy) if !ok { - return nil, nil, fmt.Errorf("given object is not a pod security policy.") + return nil, nil, false, fmt.Errorf("given object is not a pod security policy.") } - return labels.Set(psp.ObjectMeta.Labels), PodSecurityPolicyToSelectableFields(psp), nil + return labels.Set(psp.ObjectMeta.Labels), PodSecurityPolicyToSelectableFields(psp), psp.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/extensions/replicaset/registry.go b/pkg/registry/extensions/replicaset/registry.go index e33cbd075b3..87e01d8e0f4 100644 --- a/pkg/registry/extensions/replicaset/registry.go +++ b/pkg/registry/extensions/replicaset/registry.go @@ -75,7 +75,7 @@ func (s *storage) GetReplicaSet(ctx genericapirequest.Context, replicaSetID stri } func (s *storage) CreateReplicaSet(ctx genericapirequest.Context, replicaSet *extensions.ReplicaSet) (*extensions.ReplicaSet, error) { - obj, err := s.Create(ctx, replicaSet) + obj, err := s.Create(ctx, replicaSet, false) if err != nil { return nil, err } diff --git a/pkg/registry/extensions/replicaset/storage/storage_test.go b/pkg/registry/extensions/replicaset/storage/storage_test.go index a5f981c2f06..fc89666d5a9 100644 --- a/pkg/registry/extensions/replicaset/storage/storage_test.go +++ b/pkg/registry/extensions/replicaset/storage/storage_test.go @@ -47,7 +47,7 @@ func newStorage(t *testing.T) (*ReplicaSetStorage, *etcdtesting.EtcdTestServer) // createReplicaSet is a helper function that returns a ReplicaSet with the updated resource version. func createReplicaSet(storage *REST, rs extensions.ReplicaSet, t *testing.T) (extensions.ReplicaSet, error) { ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), rs.Namespace) - obj, err := storage.Create(ctx, &rs) + obj, err := storage.Create(ctx, &rs, false) if err != nil { t.Errorf("Failed to create ReplicaSet, %v", err) } diff --git a/pkg/registry/extensions/replicaset/strategy.go b/pkg/registry/extensions/replicaset/strategy.go index 260bafedd8b..e7bf7d5f379 100644 --- a/pkg/registry/extensions/replicaset/strategy.go +++ b/pkg/registry/extensions/replicaset/strategy.go @@ -122,12 +122,12 @@ func ReplicaSetToSelectableFields(rs *extensions.ReplicaSet) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { rs, ok := obj.(*extensions.ReplicaSet) if !ok { - return nil, nil, fmt.Errorf("Given object is not a ReplicaSet.") + return nil, nil, false, fmt.Errorf("given object is not a ReplicaSet.") } - return labels.Set(rs.ObjectMeta.Labels), ReplicaSetToSelectableFields(rs), nil + return labels.Set(rs.ObjectMeta.Labels), ReplicaSetToSelectableFields(rs), rs.Initializers != nil, nil } // MatchReplicaSet is the filter used by the generic etcd backend to route diff --git a/pkg/registry/extensions/thirdpartyresource/strategy.go b/pkg/registry/extensions/thirdpartyresource/strategy.go index 52a55d1bf44..baf13844c87 100644 --- a/pkg/registry/extensions/thirdpartyresource/strategy.go +++ b/pkg/registry/extensions/thirdpartyresource/strategy.go @@ -79,12 +79,12 @@ func (strategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { tpr, ok := obj.(*extensions.ThirdPartyResource) if !ok { - return nil, nil, fmt.Errorf("not a ThirdPartyResource") + return nil, nil, false, fmt.Errorf("not a ThirdPartyResource") } - return labels.Set(tpr.Labels), SelectableFields(tpr), nil + return labels.Set(tpr.Labels), SelectableFields(tpr), tpr.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/extensions/thirdpartyresourcedata/registry.go b/pkg/registry/extensions/thirdpartyresourcedata/registry.go index c844d0a5d2e..d8266046add 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/registry.go +++ b/pkg/registry/extensions/thirdpartyresourcedata/registry.go @@ -68,7 +68,7 @@ func (s *storage) GetThirdPartyResourceData(ctx genericapirequest.Context, name } func (s *storage) CreateThirdPartyResourceData(ctx genericapirequest.Context, ThirdPartyResourceData *extensions.ThirdPartyResourceData) (*extensions.ThirdPartyResourceData, error) { - obj, err := s.Create(ctx, ThirdPartyResourceData) + obj, err := s.Create(ctx, ThirdPartyResourceData, false) return obj.(*extensions.ThirdPartyResourceData), err } diff --git a/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go b/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go index 4680e735de9..3693dff82b8 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go +++ b/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go @@ -55,11 +55,11 @@ func (r *REST) isFrozen() bool { } // Create is a wrapper to support Freeze. -func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { if r.isFrozen() { return nil, errFrozen } - return r.Store.Create(ctx, obj) + return r.Store.Create(ctx, obj, includeUninitialized) } // Update is a wrapper to support Freeze. diff --git a/pkg/registry/extensions/thirdpartyresourcedata/strategy.go b/pkg/registry/extensions/thirdpartyresourcedata/strategy.go index 287c07d6151..ba3746d45c7 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/strategy.go +++ b/pkg/registry/extensions/thirdpartyresourcedata/strategy.go @@ -77,12 +77,12 @@ func (strategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { tprd, ok := obj.(*extensions.ThirdPartyResourceData) if !ok { - return nil, nil, fmt.Errorf("not a ThirdPartyResourceData") + return nil, nil, false, fmt.Errorf("not a ThirdPartyResourceData") } - return labels.Set(tprd.Labels), SelectableFields(tprd), nil + return labels.Set(tprd.Labels), SelectableFields(tprd), tprd.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/networking/networkpolicy/registry.go b/pkg/registry/networking/networkpolicy/registry.go index 36f1d3d5dbe..1efcf8ed248 100644 --- a/pkg/registry/networking/networkpolicy/registry.go +++ b/pkg/registry/networking/networkpolicy/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListNetworkPolicies(ctx genericapirequest.Context, options *me } func (s *storage) CreateNetworkPolicy(ctx genericapirequest.Context, np *networking.NetworkPolicy) error { - _, err := s.Create(ctx, np) + _, err := s.Create(ctx, np, false) return err } diff --git a/pkg/registry/networking/networkpolicy/strategy.go b/pkg/registry/networking/networkpolicy/strategy.go index b6b027fb5ed..2b58c6c1288 100644 --- a/pkg/registry/networking/networkpolicy/strategy.go +++ b/pkg/registry/networking/networkpolicy/strategy.go @@ -98,12 +98,12 @@ func SelectableFields(networkPolicy *networking.NetworkPolicy) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { networkPolicy, ok := obj.(*networking.NetworkPolicy) if !ok { - return nil, nil, fmt.Errorf("given object is not a NetworkPolicy.") + return nil, nil, false, fmt.Errorf("given object is not a NetworkPolicy.") } - return labels.Set(networkPolicy.ObjectMeta.Labels), SelectableFields(networkPolicy), nil + return labels.Set(networkPolicy.ObjectMeta.Labels), SelectableFields(networkPolicy), networkPolicy.Initializers != nil, nil } // Matcher is the filter used by the generic etcd backend to watch events diff --git a/pkg/registry/policy/poddisruptionbudget/storage/storage_test.go b/pkg/registry/policy/poddisruptionbudget/storage/storage_test.go index ab8e8851e49..4972c1d83b4 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/storage_test.go +++ b/pkg/registry/policy/poddisruptionbudget/storage/storage_test.go @@ -42,7 +42,7 @@ func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) // createPodDisruptionBudget is a helper function that returns a PodDisruptionBudget with the updated resource version. func createPodDisruptionBudget(storage *REST, pdb policy.PodDisruptionBudget, t *testing.T) (policy.PodDisruptionBudget, error) { ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), pdb.Namespace) - obj, err := storage.Create(ctx, &pdb) + obj, err := storage.Create(ctx, &pdb, false) if err != nil { t.Errorf("Failed to create PodDisruptionBudget, %v", err) } diff --git a/pkg/registry/policy/poddisruptionbudget/strategy.go b/pkg/registry/policy/poddisruptionbudget/strategy.go index 5a68bf6623f..a0f6a71d22a 100644 --- a/pkg/registry/policy/poddisruptionbudget/strategy.go +++ b/pkg/registry/policy/poddisruptionbudget/strategy.go @@ -105,12 +105,12 @@ func PodDisruptionBudgetToSelectableFields(podDisruptionBudget *policy.PodDisrup } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { podDisruptionBudget, ok := obj.(*policy.PodDisruptionBudget) if !ok { - return nil, nil, fmt.Errorf("given object is not a PodDisruptionBudget.") + return nil, nil, false, fmt.Errorf("given object is not a PodDisruptionBudget.") } - return labels.Set(podDisruptionBudget.ObjectMeta.Labels), PodDisruptionBudgetToSelectableFields(podDisruptionBudget), nil + return labels.Set(podDisruptionBudget.ObjectMeta.Labels), PodDisruptionBudgetToSelectableFields(podDisruptionBudget), podDisruptionBudget.Initializers != nil, nil } // MatchPodDisruptionBudget is the filter used by the generic etcd backend to watch events diff --git a/pkg/registry/rbac/clusterrole/policybased/storage.go b/pkg/registry/rbac/clusterrole/policybased/storage.go index 0d56bd5ddc9..7350e916951 100644 --- a/pkg/registry/rbac/clusterrole/policybased/storage.go +++ b/pkg/registry/rbac/clusterrole/policybased/storage.go @@ -39,9 +39,9 @@ func NewStorage(s rest.StandardStorage, ruleResolver rbacregistryvalidation.Auth return &Storage{s, ruleResolver} } -func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { if rbacregistry.EscalationAllowed(ctx) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } clusterRole := obj.(*rbac.ClusterRole) @@ -49,11 +49,7 @@ func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (run if err := rbacregistryvalidation.ConfirmNoEscalation(ctx, s.ruleResolver, rules); err != nil { return nil, errors.NewForbidden(groupResource, clusterRole.Name, err) } - return s.StandardStorage.Create(ctx, obj) -} - -func (s *Storage) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return s.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } func (s *Storage) Update(ctx genericapirequest.Context, name string, obj rest.UpdatedObjectInfo) (runtime.Object, bool, error) { diff --git a/pkg/registry/rbac/clusterrole/registry.go b/pkg/registry/rbac/clusterrole/registry.go index df6b5863878..6af72e1fa18 100644 --- a/pkg/registry/rbac/clusterrole/registry.go +++ b/pkg/registry/rbac/clusterrole/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListClusterRoles(ctx genericapirequest.Context, options *metai } func (s *storage) CreateClusterRole(ctx genericapirequest.Context, clusterRole *rbac.ClusterRole) error { - _, err := s.Create(ctx, clusterRole) + _, err := s.Create(ctx, clusterRole, false) return err } diff --git a/pkg/registry/rbac/clusterrole/strategy.go b/pkg/registry/rbac/clusterrole/strategy.go index 2442ffa4913..ead2a876f27 100644 --- a/pkg/registry/rbac/clusterrole/strategy.go +++ b/pkg/registry/rbac/clusterrole/strategy.go @@ -104,12 +104,12 @@ func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exac } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { role, ok := obj.(*rbac.ClusterRole) if !ok { - return nil, nil, fmt.Errorf("not a ClusterRole") + return nil, nil, false, fmt.Errorf("not a ClusterRole") } - return labels.Set(role.Labels), SelectableFields(role), nil + return labels.Set(role.Labels), SelectableFields(role), role.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/rbac/clusterrolebinding/policybased/storage.go b/pkg/registry/rbac/clusterrolebinding/policybased/storage.go index 6794c583f8a..00f197a6f0d 100644 --- a/pkg/registry/rbac/clusterrolebinding/policybased/storage.go +++ b/pkg/registry/rbac/clusterrolebinding/policybased/storage.go @@ -43,14 +43,14 @@ func NewStorage(s rest.StandardStorage, authorizer authorizer.Authorizer, ruleRe return &Storage{s, authorizer, ruleResolver} } -func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { if rbacregistry.EscalationAllowed(ctx) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } clusterRoleBinding := obj.(*rbac.ClusterRoleBinding) if rbacregistry.BindingAuthorized(ctx, clusterRoleBinding.RoleRef, metav1.NamespaceNone, s.authorizer) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } rules, err := s.ruleResolver.GetRoleReferenceRules(clusterRoleBinding.RoleRef, metav1.NamespaceNone) @@ -60,11 +60,7 @@ func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (run if err := rbacregistryvalidation.ConfirmNoEscalation(ctx, s.ruleResolver, rules); err != nil { return nil, errors.NewForbidden(groupResource, clusterRoleBinding.Name, err) } - return s.StandardStorage.Create(ctx, obj) -} - -func (s *Storage) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return s.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } func (s *Storage) Update(ctx genericapirequest.Context, name string, obj rest.UpdatedObjectInfo) (runtime.Object, bool, error) { diff --git a/pkg/registry/rbac/clusterrolebinding/registry.go b/pkg/registry/rbac/clusterrolebinding/registry.go index 1764f4a7386..525c464e83d 100644 --- a/pkg/registry/rbac/clusterrolebinding/registry.go +++ b/pkg/registry/rbac/clusterrolebinding/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListClusterRoleBindings(ctx genericapirequest.Context, options } func (s *storage) CreateClusterRoleBinding(ctx genericapirequest.Context, clusterRoleBinding *rbac.ClusterRoleBinding) error { - _, err := s.Create(ctx, clusterRoleBinding) + _, err := s.Create(ctx, clusterRoleBinding, false) return err } diff --git a/pkg/registry/rbac/clusterrolebinding/strategy.go b/pkg/registry/rbac/clusterrolebinding/strategy.go index 0b3801f2653..bb9168d51d4 100644 --- a/pkg/registry/rbac/clusterrolebinding/strategy.go +++ b/pkg/registry/rbac/clusterrolebinding/strategy.go @@ -104,12 +104,12 @@ func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exac } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { roleBinding, ok := obj.(*rbac.ClusterRoleBinding) if !ok { - return nil, nil, fmt.Errorf("not a ClusterRoleBinding") + return nil, nil, false, fmt.Errorf("not a ClusterRoleBinding") } - return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), nil + return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), roleBinding.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/rbac/role/policybased/storage.go b/pkg/registry/rbac/role/policybased/storage.go index fb51b37be79..c2b1a34977e 100644 --- a/pkg/registry/rbac/role/policybased/storage.go +++ b/pkg/registry/rbac/role/policybased/storage.go @@ -39,9 +39,9 @@ func NewStorage(s rest.StandardStorage, ruleResolver rbacregistryvalidation.Auth return &Storage{s, ruleResolver} } -func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { if rbacregistry.EscalationAllowed(ctx) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } role := obj.(*rbac.Role) @@ -49,11 +49,7 @@ func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (run if err := rbacregistryvalidation.ConfirmNoEscalation(ctx, s.ruleResolver, rules); err != nil { return nil, errors.NewForbidden(groupResource, role.Name, err) } - return s.StandardStorage.Create(ctx, obj) -} - -func (s *Storage) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return s.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } func (s *Storage) Update(ctx genericapirequest.Context, name string, obj rest.UpdatedObjectInfo) (runtime.Object, bool, error) { diff --git a/pkg/registry/rbac/role/registry.go b/pkg/registry/rbac/role/registry.go index 9c3ea883b48..080cbd64066 100644 --- a/pkg/registry/rbac/role/registry.go +++ b/pkg/registry/rbac/role/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListRoles(ctx genericapirequest.Context, options *metainternal } func (s *storage) CreateRole(ctx genericapirequest.Context, role *rbac.Role) error { - _, err := s.Create(ctx, role) + _, err := s.Create(ctx, role, false) return err } diff --git a/pkg/registry/rbac/role/strategy.go b/pkg/registry/rbac/role/strategy.go index 9a6ef33e40f..aaf2a56abb8 100644 --- a/pkg/registry/rbac/role/strategy.go +++ b/pkg/registry/rbac/role/strategy.go @@ -104,12 +104,12 @@ func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exac } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { role, ok := obj.(*rbac.Role) if !ok { - return nil, nil, fmt.Errorf("not a Role") + return nil, nil, false, fmt.Errorf("not a Role") } - return labels.Set(role.Labels), SelectableFields(role), nil + return labels.Set(role.Labels), SelectableFields(role), role.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/rbac/rolebinding/policybased/storage.go b/pkg/registry/rbac/rolebinding/policybased/storage.go index 13adaa1dcac..7f72a0be638 100644 --- a/pkg/registry/rbac/rolebinding/policybased/storage.go +++ b/pkg/registry/rbac/rolebinding/policybased/storage.go @@ -42,9 +42,9 @@ func NewStorage(s rest.StandardStorage, authorizer authorizer.Authorizer, ruleRe return &Storage{s, authorizer, ruleResolver} } -func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { +func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool) (runtime.Object, error) { if rbacregistry.EscalationAllowed(ctx) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } // Get the namespace from the context (populated from the URL). @@ -56,7 +56,7 @@ func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (run roleBinding := obj.(*rbac.RoleBinding) if rbacregistry.BindingAuthorized(ctx, roleBinding.RoleRef, namespace, s.authorizer) { - return s.StandardStorage.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } rules, err := s.ruleResolver.GetRoleReferenceRules(roleBinding.RoleRef, namespace) @@ -66,11 +66,7 @@ func (s *Storage) Create(ctx genericapirequest.Context, obj runtime.Object) (run if err := rbacregistryvalidation.ConfirmNoEscalation(ctx, s.ruleResolver, rules); err != nil { return nil, errors.NewForbidden(groupResource, roleBinding.Name, err) } - return s.StandardStorage.Create(ctx, obj) -} - -func (s *Storage) CreateInitialized(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) { - return s.Create(ctx, obj) + return s.StandardStorage.Create(ctx, obj, includeUninitialized) } func (s *Storage) Update(ctx genericapirequest.Context, name string, obj rest.UpdatedObjectInfo) (runtime.Object, bool, error) { diff --git a/pkg/registry/rbac/rolebinding/registry.go b/pkg/registry/rbac/rolebinding/registry.go index c468cb71668..a2e483b56a2 100644 --- a/pkg/registry/rbac/rolebinding/registry.go +++ b/pkg/registry/rbac/rolebinding/registry.go @@ -58,7 +58,7 @@ func (s *storage) ListRoleBindings(ctx genericapirequest.Context, options *metai func (s *storage) CreateRoleBinding(ctx genericapirequest.Context, roleBinding *rbac.RoleBinding) error { // TODO(ericchiang): add additional validation - _, err := s.Create(ctx, roleBinding) + _, err := s.Create(ctx, roleBinding, false) return err } diff --git a/pkg/registry/rbac/rolebinding/strategy.go b/pkg/registry/rbac/rolebinding/strategy.go index 0d1d5e9820c..f5291ab0b23 100644 --- a/pkg/registry/rbac/rolebinding/strategy.go +++ b/pkg/registry/rbac/rolebinding/strategy.go @@ -104,12 +104,12 @@ func (s strategy) Export(ctx genericapirequest.Context, obj runtime.Object, exac } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { roleBinding, ok := obj.(*rbac.RoleBinding) if !ok { - return nil, nil, fmt.Errorf("not a RoleBinding") + return nil, nil, false, fmt.Errorf("not a RoleBinding") } - return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), nil + return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), roleBinding.Initializers != nil, nil } // Matcher returns a generic matcher for a given label and field selector. diff --git a/pkg/registry/settings/podpreset/registry.go b/pkg/registry/settings/podpreset/registry.go index a6225de3b93..d1c96f9a380 100644 --- a/pkg/registry/settings/podpreset/registry.go +++ b/pkg/registry/settings/podpreset/registry.go @@ -57,7 +57,7 @@ func (s *storage) ListPodPresets(ctx genericapirequest.Context, options *metaint } func (s *storage) CreatePodPreset(ctx genericapirequest.Context, pp *settings.PodPreset) error { - _, err := s.Create(ctx, pp) + _, err := s.Create(ctx, pp, false) return err } diff --git a/pkg/registry/settings/podpreset/strategy.go b/pkg/registry/settings/podpreset/strategy.go index 81acd7298df..6eb0f94acd8 100644 --- a/pkg/registry/settings/podpreset/strategy.go +++ b/pkg/registry/settings/podpreset/strategy.go @@ -93,12 +93,12 @@ func SelectableFields(pip *settings.PodPreset) fields.Set { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { pip, ok := obj.(*settings.PodPreset) if !ok { - return nil, nil, fmt.Errorf("given object is not a PodPreset.") + return nil, nil, false, fmt.Errorf("given object is not a PodPreset.") } - return labels.Set(pip.ObjectMeta.Labels), SelectableFields(pip), nil + return labels.Set(pip.ObjectMeta.Labels), SelectableFields(pip), pip.Initializers != nil, nil } // Matcher is the filter used by the generic etcd backend to watch events diff --git a/pkg/registry/storage/storageclass/strategy.go b/pkg/registry/storage/storageclass/strategy.go index 4c48c3dbc5a..73aa7d2b37f 100644 --- a/pkg/registry/storage/storageclass/strategy.go +++ b/pkg/registry/storage/storageclass/strategy.go @@ -80,12 +80,12 @@ func (storageClassStrategy) AllowUnconditionalUpdate() bool { } // GetAttrs returns labels and fields of a given object for filtering purposes. -func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { cls, ok := obj.(*storage.StorageClass) if !ok { - return nil, nil, fmt.Errorf("given object is not of type StorageClass") + return nil, nil, false, fmt.Errorf("given object is not of type StorageClass") } - return labels.Set(cls.ObjectMeta.Labels), StorageClassToSelectableFields(cls), nil + return labels.Set(cls.ObjectMeta.Labels), StorageClassToSelectableFields(cls), cls.Initializers != nil, nil } // MatchStorageClass returns a generic matcher for a given label and field selector.