// DeleteController deletes a replication controller named 'name', requires that the controller // already be stopped func DeleteController(name string, client client.ClientInterface) error { controller, err := client.GetReplicationController(name) if err != nil { return err } if controller.DesiredState.Replicas != 0 { return fmt.Errorf("controller has non-zero replicas (%d)", controller.DesiredState.Replicas) } return client.DeleteReplicationController(name) }
// StopController stops a controller named 'name' by setting replicas to zero func StopController(name string, client client.ClientInterface) error { controller, err := client.GetReplicationController(name) if err != nil { return err } controller.DesiredState.Replicas = 0 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 }
// Perform 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. func Update(name string, client client.ClientInterface, updatePeriod time.Duration) error { controller, err := client.GetReplicationController(name) if err != nil { return err } labels := controller.DesiredState.ReplicasInSet podList, err := client.ListPods(labels) if err != nil { return err } for _, pod := range podList.Items { _, err = client.UpdatePod(pod) if err != nil { return err } time.Sleep(updatePeriod) } return nil }
func createService(name string, port int, client client.ClientInterface) (api.Service, error) { svc := api.Service{ JSONBase: api.JSONBase{ID: name}, Port: port, Labels: map[string]string{ "name": name, }, } svc, err := client.CreateService(svc) return svc, err }
// RunController creates a new replication controller named 'name' which creates 'replicas' pods running 'image' func RunController(image, name string, replicas int, client client.ClientInterface, portSpec string, servicePort int) error { controller := api.ReplicationController{ JSONBase: api.JSONBase{ ID: name, }, DesiredState: api.ReplicationControllerState{ Replicas: replicas, ReplicasInSet: map[string]string{ "name": name, }, PodTemplate: api.PodTemplate{ DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Containers: []api.Container{ api.Container{ Image: image, Ports: makePorts(portSpec), }, }, }, }, Labels: map[string]string{ "name": name, }, }, }, Labels: map[string]string{ "name": name, }, } controllerOut, err := client.CreateReplicationController(controller) if err != nil { return err } data, err := yaml.Marshal(controllerOut) if err != nil { return err } fmt.Print(string(data)) if servicePort > 0 { svc, err := createService(name, servicePort, client) if err != nil { return err } data, err = yaml.Marshal(svc) if err != nil { return err } fmt.Printf(string(data)) } return nil }
// Perform 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. func Update(name string, client client.ClientInterface, updatePeriod time.Duration) error { controller, err := client.GetReplicationController(name) if err != nil { return err } s := labels.Set(controller.DesiredState.ReplicaSelector).AsSelector() podList, err := client.ListPods(s) if err != nil { return err } 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 its what we support for now. err = client.DeletePod(pod.ID) if err != nil { return err } time.Sleep(updatePeriod) } return nil }