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