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 <blaine.gardner@suse.com>
This commit is contained in:
Blaine Gardner
2018-12-04 11:33:40 -07:00
parent acb0e1454e
commit 3d89c78508
4 changed files with 60 additions and 36 deletions
+9 -6
View File
@@ -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)
}
}
+8 -4
View File
@@ -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
}
+2 -18
View File
@@ -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.
+41 -8
View File
@@ -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 {