// ResizeController resizes a controller named 'name' by setting replicas to 'replicas' func ResizeController(name string, replicas int, client client.Interface) error { controller, err := client.GetReplicationController(name) if err != nil { return err } controller.DesiredState.Replicas = replicas controllerOut, err := client.UpdateReplicationController(controller) if err != nil { return err } data, err := yaml.Marshal(controllerOut) if err != nil { return err } fmt.Print(string(data)) return nil }
// Update performs a rolling update of a collection of pods. // 'name' points to a replication controller. // 'client' is used for updating pods. // 'updatePeriod' is the time between pod updates. // 'imageName' is the new image to update for the template. This will work // with the first container in the pod. There is no support yet for // updating more complex replication controllers. If this is blank then no // update of the image is performed. func Update(name string, client client.Interface, updatePeriod time.Duration, imageName string) error { controller, err := client.GetReplicationController(name) if err != nil { return err } if len(imageName) != 0 { controller.DesiredState.PodTemplate.DesiredState.Manifest.Containers[0].Image = imageName controller, err = client.UpdateReplicationController(controller) if err != nil { return err } } s := labels.Set(controller.DesiredState.ReplicaSelector).AsSelector() podList, err := client.ListPods(s) if err != nil { return err } expected := len(podList.Items) if expected == 0 { return nil } for _, pod := range podList.Items { // We delete the pod here, the controller will recreate it. This will result in pulling // a new Docker image. This isn't a full "update" but it's what we support for now. err = client.DeletePod(pod.ID) if err != nil { return err } time.Sleep(updatePeriod) } return wait.Poll(time.Second*5, time.Second*300, func() (bool, error) { podList, err := client.ListPods(s) if err != nil { return false, err } return len(podList.Items) == expected, nil }) }