~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/container/kvm/live_test.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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(machineId, machineNonce, imagemetadata.ReleasedStream, "quantal", true, 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 cpu-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
}