func (r RCtl) RollingUpdate(oldID, newID string, want, need int, deletes bool) { if want < need { r.logger.WithFields(logrus.Fields{ "want": want, "need": need, }).Fatalln("Cannot run update with desired replicas less than minimum replicas") } sessions := make(chan string) quit := make(chan struct{}) go kp.ConsulSessionManager(api.SessionEntry{ LockDelay: 1 * time.Nanosecond, Behavior: api.SessionBehaviorDelete, TTL: "15s", }, r.baseClient, sessions, quit, r.logger) session := <-sessions if session == "" { r.logger.NoFields().Fatalln("Could not acquire session") } lock := r.kps.NewUnmanagedLock(session, "") result := make(chan bool, 1) go func() { result <- roll.NewUpdate(roll_fields.Update{ OldRC: rc_fields.ID(oldID), NewRC: rc_fields.ID(newID), DesiredReplicas: want, MinimumReplicas: need, DeletePods: deletes, }, r.kps, r.rcs, r.hcheck, r.labeler, r.sched, r.logger, lock).Run(quit) close(result) }() signals := make(chan os.Signal, 2) signal.Notify(signals, syscall.SIGTERM, os.Interrupt) LOOP: for { select { case <-signals: // try to clean up locks on ^C close(quit) // do not exit right away - the session and result channels will be // closed after the quit is requested, ensuring that the locks held // by the farm were released. r.logger.NoFields().Errorln("Got signal, exiting") case <-sessions: r.logger.NoFields().Fatalln("Lost session") case res := <-result: // done, either due to ^C (already printed message above) or // clean finish if res { r.logger.NoFields().Infoln("Done") } break LOOP } } }
func (r rctlParams) RollingUpdate(oldID, newID string, want, need int, pagerdutyServiceKey string) { if want < need { r.logger.WithFields(logrus.Fields{ "want": want, "need": need, }).Fatalln("Cannot run update with desired replicas less than minimum replicas") } sessions := make(chan string) quit := make(chan struct{}) go consulutil.SessionManager(api.SessionEntry{ Name: SessionName(), LockDelay: 5 * time.Second, Behavior: api.SessionBehaviorDelete, TTL: "15s", }, r.baseClient, sessions, quit, r.logger) sessionID := <-sessions if sessionID == "" { r.logger.NoFields().Fatalln("Could not acquire session") } session := r.kps.NewUnmanagedSession(sessionID, "") alerter := alerting.NewNop() if pagerdutyServiceKey != "" { var err error alerter, err = alerting.NewPagerduty(pagerdutyServiceKey, r.httpClient) if err != nil { r.logger.WithError(err).Fatalln("Could not initialize pagerduty alerter") } } result := make(chan bool, 1) go func() { result <- roll.NewUpdate(roll_fields.Update{ OldRC: rc_fields.ID(oldID), NewRC: rc_fields.ID(newID), DesiredReplicas: want, MinimumReplicas: need, }, r.kps, r.rcs, r.hcheck, r.labeler, r.sched, r.logger, session, alerter).Run(quit) close(result) }() signals := make(chan os.Signal, 2) signal.Notify(signals, syscall.SIGTERM, os.Interrupt) LOOP: for { select { case <-signals: // try to clean up locks on ^C close(quit) // do not exit right away - the session and result channels will be // closed after the quit is requested, ensuring that the locks held // by the farm were released. r.logger.NoFields().Errorln("Got signal, exiting") case <-sessions: r.logger.NoFields().Fatalln("Lost session") case res := <-result: // done, either due to ^C (already printed message above) or // clean finish if res { r.logger.NoFields().Infoln("Done") } break LOOP } } }