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