github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/cmd/jujud/agent/machine/stateworkers.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machine
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/state"
    10  	"github.com/juju/juju/worker"
    11  	"github.com/juju/juju/worker/dependency"
    12  	workerstate "github.com/juju/juju/worker/state"
    13  )
    14  
    15  // StateWorkersConfig provides the dependencies for the
    16  // stateworkers manifold.
    17  type StateWorkersConfig struct {
    18  	StateName         string
    19  	StartStateWorkers func(*state.State) (worker.Worker, error)
    20  }
    21  
    22  // StateWorkersManifold starts workers that rely on a *state.State
    23  // using a function provided to it.
    24  //
    25  // This manifold exists to start State-using workers which have not
    26  // yet been ported to work directly with the dependency engine. Once
    27  // all state workers started by StartStateWorkers have been migrated
    28  // to the dependency engine, this manifold can be removed.
    29  func StateWorkersManifold(config StateWorkersConfig) dependency.Manifold {
    30  	return dependency.Manifold{
    31  		Inputs: []string{
    32  			config.StateName,
    33  		},
    34  		Start: func(context dependency.Context) (worker.Worker, error) {
    35  			if config.StartStateWorkers == nil {
    36  				return nil, errors.New("StartStateWorkers not specified")
    37  			}
    38  
    39  			var stTracker workerstate.StateTracker
    40  			if err := context.Get(config.StateName, &stTracker); err != nil {
    41  				return nil, err
    42  			}
    43  
    44  			st, err := stTracker.Use()
    45  			if err != nil {
    46  				return nil, errors.Annotate(err, "acquiring state")
    47  			}
    48  
    49  			w, err := config.StartStateWorkers(st)
    50  			if err != nil {
    51  				stTracker.Done()
    52  				return nil, errors.Annotate(err, "worker startup")
    53  			}
    54  
    55  			// When the state workers are done, indicate that we no
    56  			// longer need the State.
    57  			go func() {
    58  				w.Wait()
    59  				stTracker.Done()
    60  			}()
    61  
    62  			return w, nil
    63  		},
    64  	}
    65  }