diff --git a/cmd/tiller/release_server_test.go b/cmd/tiller/release_server_test.go index cfeb5d9eb571cff4bade2b2f48a77fc4cf359280..594bd865de99b8649dc5d8c51d1b23c8cd76bf43 100644 --- a/cmd/tiller/release_server_test.go +++ b/cmd/tiller/release_server_test.go @@ -582,6 +582,24 @@ func TestUpdateReleaseNoHooks(t *testing.T) { } +func TestUpdateReleaseNoChanges(t *testing.T) { + c := context.Background() + rs := rsFixture() + rel := releaseStub() + rs.env.Releases.Create(rel) + + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + DisableHooks: true, + Chart: rel.GetChart(), + } + + _, err := rs.UpdateRelease(c, req) + if err != nil { + t.Fatalf("Failed updated: %s", err) + } +} + func TestUninstallRelease(t *testing.T) { c := context.Background() rs := rsFixture() diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 0a0f459ba369ae8bf5932622458f6a1a085348b6..39a90aba518282bc4e376fbd4c542657c70b108a 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -56,6 +56,15 @@ func New(config clientcmd.ClientConfig) *Client { // ResourceActorFunc performs an action on a single resource. type ResourceActorFunc func(*resource.Info) error +// ErrAlreadyExists can be returned where there are no changes +type ErrAlreadyExists struct { + errorMsg string +} + +func (e ErrAlreadyExists) Error() string { + return fmt.Sprintf("Looks like there are no changes for %s", e.errorMsg) +} + // APIClient returns a Kubernetes API client. // // This is necessary because cmdutil.Client is a field, not a method, which @@ -189,8 +198,12 @@ func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) } if err := updateResource(info, currentObj); err != nil { - log.Printf("error updating the resource %s:\n\t %v", resourceName, err) - updateErrors = append(updateErrors, err.Error()) + if alreadyExistErr, ok := err.(ErrAlreadyExists); ok { + log.Printf(alreadyExistErr.errorMsg) + } else { + log.Printf("error updating the resource %s:\n\t %v", resourceName, err) + updateErrors = append(updateErrors, err.Error()) + } } return nil @@ -330,7 +343,7 @@ func updateResource(target *resource.Info, currentObj runtime.Object) error { } if reflect.DeepEqual(originalJS, editedJS) { - return fmt.Errorf("Looks like there are no changes for %s", target.Name) + return ErrAlreadyExists{target.Name} } patch, err := strategicpatch.CreateStrategicMergePatch(originalJS, editedJS, currentObj)