github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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/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/environs/imagemetadata" 20 "github.com/juju/juju/instance" 21 jujutesting "github.com/juju/juju/juju/testing" 22 coretesting "github.com/juju/juju/testing" 23 "github.com/juju/juju/tools" 24 "github.com/juju/juju/version" 25 ) 26 27 type LiveSuite struct { 28 coretesting.BaseSuite 29 ContainerDir string 30 RemovedDir string 31 } 32 33 var _ = gc.Suite(&LiveSuite{}) 34 35 func (s *LiveSuite) SetUpTest(c *gc.C) { 36 s.BaseSuite.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, jc.ErrorIsNil) 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, jc.ErrorIsNil) 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, jc.ErrorIsNil) 77 for _, instance := range instances { 78 err := manager.DestroyContainer(instance.Id()) 79 c.Check(err, jc.ErrorIsNil) 80 } 81 } 82 } 83 84 func createContainer(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, err := environs.NewMachineConfig(machineId, machineNonce, imagemetadata.ReleasedStream, "quantal", true, nil, stateInfo, apiInfo) 89 c.Assert(err, jc.ErrorIsNil) 90 network := container.BridgeNetworkConfig("virbr0", nil) 91 92 machineConfig.Tools = &tools.Tools{ 93 Version: version.MustParseBinary("2.3.4-foo-bar"), 94 URL: "http://tools.testing.invalid/2.3.4-foo-bar.tgz", 95 } 96 environConfig := dummyConfig(c) 97 err = environs.FinishMachineConfig(machineConfig, environConfig) 98 c.Assert(err, jc.ErrorIsNil) 99 100 inst, hardware, err := manager.CreateContainer(machineConfig, "precise", network) 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(hardware, gc.NotNil) 103 expected := fmt.Sprintf("arch=%s cpu-cores=1 mem=512M root-disk=8192M", version.Current.Arch) 104 c.Assert(hardware.String(), gc.Equals, expected) 105 return inst 106 } 107 108 func (s *LiveSuite) TestShutdownMachines(c *gc.C) { 109 manager := s.newManager(c, "test") 110 createContainer(c, manager, "1/kvm/0") 111 createContainer(c, manager, "1/kvm/1") 112 assertNumberOfContainers(c, manager, 2) 113 114 shutdownMachines(manager)(c) 115 assertNumberOfContainers(c, manager, 0) 116 } 117 118 func (s *LiveSuite) TestManagerIsolation(c *gc.C) { 119 firstManager := s.newManager(c, "first") 120 s.AddCleanup(shutdownMachines(firstManager)) 121 122 createContainer(c, firstManager, "1/kvm/0") 123 createContainer(c, firstManager, "1/kvm/1") 124 125 secondManager := s.newManager(c, "second") 126 s.AddCleanup(shutdownMachines(secondManager)) 127 128 createContainer(c, secondManager, "1/kvm/0") 129 130 assertNumberOfContainers(c, firstManager, 2) 131 assertNumberOfContainers(c, secondManager, 1) 132 } 133 134 func dummyConfig(c *gc.C) *config.Config { 135 testConfig, err := config.New(config.UseDefaults, coretesting.FakeConfig()) 136 c.Assert(err, jc.ErrorIsNil) 137 testConfig, err = testConfig.Apply(map[string]interface{}{ 138 "type": "dummy", 139 "state-server": false, 140 "agent-version": version.Current.Number.String(), 141 }) 142 c.Assert(err, jc.ErrorIsNil) 143 return testConfig 144 }