1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/names"
8
jc "github.com/juju/testing/checkers"
11
"github.com/juju/juju/constraints"
12
"github.com/juju/juju/storage"
13
"github.com/juju/juju/testing"
16
type volumeSuite struct {
20
var _ = gc.Suite(&volumeSuite{})
22
func (s *volumeSuite) TestBuildMAASVolumeParametersNoVolumes(c *gc.C) {
23
vInfo, err := buildMAASVolumeParameters(nil, constraints.Value{})
24
c.Assert(err, jc.ErrorIsNil)
25
c.Assert(vInfo, gc.HasLen, 0)
28
func (s *volumeSuite) TestBuildMAASVolumeParametersJustRootDisk(c *gc.C) {
29
var cons constraints.Value
30
rootSize := uint64(20000)
31
cons.RootDisk = &rootSize
32
vInfo, err := buildMAASVolumeParameters(nil, cons)
33
c.Assert(err, jc.ErrorIsNil)
34
c.Assert(vInfo, jc.DeepEquals, []volumeInfo{
39
func (s *volumeSuite) TestBuildMAASVolumeParametersNoTags(c *gc.C) {
40
vInfo, err := buildMAASVolumeParameters([]storage.VolumeParams{
41
{Tag: names.NewVolumeTag("1"), Size: 2000000},
42
}, constraints.Value{})
43
c.Assert(err, jc.ErrorIsNil)
44
c.Assert(vInfo, jc.DeepEquals, []volumeInfo{
45
{"root", 0, nil}, //root disk
50
func (s *volumeSuite) TestBuildMAASVolumeParametersWithRootDisk(c *gc.C) {
51
var cons constraints.Value
52
rootSize := uint64(20000)
53
cons.RootDisk = &rootSize
54
vInfo, err := buildMAASVolumeParameters([]storage.VolumeParams{
55
{Tag: names.NewVolumeTag("1"), Size: 2000000},
57
c.Assert(err, jc.ErrorIsNil)
58
c.Assert(vInfo, jc.DeepEquals, []volumeInfo{
59
{"root", 20, nil}, //root disk
64
func (s *volumeSuite) TestBuildMAASVolumeParametersWithTags(c *gc.C) {
65
vInfo, err := buildMAASVolumeParameters([]storage.VolumeParams{
66
{Tag: names.NewVolumeTag("1"), Size: 2000000, Attributes: map[string]interface{}{"tags": "tag1,tag2"}},
67
}, constraints.Value{})
68
c.Assert(err, jc.ErrorIsNil)
69
c.Assert(vInfo, jc.DeepEquals, []volumeInfo{
70
{"root", 0, nil}, //root disk
71
{"1", 1954, []string{"tag1", "tag2"}},
75
func (s *volumeSuite) TestInstanceVolumes(c *gc.C) {
76
obj := s.testMAASObject.TestServer.NewNode(validVolumeJson)
77
instance := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
78
mTag := names.NewMachineTag("1")
79
volumes, attachments, err := instance.volumes(mTag, []names.VolumeTag{
80
names.NewVolumeTag("1"),
81
names.NewVolumeTag("2"),
83
c.Assert(err, jc.ErrorIsNil)
84
// Expect 2 volumes - root volume is ignored.
85
c.Assert(volumes, gc.HasLen, 2)
86
c.Assert(attachments, gc.HasLen, 2)
87
c.Check(volumes, jc.DeepEquals, []storage.Volume{
89
// This volume has no id_path.
90
names.NewVolumeTag("1"),
99
names.NewVolumeTag("2"),
101
HardwareId: "id_for_sdc",
102
VolumeId: "volume-2",
108
c.Assert(attachments, jc.DeepEquals, []storage.VolumeAttachment{
110
names.NewVolumeTag("1"),
112
storage.VolumeAttachmentInfo{
117
// Device name not set because there's a hardware id in the volume.
119
names.NewVolumeTag("2"),
121
storage.VolumeAttachmentInfo{
129
func (s *volumeSuite) TestInstanceVolumesOldMass(c *gc.C) {
130
obj := s.testMAASObject.TestServer.NewNode(`{"system_id": "node0"}`)
131
instance := maasInstance{maasObject: &obj, environ: s.makeEnviron()}
132
volumes, attachments, err := instance.volumes(names.NewMachineTag("1"), []names.VolumeTag{
133
names.NewVolumeTag("1"),
134
names.NewVolumeTag("2"),
136
c.Assert(err, jc.ErrorIsNil)
137
c.Assert(volumes, gc.HasLen, 0)
138
c.Assert(attachments, gc.HasLen, 0)
141
var validVolumeJson = `
143
"system_id": "node0",
144
"physicalblockdevice_set": [
152
"id_path": "/dev/disk/by-id/id_for_sda",
154
"model": "Samsung_SSD_850_EVO_250GB",
156
"serial": "S21NNSAFC38075L",
167
"model": "Samsung_SSD_850_EVO_500GB",
169
"serial": "S21NNSAFC38076L",
179
"id_path": "/dev/disk/by-id/id_for_sdc",
181
"model": "Samsung_SSD_850_EVO_250GB",
183
"serial": "S21NNSAFC38999L",
193
"id_path": "/dev/disk/by-id/id_for_sdd",
195
"model": "Samsung_SSD_850_EVO_250GB",
197
"serial": "S21NNSAFC386666L",
207
"id_path": "/dev/disk/by-id/id_for_sde",
209
"model": "Samsung_SSD_850_EVO_250GB",
211
"serial": "S21NNSAFC388888L",
224
type storageProviderSuite struct {
228
var _ = gc.Suite(&storageProviderSuite{})
230
func (*storageProviderSuite) TestValidateConfigTags(c *gc.C) {
231
p := maasStorageProvider{}
232
validate := func(tags interface{}) {
233
cfg, err := storage.NewConfig("foo", maasStorageProviderType, map[string]interface{}{
236
c.Assert(err, jc.ErrorIsNil)
237
err = p.ValidateConfig(cfg)
238
c.Assert(err, jc.ErrorIsNil)
241
validate("mul,ti,ple")
242
validate(" leading, spaces")
243
validate("trailing ,spaces ")
244
validate(" and,everything, in , between ")
247
func (*storageProviderSuite) TestValidateConfigInvalidConfig(c *gc.C) {
248
p := maasStorageProvider{}
249
cfg, err := storage.NewConfig("foo", maasStorageProviderType, map[string]interface{}{
250
"tags": "white space",
252
c.Assert(err, jc.ErrorIsNil)
253
err = p.ValidateConfig(cfg)
254
c.Assert(err, gc.ErrorMatches, `tags may not contain whitespace: "white space"`)
257
func (*storageProviderSuite) TestValidateConfigUnknownAttribute(c *gc.C) {
258
p := maasStorageProvider{}
259
cfg, err := storage.NewConfig("foo", maasStorageProviderType, map[string]interface{}{
262
c.Assert(err, jc.ErrorIsNil)
263
err = p.ValidateConfig(cfg)
264
c.Assert(err, jc.ErrorIsNil) // unknown attributes are ignored
267
func (s *storageProviderSuite) TestSupports(c *gc.C) {
268
p := maasStorageProvider{}
269
c.Assert(p.Supports(storage.StorageKindBlock), jc.IsTrue)
270
c.Assert(p.Supports(storage.StorageKindFilesystem), jc.IsFalse)
273
func (s *storageProviderSuite) TestScope(c *gc.C) {
274
p := maasStorageProvider{}
275
c.Assert(p.Scope(), gc.Equals, storage.ScopeEnviron)