1
// Copyright 2014 ALTOROS
2
// Licensed under the AGPLv3, see LICENSE file for details.
9
"github.com/altoros/gosigma/data"
10
"github.com/altoros/gosigma/mock"
13
func newDataDrive(uuid string) *data.Drive {
14
result := &data.Drive{
15
Resource: data.Resource{URI: "uri", UUID: uuid},
16
LibraryDrive: data.LibraryDrive{
18
ImageType: "image-type",
22
Affinities: []string{"aff1", "aff2"},
23
AllowMultimount: true,
24
Jobs: []data.Resource{
25
data.Resource{URI: "uri-0", UUID: "uuid-0"},
26
data.Resource{URI: "uri-1", UUID: "uuid-1"},
29
Meta: map[string]string{"key1": "value1", "key2": "value2"},
31
Owner: &data.Resource{URI: "owner-uri", UUID: "owner-uuid"},
34
StorageType: "storage-type",
39
func testDrive(t *testing.T, d Drive, uuid string, short bool) {
40
checkv := func(v, wants string) {
42
t.Errorf("value %q, wants %q", v, wants)
45
checkb := func(v, wants bool) {
47
t.Errorf("value %v, wants %v", v, wants)
50
checki := func(v, wants uint64) {
52
t.Errorf("value %d, wants %d", v, wants)
55
checkg := func(d Drive, k, wants string) {
56
if v, ok := d.Get(k); !ok || v != wants {
57
t.Errorf("value of Get(%q) = %q, %v; wants %s", k, v, ok, wants)
61
checkv(d.URI(), "uri")
62
checkv(d.UUID(), uuid)
63
checkv(d.Owner().URI(), "owner-uri")
64
checkv(d.Owner().UUID(), "owner-uuid")
65
checkv(d.Status(), "status")
70
checkv(d.StorageType(), "")
74
checkv(d.Arch(), "arch")
75
checkv(d.ImageType(), "image-type")
77
checkb(d.Paid(), true)
79
if v := d.Affinities(); len(v) != 2 {
80
t.Error("Affinities failed:", len(v), v)
86
checkb(d.AllowMultimount(), true)
88
if v := d.Jobs(); len(v) != 2 {
89
t.Error("Jobs failed:", v)
91
checkv(v[0].URI(), "uri-0")
92
checkv(v[0].UUID(), "uuid-0")
93
checkv(v[1].URI(), "uri-1")
94
checkv(v[1].UUID(), "uuid-1")
97
checkv(d.Media(), "media")
99
checkg(d, "key1", "value1")
100
checkg(d, "key2", "value2")
101
checkv(d.Name(), "name")
102
checki(d.Size(), 1000)
103
checkv(d.StorageType(), "storage-type")
106
func TestClientDriveEmpty(t *testing.T) {
107
d := &drive{obj: &data.Drive{}}
108
if d.Owner() != nil {
109
t.Error("invalid owner")
113
func TestClientDrivesEmpty(t *testing.T) {
116
cli, err := createTestClient(t)
117
if err != nil || cli == nil {
118
t.Error("NewClient() failed:", err, cli)
122
check := func(rqspec RequestSpec, libspec LibrarySpec) {
123
drives, err := cli.Drives(rqspec, libspec)
128
t.Errorf("%v", drives)
132
check(RequestShort, LibraryAccount)
133
check(RequestDetail, LibraryAccount)
136
func TestClientDrives(t *testing.T) {
139
mock.Drives.Add(newDataDrive("uuid-0"))
140
mock.Drives.Add(newDataDrive("uuid-1"))
142
cli, err := createTestClient(t)
148
drives, err := cli.Drives(RequestShort, LibraryAccount)
154
if len(drives) != 2 {
155
t.Errorf("invalid len: %v", drives)
159
for i, uuid := range []string{"uuid-0", "uuid-1"} {
162
if d.String() == "" {
163
t.Error("Empty string representation")
167
testDrive(t, d, uuid, true)
170
if err := d.Refresh(); err != nil {
175
testDrive(t, d, uuid, false)
177
if err := d.Remove(); err != nil {
178
t.Error("Drive remove fail:", err)
183
if err := d.Refresh(); err == nil {
184
t.Error("Drive refresh must fail")
192
func TestClientDrive(t *testing.T) {
195
mock.Drives.Add(newDataDrive("uuid"))
197
cli, err := createTestClient(t)
203
d, err := cli.Drive("uuid", LibraryAccount)
209
if d.String() == "" {
210
t.Error("Empty string representation")
214
testDrive(t, d, "uuid", false)
216
if err := d.Remove(); err != nil {
217
t.Error("Drive remove fail:", err)
222
if err := d.Refresh(); err == nil {
223
t.Error("Drive refresh must fail")
230
func TestDriveClone(t *testing.T) {
233
mock.LibDrives.Add(newDataDrive("uuid"))
235
cli, err := createTestClient(t)
241
d, err := cli.Drive("uuid", LibraryMedia)
247
params := CloneParams{Name: "test-name", Media: "ssd"}
248
newDrive, err := d.Clone(params, []string{"avoid-uuid-0", "avoid-uuid-1"})
250
t.Error("Drive clone fail:", err)
254
if newDrive.UUID() == d.UUID() {
255
t.Errorf("Drive.Clone(), invalid new drive UUID %s", newDrive.UUID())
257
if newDrive.Size() != d.Size() {
258
t.Errorf("Drive.Clone(), invalid size %d, should be %d", newDrive.Size(), d.Size())
260
if newDrive.Library() != LibraryAccount {
261
t.Errorf("Drive.Clone(), invalid library spec %v", newDrive.Library())
263
if newDrive.Name() != "test-name" {
264
t.Errorf("Drive.Clone(), invalid name %q", newDrive.Name())
266
if newDrive.Media() != "ssd" {
267
t.Errorf("Drive.Clone(), invalid media %q", newDrive.Media())
273
func TestDriveCloneWait(t *testing.T) {
276
mock.Drives.Add(newDataDrive("uuid"))
278
cli, err := createTestClient(t)
284
d, err := cli.Drive("uuid", LibraryAccount)
290
params := CloneParams{Name: "test-name", Media: "ssd"}
291
newDrive, err := d.CloneWait(params, nil)
293
t.Error("Drive clone fail:", err)
297
if newDrive.UUID() == d.UUID() {
298
t.Errorf("Drive.Clone(), invalid new drive UUID %s", newDrive.UUID())
300
if newDrive.Size() != d.Size() {
301
t.Errorf("Drive.Clone(), invalid size %d, should be %d", newDrive.Size(), d.Size())
303
if newDrive.Library() != LibraryAccount {
304
t.Errorf("Drive.Clone(), invalid library spec %v", newDrive.Library())
306
if newDrive.Name() != "test-name" {
307
t.Errorf("Drive.Clone(), invalid name %q", newDrive.Name())
309
if newDrive.Media() != "ssd" {
310
t.Errorf("Drive.Clone(), invalid media %q", newDrive.Media())
316
func TestDriveCloneFail(t *testing.T) {
319
mock.LibDrives.Add(newDataDrive("uuid"))
321
cli, err := createTestClient(t)
327
d, err := cli.Drive("uuid", LibraryMedia)
335
params := CloneParams{Name: "test-name", Media: "ssd"}
336
newDrive, err := d.Clone(params, nil)
337
if err == nil || newDrive != nil {
338
t.Errorf("Drive clone must fail err=%v, rc=%v", err, newDrive)
342
t.Logf("OK. Drive.Clone(), err = %v", err)