github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/machineactions/manifold_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Copyright 2016 Cloudbase Solutions
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package machineactions_test
     6  
     7  import (
     8  	"github.com/juju/errors"
     9  	"github.com/juju/names/v5"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/worker/v3"
    13  	"github.com/juju/worker/v3/dependency"
    14  	dt "github.com/juju/worker/v3/dependency/testing"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/agent"
    18  	"github.com/juju/juju/api/base"
    19  	"github.com/juju/juju/core/machinelock"
    20  	"github.com/juju/juju/worker/machineactions"
    21  )
    22  
    23  type ManifoldSuite struct {
    24  	testing.IsolationSuite
    25  	context    dependency.Context
    26  	fakeAgent  agent.Agent
    27  	fakeCaller base.APICaller
    28  	fakeFacade machineactions.Facade
    29  	fakeWorker worker.Worker
    30  	fakeLock   machinelock.Lock
    31  	newFacade  func(machineactions.Facade) func(base.APICaller) machineactions.Facade
    32  	newWorker  func(worker.Worker, error) func(machineactions.WorkerConfig) (worker.Worker, error)
    33  }
    34  
    35  var _ = gc.Suite(&ManifoldSuite{})
    36  
    37  func (s *ManifoldSuite) SetUpSuite(c *gc.C) {
    38  	s.IsolationSuite.SetUpSuite(c)
    39  	s.fakeAgent = &fakeAgent{tag: fakeTag}
    40  	s.fakeCaller = &fakeCaller{}
    41  	s.fakeLock = machinelock.Lock(nil)
    42  
    43  	s.context = dt.StubContext(nil, map[string]interface{}{
    44  		"wut":     s.fakeAgent,
    45  		"exactly": s.fakeCaller,
    46  	})
    47  
    48  	s.newFacade = func(facade machineactions.Facade) func(base.APICaller) machineactions.Facade {
    49  		s.fakeFacade = facade
    50  		return func(apiCaller base.APICaller) machineactions.Facade {
    51  			c.Assert(apiCaller, gc.Equals, s.fakeCaller)
    52  			return facade
    53  		}
    54  	}
    55  	s.newWorker = func(w worker.Worker, err error) func(machineactions.WorkerConfig) (worker.Worker, error) {
    56  		s.fakeWorker = w
    57  		return func(wc machineactions.WorkerConfig) (worker.Worker, error) {
    58  			c.Assert(wc.Facade, gc.Equals, s.fakeFacade)
    59  			c.Assert(wc.MachineTag, gc.Equals, fakeTag)
    60  			c.Assert(wc.HandleAction, gc.Equals, fakeHandleAction)
    61  			c.Assert(wc.MachineLock, gc.Equals, s.fakeLock)
    62  			return w, err
    63  		}
    64  	}
    65  }
    66  
    67  func (s *ManifoldSuite) TestInputs(c *gc.C) {
    68  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    69  		AgentName:     "wut",
    70  		APICallerName: "exactly",
    71  	})
    72  	c.Check(manifold.Inputs, jc.DeepEquals, []string{"wut", "exactly"})
    73  }
    74  
    75  func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) {
    76  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    77  		AgentName:     "wut",
    78  		APICallerName: "exactly",
    79  	})
    80  	context := dt.StubContext(nil, map[string]interface{}{
    81  		"wut": dependency.ErrMissing,
    82  	})
    83  
    84  	w, err := manifold.Start(context)
    85  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    86  	c.Assert(w, gc.IsNil)
    87  }
    88  
    89  func (s *ManifoldSuite) TestStartMissingAPI(c *gc.C) {
    90  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
    91  		AgentName:     "wut",
    92  		APICallerName: "exactly",
    93  	})
    94  	context := dt.StubContext(nil, map[string]interface{}{
    95  		"wut":     &fakeAgent{},
    96  		"exactly": dependency.ErrMissing,
    97  	})
    98  
    99  	w, err := manifold.Start(context)
   100  	c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing)
   101  	c.Assert(w, gc.IsNil)
   102  }
   103  
   104  func (s *ManifoldSuite) TestStartWorkerError(c *gc.C) {
   105  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   106  		AgentName:     "wut",
   107  		APICallerName: "exactly",
   108  		NewFacade:     s.newFacade(&fakeFacade{}),
   109  		NewWorker:     s.newWorker(nil, errors.New("blam")),
   110  		MachineLock:   s.fakeLock,
   111  	})
   112  
   113  	w, err := manifold.Start(s.context)
   114  	c.Assert(err, gc.ErrorMatches, "blam")
   115  	c.Assert(w, gc.IsNil)
   116  }
   117  
   118  func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
   119  	fakeWorker := &fakeWorker{}
   120  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   121  		AgentName:     "wut",
   122  		APICallerName: "exactly",
   123  		NewFacade:     s.newFacade(&fakeFacade{}),
   124  		NewWorker:     s.newWorker(fakeWorker, nil),
   125  		MachineLock:   s.fakeLock,
   126  	})
   127  
   128  	w, err := manifold.Start(s.context)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	c.Assert(w, gc.Equals, fakeWorker)
   131  }
   132  
   133  func (s *ManifoldSuite) TestInvalidTag(c *gc.C) {
   134  	fakeWorker := &fakeWorker{}
   135  	manifold := machineactions.Manifold(machineactions.ManifoldConfig{
   136  		AgentName:     "wut",
   137  		APICallerName: "exactly",
   138  		NewFacade:     s.newFacade(&fakeFacade{}),
   139  		NewWorker:     s.newWorker(fakeWorker, nil),
   140  		MachineLock:   s.fakeLock,
   141  	})
   142  	context := dt.StubContext(nil, map[string]interface{}{
   143  		"wut":     &fakeAgent{tag: fakeTagErr},
   144  		"exactly": s.fakeCaller,
   145  	})
   146  
   147  	w, err := manifold.Start(context)
   148  	c.Assert(err, gc.ErrorMatches, "this manifold can only be used inside a machine")
   149  	c.Assert(w, gc.IsNil)
   150  }
   151  
   152  var fakeTag = names.NewMachineTag("4")
   153  var fakeTagErr = names.NewUnitTag("whatatag/0")
   154  
   155  type fakeAgent struct {
   156  	agent.Agent
   157  	tag names.Tag
   158  }
   159  
   160  func (mock *fakeAgent) CurrentConfig() agent.Config {
   161  	return &fakeConfig{tag: mock.tag}
   162  }
   163  
   164  type fakeConfig struct {
   165  	agent.Config
   166  	tag names.Tag
   167  }
   168  
   169  func (mock *fakeConfig) Tag() names.Tag {
   170  	return mock.tag
   171  }
   172  
   173  type fakeCaller struct {
   174  	base.APICaller
   175  }
   176  
   177  type fakeFacade struct {
   178  	machineactions.Facade
   179  }
   180  
   181  type fakeWorker struct {
   182  	worker.Worker
   183  }
   184  
   185  var fakeHandleAction = func(name string, params map[string]interface{}) (results map[string]interface{}, err error) {
   186  	return nil, nil
   187  }