github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/container/kvm/kvm_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package kvm_test 5 6 import ( 7 "path/filepath" 8 9 "github.com/juju/loggo" 10 jc "github.com/juju/testing/checkers" 11 gc "launchpad.net/gocheck" 12 13 "github.com/juju/juju/constraints" 14 "github.com/juju/juju/container" 15 "github.com/juju/juju/container/kvm" 16 kvmtesting "github.com/juju/juju/container/kvm/testing" 17 containertesting "github.com/juju/juju/container/testing" 18 "github.com/juju/juju/instance" 19 coretesting "github.com/juju/juju/testing" 20 "github.com/juju/juju/version" 21 ) 22 23 type KVMSuite struct { 24 kvmtesting.TestSuite 25 manager container.Manager 26 } 27 28 var _ = gc.Suite(&KVMSuite{}) 29 30 func (s *KVMSuite) SetUpTest(c *gc.C) { 31 s.TestSuite.SetUpTest(c) 32 var err error 33 s.manager, err = kvm.NewContainerManager(container.ManagerConfig{container.ConfigName: "test"}) 34 c.Assert(err, gc.IsNil) 35 } 36 37 func (*KVMSuite) TestManagerNameNeeded(c *gc.C) { 38 manager, err := kvm.NewContainerManager(container.ManagerConfig{container.ConfigName: ""}) 39 c.Assert(err, gc.ErrorMatches, "name is required") 40 c.Assert(manager, gc.IsNil) 41 } 42 43 func (*KVMSuite) TestManagerWarnsAboutUnknownOption(c *gc.C) { 44 _, err := kvm.NewContainerManager(container.ManagerConfig{ 45 container.ConfigName: "BillyBatson", 46 "shazam": "Captain Marvel", 47 }) 48 c.Assert(err, gc.IsNil) 49 c.Assert(c.GetTestLog(), jc.Contains, `WARNING juju.container unused config option: "shazam" -> "Captain Marvel"`) 50 } 51 52 func (s *KVMSuite) TestListInitiallyEmpty(c *gc.C) { 53 containers, err := s.manager.ListContainers() 54 c.Assert(err, gc.IsNil) 55 c.Assert(containers, gc.HasLen, 0) 56 } 57 58 func (s *KVMSuite) createRunningContainer(c *gc.C, name string) kvm.Container { 59 kvmContainer := s.Factory.New(name) 60 network := container.BridgeNetworkConfig("testbr0") 61 c.Assert(kvmContainer.Start(kvm.StartParams{ 62 Series: "quantal", 63 Arch: version.Current.Arch, 64 UserDataFile: "userdata.txt", 65 Network: network}), gc.IsNil) 66 return kvmContainer 67 } 68 69 func (s *KVMSuite) TestListMatchesManagerName(c *gc.C) { 70 s.createRunningContainer(c, "test-match1") 71 s.createRunningContainer(c, "test-match2") 72 s.createRunningContainer(c, "testNoMatch") 73 s.createRunningContainer(c, "other") 74 containers, err := s.manager.ListContainers() 75 c.Assert(err, gc.IsNil) 76 c.Assert(containers, gc.HasLen, 2) 77 expectedIds := []instance.Id{"test-match1", "test-match2"} 78 ids := []instance.Id{containers[0].Id(), containers[1].Id()} 79 c.Assert(ids, jc.SameContents, expectedIds) 80 } 81 82 func (s *KVMSuite) TestListMatchesRunningContainers(c *gc.C) { 83 running := s.createRunningContainer(c, "test-running") 84 s.Factory.New("test-stopped") 85 containers, err := s.manager.ListContainers() 86 c.Assert(err, gc.IsNil) 87 c.Assert(containers, gc.HasLen, 1) 88 c.Assert(string(containers[0].Id()), gc.Equals, running.Name()) 89 } 90 91 func (s *KVMSuite) TestCreateContainer(c *gc.C) { 92 instance := containertesting.CreateContainer(c, s.manager, "1/kvm/0") 93 name := string(instance.Id()) 94 cloudInitFilename := filepath.Join(s.ContainerDir, name, "cloud-init") 95 containertesting.AssertCloudInit(c, cloudInitFilename) 96 } 97 98 func (s *KVMSuite) TestDestroyContainer(c *gc.C) { 99 instance := containertesting.CreateContainer(c, s.manager, "1/lxc/0") 100 101 err := s.manager.DestroyContainer(instance.Id()) 102 c.Assert(err, gc.IsNil) 103 104 name := string(instance.Id()) 105 // Check that the container dir is no longer in the container dir 106 c.Assert(filepath.Join(s.ContainerDir, name), jc.DoesNotExist) 107 // but instead, in the removed container dir 108 c.Assert(filepath.Join(s.RemovedDir, name), jc.IsDirectory) 109 } 110 111 type ConstraintsSuite struct { 112 coretesting.BaseSuite 113 } 114 115 var _ = gc.Suite(&ConstraintsSuite{}) 116 117 func (s *ConstraintsSuite) TestDefaults(c *gc.C) { 118 119 for _, test := range []struct { 120 cons string 121 expected kvm.StartParams 122 infoLog []string 123 }{{ 124 expected: kvm.StartParams{ 125 Memory: kvm.DefaultMemory, 126 CpuCores: kvm.DefaultCpu, 127 RootDisk: kvm.DefaultDisk, 128 }, 129 }, { 130 cons: "mem=256M", 131 expected: kvm.StartParams{ 132 Memory: kvm.MinMemory, 133 CpuCores: kvm.DefaultCpu, 134 RootDisk: kvm.DefaultDisk, 135 }, 136 }, { 137 cons: "mem=4G", 138 expected: kvm.StartParams{ 139 Memory: 4 * 1024, 140 CpuCores: kvm.DefaultCpu, 141 RootDisk: kvm.DefaultDisk, 142 }, 143 }, { 144 cons: "cpu-cores=4", 145 expected: kvm.StartParams{ 146 Memory: kvm.DefaultMemory, 147 CpuCores: 4, 148 RootDisk: kvm.DefaultDisk, 149 }, 150 }, { 151 cons: "cpu-cores=0", 152 expected: kvm.StartParams{ 153 Memory: kvm.DefaultMemory, 154 CpuCores: kvm.MinCpu, 155 RootDisk: kvm.DefaultDisk, 156 }, 157 }, { 158 cons: "root-disk=512M", 159 expected: kvm.StartParams{ 160 Memory: kvm.DefaultMemory, 161 CpuCores: kvm.DefaultCpu, 162 RootDisk: kvm.MinDisk, 163 }, 164 }, { 165 cons: "root-disk=4G", 166 expected: kvm.StartParams{ 167 Memory: kvm.DefaultMemory, 168 CpuCores: kvm.DefaultCpu, 169 RootDisk: 4, 170 }, 171 }, { 172 cons: "arch=armhf", 173 expected: kvm.StartParams{ 174 Memory: kvm.DefaultMemory, 175 CpuCores: kvm.DefaultCpu, 176 RootDisk: kvm.DefaultDisk, 177 }, 178 infoLog: []string{ 179 `arch constraint of "armhf" being ignored as not supported`, 180 }, 181 }, { 182 cons: "container=lxc", 183 expected: kvm.StartParams{ 184 Memory: kvm.DefaultMemory, 185 CpuCores: kvm.DefaultCpu, 186 RootDisk: kvm.DefaultDisk, 187 }, 188 infoLog: []string{ 189 `container constraint of "lxc" being ignored as not supported`, 190 }, 191 }, { 192 cons: "cpu-power=100", 193 expected: kvm.StartParams{ 194 Memory: kvm.DefaultMemory, 195 CpuCores: kvm.DefaultCpu, 196 RootDisk: kvm.DefaultDisk, 197 }, 198 infoLog: []string{ 199 `cpu-power constraint of 100 being ignored as not supported`, 200 }, 201 }, { 202 cons: "tags=foo,bar", 203 expected: kvm.StartParams{ 204 Memory: kvm.DefaultMemory, 205 CpuCores: kvm.DefaultCpu, 206 RootDisk: kvm.DefaultDisk, 207 }, 208 infoLog: []string{ 209 `tags constraint of "foo,bar" being ignored as not supported`, 210 }, 211 }, { 212 cons: "mem=4G cpu-cores=4 root-disk=20G arch=armhf cpu-power=100 container=lxc tags=foo,bar", 213 expected: kvm.StartParams{ 214 Memory: 4 * 1024, 215 CpuCores: 4, 216 RootDisk: 20, 217 }, 218 infoLog: []string{ 219 `arch constraint of "armhf" being ignored as not supported`, 220 `container constraint of "lxc" being ignored as not supported`, 221 `cpu-power constraint of 100 being ignored as not supported`, 222 `tags constraint of "foo,bar" being ignored as not supported`, 223 }, 224 }} { 225 tw := &loggo.TestWriter{} 226 c.Assert(loggo.RegisterWriter("constraint-tester", tw, loggo.DEBUG), gc.IsNil) 227 cons := constraints.MustParse(test.cons) 228 params := kvm.ParseConstraintsToStartParams(cons) 229 c.Check(params, gc.DeepEquals, test.expected) 230 c.Check(tw.Log, jc.LogMatches, test.infoLog) 231 loggo.RemoveWriter("constraint-tester") 232 } 233 }