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