forked from hpe-storage/common-host-libs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fake_storage_provider.go
289 lines (251 loc) · 8.42 KB
/
fake_storage_provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
// Copyright 2019 Hewlett Packard Enterprise Development LP
package fake
import (
"errors"
"fmt"
"github.com/hpe-storage/common-host-libs/model"
)
// StorageProvider is an implementor of the StorageProvider interface
type StorageProvider struct {
volumes map[string]model.Volume
snapshots map[string]model.Snapshot
volumeGroups map[string]model.VolumeGroup
snapshotGroups map[string]model.SnapshotGroup
}
// NewFakeStorageProvider returns a fake storage provider
func NewFakeStorageProvider() *StorageProvider {
return &StorageProvider{
volumes: make(map[string]model.Volume),
snapshots: make(map[string]model.Snapshot),
volumeGroups: make(map[string]model.VolumeGroup),
snapshotGroups: make(map[string]model.SnapshotGroup),
}
}
// Initialize does nothing
func (provider *StorageProvider) Initialize() {
}
// SetNodeContext does nothing
func (provider *StorageProvider) SetNodeContext(node *model.Node) error {
return nil
}
// GetNodeContext does nothing
func (provider *StorageProvider) GetNodeContext(nodeID string) (*model.Node, error) {
return nil, nil
}
// CreateVolume returns a fake volume
func (provider *StorageProvider) CreateVolume(name, description string, size int64, opts map[string]interface{}) (*model.Volume, error) {
if _, ok := provider.volumes[name]; ok {
return nil, fmt.Errorf("Volume named %s already exists", name)
}
fakeVolume := model.Volume{
ID: name,
Name: name,
Size: size,
Config: opts,
}
provider.volumes[name] = fakeVolume
return &fakeVolume, nil
}
// CreateVolumeGroup returns a fake volume group
func (provider *StorageProvider) CreateVolumeGroup(name, description string, opts map[string]interface{}) (*model.VolumeGroup, error) {
if _, ok := provider.volumeGroups[name]; ok {
return nil, fmt.Errorf("Volume Group named %s already exists", name)
}
fakeVolumeGroup := model.VolumeGroup{
ID: name,
Name: name,
Config: opts,
}
provider.volumeGroups[name] = fakeVolumeGroup
return &fakeVolumeGroup, nil
}
// CreateSnapshotGroup returns a fake volume group
func (provider *StorageProvider) CreateSnapshotGroup(name, sourceVolumeGroupID string, opts map[string]interface{}) (*model.SnapshotGroup, error) {
if _, ok := provider.snapshotGroups[name]; ok {
return nil, fmt.Errorf("Snapshot Group named %s already exists", name)
}
fakeSnapshotGroup := model.SnapshotGroup{
ID: name,
Name: name,
SourceVolumeGroupID: sourceVolumeGroupID,
}
provider.snapshotGroups[name] = fakeSnapshotGroup
return &fakeSnapshotGroup, nil
}
// CloneVolume returns a fake volume
func (provider *StorageProvider) CloneVolume(name, description, sourceID, snapshotID string, size int64, opts map[string]interface{}) (*model.Volume, error) {
if _, ok := provider.volumes[name]; ok {
return nil, fmt.Errorf("Volume named %s already exists", name)
}
var snapshot *model.Snapshot
var err error
if sourceID == "" {
snapshot, err = provider.GetSnapshot(snapshotID)
if err != nil {
return nil, err
}
if snapshot == nil {
return nil, errors.New("Could not find snapshot with id " + snapshotID)
}
} else if snapshotID == "" {
snapshotName := "testSnapshot"
snapshot, err = provider.CreateSnapshot(snapshotName, snapshotName, sourceID, nil)
if err != nil {
return nil, err
}
if snapshot == nil {
return nil, errors.New("Could not create new snapshot for volume clone")
}
}
fakeClone := model.Volume{
ID: name,
Name: name,
Size: size,
BaseSnapID: snapshot.ID,
}
provider.volumes[name] = fakeClone
return &fakeClone, nil
}
// DeleteVolume removes a fake volume
func (provider *StorageProvider) DeleteVolume(id string, force bool) error {
if _, ok := provider.volumes[id]; ok {
delete(provider.volumes, id)
return nil
}
return fmt.Errorf("Could not find volume with id %s", id)
}
// DeleteVolumeGroup removes a fake volumeGroup
func (provider *StorageProvider) DeleteVolumeGroup(id string) error {
if _, ok := provider.volumeGroups[id]; ok {
delete(provider.volumeGroups, id)
return nil
}
return fmt.Errorf("Could not find volume group with id %s", id)
}
// DeleteSnapshotGroup removes a fake snapshotGroup
func (provider *StorageProvider) DeleteSnapshotGroup(id string) error {
if _, ok := provider.snapshotGroups[id]; ok {
delete(provider.snapshotGroups, id)
return nil
}
return fmt.Errorf("Could not find snapshot group with id %s", id)
}
// PublishVolume returns fake publish data
func (provider *StorageProvider) PublishVolume(id, hostUUID, accessProtocol string) (*model.PublishInfo, error) {
return &model.PublishInfo{
SerialNumber: "eui.fake",
}, nil
}
// UnpublishVolume does nothing
func (provider *StorageProvider) UnpublishVolume(id, hostUUID string) error {
return nil
}
// GetVolume returns a fake volume from memory
func (provider *StorageProvider) GetVolume(id string) (*model.Volume, error) {
if _, ok := provider.volumes[id]; ok {
fakeVolume := provider.volumes[id]
return &model.Volume{
ID: fakeVolume.ID,
Name: fakeVolume.Name,
Size: fakeVolume.Size,
}, nil
}
return nil, nil
}
// GetVolumeByName returns a fake volume from memory
func (provider *StorageProvider) GetVolumeByName(name string) (*model.Volume, error) {
return provider.GetVolume(name)
}
// GetVolumes returns the fake volumes saved in the map
func (provider *StorageProvider) GetVolumes() ([]*model.Volume, error) {
var volumes []*model.Volume
for _, volume := range provider.volumes {
fakeVolume := &model.Volume{
ID: volume.ID,
Name: volume.Name,
Size: volume.Size,
}
volumes = append(volumes, fakeVolume)
}
return volumes, nil
}
// GetSnapshots returns the fake snapshots saved in the map
func (provider *StorageProvider) GetSnapshots(sourceID string) ([]*model.Snapshot, error) {
var snapshots []*model.Snapshot
for _, snapshot := range provider.snapshots {
fakeSnapshot := &model.Snapshot{
ID: snapshot.ID,
Name: snapshot.Name,
VolumeID: snapshot.VolumeID,
VolumeName: snapshot.VolumeName,
Size: snapshot.Size,
ReadyToUse: snapshot.ReadyToUse,
}
snapshots = append(snapshots, fakeSnapshot)
}
return snapshots, nil
}
// GetSnapshotByName returns a fake snapshot from memory
func (provider *StorageProvider) GetSnapshotByName(name string, sourceID string) (*model.Snapshot, error) {
return provider.GetSnapshot(name)
}
// GetSnapshot returns the fake snapshot from memory
func (provider *StorageProvider) GetSnapshot(id string) (*model.Snapshot, error) {
if _, ok := provider.snapshots[id]; ok {
fakeSnap := provider.snapshots[id]
return &model.Snapshot{
ID: fakeSnap.ID,
Name: fakeSnap.Name,
VolumeID: fakeSnap.VolumeID,
VolumeName: fakeSnap.VolumeName,
Size: fakeSnap.Size,
ReadyToUse: fakeSnap.ReadyToUse,
}, nil
}
return nil, nil
}
// CreateSnapshot returns a fake snapshot
func (provider *StorageProvider) CreateSnapshot(name, description, sourceID string, opts map[string]interface{}) (*model.Snapshot, error) {
if _, ok := provider.snapshots[name]; ok {
return nil, fmt.Errorf("Snapshot named %s already exists", name)
}
fakeSnapshot := model.Snapshot{
ID: name,
Name: name,
VolumeID: sourceID,
VolumeName: sourceID,
ReadyToUse: true,
}
provider.snapshots[name] = fakeSnapshot
return &fakeSnapshot, nil
}
// DeleteSnapshot removes a fake volume
func (provider *StorageProvider) DeleteSnapshot(id string) error {
if _, ok := provider.snapshots[id]; ok {
delete(provider.snapshots, id)
return nil
}
return fmt.Errorf("Could not find snapshot with id %s", id)
}
// ExpandVolume will expand the fake volume to requested size
func (provider *StorageProvider) ExpandVolume(id string, requestBytes int64) (*model.Volume, error) {
if _, ok := provider.volumes[id]; !ok {
return nil, fmt.Errorf("Could not find volume with id %s", id)
}
fakeVolume := provider.volumes[id]
// update volume, so that new size will be reflected
fakeVolume.Size = requestBytes
return &fakeVolume, nil
}
// EditVolume will edit the fake volume with requested params
func (provider *StorageProvider) EditVolume(id string, parameters map[string]interface{}) (*model.Volume, error) {
if _, ok := provider.volumes[id]; !ok {
return nil, fmt.Errorf("Could not find volume with id %s", id)
}
// update volume in the map, so that new properties will be reflected
fakeVolume := provider.volumes[id]
for key, value := range parameters {
fakeVolume.Config[key] = value
}
return &fakeVolume, nil
}