[ARVADOS] created: 1.1.3-77-gc28d87a

Git user git at public.curoverse.com
Wed Feb 21 11:57:07 EST 2018


        at  c28d87a0916349bfcaacc774aa1c05582e1f0154 (commit)


commit c28d87a0916349bfcaacc774aa1c05582e1f0154
Author: Peter Amstutz <pamstutz at veritasgenetics.com>
Date:   Wed Feb 21 11:56:39 2018 -0500

    11645: Add support for StorageClasses in volume config.
    
    Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz at veritasgenetics.com>

diff --git a/services/keepstore/azure_blob_volume.go b/services/keepstore/azure_blob_volume.go
index c4eb8b2..f18d82c 100644
--- a/services/keepstore/azure_blob_volume.go
+++ b/services/keepstore/azure_blob_volume.go
@@ -105,6 +105,7 @@ type AzureBlobVolume struct {
 	AzureReplication      int
 	ReadOnly              bool
 	RequestTimeout        arvados.Duration
+	StorageClasses        []string
 
 	azClient  storage.Client
 	container *azureContainer
@@ -590,6 +591,11 @@ func (v *AzureBlobVolume) Replication() int {
 	return v.AzureReplication
 }
 
+// GetStorageClasses implements Volume
+func (v *AzureBlobVolume) GetStorageClasses() []string {
+	return v.StorageClasses
+}
+
 // If possible, translate an Azure SDK error to a recognizable error
 // like os.ErrNotExist.
 func (v *AzureBlobVolume) translateError(err error) error {
diff --git a/services/keepstore/mounts_test.go b/services/keepstore/mounts_test.go
index 883aa71..66a2124 100644
--- a/services/keepstore/mounts_test.go
+++ b/services/keepstore/mounts_test.go
@@ -46,11 +46,11 @@ func (s *MountsSuite) TestMounts(c *check.C) {
 	resp := s.call("GET", "/mounts", "", nil)
 	c.Check(resp.Code, check.Equals, http.StatusOK)
 	var mntList []struct {
-		UUID        string
-		DeviceID    string
-		ReadOnly    bool
-		Replication int
-		Tier        int
+		UUID           string
+		DeviceID       string
+		ReadOnly       bool
+		Replication    int
+		StorageClasses []string
 	}
 	err := json.Unmarshal(resp.Body.Bytes(), &mntList)
 	c.Assert(err, check.IsNil)
@@ -61,7 +61,7 @@ func (s *MountsSuite) TestMounts(c *check.C) {
 		c.Check(m.DeviceID, check.Equals, "mock-device-id")
 		c.Check(m.ReadOnly, check.Equals, false)
 		c.Check(m.Replication, check.Equals, 1)
-		c.Check(m.Tier, check.Equals, 1)
+		c.Check(m.StorageClasses, check.DeepEquals, []string{"default"})
 	}
 	c.Check(mntList[0].UUID, check.Not(check.Equals), mntList[1].UUID)
 
diff --git a/services/keepstore/s3_volume.go b/services/keepstore/s3_volume.go
index 90e8a1b..a60b2fc 100644
--- a/services/keepstore/s3_volume.go
+++ b/services/keepstore/s3_volume.go
@@ -152,6 +152,7 @@ type S3Volume struct {
 	RaceWindow         arvados.Duration
 	ReadOnly           bool
 	UnsafeDelete       bool
+	StorageClasses     []string
 
 	bucket *s3bucket
 
@@ -686,6 +687,11 @@ func (v *S3Volume) Replication() int {
 	return v.S3Replication
 }
 
+// GetStorageClasses implements Volume
+func (v *S3Volume) GetStorageClasses() []string {
+	return v.StorageClasses
+}
+
 var s3KeepBlockRegexp = regexp.MustCompile(`^[0-9a-f]{32}$`)
 
 func (v *S3Volume) isKeepBlock(s string) bool {
diff --git a/services/keepstore/volume.go b/services/keepstore/volume.go
index 69802ab..1f8fba5 100644
--- a/services/keepstore/volume.go
+++ b/services/keepstore/volume.go
@@ -240,6 +240,9 @@ type Volume interface {
 	// Return a globally unique ID of the underlying storage
 	// device if possible, otherwise "".
 	DeviceID() string
+
+	// Get the storage classes associated with this volume
+	GetStorageClasses() []string
 }
 
 // A VolumeWithExamples provides example configs to display in the
@@ -284,12 +287,12 @@ type VolumeManager interface {
 
 // A VolumeMount is an attachment of a Volume to a VolumeManager.
 type VolumeMount struct {
-	UUID        string
-	DeviceID    string
-	ReadOnly    bool
-	Replication int
-	Tier        int
-	volume      Volume
+	UUID           string
+	DeviceID       string
+	ReadOnly       bool
+	Replication    int
+	StorageClasses []string
+	volume         Volume
 }
 
 // Generate a UUID the way API server would for a "KeepVolumeMount"
@@ -326,13 +329,17 @@ func MakeRRVolumeManager(volumes []Volume) *RRVolumeManager {
 	}
 	vm.mountMap = make(map[string]*VolumeMount)
 	for _, v := range volumes {
+		sc := v.GetStorageClasses()
+		if len(sc) == 0 {
+			sc = []string{"default"}
+		}
 		mnt := &VolumeMount{
-			UUID:        (*VolumeMount)(nil).generateUUID(),
-			DeviceID:    v.DeviceID(),
-			ReadOnly:    !v.Writable(),
-			Replication: v.Replication(),
-			Tier:        1,
-			volume:      v,
+			UUID:           (*VolumeMount)(nil).generateUUID(),
+			DeviceID:       v.DeviceID(),
+			ReadOnly:       !v.Writable(),
+			Replication:    v.Replication(),
+			StorageClasses: sc,
+			volume:         v,
 		}
 		vm.iostats[v] = &ioStats{}
 		vm.mounts = append(vm.mounts, mnt)
diff --git a/services/keepstore/volume_test.go b/services/keepstore/volume_test.go
index baed6a7..43ddd09 100644
--- a/services/keepstore/volume_test.go
+++ b/services/keepstore/volume_test.go
@@ -241,3 +241,7 @@ func (v *MockVolume) Replication() int {
 
 func (v *MockVolume) EmptyTrash() {
 }
+
+func (v *MockVolume) GetStorageClasses() []string {
+	return nil
+}
diff --git a/services/keepstore/volume_unix.go b/services/keepstore/volume_unix.go
index ea9aa48..b4f18ad 100644
--- a/services/keepstore/volume_unix.go
+++ b/services/keepstore/volume_unix.go
@@ -110,6 +110,7 @@ type UnixVolume struct {
 	ReadOnly             bool
 	Serialize            bool
 	DirectoryReplication int
+	StorageClasses       []string
 
 	// something to lock during IO, typically a sync.Mutex (or nil
 	// to skip locking)
@@ -644,6 +645,11 @@ func (v *UnixVolume) Replication() int {
 	return v.DirectoryReplication
 }
 
+// GetStorageClasses implements Volume
+func (v *UnixVolume) GetStorageClasses() []string {
+	return v.StorageClasses
+}
+
 // InternalStats returns I/O and filesystem ops counters.
 func (v *UnixVolume) InternalStats() interface{} {
 	return &v.os.stats

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list