Skip to content

Commit

Permalink
VolumeCreateFromSnapshot and SetTags for FCD volume implementation (#346
Browse files Browse the repository at this point in the history
)

* VolumeCreateFromSnapshot and SetTags for volume implementation.

* Add nil check

* Make inline error check
  • Loading branch information
Hakan Memisoglu authored and mergify[bot] committed Oct 10, 2019
1 parent d8d0d0b commit 60236cd
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 3 deletions.
11 changes: 11 additions & 0 deletions pkg/blockstorage/vmware/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,14 @@ func convertKeyValueToTags(kvs []types.KeyValue) []*blockstorage.KeyValue {
}
return blockstorage.MapToKeyValue(tags)
}

func convertTagsToKeyValue(tags map[string]string) []types.KeyValue {
result := make([]types.KeyValue, 0)
for k, v := range tags {
var kv types.KeyValue
kv.Key = k
kv.Value = v
result = append(result, kv)
}
return result
}
56 changes: 53 additions & 3 deletions pkg/blockstorage/vmware/vmware.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"time"

"github.com/pkg/errors"
uuid "github.com/satori/go.uuid"
"github.com/vmware/govmomi/cns"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/methods"
Expand All @@ -13,6 +14,7 @@ import (
"github.com/vmware/govmomi/vslm"

"github.com/kanisterio/kanister/pkg/blockstorage"
ktags "github.com/kanisterio/kanister/pkg/blockstorage/tags"
)

var _ blockstorage.Provider = (*fcdProvider)(nil)
Expand Down Expand Up @@ -70,7 +72,33 @@ func (p *fcdProvider) VolumeCreate(ctx context.Context, volume blockstorage.Volu
}

func (p *fcdProvider) VolumeCreateFromSnapshot(ctx context.Context, snapshot blockstorage.Snapshot, tags map[string]string) (*blockstorage.Volume, error) {
return nil, errors.New("Not implemented")
volID, snapshotID, err := splitSnapshotFullID(snapshot.ID)
if err != nil {
return nil, errors.Wrap(err, "Failed to split snapshot full ID")
}
task, err := p.gom.CreateDiskFromSnapshot(ctx, vimID(volID), vimID(snapshotID), uuid.NewV1().String(), nil, nil, "")
if err != nil {
return nil, errors.Wrap(err, "Failed to create disk from snapshot")
}
res, err := task.Wait(ctx, defaultWaitTime)
if err != nil {
return nil, errors.Wrap(err, "Failed to wait on task")
}
obj, ok := res.(types.VStorageObject)
if !ok {
return nil, errors.New("Wrong type returned")
}
vol, err := p.VolumeGet(ctx, obj.Config.Id.Id, "")
if err != nil {
return nil, errors.Wrap(err, "Failed to get volume")
}
tagsCNS := make(map[string]string)
tagsCNS["cns.tag"] = "1"
tags = ktags.Union(tags, tagsCNS)
if err = p.SetTags(ctx, vol, tags); err != nil {
return nil, errors.Wrap(err, "Failed to set tags")
}
return p.VolumeGet(ctx, vol.ID, "")
}

func (p *fcdProvider) VolumeDelete(ctx context.Context, volume *blockstorage.Volume) error {
Expand Down Expand Up @@ -115,7 +143,7 @@ func (p *fcdProvider) SnapshotCreate(ctx context.Context, volume blockstorage.Vo
}

func (p *fcdProvider) SnapshotCreateWaitForCompletion(ctx context.Context, snapshot *blockstorage.Snapshot) error {
return errors.New("Not implemented")
return nil
}

func (p *fcdProvider) SnapshotDelete(ctx context.Context, snapshot *blockstorage.Snapshot) error {
Expand Down Expand Up @@ -150,7 +178,29 @@ func (p *fcdProvider) SnapshotGet(ctx context.Context, id string) (*blockstorage
}

func (p *fcdProvider) SetTags(ctx context.Context, resource interface{}, tags map[string]string) error {
return errors.New("Not implemented")
switch r := resource.(type) {
case *blockstorage.Volume:
return p.setTagsVolume(ctx, r, tags)
case *blockstorage.Snapshot:
return nil
default:
return errors.New("Unsupported type for resource")
}
}

func (p *fcdProvider) setTagsVolume(ctx context.Context, volume *blockstorage.Volume, tags map[string]string) error {
if volume == nil {
return errors.New("Empty volume")
}
task, err := p.gom.UpdateMetadata(ctx, vimID(volume.ID), convertTagsToKeyValue(tags), nil)
if err != nil {
return errors.Wrap(err, "Failed to update metadata")
}
_, err = task.Wait(ctx, defaultWaitTime)
if err != nil {
return errors.Wrap(err, "Failed to wait on task")
}
return nil
}

func (p *fcdProvider) VolumesList(ctx context.Context, tags map[string]string, zone string) ([]*blockstorage.Volume, error) {
Expand Down

0 comments on commit 60236cd

Please sign in to comment.