Skip to content

Commit

Permalink
K10-1981: Import validation (#5382)
Browse files Browse the repository at this point in the history
* Export NodeZonesAndRegion

* Define RestoreTargetter interfaces

* Translation layer for RestoreTargetter interface

* SnapshotRestoreTargets for EBS

* SnapshotRestoreTargets for GPD

* K10-1981 Import verify snapshot usability

* Need kubeCli for MigrateReceivePhase

* Compile errors

* Spelling correction

* GPD is globally accessible

* PR feedback: no SnapshotRestoreTargets for GPD

* PR feedback: Add comments and name return values

* PR feedback: use p.Clis.KubeCli

* PR feedback: name return values

* Add SnapshotRestoreTargets to mockstorage

* Add TestSnapshotRestoreTargets

* Lint fix
  • Loading branch information
ewhamilton authored and Ilya Kislenko committed Jun 7, 2019
1 parent d733cec commit 4fa431e
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 5 deletions.
16 changes: 16 additions & 0 deletions pkg/blockstorage/awsebs/awsebs.go
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,22 @@ func queryRegionToZones(ctx context.Context, region string) ([]string, error) {
return azs, nil
}

func (s *ebsStorage) SnapshotRestoreTargets(ctx context.Context, snapshot *blockstorage.Snapshot) (global bool, regionsAndZones map[string][]string, err error) {
// A few checks from VolumeCreateFromSnapshot
if snapshot.Volume == nil {
return false, nil, errors.New("Snapshot volume information not available")
}
if snapshot.Volume.VolumeType == "" || snapshot.Volume.Az == "" || snapshot.Volume.Tags == nil {
return false, nil, errors.Errorf("Required volume fields not available, volumeType: %s, Az: %s, VolumeTags: %v", snapshot.Volume.VolumeType, snapshot.Volume.Az, snapshot.Volume.Tags)
}
// EBS snapshots can only be restored in their region
zl, err := staticRegionToZones(snapshot.Region)
if err != nil {
return false, nil, err
}
return false, map[string][]string{snapshot.Region: zl}, nil
}

func staticRegionToZones(region string) ([]string, error) {
switch region {
case "ap-south-1":
Expand Down
7 changes: 7 additions & 0 deletions pkg/blockstorage/blockstorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,10 @@ type Provider interface {
VolumesList(ctx context.Context, tags map[string]string, zone string) ([]*Volume, error)
SnapshotsList(ctx context.Context, tags map[string]string) ([]*Snapshot, error)
}

// RestoreTargeter implements the SnapshotRestoreTargets method
type RestoreTargeter interface {
// SnapshotRestoreTargets returns whether a snapshot can be restored globally.
// If not globally restorable, returns a map of the regions and zones to which snapshot can be restored.
SnapshotRestoreTargets(context.Context, *Snapshot) (global bool, regionsAndZones map[string][]string, err error)
}
6 changes: 4 additions & 2 deletions pkg/blockstorage/zone/zone.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
)

type (
// Mapper interface indicates provider that supports FromRegion mapping to list of zones
Mapper interface {
FromRegion(ctx context.Context, region string) ([]string, error)
}
Expand All @@ -29,7 +30,7 @@ func FromSourceRegionZone(ctx context.Context, m Mapper, region string, sourceZo
newZones := make(map[string]struct{})
cli, err := kube.NewClient()
if err == nil {
nzs, rs, errzr := nodeZonesAndRegion(ctx, cli)
nzs, rs, errzr := NodeZonesAndRegion(ctx, cli)
if err != nil {
log.Errorf("Ignoring error getting Node availability zones. Error: %+v", errzr)
}
Expand Down Expand Up @@ -171,7 +172,8 @@ const (
nodeZonesErr = `Failed to get Node availability zones.`
)

func nodeZonesAndRegion(ctx context.Context, cli kubernetes.Interface) (map[string]struct{}, string, error) {
// NodeZonesAndRegion returns cloud provider failure-domain region and zones as reported by K8s
func NodeZonesAndRegion(ctx context.Context, cli kubernetes.Interface) (map[string]struct{}, string, error) {
if cli == nil {
return nil, "", errors.New(nodeZonesErr)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/blockstorage/zone/zone_kube_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (s KubeTestZoneSuite) TestNodeZones(c *C) {
ctx := context.Background()
cli, err := kube.NewClient()
c.Assert(err, IsNil)
zones, _, err := nodeZonesAndRegion(ctx, cli)
zones, _, err := NodeZonesAndRegion(ctx, cli)
c.Assert(err, IsNil)
c.Assert(zones, Not(HasLen), 0)
}
4 changes: 2 additions & 2 deletions pkg/blockstorage/zone/zone_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func (s ZoneSuite) TestNodeZoneAndRegionGCP(c *C) {
expectedZone["us-west2-b"] = struct{}{}
expectedZone["us-west2-c"] = struct{}{}
cli := fake.NewSimpleClientset(node1, node2, node3)
z, r, err := nodeZonesAndRegion(ctx, cli)
z, r, err := NodeZonesAndRegion(ctx, cli)
c.Assert(err, IsNil)
c.Assert(reflect.DeepEqual(z, expectedZone), Equals, true)
c.Assert(r, Equals, "us-west2")
Expand Down Expand Up @@ -113,7 +113,7 @@ func (s ZoneSuite) TestNodeZoneAndRegionEBS(c *C) {
expectedZone["us-west-2b"] = struct{}{}
expectedZone["us-west-2c"] = struct{}{}
cli := fake.NewSimpleClientset(node1, node2, node3)
z, r, err := nodeZonesAndRegion(ctx, cli)
z, r, err := NodeZonesAndRegion(ctx, cli)
c.Assert(err, IsNil)
c.Assert(reflect.DeepEqual(z, expectedZone), Equals, true)
c.Assert(r, Equals, "us-west-2")
Expand Down

0 comments on commit 4fa431e

Please sign in to comment.