func (p *containerProvisioner) loop() error { var environConfigChanges <-chan struct{} environWatcher, err := p.st.WatchForEnvironConfigChanges() if err != nil { return err } environConfigChanges = environWatcher.Changes() defer watcher.Stop(environWatcher, &p.tomb) config, err := p.st.EnvironConfig() if err != nil { return err } harvestMode := config.ProvisionerHarvestMode() task, err := p.getStartTask(harvestMode) if err != nil { return err } defer watcher.Stop(task, &p.tomb) for { select { case <-p.tomb.Dying(): return tomb.ErrDying case <-task.Dying(): err := task.Err() logger.Errorf("%s provisioner died: %v", p.containerType, err) return err case _, ok := <-environConfigChanges: if !ok { return watcher.EnsureErr(environWatcher) } environConfig, err := p.st.EnvironConfig() if err != nil { logger.Errorf("cannot load environment configuration: %v", err) return err } p.configObserver.notify(environConfig) task.SetHarvestMode(environConfig.ProvisionerHarvestMode()) } } }
func (p *containerProvisioner) loop() error { environWatcher, err := p.st.WatchForEnvironConfigChanges() if err != nil { return errors.Trace(err) } if err := p.catacomb.Add(environWatcher); err != nil { return errors.Trace(err) } config, err := p.st.EnvironConfig() if err != nil { return err } harvestMode := config.ProvisionerHarvestMode() task, err := p.getStartTask(harvestMode) if err != nil { return err } if err := p.catacomb.Add(task); err != nil { return errors.Trace(err) } for { select { case <-p.catacomb.Dying(): return p.catacomb.ErrDying() case _, ok := <-environWatcher.Changes(): if !ok { return errors.New("environment configuratioon watch closed") } environConfig, err := p.st.EnvironConfig() if err != nil { return errors.Annotate(err, "cannot load environment configuration") } p.configObserver.notify(environConfig) task.SetHarvestMode(environConfig.ProvisionerHarvestMode()) } } }