github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/instancepoller/worker.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package instancepoller
     5  
     6  import (
     7  	"github.com/juju/names"
     8  	"launchpad.net/tomb"
     9  
    10  	apiinstancepoller "github.com/juju/juju/api/instancepoller"
    11  	apiwatcher "github.com/juju/juju/api/watcher"
    12  	"github.com/juju/juju/worker"
    13  )
    14  
    15  type updaterWorker struct {
    16  	st   *apiinstancepoller.API
    17  	tomb tomb.Tomb
    18  	*aggregator
    19  
    20  	observer *worker.EnvironObserver
    21  }
    22  
    23  // NewWorker returns a worker that keeps track of
    24  // the machines in the state and polls their instance
    25  // addresses and status periodically to keep them up to date.
    26  func NewWorker(st *apiinstancepoller.API) worker.Worker {
    27  	u := &updaterWorker{
    28  		st: st,
    29  	}
    30  	// wait for environment
    31  	go func() {
    32  		defer u.tomb.Done()
    33  		u.tomb.Kill(u.loop())
    34  	}()
    35  	return u
    36  }
    37  
    38  func (u *updaterWorker) Kill() {
    39  	u.tomb.Kill(nil)
    40  }
    41  
    42  func (u *updaterWorker) Wait() error {
    43  	return u.tomb.Wait()
    44  }
    45  
    46  func (u *updaterWorker) loop() (err error) {
    47  	u.observer, err = worker.NewEnvironObserver(u.st)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	u.aggregator = newAggregator(u.observer.Environ())
    52  	logger.Infof("instance poller received inital environment configuration")
    53  	defer func() {
    54  		obsErr := worker.Stop(u.observer)
    55  		if err == nil {
    56  			err = obsErr
    57  		}
    58  	}()
    59  	var w apiwatcher.StringsWatcher
    60  	w, err = u.st.WatchEnvironMachines()
    61  	if err != nil {
    62  		return err
    63  	}
    64  	return watchMachinesLoop(u, w)
    65  }
    66  
    67  func (u *updaterWorker) newMachineContext() machineContext {
    68  	return u
    69  }
    70  
    71  func (u *updaterWorker) getMachine(tag names.MachineTag) (machine, error) {
    72  	return u.st.Machine(tag)
    73  }
    74  
    75  func (u *updaterWorker) dying() <-chan struct{} {
    76  	return u.tomb.Dying()
    77  }
    78  
    79  func (u *updaterWorker) killAll(err error) {
    80  	u.tomb.Kill(err)
    81  }