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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package storageprovisioner_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock/testclock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/loggo"
    12  	"github.com/juju/names/v5"
    13  	"github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	"github.com/juju/worker/v3"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/agent"
    19  	"github.com/juju/juju/api"
    20  	"github.com/juju/juju/cmd/jujud/agent/engine/enginetest"
    21  	"github.com/juju/juju/core/model"
    22  	"github.com/juju/juju/rpc/params"
    23  	"github.com/juju/juju/worker/common"
    24  	"github.com/juju/juju/worker/storageprovisioner"
    25  )
    26  
    27  type MachineManifoldSuite struct {
    28  	testing.IsolationSuite
    29  	config    storageprovisioner.MachineManifoldConfig
    30  	newCalled bool
    31  }
    32  
    33  var (
    34  	defaultClockStart time.Time
    35  	_                 = gc.Suite(&MachineManifoldSuite{})
    36  )
    37  
    38  func (s *MachineManifoldSuite) SetUpTest(c *gc.C) {
    39  	s.newCalled = false
    40  	s.PatchValue(&storageprovisioner.NewStorageProvisioner,
    41  		func(config storageprovisioner.Config) (worker.Worker, error) {
    42  			s.newCalled = true
    43  			return nil, nil
    44  		},
    45  	)
    46  	config := enginetest.AgentAPIManifoldTestConfig()
    47  	s.config = storageprovisioner.MachineManifoldConfig{
    48  		AgentName:                    config.AgentName,
    49  		APICallerName:                config.APICallerName,
    50  		Clock:                        testclock.NewClock(defaultClockStart),
    51  		Logger:                       loggo.GetLogger("test"),
    52  		NewCredentialValidatorFacade: common.NewCredentialInvalidatorFacade,
    53  	}
    54  }
    55  
    56  func (s *MachineManifoldSuite) TestMachine(c *gc.C) {
    57  	_, err := enginetest.RunAgentAPIManifold(
    58  		storageprovisioner.MachineManifold(s.config),
    59  		&fakeAgent{tag: names.NewMachineTag("42")},
    60  		&fakeAPIConn{})
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	c.Assert(s.newCalled, jc.IsTrue)
    63  }
    64  
    65  func (s *MachineManifoldSuite) TestMissingClock(c *gc.C) {
    66  	s.config.Clock = nil
    67  	_, err := enginetest.RunAgentAPIManifold(
    68  		storageprovisioner.MachineManifold(s.config),
    69  		&fakeAgent{tag: names.NewMachineTag("42")},
    70  		&fakeAPIConn{})
    71  	c.Assert(err, jc.Satisfies, errors.IsNotValid)
    72  	c.Assert(err.Error(), gc.Equals, "missing Clock not valid")
    73  	c.Assert(s.newCalled, jc.IsFalse)
    74  }
    75  
    76  func (s *MachineManifoldSuite) TestMissingLogger(c *gc.C) {
    77  	s.config.Logger = nil
    78  	_, err := enginetest.RunAgentAPIManifold(
    79  		storageprovisioner.MachineManifold(s.config),
    80  		&fakeAgent{tag: names.NewMachineTag("42")},
    81  		&fakeAPIConn{})
    82  	c.Assert(err, jc.Satisfies, errors.IsNotValid)
    83  	c.Assert(err.Error(), gc.Equals, "missing Logger not valid")
    84  	c.Assert(s.newCalled, jc.IsFalse)
    85  }
    86  
    87  func (s *MachineManifoldSuite) TestNonAgent(c *gc.C) {
    88  	_, err := enginetest.RunAgentAPIManifold(
    89  		storageprovisioner.MachineManifold(s.config),
    90  		&fakeAgent{tag: names.NewUserTag("foo")},
    91  		&fakeAPIConn{})
    92  	c.Assert(err, gc.ErrorMatches, "this manifold may only be used inside a machine agent")
    93  	c.Assert(s.newCalled, jc.IsFalse)
    94  }
    95  
    96  type fakeAgent struct {
    97  	agent.Agent
    98  	tag names.Tag
    99  }
   100  
   101  func (a *fakeAgent) CurrentConfig() agent.Config {
   102  	return &fakeConfig{tag: a.tag}
   103  }
   104  
   105  type fakeConfig struct {
   106  	agent.Config
   107  	tag names.Tag
   108  }
   109  
   110  func (c *fakeConfig) Tag() names.Tag {
   111  	return c.tag
   112  }
   113  
   114  func (_ fakeConfig) DataDir() string {
   115  	return "/path/to/data/dir"
   116  }
   117  
   118  type fakeAPIConn struct {
   119  	api.Connection
   120  	machineJob model.MachineJob
   121  }
   122  
   123  func (f *fakeAPIConn) APICall(objType string, version int, id, request string, args interface{}, response interface{}) error {
   124  	if res, ok := response.(*params.AgentGetEntitiesResults); ok {
   125  		res.Entities = []params.AgentGetEntitiesResult{
   126  			{Jobs: []model.MachineJob{f.machineJob}},
   127  		}
   128  	}
   129  
   130  	return nil
   131  }
   132  
   133  func (*fakeAPIConn) BestFacadeVersion(facade string) int {
   134  	return 42
   135  }