1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
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"
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"
31
type LiveSuite struct {
37
var _ = gc.Suite(&LiveSuite{})
39
func (s *LiveSuite) SetUpTest(c *gc.C) {
40
s.BaseSuite.SetUpTest(c)
42
if runtime.GOOS != "linux" {
43
c.Skip("not running linux")
45
// Skip if not running as root.
47
c.Skip("not running as root")
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)
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(),
62
c.Assert(err, jc.ErrorIsNil)
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)
72
func (s *LiveSuite) TestNoInitialContainers(c *gc.C) {
73
manager := s.newManager(c, "test")
74
assertNumberOfContainers(c, manager, 0)
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)
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(machineId, machineNonce, imagemetadata.ReleasedStream, "quantal", true, apiInfo)
92
c.Assert(err, jc.ErrorIsNil)
93
network := container.BridgeNetworkConfig("virbr0", 0, nil)
95
err = instanceConfig.SetTools(tools.List{
97
Version: version.MustParseBinary("2.3.4-foo-bar"),
98
URL: "http://tools.testing.invalid/2.3.4-foo-bar.tgz",
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 cpu-cores=1 mem=512M root-disk=8192M", arch.HostArch())
110
c.Assert(hardware.String(), gc.Equals, expected)
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)
120
shutdownMachines(manager)(c)
121
assertNumberOfContainers(c, manager, 0)
124
func (s *LiveSuite) TestManagerIsolation(c *gc.C) {
125
firstManager := s.newManager(c, "first")
126
s.AddCleanup(shutdownMachines(firstManager))
128
createContainer(c, firstManager, "1/kvm/0")
129
createContainer(c, firstManager, "1/kvm/1")
131
secondManager := s.newManager(c, "second")
132
s.AddCleanup(shutdownMachines(secondManager))
134
createContainer(c, secondManager, "1/kvm/0")
136
assertNumberOfContainers(c, firstManager, 2)
137
assertNumberOfContainers(c, secondManager, 1)
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{}{
146
"agent-version": jujuversion.Current.String(),
148
c.Assert(err, jc.ErrorIsNil)