From 3d89c78508ca809e9fffea8bfe4e07bc498fbeae Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 29 Nov 2018 13:12:56 -0700 Subject: [PATCH] ceph: Update deployments on rook img update Use the `UpdateDeploymentAndWait` method used by the osd operator to update the deployments for mgrs, mdses, and rgws when the Rook orchestrator image is updated. Signed-off-by: Blaine Gardner --- pkg/operator/ceph/cluster/mgr/mgr.go | 15 +++++---- pkg/operator/ceph/file/mds.go | 12 ++++--- pkg/operator/ceph/object/rgw.go | 20 ++---------- pkg/operator/ceph/object/spec.go | 49 +++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 36 deletions(-) diff --git a/pkg/operator/ceph/cluster/mgr/mgr.go b/pkg/operator/ceph/cluster/mgr/mgr.go index e60371fb0..2891b4c11 100644 --- a/pkg/operator/ceph/cluster/mgr/mgr.go +++ b/pkg/operator/ceph/cluster/mgr/mgr.go @@ -112,14 +112,17 @@ func (c *Cluster) Start() error { } // start the deployment - deployment := c.makeDeployment(mgrConfig, dashboardPort) - if _, err := c.context.Clientset.ExtensionsV1beta1().Deployments(c.Namespace).Create(deployment); err != nil { + d := c.makeDeployment(mgrConfig, dashboardPort) + logger.Debugf("starting mgr deployment: %+v", d) + _, err := c.context.Clientset.ExtensionsV1beta1().Deployments(c.Namespace).Create(d) + if err != nil { if !errors.IsAlreadyExists(err) { - return fmt.Errorf("failed to create %s deployment. %+v", resourceName, err) + return fmt.Errorf("failed to create mgr deployment %s. %+v", resourceName, err) + } + logger.Infof("deployment for mgr %s already exists. updating if needed", resourceName) + if err := k8sutil.UpdateDeploymentAndWait(c.context, d, c.Namespace); err != nil { + return fmt.Errorf("failed to update mgr deployment %s. %+v", resourceName, err) } - logger.Infof("%s deployment already exists", resourceName) - } else { - logger.Infof("%s deployment started", resourceName) } } diff --git a/pkg/operator/ceph/file/mds.go b/pkg/operator/ceph/file/mds.go index 69e5a921b..d0557ee9b 100644 --- a/pkg/operator/ceph/file/mds.go +++ b/pkg/operator/ceph/file/mds.go @@ -141,11 +141,15 @@ func (c *cluster) start() error { _, err := c.context.Clientset.ExtensionsV1beta1().Deployments(c.fs.Namespace).Create(d) if err != nil { if !errors.IsAlreadyExists(err) { - return fmt.Errorf("failed to create mds deployment: %+v", err) + return fmt.Errorf("failed to create mds deployment %s: %+v", mdsConfig.ResourceName, err) + } + logger.Infof("deployment for mds %s already exists. updating if needed", mdsConfig.ResourceName) + // TODO: need to prepare for upgrade here each time. Also, before a given deployment is + // terminated, I think we should somehow make sure that it isn't running the single + // active daemon. If it is, then we should have another daemon take over as active. @Jan? + if err := k8sutil.UpdateDeploymentAndWait(c.context, d, c.fs.Namespace); err != nil { + return fmt.Errorf("failed to update mds deployment %s. %+v", mdsConfig.ResourceName, err) } - logger.Infof("mds deployment %s already exists", d.Name) - } else { - logger.Infof("mds deployment %s started", d.Name) } desiredDeployments[d.GetName()] = true // add deployment name to improvised set } diff --git a/pkg/operator/ceph/object/rgw.go b/pkg/operator/ceph/object/rgw.go index 2331a84ba..2334597ef 100644 --- a/pkg/operator/ceph/object/rgw.go +++ b/pkg/operator/ceph/object/rgw.go @@ -116,26 +116,10 @@ func (c *config) startRGWPods(update bool) error { } // start the deployment or daemonset - var rgwType string - var err error if c.store.Spec.Gateway.AllNodes { - rgwType = "daemonset" - err = c.startDaemonset() - } else { - rgwType = "deployment" - err = c.startDeployment() + return c.startDaemonset() } - - if err != nil { - if !errors.IsAlreadyExists(err) { - return fmt.Errorf("failed to create rgw %store. %+v", rgwType, err) - } - logger.Infof("rgw %s already exists", rgwType) - } else { - logger.Infof("rgw %s started", rgwType) - } - - return nil + return c.startDeployment() } // Delete the object store. diff --git a/pkg/operator/ceph/object/spec.go b/pkg/operator/ceph/object/spec.go index 46a008edd..eb0553c04 100644 --- a/pkg/operator/ceph/object/spec.go +++ b/pkg/operator/ceph/object/spec.go @@ -34,21 +34,38 @@ import ( func (c *config) startDeployment() error { - deployment := &extensions.Deployment{ + d := &extensions.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: c.instanceName(), Namespace: c.store.Namespace, }, Spec: extensions.DeploymentSpec{Template: c.makeRGWPodSpec(), Replicas: &c.store.Spec.Gateway.Instances}, } - k8sutil.SetOwnerRefs(c.context.Clientset, c.store.Namespace, &deployment.ObjectMeta, c.ownerRefs) - _, err := c.context.Clientset.ExtensionsV1beta1().Deployments(c.store.Namespace).Create(deployment) - return err + k8sutil.SetOwnerRefs(c.context.Clientset, c.store.Namespace, &d.ObjectMeta, c.ownerRefs) + + logger.Debugf("starting mds deployment: %+v", d) + _, err := c.context.Clientset.ExtensionsV1beta1().Deployments(c.store.Namespace).Create(d) + if err != nil { + if !errors.IsAlreadyExists(err) { + return fmt.Errorf("failed to create rgw deployment %s: %+v", c.instanceName(), err) + } + logger.Infof("deployment for rgw %s already exists. updating if needed", c.instanceName()) + // There may be a *lot* of rgws, and they are stateless, so don't bother waiting until the + // entire deployment is updated to move on. + // TODO: is the above statement safe to assume? + // TODO: Are there any steps for RGW that need to happen before the daemons upgrade? + _, err := c.context.Clientset.Extensions().Deployments(c.store.Namespace).Update(d) + if err != nil { + return fmt.Errorf("failed to update rgw deployment %s. %+v", c.instanceName(), err) + } + } + + return nil } func (c *config) startDaemonset() error { - daemonset := &extensions.DaemonSet{ + d := &extensions.DaemonSet{ ObjectMeta: metav1.ObjectMeta{ Name: c.instanceName(), Namespace: c.store.Namespace, @@ -60,10 +77,26 @@ func (c *config) startDaemonset() error { Template: c.makeRGWPodSpec(), }, } - k8sutil.SetOwnerRefs(c.context.Clientset, c.store.Namespace, &daemonset.ObjectMeta, c.ownerRefs) + k8sutil.SetOwnerRefs(c.context.Clientset, c.store.Namespace, &d.ObjectMeta, c.ownerRefs) - _, err := c.context.Clientset.ExtensionsV1beta1().DaemonSets(c.store.Namespace).Create(daemonset) - return err + logger.Debugf("starting rgw daemonset: %+v", d) + _, err := c.context.Clientset.ExtensionsV1beta1().DaemonSets(c.store.Namespace).Create(d) + if err != nil { + if !errors.IsAlreadyExists(err) { + return fmt.Errorf("failed to create rgw daemonset %s: %+v", c.instanceName(), err) + } + logger.Infof("daemonset for rgw %s already exists. updating if needed", c.instanceName()) + // There may be a *lot* of rgws, and they are stateless, so don't bother waiting until the + // entire daemonset is updated to move on. + // TODO: is the above statement safe to assume? + // TODO: Are there any steps for RGW that need to happen before the daemons upgrade? + _, err := c.context.Clientset.Extensions().DaemonSets(c.store.Namespace).Update(d) + if err != nil { + return fmt.Errorf("failed to update rgw daemonset %s. %+v", c.instanceName(), err) + } + } + + return nil } func (c *config) makeRGWPodSpec() v1.PodTemplateSpec {