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  }