github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/modelworkermanager/manifold.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package modelworkermanager
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/worker.v1"
     9  	"gopkg.in/juju/worker.v1/dependency"
    10  
    11  	jworker "github.com/juju/juju/worker"
    12  	"github.com/juju/juju/worker/common"
    13  	workerstate "github.com/juju/juju/worker/state"
    14  )
    15  
    16  // ManifoldConfig holds the information necessary to run a model worker manager
    17  // in a dependency.Engine.
    18  type ManifoldConfig struct {
    19  	StateName      string
    20  	NewWorker      func(Config) (worker.Worker, error)
    21  	NewModelWorker NewModelWorkerFunc
    22  }
    23  
    24  // Validate validates the manifold configuration.
    25  func (config ManifoldConfig) Validate() error {
    26  	if config.StateName == "" {
    27  		return errors.NotValidf("empty StateName")
    28  	}
    29  	if config.NewWorker == nil {
    30  		return errors.NotValidf("nil NewWorker")
    31  	}
    32  	if config.NewModelWorker == nil {
    33  		return errors.NotValidf("nil NewModelWorker")
    34  	}
    35  	return nil
    36  }
    37  
    38  // Manifold returns a dependency.Manifold that will run a model worker manager.
    39  func Manifold(config ManifoldConfig) dependency.Manifold {
    40  	return dependency.Manifold{
    41  		Inputs: []string{config.StateName},
    42  		Start:  config.start,
    43  	}
    44  }
    45  
    46  // start is a method on ManifoldConfig because it's more readable than a closure.
    47  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    48  	if err := config.Validate(); err != nil {
    49  		return nil, errors.Trace(err)
    50  	}
    51  
    52  	var stTracker workerstate.StateTracker
    53  	if err := context.Get(config.StateName, &stTracker); err != nil {
    54  		return nil, errors.Trace(err)
    55  	}
    56  	statePool, err := stTracker.Use()
    57  	if err != nil {
    58  		return nil, errors.Trace(err)
    59  	}
    60  
    61  	w, err := config.NewWorker(Config{
    62  		ModelWatcher:   statePool.SystemState(),
    63  		ModelGetter:    StatePoolModelGetter{statePool},
    64  		NewModelWorker: config.NewModelWorker,
    65  		ErrorDelay:     jworker.RestartDelay,
    66  	})
    67  	if err != nil {
    68  		stTracker.Done()
    69  		return nil, errors.Trace(err)
    70  	}
    71  	return common.NewCleanupWorker(w, func() { stTracker.Done() }), nil
    72  }