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