launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/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  	"launchpad.net/tomb"
     8  
     9  	"launchpad.net/juju-core/instance"
    10  	"launchpad.net/juju-core/state"
    11  	"launchpad.net/juju-core/worker"
    12  )
    13  
    14  type updaterWorker struct {
    15  	st   *state.State
    16  	tomb tomb.Tomb
    17  
    18  	observer *environObserver
    19  }
    20  
    21  // NewWorker returns a worker that keeps track of
    22  // the machines in the state and polls their instance
    23  // addresses and status periodically to keep them up to date.
    24  func NewWorker(st *state.State) worker.Worker {
    25  	u := &updaterWorker{
    26  		st: st,
    27  	}
    28  	// wait for environment
    29  	go func() {
    30  		defer u.tomb.Done()
    31  		u.tomb.Kill(u.loop())
    32  	}()
    33  	return u
    34  }
    35  
    36  func (u *updaterWorker) Kill() {
    37  	u.tomb.Kill(nil)
    38  }
    39  
    40  func (u *updaterWorker) Wait() error {
    41  	return u.tomb.Wait()
    42  }
    43  
    44  func (u *updaterWorker) loop() (err error) {
    45  	u.observer, err = newEnvironObserver(u.st, u.tomb.Dying())
    46  	if err != nil {
    47  		return mask(err)
    48  	}
    49  	logger.Infof("instance poller received inital environment configuration")
    50  	defer func() {
    51  		obsErr := worker.Stop(u.observer)
    52  		if err == nil {
    53  			err = obsErr
    54  		}
    55  	}()
    56  	return watchMachinesLoop(u, u.st.WatchEnvironMachines())
    57  }
    58  
    59  func (u *updaterWorker) newMachineContext() machineContext {
    60  	return u
    61  }
    62  
    63  func (u *updaterWorker) getMachine(id string) (machine, error) {
    64  	return u.st.Machine(id)
    65  }
    66  
    67  func (u *updaterWorker) dying() <-chan struct{} {
    68  	return u.tomb.Dying()
    69  }
    70  
    71  func (u *updaterWorker) killAll(err error) {
    72  	u.tomb.Kill(err)
    73  }
    74  
    75  func (u *updaterWorker) instanceInfo(id instance.Id) (instanceInfo, error) {
    76  	env := u.observer.Environ()
    77  	insts, err := env.Instances([]instance.Id{id})
    78  	if err != nil {
    79  		return instanceInfo{}, mask(err)
    80  	}
    81  	addr, err := insts[0].Addresses()
    82  	if err != nil {
    83  		return instanceInfo{}, mask(err)
    84  	}
    85  	return instanceInfo{
    86  		addr,
    87  		insts[0].Status(),
    88  	}, nil
    89  }