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 }