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