Skip to content

Commit a87b14c

Browse files
Raunak Kumarraunakkumar
authored andcommitted
snapshotgroup: support for creat/delete snapshot group
Signed-off-by: Raunak Kumar <[email protected]>
1 parent 5130e10 commit a87b14c

File tree

5 files changed

+129
-13
lines changed

5 files changed

+129
-13
lines changed

model/types.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,16 @@ type VolumeGroup struct {
252252
Config map[string]interface{} `json:"config,omitempty"`
253253
}
254254

255+
type SnapshotGroup struct {
256+
ID string `json:"id,omitempty"`
257+
Name string `json:"name,omitempty"`
258+
SourceVolumeGroupID string `json:"volume_group_id,omitempty"`
259+
SourceVolumeGroupName string `json:"volume_group_name,omitempty"`
260+
Snapshots []*Snapshot `json:"snapshots,omitempty"`
261+
CreationTime int64 `json:"creation_time,omitempty"`
262+
Config map[string]interface{} `json:"config,omitempty"`
263+
}
264+
255265
// PublishOptions are the options needed to publish a volume
256266
type PublishOptions struct {
257267
HostUUID string `json:"host_uuid,omitempty"`

storageprovider/csp/container_storage_provider.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,64 @@ func (provider *ContainerStorageProvider) CreateVolume(name, description string,
263263
return response, err
264264
}
265265

266+
// CreateSnapshotGroup creates a snapshot group on the CSP
267+
func (provider *ContainerStorageProvider) CreateSnapshotGroup(name, sourceVolumeGroupID string, opts map[string]interface{}) (*model.SnapshotGroup, error) {
268+
log.Tracef(">>>>> CreateSnapshotGroup, name: %s, sourceVolumeGroupID: %s", name, sourceVolumeGroupID)
269+
defer log.Trace("<<<<< CreateSnapshotGroup")
270+
271+
response := &model.SnapshotGroup{}
272+
var errorResponse *ErrorsPayload
273+
274+
snapshot_group := &model.SnapshotGroup{
275+
Name: name,
276+
SourceVolumeGroupID: sourceVolumeGroupID,
277+
Config: opts,
278+
}
279+
280+
// Create the snapshot group on the array
281+
status, err := provider.invoke(
282+
&connectivity.Request{
283+
Action: "POST",
284+
Path: "/containers/v1/snapshot_groups",
285+
Payload: &snapshot_group,
286+
Response: &response,
287+
ResponseError: &errorResponse,
288+
},
289+
)
290+
if errorResponse != nil {
291+
return nil, handleError(status, errorResponse)
292+
}
293+
294+
return response, err
295+
}
296+
297+
// DeleteSnapshotGroup deletes a snapshot group on the CSP
298+
func (provider *ContainerStorageProvider) DeleteSnapshotGroup(id string) error {
299+
log.Tracef(">>>>> DeleteSnapshotGroup, id: %s", id)
300+
defer log.Trace("<<<<< DeleteSnapshotGroup")
301+
302+
var errorResponse *ErrorsPayload
303+
304+
// Delete the snapshot group on the array
305+
status, err := provider.invoke(
306+
&connectivity.Request{
307+
Action: "DELETE",
308+
Path: fmt.Sprintf("/containers/v1/snapshot_groups/%s", id),
309+
Payload: nil,
310+
Response: nil,
311+
ResponseError: &errorResponse,
312+
},
313+
)
314+
if errorResponse != nil {
315+
return handleError(status, errorResponse)
316+
}
317+
if err != nil {
318+
return err
319+
}
320+
321+
return nil
322+
}
323+
266324
// CreateVolumeGroup creates a volume group on the CSP
267325
func (provider *ContainerStorageProvider) CreateVolumeGroup(name, description string, opts map[string]interface{}) (*model.VolumeGroup, error) {
268326
log.Tracef(">>>>> CreateVolumeGroup, name: %s, opts: %+v", name, opts)

storageprovider/fake/fake_storage_provider.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ import (
1111

1212
// StorageProvider is an implementor of the StorageProvider interface
1313
type StorageProvider struct {
14-
volumes map[string]model.Volume
15-
snapshots map[string]model.Snapshot
16-
volumeGroups map[string]model.VolumeGroup
14+
volumes map[string]model.Volume
15+
snapshots map[string]model.Snapshot
16+
volumeGroups map[string]model.VolumeGroup
17+
snapshotGroups map[string]model.SnapshotGroup
1718
}
1819

1920
// NewFakeStorageProvider returns a fake storage provider
2021
func NewFakeStorageProvider() *StorageProvider {
2122
return &StorageProvider{
22-
volumes: make(map[string]model.Volume),
23-
snapshots: make(map[string]model.Snapshot),
24-
volumeGroups: make(map[string]model.VolumeGroup),
23+
volumes: make(map[string]model.Volume),
24+
snapshots: make(map[string]model.Snapshot),
25+
volumeGroups: make(map[string]model.VolumeGroup),
26+
snapshotGroups: make(map[string]model.SnapshotGroup),
2527
}
2628
}
2729

@@ -55,7 +57,7 @@ func (provider *StorageProvider) CreateVolume(name, description string, size int
5557
return &fakeVolume, nil
5658
}
5759

58-
// CreateVolume returns a fake volume group
60+
// CreateVolumeGroup returns a fake volume group
5961
func (provider *StorageProvider) CreateVolumeGroup(name, description string, opts map[string]interface{}) (*model.VolumeGroup, error) {
6062
if _, ok := provider.volumeGroups[name]; ok {
6163
return nil, fmt.Errorf("Volume Group named %s already exists", name)
@@ -69,6 +71,20 @@ func (provider *StorageProvider) CreateVolumeGroup(name, description string, opt
6971
return &fakeVolumeGroup, nil
7072
}
7173

74+
// CreateSnapshotGroup returns a fake volume group
75+
func (provider *StorageProvider) CreateSnapshotGroup(name, sourceVolumeGroupID string) (*model.SnapshotGroup, error) {
76+
if _, ok := provider.snapshotGroups[name]; ok {
77+
return nil, fmt.Errorf("Snapshot Group named %s already exists", name)
78+
}
79+
fakeSnapshotGroup := model.SnapshotGroup{
80+
ID: name,
81+
Name: name,
82+
SourceVolumeGroupID: sourceVolumeGroupID,
83+
}
84+
provider.snapshotGroups[name] = fakeSnapshotGroup
85+
return &fakeSnapshotGroup, nil
86+
}
87+
7288
// CloneVolume returns a fake volume
7389
func (provider *StorageProvider) CloneVolume(name, description, sourceID, snapshotID string, size int64, opts map[string]interface{}) (*model.Volume, error) {
7490
if _, ok := provider.volumes[name]; ok {
@@ -125,6 +141,15 @@ func (provider *StorageProvider) DeleteVolumeGroup(id string) error {
125141
return fmt.Errorf("Could not find volume group with id %s", id)
126142
}
127143

144+
// DeleteSnapshotGroup removes a fake snapshotGroup
145+
func (provider *StorageProvider) DeleteSnapshotGroup(id string) error {
146+
if _, ok := provider.snapshotGroups[id]; ok {
147+
delete(provider.snapshotGroups, id)
148+
return nil
149+
}
150+
return fmt.Errorf("Could not find snapshot group with id %s", id)
151+
}
152+
128153
// PublishVolume returns fake publish data
129154
func (provider *StorageProvider) PublishVolume(id, hostUUID, accessProtocol string) (*model.PublishInfo, error) {
130155
return &model.PublishInfo{

storageprovider/fake/fake_storage_provider_test.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import (
1010
)
1111

1212
const (
13-
volumeName = "testCspVol"
14-
volumeSize = 1024 * 1024 * 1024
15-
snapshotName = "testCspSnapshot"
16-
cloneName = "testCspVolClone"
17-
cloneSize = 2 * 1024 * 1024 * 1024
18-
volumeGroupName = "testCspVolumeGroup"
13+
volumeName = "testCspVol"
14+
volumeSize = 1024 * 1024 * 1024
15+
snapshotName = "testCspSnapshot"
16+
cloneName = "testCspVolClone"
17+
cloneSize = 2 * 1024 * 1024 * 1024
18+
volumeGroupName = "testCspVolumeGroup"
19+
snapshotGroupName = "testCspSnapshotGroup"
1920
)
2021

2122
// nolint: gocyclo
@@ -109,6 +110,18 @@ func TestPluginSuite(t *testing.T) {
109110
if err != nil {
110111
t.Fatal("Failed to create volume group" + volumeGroupName)
111112
}
113+
114+
// Create Snapshot Group
115+
config["test"] = "test"
116+
117+
snapshotGroup, err := provider.CreateSnapshotGroup(snapshotGroupName, volumeGroup.ID)
118+
if err != nil {
119+
t.Fatal("Failed to create snapshot group" + snapshotGroupName)
120+
}
121+
122+
// Delete the Snapshot Group
123+
deleteSnapshotGroup(t, provider, snapshotGroup)
124+
112125
// Delete the Volume Group
113126
deleteVolumeGroup(t, provider, volumeGroup)
114127

@@ -151,6 +164,14 @@ func deleteVolume(t *testing.T, provider *StorageProvider, volume *model.Volume)
151164
assert.Nil(t, volume)
152165
}
153166

167+
// nolint: dupl
168+
func deleteSnapshotGroup(t *testing.T, provider *StorageProvider, snapshotGroup *model.SnapshotGroup) {
169+
err := provider.DeleteSnapshotGroup(snapshotGroup.ID)
170+
if err != nil {
171+
t.Fatal("Could not delete snapshot group" + snapshotGroup.Name + ". Error: " + err.Error())
172+
}
173+
}
174+
154175
// nolint: dupl
155176
func deleteVolumeGroup(t *testing.T, provider *StorageProvider, volumeGroup *model.VolumeGroup) {
156177
err := provider.DeleteVolumeGroup(volumeGroup.ID)

storageprovider/storage_provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ type StorageProvider interface {
4444
EditVolume(id string, opts map[string]interface{}) (*model.Volume, error)
4545
CreateVolumeGroup(name, description string, opts map[string]interface{}) (*model.VolumeGroup, error)
4646
DeleteVolumeGroup(id string) error
47+
CreateSnapshotGroup(name, sourceVolumeGroupID string, opts map[string]interface{}) (*model.SnapshotGroup, error)
48+
DeleteSnapshotGroup(id string) error
4749
}
4850

4951
// Credentials defines how a StorageProvider is accessed

0 commit comments

Comments
 (0)