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