github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/worker/provisioner/lxd-broker_test.go (about)

     1  // Copyright 2013-2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package provisioner_test
     5  
     6  import (
     7  	"runtime"
     8  
     9  	"github.com/juju/names"
    10  	gitjujutesting "github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/arch"
    13  	"github.com/juju/version"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/agent"
    17  	"github.com/juju/juju/cloudconfig/instancecfg"
    18  	"github.com/juju/juju/constraints"
    19  	"github.com/juju/juju/container"
    20  	"github.com/juju/juju/environs"
    21  	"github.com/juju/juju/instance"
    22  	jujutesting "github.com/juju/juju/juju/testing"
    23  	coretesting "github.com/juju/juju/testing"
    24  	coretools "github.com/juju/juju/tools"
    25  	jujuversion "github.com/juju/juju/version"
    26  	"github.com/juju/juju/worker/provisioner"
    27  )
    28  
    29  type lxdBrokerSuite struct {
    30  	coretesting.BaseSuite
    31  	broker        environs.InstanceBroker
    32  	agentConfig   agent.ConfigSetterWriter
    33  	api           *fakeAPI
    34  	manager       *fakeContainerManager
    35  	possibleTools coretools.List
    36  }
    37  
    38  var _ = gc.Suite(&lxdBrokerSuite{})
    39  
    40  func (s *lxdBrokerSuite) SetUpTest(c *gc.C) {
    41  	s.BaseSuite.SetUpTest(c)
    42  	if runtime.GOOS == "windows" {
    43  		c.Skip("Skipping lxd tests on windows")
    44  	}
    45  
    46  	// To isolate the tests from the host's architecture, we override it here.
    47  	s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 })
    48  
    49  	s.possibleTools = coretools.List{&coretools.Tools{
    50  		Version: version.MustParseBinary("2.3.4-quantal-amd64"),
    51  		URL:     "http://tools.testing.invalid/2.3.4-quantal-amd64.tgz",
    52  	}, {
    53  		// non-host-arch tools should be filtered out by StartInstance
    54  		Version: version.MustParseBinary("2.3.4-quantal-arm64"),
    55  		URL:     "http://tools.testing.invalid/2.3.4-quantal-arm64.tgz",
    56  	}}
    57  
    58  	var err error
    59  	s.agentConfig, err = agent.NewAgentConfig(
    60  		agent.AgentConfigParams{
    61  			Paths:             agent.NewPathsWithDefaults(agent.Paths{DataDir: "/not/used/here"}),
    62  			Tag:               names.NewMachineTag("1"),
    63  			UpgradedToVersion: jujuversion.Current,
    64  			Password:          "dummy-secret",
    65  			Nonce:             "nonce",
    66  			APIAddresses:      []string{"10.0.0.1:1234"},
    67  			CACert:            coretesting.CACert,
    68  			Model:             coretesting.ModelTag,
    69  		})
    70  	c.Assert(err, jc.ErrorIsNil)
    71  	s.api = NewFakeAPI()
    72  	s.manager = &fakeContainerManager{}
    73  	s.broker, err = provisioner.NewLxdBroker(s.api, s.manager, s.agentConfig, "namespace", true)
    74  	c.Assert(err, jc.ErrorIsNil)
    75  }
    76  
    77  func (s *lxdBrokerSuite) instanceConfig(c *gc.C, machineId string) *instancecfg.InstanceConfig {
    78  	machineNonce := "fake-nonce"
    79  	stateInfo := jujutesting.FakeStateInfo(machineId)
    80  	apiInfo := jujutesting.FakeAPIInfo(machineId)
    81  	instanceConfig, err := instancecfg.NewInstanceConfig(machineId, machineNonce, "released", "quantal", "", true, stateInfo, apiInfo)
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	return instanceConfig
    84  }
    85  
    86  func (s *lxdBrokerSuite) startInstance(c *gc.C, machineId string) instance.Instance {
    87  	instanceConfig := s.instanceConfig(c, machineId)
    88  	cons := constraints.Value{}
    89  	result, err := s.broker.StartInstance(environs.StartInstanceParams{
    90  		Constraints:    cons,
    91  		Tools:          s.possibleTools,
    92  		InstanceConfig: instanceConfig,
    93  	})
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	return result.Instance
    96  }
    97  
    98  func (s *lxdBrokerSuite) TestStartInstance(c *gc.C) {
    99  	machineId := "1/lxd/0"
   100  	s.startInstance(c, machineId)
   101  	s.api.CheckCalls(c, []gitjujutesting.StubCall{{
   102  		FuncName: "ContainerConfig",
   103  	}, {
   104  		FuncName: "PrepareContainerInterfaceInfo",
   105  		Args:     []interface{}{names.NewMachineTag("1-lxd-0")},
   106  	}})
   107  	s.manager.CheckCallNames(c, "CreateContainer")
   108  	call := s.manager.Calls()[0]
   109  	c.Assert(call.Args[0], gc.FitsTypeOf, &instancecfg.InstanceConfig{})
   110  	instanceConfig := call.Args[0].(*instancecfg.InstanceConfig)
   111  	c.Assert(instanceConfig.ToolsList(), gc.HasLen, 1)
   112  	c.Assert(instanceConfig.ToolsList().Arches(), jc.DeepEquals, []string{"amd64"})
   113  }
   114  
   115  func (s *lxdBrokerSuite) TestStartInstanceNoHostArchTools(c *gc.C) {
   116  	_, err := s.broker.StartInstance(environs.StartInstanceParams{
   117  		Tools: coretools.List{{
   118  			// non-host-arch tools should be filtered out by StartInstance
   119  			Version: version.MustParseBinary("2.3.4-quantal-arm64"),
   120  			URL:     "http://tools.testing.invalid/2.3.4-quantal-arm64.tgz",
   121  		}},
   122  		InstanceConfig: s.instanceConfig(c, "1/lxd/0"),
   123  	})
   124  	c.Assert(err, gc.ErrorMatches, `need tools for arch amd64, only found \[arm64\]`)
   125  }
   126  
   127  type fakeContainerManager struct {
   128  	gitjujutesting.Stub
   129  }
   130  
   131  func (m *fakeContainerManager) CreateContainer(instanceConfig *instancecfg.InstanceConfig,
   132  	series string,
   133  	network *container.NetworkConfig,
   134  	storage *container.StorageConfig,
   135  	callback container.StatusCallback,
   136  ) (instance.Instance, *instance.HardwareCharacteristics, error) {
   137  	m.MethodCall(m, "CreateContainer", instanceConfig, series, network, storage, callback)
   138  	return nil, nil, m.NextErr()
   139  }
   140  
   141  func (m *fakeContainerManager) DestroyContainer(id instance.Id) error {
   142  	m.MethodCall(m, "DestroyContainer", id)
   143  	return m.NextErr()
   144  }
   145  
   146  func (m *fakeContainerManager) ListContainers() ([]instance.Instance, error) {
   147  	m.MethodCall(m, "ListContainers")
   148  	return nil, m.NextErr()
   149  }
   150  
   151  func (m *fakeContainerManager) IsInitialized() bool {
   152  	m.MethodCall(m, "IsInitialized")
   153  	m.PopNoErr()
   154  	return true
   155  }