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  }