github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"os/exec"
    10  	"runtime"
    11  
    12  	"github.com/juju/loggo"
    13  	jc "github.com/juju/testing/checkers"
    14  	"github.com/juju/utils/arch"
    15  	"github.com/juju/version"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/cloudconfig/instancecfg"
    19  	"github.com/juju/juju/container"
    20  	"github.com/juju/juju/container/kvm"
    21  	"github.com/juju/juju/core/constraints"
    22  	"github.com/juju/juju/core/status"
    23  	"github.com/juju/juju/environs/config"
    24  	"github.com/juju/juju/environs/imagemetadata"
    25  	"github.com/juju/juju/environs/instances"
    26  	jujutesting "github.com/juju/juju/juju/testing"
    27  	coretesting "github.com/juju/juju/testing"
    28  	"github.com/juju/juju/tools"
    29  	jujuversion "github.com/juju/juju/version"
    30  )
    31  
    32  type LiveSuite struct {
    33  	coretesting.BaseSuite
    34  	ContainerDir string
    35  	RemovedDir   string
    36  }
    37  
    38  var _ = gc.Suite(&LiveSuite{})
    39  
    40  func (s *LiveSuite) SetUpTest(c *gc.C) {
    41  	s.BaseSuite.SetUpTest(c)
    42  	// Skip if not linux
    43  	if runtime.GOOS != "linux" {
    44  		c.Skip("not running linux")
    45  	}
    46  	// Skip if virsh is not installed.
    47  	if _, err := exec.LookPath("virsh"); err != nil {
    48  		c.Skip("virsh not found")
    49  	}
    50  	// Skip if not running as root.
    51  	if os.Getuid() != 0 {
    52  		c.Skip("not running as root")
    53  	}
    54  	s.ContainerDir = c.MkDir()
    55  	s.PatchValue(&container.ContainerDir, s.ContainerDir)
    56  	s.RemovedDir = c.MkDir()
    57  	s.PatchValue(&container.RemovedContainerDir, s.RemovedDir)
    58  	loggo.GetLogger("juju.container").SetLogLevel(loggo.TRACE)
    59  }
    60  
    61  func (s *LiveSuite) newManager(c *gc.C, name string) container.Manager {
    62  	manager, err := kvm.NewContainerManager(
    63  		container.ManagerConfig{
    64  			container.ConfigModelUUID: coretesting.ModelTag.Id(),
    65  			container.ConfigLogDir:    c.MkDir(),
    66  		})
    67  	c.Assert(err, jc.ErrorIsNil)
    68  	return manager
    69  }
    70  
    71  func assertNumberOfContainers(c *gc.C, manager container.Manager, count int) {
    72  	containers, err := manager.ListContainers()
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	c.Assert(containers, gc.HasLen, count)
    75  }
    76  
    77  func (s *LiveSuite) TestNoInitialContainers(c *gc.C) {
    78  	manager := s.newManager(c, "test")
    79  	assertNumberOfContainers(c, manager, 0)
    80  }
    81  
    82  func shutdownMachines(manager container.Manager) func(*gc.C) {
    83  	return func(c *gc.C) {
    84  		instances, err := manager.ListContainers()
    85  		c.Assert(err, jc.ErrorIsNil)
    86  		for _, instance := range instances {
    87  			err := manager.DestroyContainer(instance.Id())
    88  			c.Check(err, jc.ErrorIsNil)
    89  		}
    90  	}
    91  }
    92  
    93  func createContainer(c *gc.C, manager container.Manager, machineId string) instances.Instance {
    94  	machineNonce := "fake-nonce"
    95  	apiInfo := jujutesting.FakeAPIInfo(machineId)
    96  	instanceConfig, err := instancecfg.NewInstanceConfig(coretesting.ControllerTag, machineId, machineNonce, imagemetadata.ReleasedStream, "quantal", apiInfo)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	network := container.BridgeNetworkConfig("virbr0", 0, nil)
    99  
   100  	err = instanceConfig.SetTools(tools.List{
   101  		&tools.Tools{
   102  			Version: version.MustParseBinary("2.3.4-foo-bar"),
   103  			URL:     "http://tools.testing.invalid/2.3.4-foo-bar.tgz",
   104  		},
   105  	})
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	environConfig := dummyConfig(c)
   108  	err = instancecfg.FinishInstanceConfig(instanceConfig, environConfig)
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	callback := func(settableStatus status.Status, info string, data map[string]interface{}) error { return nil }
   111  	inst, hardware, err := manager.CreateContainer(instanceConfig, constraints.Value{}, "precise", network, nil, callback)
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	c.Assert(hardware, gc.NotNil)
   114  	expected := fmt.Sprintf("arch=%s cores=1 mem=512M root-disk=8192M", arch.HostArch())
   115  	c.Assert(hardware.String(), gc.Equals, expected)
   116  	return inst
   117  }
   118  
   119  func (s *LiveSuite) TestShutdownMachines(c *gc.C) {
   120  	manager := s.newManager(c, "test")
   121  	createContainer(c, manager, "1/kvm/0")
   122  	createContainer(c, manager, "1/kvm/1")
   123  	assertNumberOfContainers(c, manager, 2)
   124  
   125  	shutdownMachines(manager)(c)
   126  	assertNumberOfContainers(c, manager, 0)
   127  }
   128  
   129  func (s *LiveSuite) TestManagerIsolation(c *gc.C) {
   130  	firstManager := s.newManager(c, "first")
   131  	s.AddCleanup(shutdownMachines(firstManager))
   132  
   133  	createContainer(c, firstManager, "1/kvm/0")
   134  	createContainer(c, firstManager, "1/kvm/1")
   135  
   136  	secondManager := s.newManager(c, "second")
   137  	s.AddCleanup(shutdownMachines(secondManager))
   138  
   139  	createContainer(c, secondManager, "1/kvm/0")
   140  
   141  	assertNumberOfContainers(c, firstManager, 2)
   142  	assertNumberOfContainers(c, secondManager, 1)
   143  }
   144  
   145  func dummyConfig(c *gc.C) *config.Config {
   146  	testConfig, err := config.New(config.UseDefaults, coretesting.FakeConfig())
   147  	c.Assert(err, jc.ErrorIsNil)
   148  	testConfig, err = testConfig.Apply(map[string]interface{}{
   149  		"type":          "dummy",
   150  		"controller":    false,
   151  		"agent-version": jujuversion.Current.String(),
   152  	})
   153  	c.Assert(err, jc.ErrorIsNil)
   154  	return testConfig
   155  }