Skip to content

Commit e239831

Browse files
committed
apiextensions: keep CRD storage for updates outside of spec and accepted names
1 parent b125388 commit e239831

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ go_library(
3333
"//vendor/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library",
3434
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library",
3535
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library",
36+
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
3637
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
3738
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
3839
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",

staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/go-openapi/validate"
3131
"github.com/golang/glog"
3232

33+
apiequality "k8s.io/apimachinery/pkg/api/equality"
3334
apierrors "k8s.io/apimachinery/pkg/api/errors"
3435
"k8s.io/apimachinery/pkg/api/meta"
3536
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -79,6 +80,11 @@ type crdHandler struct {
7980

8081
// crdInfo stores enough information to serve the storage for the custom resource
8182
type crdInfo struct {
83+
// spec and acceptedNames are used to compare against if a change is made on a CRD. We only update
84+
// the storage if one of these changes.
85+
spec *apiextensions.CustomResourceDefinitionSpec
86+
acceptedNames *apiextensions.CustomResourceDefinitionNames
87+
8288
storage *customresource.REST
8389
requestScope handlers.RequestScope
8490
}
@@ -108,6 +114,9 @@ func NewCustomResourceDefinitionHandler(
108114

109115
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
110116
UpdateFunc: ret.updateCustomResourceDefinition,
117+
DeleteFunc: func(obj interface{}) {
118+
ret.removeDeadStorage()
119+
},
111120
})
112121

113122
ret.customStorage.Store(crdStorageMap{})
@@ -254,6 +263,7 @@ func (r *crdHandler) removeDeadStorage() {
254263
}
255264
}
256265
if !found {
266+
glog.V(4).Infof("Removing dead CRD storage for %v", s.requestScope.Resource)
257267
s.storage.DestroyFunc()
258268
delete(storageMap, uid)
259269
}
@@ -376,6 +386,9 @@ func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefiniti
376386
}
377387

378388
ret = &crdInfo{
389+
spec: &crd.Spec,
390+
acceptedNames: &crd.Status.AcceptedNames,
391+
379392
storage: storage,
380393
requestScope: requestScope,
381394
}
@@ -411,14 +424,24 @@ func (c crdObjectConverter) ConvertFieldLabel(version, kind, label, value string
411424
}
412425
}
413426

414-
func (c *crdHandler) updateCustomResourceDefinition(oldObj, _ interface{}) {
427+
func (c *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
415428
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
416-
glog.V(4).Infof("Updating customresourcedefinition %s", oldCRD.Name)
429+
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
417430

418431
c.customStorageLock.Lock()
419432
defer c.customStorageLock.Unlock()
420-
421433
storageMap := c.customStorage.Load().(crdStorageMap)
434+
435+
oldInfo, found := storageMap[newCRD.UID]
436+
if !found {
437+
return
438+
}
439+
if apiequality.Semantic.DeepEqual(&newCRD.Spec, oldInfo.spec) && apiequality.Semantic.DeepEqual(&newCRD.Status.AcceptedNames, oldInfo.acceptedNames) {
440+
glog.V(6).Infof("Ignoring customresourcedefinition %s update because neither spec, nor accepted names changed", oldCRD.Name)
441+
return
442+
}
443+
444+
glog.V(4).Infof("Updating customresourcedefinition %s", oldCRD.Name)
422445
storageMap2 := make(crdStorageMap, len(storageMap))
423446

424447
// Copy because we cannot write to storageMap without a race

0 commit comments

Comments
 (0)