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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package reboot
     5  
     6  import (
     7  	"github.com/juju/clock"
     8  	"github.com/juju/errors"
     9  	"gopkg.in/juju/worker.v1"
    10  	"gopkg.in/juju/worker.v1/dependency"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/api"
    14  	"github.com/juju/juju/api/base"
    15  	"github.com/juju/juju/core/machinelock"
    16  )
    17  
    18  // ManifoldConfig defines the names of the manifolds on which a Manifold will depend.
    19  type ManifoldConfig struct {
    20  	AgentName     string
    21  	APICallerName string
    22  	MachineLock   machinelock.Lock
    23  	Clock         clock.Clock
    24  }
    25  
    26  // Manifold returns a dependency manifold that runs a reboot worker,
    27  // using the resource names defined in the supplied config.
    28  func Manifold(config ManifoldConfig) dependency.Manifold {
    29  	return dependency.Manifold{
    30  		Inputs: []string{
    31  			config.AgentName,
    32  			config.APICallerName,
    33  		},
    34  		Start: func(context dependency.Context) (worker.Worker, error) {
    35  			var agent agent.Agent
    36  			if err := context.Get(config.AgentName, &agent); err != nil {
    37  				return nil, err
    38  			}
    39  			var apiCaller base.APICaller
    40  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    41  				return nil, err
    42  			}
    43  			if config.Clock == nil {
    44  				return nil, errors.NotValidf("missing Clock")
    45  			}
    46  			if config.MachineLock == nil {
    47  				return nil, errors.NotValidf("missing MachineLock")
    48  			}
    49  			return newWorker(agent, apiCaller, config.MachineLock, config.Clock)
    50  		},
    51  	}
    52  }
    53  
    54  // newWorker starts a new reboot worker.
    55  //
    56  // TODO(mjs) - It's not tested at the moment, because the scaffolding
    57  // necessary is too unwieldy/distracting to introduce at this point.
    58  func newWorker(a agent.Agent, apiCaller base.APICaller, machineLock machinelock.Lock, clock clock.Clock) (worker.Worker, error) {
    59  	apiConn, ok := apiCaller.(api.Connection)
    60  	if !ok {
    61  		return nil, errors.New("unable to obtain api.Connection")
    62  	}
    63  	rebootState, err := apiConn.Reboot()
    64  	if err != nil {
    65  		return nil, errors.Trace(err)
    66  	}
    67  	w, err := NewReboot(rebootState, a.CurrentConfig(), machineLock, clock)
    68  	if err != nil {
    69  		return nil, errors.Annotate(err, "cannot start reboot worker")
    70  	}
    71  	return w, nil
    72  }