Skip to content

Commit 485741e

Browse files
committed
Skip deleting custom resource instances that overlap with storage for built-in types
1 parent bcb464d commit 485741e

File tree

4 files changed

+410
-1
lines changed

4 files changed

+410
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ go_library(
1818
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
1919
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
2020
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
21+
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
2122
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
2223
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
2324
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",

staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
apierrors "k8s.io/apimachinery/pkg/api/errors"
2727
"k8s.io/apimachinery/pkg/api/meta"
2828
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
29+
"k8s.io/apimachinery/pkg/runtime/schema"
2930
utilerrors "k8s.io/apimachinery/pkg/util/errors"
3031
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3132
"k8s.io/apimachinery/pkg/util/sets"
@@ -41,6 +42,16 @@ import (
4142
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
4243
)
4344

45+
// OverlappingBuiltInResources returns the set of built-in group/resources that are persisted
46+
// in storage paths that overlap with CRD storage paths, and should not be deleted
47+
// by this controller if an associated CRD is deleted.
48+
func OverlappingBuiltInResources() map[schema.GroupResource]bool {
49+
return map[schema.GroupResource]bool{
50+
{Group: "apiregistration.k8s.io", Resource: "apiservices"}: true,
51+
{Group: "apiextensions.k8s.io", Resource: "customresourcedefinitions"}: true,
52+
}
53+
}
54+
4455
// CRDFinalizer is a controller that finalizes the CRD by deleting all the CRs associated with it.
4556
type CRDFinalizer struct {
4657
crdClient client.CustomResourceDefinitionsGetter
@@ -126,7 +137,15 @@ func (c *CRDFinalizer) sync(key string) error {
126137

127138
// Now we can start deleting items. We should use the REST API to ensure that all normal admission runs.
128139
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
129-
if apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
140+
if OverlappingBuiltInResources()[schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural}] {
141+
// Skip deletion, explain why, and proceed to remove the finalizer and delete the CRD
142+
apiextensions.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
143+
Type: apiextensions.Terminating,
144+
Status: apiextensions.ConditionFalse,
145+
Reason: "OverlappingBuiltInResource",
146+
Message: "instances overlap with built-in resources in storage",
147+
})
148+
} else if apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
130149
cond, deleteErr := c.deleteInstances(crd)
131150
apiextensions.SetCRDCondition(crd, cond)
132151
if deleteErr != nil {

test/integration/etcd/BUILD

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ go_test(
66
name = "go_default_test",
77
size = "large",
88
srcs = [
9+
"crd_overlap_storage_test.go",
910
"etcd_cross_group_test.go",
1011
"etcd_storage_path_test.go",
1112
"main_test.go",
@@ -18,15 +19,23 @@ go_test(
1819
deps = [
1920
"//cmd/kube-apiserver/app/options:go_default_library",
2021
"//staging/src/k8s.io/api/core/v1:go_default_library",
22+
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library",
23+
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library",
24+
"//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library",
2125
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
26+
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
2227
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
2328
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2429
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
2530
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
31+
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
2632
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
2733
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
34+
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
2835
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
2936
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
37+
"//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library",
38+
"//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library",
3039
"//test/integration/framework:go_default_library",
3140
"//vendor/github.com/coreos/etcd/clientv3:go_default_library",
3241
],

0 commit comments

Comments
 (0)