Skip to content

Commit 259bce3

Browse files
committed
support storage class in Cinder provisioner
Signed-off-by: Huamin Chen <[email protected]>
1 parent cfe7a43 commit 259bce3

File tree

7 files changed

+47
-8
lines changed

7 files changed

+47
-8
lines changed

examples/experimental/persistent-volume-provisioning/README.md

+16
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,22 @@ parameters:
105105
* `restuser` : Gluster REST service user who has access to create volumes in the Gluster Trusted Pool.
106106
* `restuserkey` : Gluster REST service user's password which will be used for authentication to the REST server.
107107

108+
#### OpenStack Cinder
109+
110+
```yaml
111+
kind: StorageClass
112+
apiVersion: extensions/v1beta1
113+
metadata:
114+
name: gold
115+
provisioner: kubernetes.io/cinder
116+
parameters:
117+
type: fast
118+
availability: nova
119+
```
120+
121+
* `type`: [VolumeType](http://docs.openstack.org/admin-guide/dashboard-manage-volumes.html) created in Cinder. Default is empty.
122+
* `availability`: Availability Zone. Default is empty.
123+
108124
### User provisioning requests
109125

110126
Users request dynamically provisioned storage by including a storage class in their `PersistentVolumeClaim`.

pkg/cloudprovider/providers/openstack/openstack_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ func TestVolumes(t *testing.T) {
268268
tags := map[string]string{
269269
"test": "value",
270270
}
271-
vol, err := os.CreateVolume("kubernetes-test-volume-"+rand.String(10), 1, &tags)
271+
vol, err := os.CreateVolume("kubernetes-test-volume-"+rand.String(10), 1, "", "", &tags)
272272
if err != nil {
273273
t.Fatalf("Cannot create a new Cinder volume: %v", err)
274274
}

pkg/cloudprovider/providers/openstack/openstack_volumes.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (os *OpenStack) getVolume(diskName string) (volumes.Volume, error) {
136136
}
137137

138138
// Create a volume of given size (in GiB)
139-
func (os *OpenStack) CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error) {
139+
func (os *OpenStack) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (volumeName string, err error) {
140140

141141
sClient, err := openstack.NewBlockStorageV1(os.provider, gophercloud.EndpointOpts{
142142
Region: os.region,
@@ -148,8 +148,10 @@ func (os *OpenStack) CreateVolume(name string, size int, tags *map[string]string
148148
}
149149

150150
opts := volumes.CreateOpts{
151-
Name: name,
152-
Size: size,
151+
Name: name,
152+
Size: size,
153+
VolumeType: vtype,
154+
Availability: availability,
153155
}
154156
if tags != nil {
155157
opts.Metadata = *tags

pkg/cloudprovider/providers/rackspace/rackspace.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ func (os *Rackspace) GetZone() (cloudprovider.Zone, error) {
475475
}
476476

477477
// Create a volume of given size (in GiB)
478-
func (rs *Rackspace) CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error) {
478+
func (rs *Rackspace) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (volumeName string, err error) {
479479
return "", errors.New("unimplemented")
480480
}
481481

pkg/volume/cinder/attacher_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ func (testcase *testcase) GetAttachmentDiskPath(instanceID string, diskName stri
391391
return expected.retPath, expected.ret
392392
}
393393

394-
func (testcase *testcase) CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error) {
394+
func (testcase *testcase) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (volumeName string, err error) {
395395
return "", errors.New("Not implemented")
396396
}
397397

pkg/volume/cinder/cinder.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type CinderProvider interface {
4545
AttachDisk(instanceID string, diskName string) (string, error)
4646
DetachDisk(instanceID string, partialDiskId string) error
4747
DeleteVolume(volumeName string) error
48-
CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error)
48+
CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (volumeName string, err error)
4949
GetDevicePath(diskId string) string
5050
InstanceID() (string, error)
5151
GetAttachmentDiskPath(instanceID string, diskName string) (string, error)

pkg/volume/cinder/cinder_util.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package cinder
1818

1919
import (
2020
"errors"
21+
"fmt"
2122
"os"
23+
"strings"
2224
"time"
2325

2426
"github.com/golang/glog"
@@ -139,7 +141,26 @@ func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID s
139141
// Cinder works with gigabytes, convert to GiB with rounding up
140142
volSizeGB := int(volume.RoundUpSize(volSizeBytes, 1024*1024*1024))
141143
name := volume.GenerateVolumeName(c.options.ClusterName, c.options.PVName, 255) // Cinder volume name can have up to 255 characters
142-
name, err = cloud.CreateVolume(name, volSizeGB, c.options.CloudTags)
144+
vtype := ""
145+
availability := ""
146+
// Apply ProvisionerParameters (case-insensitive). We leave validation of
147+
// the values to the cloud provider.
148+
for k, v := range c.options.Parameters {
149+
switch strings.ToLower(k) {
150+
case "type":
151+
vtype = v
152+
case "availability":
153+
availability = v
154+
default:
155+
return "", 0, fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName())
156+
}
157+
}
158+
// TODO: implement c.options.ProvisionerSelector parsing
159+
if c.options.Selector != nil {
160+
return "", 0, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on Cinder")
161+
}
162+
163+
name, err = cloud.CreateVolume(name, volSizeGB, vtype, availability, c.options.CloudTags)
143164
if err != nil {
144165
glog.V(2).Infof("Error creating cinder volume: %v", err)
145166
return "", 0, err

0 commit comments

Comments
 (0)