github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/container/kvm/live_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 "fmt" 8 "os" 9 "runtime" 10 11 "github.com/juju/loggo" 12 gc "launchpad.net/gocheck" 13 14 "launchpad.net/juju-core/constraints" 15 "launchpad.net/juju-core/container" 16 "launchpad.net/juju-core/container/kvm" 17 "launchpad.net/juju-core/environs" 18 "launchpad.net/juju-core/environs/config" 19 "launchpad.net/juju-core/instance" 20 jujutesting "launchpad.net/juju-core/juju/testing" 21 coretesting "launchpad.net/juju-core/testing" 22 "launchpad.net/juju-core/testing/testbase" 23 "launchpad.net/juju-core/tools" 24 "launchpad.net/juju-core/version" 25 ) 26 27 type LiveSuite struct { 28 testbase.LoggingSuite 29 ContainerDir string 30 RemovedDir string 31 } 32 33 var _ = gc.Suite(&LiveSuite{}) 34 35 func (s *LiveSuite) SetUpTest(c *gc.C) { 36 s.LoggingSuite.SetUpTest(c) 37 // Skip if not linux 38 if runtime.GOOS != "linux" { 39 c.Skip("not running linux") 40 } 41 // Skip if not running as root. 42 if os.Getuid() != 0 { 43 c.Skip("not running as root") 44 } 45 s.ContainerDir = c.MkDir() 46 s.PatchValue(&container.ContainerDir, s.ContainerDir) 47 s.RemovedDir = c.MkDir() 48 s.PatchValue(&container.RemovedContainerDir, s.RemovedDir) 49 loggo.GetLogger("juju.container").SetLogLevel(loggo.TRACE) 50 } 51 52 func (s *LiveSuite) newManager(c *gc.C, name string) container.Manager { 53 manager, err := kvm.NewContainerManager( 54 container.ManagerConfig{ 55 container.ConfigName: name, 56 container.ConfigLogDir: c.MkDir(), 57 }) 58 c.Assert(err, gc.IsNil) 59 return manager 60 } 61 62 func assertNumberOfContainers(c *gc.C, manager container.Manager, count int) { 63 containers, err := manager.ListContainers() 64 c.Assert(err, gc.IsNil) 65 c.Assert(containers, gc.HasLen, count) 66 } 67 68 func (s *LiveSuite) TestNoInitialContainers(c *gc.C) { 69 manager := s.newManager(c, "test") 70 assertNumberOfContainers(c, manager, 0) 71 } 72 73 func shutdownMachines(manager container.Manager) func(*gc.C) { 74 return func(c *gc.C) { 75 instances, err := manager.ListContainers() 76 c.Assert(err, gc.IsNil) 77 for _, instance := range instances { 78 err := manager.StopContainer(instance) 79 c.Check(err, gc.IsNil) 80 } 81 } 82 } 83 84 func startContainer(c *gc.C, manager container.Manager, machineId string) instance.Instance { 85 machineNonce := "fake-nonce" 86 stateInfo := jujutesting.FakeStateInfo(machineId) 87 apiInfo := jujutesting.FakeAPIInfo(machineId) 88 machineConfig := environs.NewMachineConfig(machineId, machineNonce, "", stateInfo, apiInfo) 89 network := container.BridgeNetworkConfig("virbr0") 90 91 machineConfig.Tools = &tools.Tools{ 92 Version: version.MustParseBinary("2.3.4-foo-bar"), 93 URL: "http://tools.testing.invalid/2.3.4-foo-bar.tgz", 94 } 95 environConfig := dummyConfig(c) 96 err := environs.FinishMachineConfig(machineConfig, environConfig, constraints.Value{}) 97 c.Assert(err, gc.IsNil) 98 99 inst, hardware, err := manager.StartContainer(machineConfig, "precise", network) 100 c.Assert(err, gc.IsNil) 101 c.Assert(hardware, gc.NotNil) 102 expected := fmt.Sprintf("arch=%s cpu-cores=1 mem=512M root-disk=8192M", version.Current.Arch) 103 c.Assert(hardware.String(), gc.Equals, expected) 104 return inst 105 } 106 107 func (s *LiveSuite) TestShutdownMachines(c *gc.C) { 108 manager := s.newManager(c, "test") 109 startContainer(c, manager, "1/kvm/0") 110 startContainer(c, manager, "1/kvm/1") 111 assertNumberOfContainers(c, manager, 2) 112 113 shutdownMachines(manager)(c) 114 assertNumberOfContainers(c, manager, 0) 115 } 116 117 func (s *LiveSuite) TestManagerIsolation(c *gc.C) { 118 firstManager := s.newManager(c, "first") 119 s.AddCleanup(shutdownMachines(firstManager)) 120 121 startContainer(c, firstManager, "1/kvm/0") 122 startContainer(c, firstManager, "1/kvm/1") 123 124 secondManager := s.newManager(c, "second") 125 s.AddCleanup(shutdownMachines(secondManager)) 126 127 startContainer(c, secondManager, "1/kvm/0") 128 129 assertNumberOfContainers(c, firstManager, 2) 130 assertNumberOfContainers(c, secondManager, 1) 131 } 132 133 func dummyConfig(c *gc.C) *config.Config { 134 testConfig, err := config.New(config.UseDefaults, coretesting.FakeConfig()) 135 c.Assert(err, gc.IsNil) 136 testConfig, err = testConfig.Apply(map[string]interface{}{ 137 "type": "dummy", 138 "state-server": false, 139 "agent-version": version.Current.Number.String(), 140 }) 141 c.Assert(err, gc.IsNil) 142 return testConfig 143 }