fix(kube): reap deleted resources during upgrade

pull/1825/head
Adam Reese 8 years ago
parent b22e6fcfaa
commit 9e37009467

@ -219,7 +219,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader
for _, info := range original.Difference(target) {
log.Printf("Deleting %s in %s...", info.Name, info.Namespace)
if err := deleteResource(info); err != nil {
if err := deleteResource(c, info); err != nil {
log.Printf("Failed to delete %s, err: %s", info.Name, err)
}
}
@ -232,20 +232,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader
func (c *Client) Delete(namespace string, reader io.Reader) error {
return perform(c, namespace, reader, func(info *resource.Info) error {
log.Printf("Starting delete for %s %s", info.Name, info.Mapping.GroupVersionKind.Kind)
reaper, err := c.Reaper(info.Mapping)
if err != nil {
// If there is no reaper for this resources, delete it.
if kubectl.IsNoSuchReaperError(err) {
err := resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name)
return skipIfNotFound(err)
}
return err
}
log.Printf("Using reaper for deleting %s", info.Name)
err = reaper.Stop(info.Namespace, info.Name, 0, nil)
err := deleteResource(c, info)
return skipIfNotFound(err)
})
}
@ -303,8 +290,17 @@ func createResource(info *resource.Info) error {
return err
}
func deleteResource(info *resource.Info) error {
return resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name)
func deleteResource(c *Client, info *resource.Info) error {
reaper, err := c.Reaper(info.Mapping)
if err != nil {
// If there is no reaper for this resources, delete it.
if kubectl.IsNoSuchReaperError(err) {
return resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name)
}
return err
}
log.Printf("Using reaper for deleting %s", info.Name)
return reaper.Stop(info.Namespace, info.Name, 0, nil)
}
func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, recreate bool) error {

@ -23,13 +23,18 @@ import (
"net/http"
"strings"
"testing"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/client/restclient/fake"
"k8s.io/kubernetes/pkg/kubectl"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/runtime"
)
@ -79,6 +84,24 @@ func newResponse(code int, obj runtime.Object) (*http.Response, error) {
return &http.Response{StatusCode: code, Header: header, Body: body}, nil
}
type fakeReaper struct {
name string
}
func (r *fakeReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *api.DeleteOptions) error {
r.name = name
return nil
}
type fakeReaperFactory struct {
cmdutil.Factory
reaper kubectl.Reaper
}
func (f *fakeReaperFactory) Reaper(mapping *meta.RESTMapping) (kubectl.Reaper, error) {
return f.reaper, nil
}
func TestUpdate(t *testing.T) {
listA := newPodList("starfish", "otter", "squid")
listB := newPodList("starfish", "otter", "dolphin")
@ -92,6 +115,7 @@ func TestUpdate(t *testing.T) {
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
p, m := req.URL.Path, req.Method
actions[p] = m
t.Logf("got request %s %s", p, m)
switch {
case p == "/namespaces/default/pods/starfish" && m == "GET":
return newResponse(200, &listA.Items[0])
@ -121,7 +145,9 @@ func TestUpdate(t *testing.T) {
}),
}
c := &Client{Factory: f}
reaper := &fakeReaper{}
rf := &fakeReaperFactory{Factory: f, reaper: reaper}
c := &Client{Factory: rf}
if err := c.Update(api.NamespaceDefault, objBody(codec, &listA), objBody(codec, &listB), false); err != nil {
t.Fatal(err)
}
@ -131,7 +157,6 @@ func TestUpdate(t *testing.T) {
"/namespaces/default/pods/otter": "GET",
"/namespaces/default/pods/starfish": "PATCH",
"/namespaces/default/pods": "POST",
"/namespaces/default/pods/squid": "DELETE",
}
for k, v := range expectedActions {
@ -139,6 +164,11 @@ func TestUpdate(t *testing.T) {
t.Errorf("expected a %s request to %s", k, v)
}
}
if reaper.name != "squid" {
t.Errorf("unexpected reaper: %#v", reaper)
}
}
func TestPerform(t *testing.T) {

Loading…
Cancel
Save