Skip to content
This repository was archived by the owner on Jun 23, 2020. It is now read-only.

Commit c392a06

Browse files
author
Harvey Lowndes
committed
Storage type used to dispatch custom logic
1 parent d7875c4 commit c392a06

File tree

3 files changed

+68
-15
lines changed

3 files changed

+68
-15
lines changed

pkg/provisioner/block/block.go

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ const (
4141
ociVolumeID = "ociVolumeID"
4242
ociVolumeBackupID = "volume.beta.kubernetes.io/oci-volume-source"
4343
volumePrefixEnvVarName = "OCI_VOLUME_NAME_PREFIX"
44-
fsType = "fsType"
44+
)
45+
46+
var (
47+
validFsTypes = [2]string{"ext3", "ext4"}
4548
)
4649

4750
// blockProvisioner is the internal provisioner for OCI block volumes
@@ -68,12 +71,33 @@ func mapVolumeIDToName(volumeID string) string {
6871
return strings.Split(volumeID, ".")[4]
6972
}
7073

71-
func resolveFSType(options controller.VolumeOptions) string {
72-
fs := "ext4" // default to ext4
73-
if fsType, ok := options.Parameters[fsType]; ok {
74+
func resolveStorageType(options controller.VolumeOptions) string {
75+
t := "blockStorage"
76+
if sType, ok := options.Parameters["type"]; ok {
77+
t = sType
78+
}
79+
return t
80+
}
81+
82+
func resolveFSType(options controller.VolumeOptions) (string, error) {
83+
fs := "ext4"
84+
if fsType, ok := options.Parameters["fsType"]; ok {
7485
fs = fsType
7586
}
76-
return fs
87+
err := validateFSType(fs)
88+
if err != nil {
89+
return "", err
90+
}
91+
return fs, nil
92+
}
93+
94+
func validateFSType(fsType string) error {
95+
for _, f := range validFsTypes {
96+
if f == fsType {
97+
return nil
98+
}
99+
}
100+
return fmt.Errorf("invalid fsType value '%s'", fsType)
77101
}
78102

79103
func roundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 {
@@ -132,7 +156,7 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions, ad *i
132156
return nil, err
133157
}
134158

135-
filesystemType := resolveFSType(options)
159+
storageType := resolveStorageType(options)
136160

137161
region, ok := os.LookupEnv("OCI_SHORT_REGION")
138162
if !ok {
@@ -162,13 +186,22 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions, ad *i
162186
},
163187
PersistentVolumeSource: v1.PersistentVolumeSource{
164188
FlexVolume: &v1.FlexVolumeSource{
165-
Driver: plugin.OCIProvisionerName,
166-
FSType: filesystemType,
189+
Driver: plugin.OCIProvisionerName,
190+
Options: map[string]string{"type": storageType},
167191
},
168192
},
169193
},
170194
}
171195

196+
// FsType only concerns blockStorage volumes
197+
if pv.Spec.PersistentVolumeSource.FlexVolume.Options["type"] == "blockStorage" {
198+
filesystemType, err := resolveFSType(options)
199+
if err != nil {
200+
return nil, err
201+
}
202+
pv.Spec.PersistentVolumeSource.FlexVolume.FSType = filesystemType
203+
}
204+
172205
return pv, nil
173206
}
174207

pkg/provisioner/block/block_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ func TestResolveFSTypeWhenNotConfigured(t *testing.T) {
4848

4949
func TestResolveFSTypeWhenConfigured(t *testing.T) {
5050
// test default fsType of 'ext3' is always returned when configured.
51-
options := controller.VolumeOptions{Parameters: map[string]string{fsType: "ext3"}}
51+
parameters := make(map[string]string)
52+
parameters["fsType"] = "ext3"
53+
options := controller.VolumeOptions{Parameters: parameters}
5254
fst := resolveFSType(options)
5355
if fst != "ext3" {
5456
t.Fatalf("Unexpected filesystem type: '%s'.", fst)

pkg/provisioner/core/provisioner.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1
8787
nodeLister: nodeInformer.Lister(),
8888
nodeListerSynced: nodeInformer.Informer().HasSynced,
8989
storageClassProvisioners: map[string]plugin.ProvisionerPlugin{
90-
"oci": blockProvisioner,
91-
"oci-ext3": blockProvisioner,
90+
"blockStorage": blockProvisioner,
9291
},
9392
}
9493
}
@@ -109,16 +108,29 @@ func mapAvailabilityDomainToFailureDomain(AD string) string {
109108
return parts[len(parts)-1]
110109
}
111110

111+
func resolveStorageType(options controller.VolumeOptions) string {
112+
return getStorageTypeWithDefault(options.Parameters["type"])
113+
}
114+
115+
func getStorageTypeWithDefault(sType string) string {
116+
t := "blockStorage"
117+
if sType != "" {
118+
t = sType
119+
}
120+
return t
121+
}
122+
112123
// Provision creates a storage asset and returns a PV object representing it.
113124
func (p *OCIProvisioner) Provision(options controller.VolumeOptions) (*v1.PersistentVolume, error) {
114125
availabilityDomainName, availabilityDomain, err := p.chooseAvailabilityDomain(options.PVC)
115126
if err != nil {
116127
return nil, err
117128
}
118129

119-
provisioner, ok := p.storageClassProvisioners[*options.PVC.Spec.StorageClassName]
130+
storageType := resolveStorageType(options)
131+
provisioner, ok := p.storageClassProvisioners[storageType]
120132
if !ok {
121-
return nil, fmt.Errorf("Storage class '%s' not supported", *options.PVC.Spec.StorageClassName)
133+
return nil, fmt.Errorf("Storage type '%s' not supported", storageType)
122134
}
123135

124136
persistentVolume, err := provisioner.Provision(options, availabilityDomain)
@@ -142,9 +154,15 @@ func (p *OCIProvisioner) Delete(volume *v1.PersistentVolume) error {
142154
return &controller.IgnoredError{Reason: "identity annotation on PV does not match ours"}
143155
}
144156

145-
provisioner, ok := p.storageClassProvisioners[volume.Spec.StorageClassName]
157+
storageClass, err := p.kubeClient.Storage().StorageClasses().Get(volume.Spec.StorageClassName, metav1.GetOptions{})
158+
if err != nil {
159+
return fmt.Errorf("Could not find storage class with the associated name '%s'", volume.Spec.StorageClassName)
160+
}
161+
162+
storageType := getStorageTypeWithDefault(storageClass.Parameters["type"])
163+
provisioner, ok := p.storageClassProvisioners[storageType]
146164
if !ok {
147-
return fmt.Errorf("Storage class '%s' not supported", volume.Spec.StorageClassName)
165+
return fmt.Errorf("Could not find a provisioner for storageType '%s'", storageType)
148166
}
149167

150168
return provisioner.Delete(volume)

0 commit comments

Comments
 (0)