Skip to content

Commit 10f47a0

Browse files
committed
Clean-up installed CRDs on Stop()
But only if USE_EXISTING_CLUSTER is set to true as there's no point in doing it if the control-plane is going away. Signed-off-by: Pires <[email protected]>
1 parent 198197f commit 10f47a0

File tree

3 files changed

+143
-2
lines changed

3 files changed

+143
-2
lines changed

pkg/envtest/crd.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
2929
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
30+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031
"k8s.io/apimachinery/pkg/runtime/schema"
3132
"k8s.io/apimachinery/pkg/util/sets"
3233
"k8s.io/apimachinery/pkg/util/wait"
@@ -180,6 +181,32 @@ func (p *poller) poll() (done bool, err error) {
180181
return allFound, nil
181182
}
182183

184+
// UninstallCRDs uninstalls a collection of CRDs by reading the crd yaml files from a directory
185+
func UninstallCRDs(config *rest.Config, options CRDInstallOptions) error {
186+
187+
// Read the CRD yamls into options.CRDs
188+
if err := readCRDFiles(&options); err != nil {
189+
return err
190+
}
191+
192+
// Delete the CRDs from the apiserver
193+
cs, err := clientset.NewForConfig(config)
194+
if err != nil {
195+
return err
196+
}
197+
198+
// Create each CRD
199+
for _, crd := range options.CRDs {
200+
log.V(1).Info("uninstalling CRD", "crd", crd.Name)
201+
if err := cs.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(crd.Name, &metav1.DeleteOptions{}); err != nil {
202+
return err
203+
}
204+
}
205+
return nil
206+
207+
return nil
208+
}
209+
183210
// CreateCRDs creates the CRDs
184211
func CreateCRDs(config *rest.Config, crds []*apiextensionsv1beta1.CustomResourceDefinition) error {
185212
cs, err := clientset.NewForConfig(config)

pkg/envtest/envtest_test.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
. "github.com/onsi/ginkgo"
2626
. "github.com/onsi/gomega"
2727
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
28+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2829
"k8s.io/apimachinery/pkg/runtime"
2930
"k8s.io/apimachinery/pkg/types"
3031
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -52,6 +53,18 @@ var _ = Describe("Test", func() {
5253
// Cleanup CRDs
5354
AfterEach(func(done Done) {
5455
for _, crd := range crds {
56+
// Delete only if CRD exists.
57+
crdObjectKey := client.ObjectKey{
58+
Namespace: crd.Namespace,
59+
Name: crd.Name,
60+
}
61+
var placeholder v1beta1.CustomResourceDefinition
62+
err := c.Get(context.TODO(), crdObjectKey, &placeholder)
63+
if err != nil && apierrors.IsNotFound(err) {
64+
// CRD doesn't need to be deleted.
65+
continue
66+
}
67+
Expect(err).NotTo(HaveOccurred())
5568
Expect(c.Delete(context.TODO(), crd)).To(Succeed())
5669
}
5770
close(done)
@@ -216,4 +229,105 @@ var _ = Describe("Test", func() {
216229
close(done)
217230
}, 5)
218231
})
232+
233+
Describe("UninstallCRDs", func() {
234+
It("should uninstall the CRDs from the cluster", func(done Done) {
235+
236+
crds, err = InstallCRDs(env.Config, CRDInstallOptions{
237+
Paths: []string{filepath.Join(".", "testdata")},
238+
})
239+
Expect(err).NotTo(HaveOccurred())
240+
241+
// Expect to find the CRDs
242+
243+
crd := &v1beta1.CustomResourceDefinition{}
244+
err = c.Get(context.TODO(), types.NamespacedName{Name: "foos.bar.example.com"}, crd)
245+
Expect(err).NotTo(HaveOccurred())
246+
Expect(crd.Spec.Names.Kind).To(Equal("Foo"))
247+
248+
crd = &v1beta1.CustomResourceDefinition{}
249+
err = c.Get(context.TODO(), types.NamespacedName{Name: "bazs.qux.example.com"}, crd)
250+
Expect(err).NotTo(HaveOccurred())
251+
Expect(crd.Spec.Names.Kind).To(Equal("Baz"))
252+
253+
crd = &v1beta1.CustomResourceDefinition{}
254+
err = c.Get(context.TODO(), types.NamespacedName{Name: "captains.crew.example.com"}, crd)
255+
Expect(err).NotTo(HaveOccurred())
256+
Expect(crd.Spec.Names.Kind).To(Equal("Captain"))
257+
258+
crd = &v1beta1.CustomResourceDefinition{}
259+
err = c.Get(context.TODO(), types.NamespacedName{Name: "firstmates.crew.example.com"}, crd)
260+
Expect(err).NotTo(HaveOccurred())
261+
Expect(crd.Spec.Names.Kind).To(Equal("FirstMate"))
262+
263+
crd = &v1beta1.CustomResourceDefinition{}
264+
err = c.Get(context.TODO(), types.NamespacedName{Name: "drivers.crew.example.com"}, crd)
265+
Expect(err).NotTo(HaveOccurred())
266+
Expect(crd.Spec.Names.Kind).To(Equal("Driver"))
267+
268+
err = WaitForCRDs(env.Config, []*v1beta1.CustomResourceDefinition{
269+
{
270+
Spec: v1beta1.CustomResourceDefinitionSpec{
271+
Group: "qux.example.com",
272+
Version: "v1beta1",
273+
Names: v1beta1.CustomResourceDefinitionNames{
274+
Plural: "bazs",
275+
}},
276+
},
277+
{
278+
Spec: v1beta1.CustomResourceDefinitionSpec{
279+
Group: "bar.example.com",
280+
Version: "v1beta1",
281+
Names: v1beta1.CustomResourceDefinitionNames{
282+
Plural: "foos",
283+
}},
284+
},
285+
{
286+
Spec: v1beta1.CustomResourceDefinitionSpec{
287+
Group: "crew.example.com",
288+
Version: "v1beta1",
289+
Names: v1beta1.CustomResourceDefinitionNames{
290+
Plural: "captains",
291+
}},
292+
},
293+
{
294+
Spec: v1beta1.CustomResourceDefinitionSpec{
295+
Group: "crew.example.com",
296+
Version: "v1beta1",
297+
Names: v1beta1.CustomResourceDefinitionNames{
298+
Plural: "firstmates",
299+
}},
300+
},
301+
{
302+
Spec: v1beta1.CustomResourceDefinitionSpec{
303+
Group: "crew.example.com",
304+
Names: v1beta1.CustomResourceDefinitionNames{
305+
Plural: "drivers",
306+
},
307+
Versions: []v1beta1.CustomResourceDefinitionVersion{
308+
{
309+
Name: "v1",
310+
Storage: true,
311+
Served: true,
312+
},
313+
{
314+
Name: "v2",
315+
Storage: false,
316+
Served: true,
317+
},
318+
}},
319+
},
320+
},
321+
CRDInstallOptions{MaxTime: 50 * time.Millisecond, PollInterval: 15 * time.Millisecond},
322+
)
323+
Expect(err).NotTo(HaveOccurred())
324+
325+
err = UninstallCRDs(env.Config, CRDInstallOptions{
326+
Paths: []string{filepath.Join(".", "testdata")},
327+
})
328+
Expect(err).NotTo(HaveOccurred())
329+
330+
close(done)
331+
}, 10)
332+
})
219333
})

pkg/envtest/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ type Environment struct {
135135
}
136136

137137
// Stop stops a running server.
138-
// If USE_EXISTING_CLUSTER is set to true, this method is a no-op.
138+
// If USE_EXISTING_CLUSTER is set to true, uninstall whatever CRDs were installed with Start().
139139
func (te *Environment) Stop() error {
140140
if te.useExistingCluster() {
141-
return nil
141+
return UninstallCRDs(te.Config, te.CRDInstallOptions)
142142
}
143143
return te.ControlPlane.Stop()
144144
}

0 commit comments

Comments
 (0)