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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package pruner
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"gopkg.in/juju/worker.v1"
    12  	"gopkg.in/juju/worker.v1/dependency"
    13  
    14  	"github.com/juju/juju/api/base"
    15  )
    16  
    17  // ManifoldConfig describes the resources and configuration on which the
    18  // statushistorypruner worker depends.
    19  type ManifoldConfig struct {
    20  	APICallerName string
    21  	EnvironName   string
    22  	ClockName     string
    23  	PruneInterval time.Duration
    24  	NewWorker     func(Config) (worker.Worker, error)
    25  	NewFacade     func(base.APICaller) Facade
    26  }
    27  
    28  // Manifold returns a Manifold that encapsulates the statushistorypruner worker.
    29  func Manifold(config ManifoldConfig) dependency.Manifold {
    30  	return dependency.Manifold{
    31  		Inputs: []string{config.APICallerName, config.EnvironName, config.ClockName},
    32  		Start:  config.start,
    33  	}
    34  }
    35  
    36  // start is a StartFunc for a Worker manifold.
    37  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    38  	if err := config.Validate(); err != nil {
    39  		return nil, errors.Trace(err)
    40  	}
    41  	var apiCaller base.APICaller
    42  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    43  		return nil, errors.Trace(err)
    44  	}
    45  	var clock clock.Clock
    46  	if err := context.Get(config.ClockName, &clock); err != nil {
    47  		return nil, errors.Trace(err)
    48  	}
    49  
    50  	facade := config.NewFacade(apiCaller)
    51  	prunerConfig := Config{
    52  		Facade:        facade,
    53  		PruneInterval: config.PruneInterval,
    54  		Clock:         clock,
    55  	}
    56  	w, err := config.NewWorker(prunerConfig)
    57  	if err != nil {
    58  		return nil, errors.Trace(err)
    59  	}
    60  	return w, nil
    61  }
    62  
    63  // Validate is called by start to check for bad configuration.
    64  func (config ManifoldConfig) Validate() error {
    65  	if config.APICallerName == "" {
    66  		return errors.NotValidf("empty APICallerName")
    67  	}
    68  	if config.EnvironName == "" {
    69  		return errors.NotValidf("empty EnvironName")
    70  	}
    71  	if config.ClockName == "" {
    72  		return errors.NotValidf("empty ClockName")
    73  	}
    74  	if config.NewWorker == nil {
    75  		return errors.NotValidf("nil NewWorker")
    76  	}
    77  	if config.NewFacade == nil {
    78  		return errors.NotValidf("nil NewFacade")
    79  	}
    80  	return nil
    81  }