diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index 94352cf44..c6442841a 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -3,6 +3,7 @@ package cluster import ( "fmt" + "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/apis/apps/v1beta1" @@ -126,11 +127,20 @@ func (c *Cluster) updateStatefulSet(newStatefulSet *v1beta1.StatefulSet) error { if c.Statefulset == nil { return fmt.Errorf("There is no StatefulSet in the cluster") } - statefulSet, err := c.KubeClient.StatefulSets(newStatefulSet.Namespace).Update(newStatefulSet) + statefulSetName := util.NameFromMeta(c.Statefulset.ObjectMeta) + + patchData, err := specPatch(newStatefulSet.Spec) if err != nil { - return err + return fmt.Errorf("Can't form patch for the StatefulSet '%s': %s", statefulSetName, err) } + statefulSet, err := c.KubeClient.StatefulSets(c.Statefulset.Namespace).Patch( + c.Statefulset.Name, + api.MergePatchType, + patchData, "") + if err != nil { + return fmt.Errorf("Can't patch StatefulSet '%s': %s", statefulSetName, err) + } c.Statefulset = statefulSet return nil @@ -182,12 +192,19 @@ func (c *Cluster) updateService(newService *v1.Service) error { if c.Service == nil { return fmt.Errorf("There is no Service in the cluster") } - newService.ObjectMeta = c.Service.ObjectMeta - newService.Spec.ClusterIP = c.Service.Spec.ClusterIP + serviceName := util.NameFromMeta(c.Service.ObjectMeta) - svc, err := c.KubeClient.Services(newService.Namespace).Update(newService) + patchData, err := specPatch(newService.Spec) if err != nil { - return err + return fmt.Errorf("Can't form patch for the Service '%s': %s", serviceName, err) + } + + svc, err := c.KubeClient.Services(c.Service.Namespace).Patch( + c.Service.Name, + api.MergePatchType, + patchData, "") + if err != nil { + return fmt.Errorf("Can't patch Service '%s': %s", serviceName, err) } c.Service = svc diff --git a/pkg/cluster/util.go b/pkg/cluster/util.go index 21e5e0f11..96900b01a 100644 --- a/pkg/cluster/util.go +++ b/pkg/cluster/util.go @@ -7,6 +7,7 @@ import ( "time" etcdclient "github.com/coreos/etcd/client" + "k8s.io/apimachinery/pkg/util/json" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/apis/apps/v1beta1" "k8s.io/client-go/pkg/labels" @@ -44,6 +45,12 @@ func normalizeUserFlags(userFlags []string) (flags []string, err error) { return } +func specPatch(spec interface{}) ([]byte, error) { + return json.Marshal(struct { + Spec interface{} `json:"spec"` + }{spec}) +} + func (c *Cluster) logStatefulSetChanges(old, new *v1beta1.StatefulSet, isUpdate bool, reason string) { if isUpdate { c.logger.Infof("StatefulSet '%s' has been changed",