github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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/constraints" 19 "github.com/juju/juju/container" 20 "github.com/juju/juju/container/kvm" 21 "github.com/juju/juju/environs/config" 22 "github.com/juju/juju/environs/imagemetadata" 23 "github.com/juju/juju/instance" 24 jujutesting "github.com/juju/juju/juju/testing" 25 "github.com/juju/juju/status" 26 coretesting "github.com/juju/juju/testing" 27 "github.com/juju/juju/tools" 28 jujuversion "github.com/juju/juju/version" 29 ) 30 31 type LiveSuite struct { 32 coretesting.BaseSuite 33 ContainerDir string 34 RemovedDir string 35 } 36 37 var _ = gc.Suite(&LiveSuite{}) 38 39 func (s *LiveSuite) SetUpTest(c *gc.C) { 40 s.BaseSuite.SetUpTest(c) 41 // Skip if not linux 42 if runtime.GOOS != "linux" { 43 c.Skip("not running linux") 44 } 45 // Skip if not running as root. 46 if os.Getuid() != 0 { 47 c.Skip("not running as root") 48 } 49 s.ContainerDir = c.MkDir() 50 s.PatchValue(&container.ContainerDir, s.ContainerDir) 51 s.RemovedDir = c.MkDir() 52 s.PatchValue(&container.RemovedContainerDir, s.RemovedDir) 53 loggo.GetLogger("juju.container").SetLogLevel(loggo.TRACE) 54 } 55 56 func (s *LiveSuite) newManager(c *gc.C, name string) container.Manager { 57 manager, err := kvm.NewContainerManager( 58 container.ManagerConfig{ 59 container.ConfigModelUUID: coretesting.ModelTag.Id(), 60 container.ConfigLogDir: c.MkDir(), 61 }) 62 c.Assert(err, jc.ErrorIsNil) 63 return manager 64 } 65 66 func assertNumberOfContainers(c *gc.C, manager container.Manager, count int) { 67 containers, err := manager.ListContainers() 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(containers, gc.HasLen, count) 70 } 71 72 func (s *LiveSuite) TestNoInitialContainers(c *gc.C) { 73 manager := s.newManager(c, "test") 74 assertNumberOfContainers(c, manager, 0) 75 } 76 77 func shutdownMachines(manager container.Manager) func(*gc.C) { 78 return func(c *gc.C) { 79 instances, err := manager.ListContainers() 80 c.Assert(err, jc.ErrorIsNil) 81 for _, instance := range instances { 82 err := manager.DestroyContainer(instance.Id()) 83 c.Check(err, jc.ErrorIsNil) 84 } 85 } 86 } 87 88 func createContainer(c *gc.C, manager container.Manager, machineId string) instance.Instance { 89 machineNonce := "fake-nonce" 90 apiInfo := jujutesting.FakeAPIInfo(machineId) 91 instanceConfig, err := instancecfg.NewInstanceConfig(coretesting.ControllerTag, machineId, machineNonce, imagemetadata.ReleasedStream, "quantal", 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, constraints.Value{}, "precise", network, nil, callback) 107 c.Assert(err, jc.ErrorIsNil) 108 c.Assert(hardware, gc.NotNil) 109 expected := fmt.Sprintf("arch=%s 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 }