launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/container/kvm/kvm_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  	"path/filepath"
     8  
     9  	"github.com/loggo/loggo"
    10  	gc "launchpad.net/gocheck"
    11  
    12  	"launchpad.net/juju-core/constraints"
    13  	"launchpad.net/juju-core/container"
    14  	"launchpad.net/juju-core/container/kvm"
    15  	kvmtesting "launchpad.net/juju-core/container/kvm/testing"
    16  	containertesting "launchpad.net/juju-core/container/testing"
    17  	"launchpad.net/juju-core/instance"
    18  	jc "launchpad.net/juju-core/testing/checkers"
    19  	"launchpad.net/juju-core/testing/testbase"
    20  	"launchpad.net/juju-core/version"
    21  )
    22  
    23  type KVMSuite struct {
    24  	kvmtesting.TestSuite
    25  	manager container.Manager
    26  }
    27  
    28  var _ = gc.Suite(&KVMSuite{})
    29  
    30  func (s *KVMSuite) SetUpTest(c *gc.C) {
    31  	s.TestSuite.SetUpTest(c)
    32  	var err error
    33  	s.manager, err = kvm.NewContainerManager(container.ManagerConfig{Name: "test"})
    34  	c.Assert(err, gc.IsNil)
    35  }
    36  
    37  func (*KVMSuite) TestManagerNameNeeded(c *gc.C) {
    38  	manager, err := kvm.NewContainerManager(container.ManagerConfig{})
    39  	c.Assert(err, gc.ErrorMatches, "name is required")
    40  	c.Assert(manager, gc.IsNil)
    41  }
    42  
    43  func (s *KVMSuite) TestListInitiallyEmpty(c *gc.C) {
    44  	containers, err := s.manager.ListContainers()
    45  	c.Assert(err, gc.IsNil)
    46  	c.Assert(containers, gc.HasLen, 0)
    47  }
    48  
    49  func (s *KVMSuite) createRunningContainer(c *gc.C, name string) kvm.Container {
    50  	kvmContainer := s.Factory.New(name)
    51  	network := container.BridgeNetworkConfig("testbr0")
    52  	c.Assert(kvmContainer.Start(kvm.StartParams{
    53  		Series:       "quantal",
    54  		Arch:         version.Current.Arch,
    55  		UserDataFile: "userdata.txt",
    56  		Network:      network}), gc.IsNil)
    57  	return kvmContainer
    58  }
    59  
    60  func (s *KVMSuite) TestListMatchesManagerName(c *gc.C) {
    61  	s.createRunningContainer(c, "test-match1")
    62  	s.createRunningContainer(c, "test-match2")
    63  	s.createRunningContainer(c, "testNoMatch")
    64  	s.createRunningContainer(c, "other")
    65  	containers, err := s.manager.ListContainers()
    66  	c.Assert(err, gc.IsNil)
    67  	c.Assert(containers, gc.HasLen, 2)
    68  	expectedIds := []instance.Id{"test-match1", "test-match2"}
    69  	ids := []instance.Id{containers[0].Id(), containers[1].Id()}
    70  	c.Assert(ids, jc.SameContents, expectedIds)
    71  }
    72  
    73  func (s *KVMSuite) TestListMatchesRunningContainers(c *gc.C) {
    74  	running := s.createRunningContainer(c, "test-running")
    75  	s.Factory.New("test-stopped")
    76  	containers, err := s.manager.ListContainers()
    77  	c.Assert(err, gc.IsNil)
    78  	c.Assert(containers, gc.HasLen, 1)
    79  	c.Assert(string(containers[0].Id()), gc.Equals, running.Name())
    80  }
    81  
    82  func (s *KVMSuite) TestStartContainer(c *gc.C) {
    83  	instance := containertesting.StartContainer(c, s.manager, "1/kvm/0")
    84  	name := string(instance.Id())
    85  	cloudInitFilename := filepath.Join(s.ContainerDir, name, "cloud-init")
    86  	containertesting.AssertCloudInit(c, cloudInitFilename)
    87  }
    88  
    89  func (s *KVMSuite) TestStopContainer(c *gc.C) {
    90  	instance := containertesting.StartContainer(c, s.manager, "1/lxc/0")
    91  
    92  	err := s.manager.StopContainer(instance)
    93  	c.Assert(err, gc.IsNil)
    94  
    95  	name := string(instance.Id())
    96  	// Check that the container dir is no longer in the container dir
    97  	c.Assert(filepath.Join(s.ContainerDir, name), jc.DoesNotExist)
    98  	// but instead, in the removed container dir
    99  	c.Assert(filepath.Join(s.RemovedDir, name), jc.IsDirectory)
   100  }
   101  
   102  type ConstraintsSuite struct {
   103  	testbase.LoggingSuite
   104  }
   105  
   106  var _ = gc.Suite(&ConstraintsSuite{})
   107  
   108  func (s *ConstraintsSuite) TestDefaults(c *gc.C) {
   109  
   110  	for _, test := range []struct {
   111  		cons     string
   112  		expected kvm.StartParams
   113  		infoLog  []string
   114  	}{{
   115  		expected: kvm.StartParams{
   116  			Memory:   kvm.DefaultMemory,
   117  			CpuCores: kvm.DefaultCpu,
   118  			RootDisk: kvm.DefaultDisk,
   119  		},
   120  	}, {
   121  		cons: "mem=256M",
   122  		expected: kvm.StartParams{
   123  			Memory:   kvm.MinMemory,
   124  			CpuCores: kvm.DefaultCpu,
   125  			RootDisk: kvm.DefaultDisk,
   126  		},
   127  	}, {
   128  		cons: "mem=4G",
   129  		expected: kvm.StartParams{
   130  			Memory:   4 * 1024,
   131  			CpuCores: kvm.DefaultCpu,
   132  			RootDisk: kvm.DefaultDisk,
   133  		},
   134  	}, {
   135  		cons: "cpu-cores=4",
   136  		expected: kvm.StartParams{
   137  			Memory:   kvm.DefaultMemory,
   138  			CpuCores: 4,
   139  			RootDisk: kvm.DefaultDisk,
   140  		},
   141  	}, {
   142  		cons: "cpu-cores=0",
   143  		expected: kvm.StartParams{
   144  			Memory:   kvm.DefaultMemory,
   145  			CpuCores: kvm.MinCpu,
   146  			RootDisk: kvm.DefaultDisk,
   147  		},
   148  	}, {
   149  		cons: "root-disk=512M",
   150  		expected: kvm.StartParams{
   151  			Memory:   kvm.DefaultMemory,
   152  			CpuCores: kvm.DefaultCpu,
   153  			RootDisk: kvm.MinDisk,
   154  		},
   155  	}, {
   156  		cons: "root-disk=4G",
   157  		expected: kvm.StartParams{
   158  			Memory:   kvm.DefaultMemory,
   159  			CpuCores: kvm.DefaultCpu,
   160  			RootDisk: 4,
   161  		},
   162  	}, {
   163  		cons: "arch=arm",
   164  		expected: kvm.StartParams{
   165  			Memory:   kvm.DefaultMemory,
   166  			CpuCores: kvm.DefaultCpu,
   167  			RootDisk: kvm.DefaultDisk,
   168  		},
   169  		infoLog: []string{
   170  			`arch constraint of "arm" being ignored as not supported`,
   171  		},
   172  	}, {
   173  		cons: "container=lxc",
   174  		expected: kvm.StartParams{
   175  			Memory:   kvm.DefaultMemory,
   176  			CpuCores: kvm.DefaultCpu,
   177  			RootDisk: kvm.DefaultDisk,
   178  		},
   179  		infoLog: []string{
   180  			`container constraint of "lxc" being ignored as not supported`,
   181  		},
   182  	}, {
   183  		cons: "cpu-power=100",
   184  		expected: kvm.StartParams{
   185  			Memory:   kvm.DefaultMemory,
   186  			CpuCores: kvm.DefaultCpu,
   187  			RootDisk: kvm.DefaultDisk,
   188  		},
   189  		infoLog: []string{
   190  			`cpu-power constraint of 100 being ignored as not supported`,
   191  		},
   192  	}, {
   193  		cons: "tags=foo,bar",
   194  		expected: kvm.StartParams{
   195  			Memory:   kvm.DefaultMemory,
   196  			CpuCores: kvm.DefaultCpu,
   197  			RootDisk: kvm.DefaultDisk,
   198  		},
   199  		infoLog: []string{
   200  			`tags constraint of "foo,bar" being ignored as not supported`,
   201  		},
   202  	}, {
   203  		cons: "mem=4G cpu-cores=4 root-disk=20G arch=arm cpu-power=100 container=lxc tags=foo,bar",
   204  		expected: kvm.StartParams{
   205  			Memory:   4 * 1024,
   206  			CpuCores: 4,
   207  			RootDisk: 20,
   208  		},
   209  		infoLog: []string{
   210  			`arch constraint of "arm" being ignored as not supported`,
   211  			`container constraint of "lxc" being ignored as not supported`,
   212  			`cpu-power constraint of 100 being ignored as not supported`,
   213  			`tags constraint of "foo,bar" being ignored as not supported`,
   214  		},
   215  	}} {
   216  		tw := &loggo.TestWriter{}
   217  		c.Assert(loggo.RegisterWriter("constraint-tester", tw, loggo.DEBUG), gc.IsNil)
   218  		cons := constraints.MustParse(test.cons)
   219  		params := kvm.ParseConstraintsToStartParams(cons)
   220  		c.Check(params, gc.DeepEquals, test.expected)
   221  		c.Check(tw.Log, jc.LogMatches, test.infoLog)
   222  		loggo.RemoveWriter("constraint-tester")
   223  	}
   224  }