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

Commit 18ecaa5

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

File tree

3 files changed

+95
-17
lines changed

3 files changed

+95
-17
lines changed

pkg/provisioner/block/block.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ const (
4141
ociVolumeID = "ociVolumeID"
4242
ociVolumeBackupID = "volume.beta.kubernetes.io/oci-volume-source"
4343
volumePrefixEnvVarName = "OCI_VOLUME_NAME_PREFIX"
44-
fsType = "fsType"
44+
45+
typeParameter = "type"
46+
fsTypeParameter = "fsType"
47+
blockStorageType = "blockStorage"
48+
defaultType = blockStorageType
49+
defaultFsType = "ext4"
50+
)
51+
52+
var (
53+
validFsTypes = [2]string{"ext3", "ext4"}
4554
)
4655

4756
// blockProvisioner is the internal provisioner for OCI block volumes
@@ -68,12 +77,33 @@ func mapVolumeIDToName(volumeID string) string {
6877
return strings.Split(volumeID, ".")[4]
6978
}
7079

71-
func resolveFSType(options controller.VolumeOptions) string {
72-
fs := "ext4" // default to ext4
73-
if fsType, ok := options.Parameters[fsType]; ok {
80+
func resolveStorageType(options controller.VolumeOptions) string {
81+
t := defaultType
82+
if sType, ok := options.Parameters[typeParameter]; ok {
83+
t = sType
84+
}
85+
return t
86+
}
87+
88+
func resolveFSType(options controller.VolumeOptions) (string, error) {
89+
fs := defaultFsType
90+
if fsType, ok := options.Parameters[fsTypeParameter]; ok {
7491
fs = fsType
7592
}
76-
return fs
93+
err := validateFSType(fs)
94+
if err != nil {
95+
return "", err
96+
}
97+
return fs, nil
98+
}
99+
100+
func validateFSType(fsType string) error {
101+
for _, f := range validFsTypes {
102+
if f == fsType {
103+
return nil
104+
}
105+
}
106+
return fmt.Errorf("invalid fsType value '%s'", fsType)
77107
}
78108

79109
func roundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 {
@@ -132,7 +162,7 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions, ad *i
132162
return nil, err
133163
}
134164

135-
filesystemType := resolveFSType(options)
165+
storageType := resolveStorageType(options)
136166

137167
region, ok := os.LookupEnv("OCI_SHORT_REGION")
138168
if !ok {
@@ -162,13 +192,22 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions, ad *i
162192
},
163193
PersistentVolumeSource: v1.PersistentVolumeSource{
164194
FlexVolume: &v1.FlexVolumeSource{
165-
Driver: plugin.OCIProvisionerName,
166-
FSType: filesystemType,
195+
Driver: plugin.OCIProvisionerName,
196+
Options: map[string]string{typeParameter: storageType},
167197
},
168198
},
169199
},
170200
}
171201

202+
// FsType only concerns blockStorage volumes
203+
if pv.Spec.PersistentVolumeSource.FlexVolume.Options[typeParameter] == "blockStorage" {
204+
filesystemType, err := resolveFSType(options)
205+
if err != nil {
206+
return nil, err
207+
}
208+
pv.Spec.PersistentVolumeSource.FlexVolume.FSType = filesystemType
209+
}
210+
172211
return pv, nil
173212
}
174213

pkg/provisioner/block/block_test.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,35 @@ var (
3737
defaultAD = identity.AvailabilityDomain{Name: common.String("PHX-AD-1"), CompartmentId: common.String("ocid1.compartment.oc1")}
3838
)
3939

40+
func TestValidateFsType(t *testing.T) {
41+
err := validateFSType("ext3")
42+
if err != nil {
43+
t.Fatalf("Unexpected validation error for fsType: '%s'", "ext3")
44+
}
45+
err = validateFSType("ext4")
46+
if err != nil {
47+
t.Fatalf("Unexpected validation error for fsType: '%s'", "ext4")
48+
}
49+
err = validateFSType("abc3")
50+
if err == nil {
51+
t.Fatalf("Unexpected validation pass for fsType: '%s'", "abc3")
52+
}
53+
}
54+
4055
func TestResolveFSTypeWhenNotConfigured(t *testing.T) {
4156
options := controller.VolumeOptions{Parameters: make(map[string]string)}
4257
// test default fsType of 'ext4' is always returned.
43-
fst := resolveFSType(options)
58+
fst, _ := resolveFSType(options)
4459
if fst != "ext4" {
4560
t.Fatalf("Unexpected filesystem type: '%s'.", fst)
4661
}
4762
}
4863

4964
func TestResolveFSTypeWhenConfigured(t *testing.T) {
5065
// test default fsType of 'ext3' is always returned when configured.
51-
options := controller.VolumeOptions{Parameters: map[string]string{fsType: "ext3"}}
52-
fst := resolveFSType(options)
66+
parameters := map[string]string{"fsType": "ext3"}
67+
options := controller.VolumeOptions{Parameters: parameters}
68+
fst, _ := resolveFSType(options)
5369
if fst != "ext3" {
5470
t.Fatalf("Unexpected filesystem type: '%s'.", fst)
5571
}

pkg/provisioner/core/provisioner.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ const (
4242
ociAvailabilityDomain = "ociAvailabilityDomain"
4343
ociCompartment = "ociCompartment"
4444
configFilePath = "/etc/oci/config.yaml"
45+
typeParameter = "type"
46+
fsTypeParameter = "fsType"
47+
blockStorageType = "blockStorage"
48+
defaultType = blockStorageType
49+
defaultFsType = "ext4"
4550
)
4651

4752
// OCIProvisioner is a dynamic volume provisioner that satisfies
@@ -87,8 +92,7 @@ func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1
8792
nodeLister: nodeInformer.Lister(),
8893
nodeListerSynced: nodeInformer.Informer().HasSynced,
8994
storageClassProvisioners: map[string]plugin.ProvisionerPlugin{
90-
"oci": blockProvisioner,
91-
"oci-ext3": blockProvisioner,
95+
defaultType: blockProvisioner,
9296
},
9397
}
9498
}
@@ -109,16 +113,29 @@ func mapAvailabilityDomainToFailureDomain(AD string) string {
109113
return parts[len(parts)-1]
110114
}
111115

116+
func resolveStorageType(options controller.VolumeOptions) string {
117+
return getStorageTypeWithDefault(options.Parameters[typeParameter])
118+
}
119+
120+
func getStorageTypeWithDefault(sType string) string {
121+
t := defaultType
122+
if sType != "" {
123+
t = sType
124+
}
125+
return t
126+
}
127+
112128
// Provision creates a storage asset and returns a PV object representing it.
113129
func (p *OCIProvisioner) Provision(options controller.VolumeOptions) (*v1.PersistentVolume, error) {
114130
availabilityDomainName, availabilityDomain, err := p.chooseAvailabilityDomain(options.PVC)
115131
if err != nil {
116132
return nil, err
117133
}
118134

119-
provisioner, ok := p.storageClassProvisioners[*options.PVC.Spec.StorageClassName]
135+
storageType := resolveStorageType(options)
136+
provisioner, ok := p.storageClassProvisioners[storageType]
120137
if !ok {
121-
return nil, fmt.Errorf("Storage class '%s' not supported", *options.PVC.Spec.StorageClassName)
138+
return nil, fmt.Errorf("Storage type '%s' not supported", storageType)
122139
}
123140

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

145-
provisioner, ok := p.storageClassProvisioners[volume.Spec.StorageClassName]
162+
storageClass, err := p.kubeClient.Storage().StorageClasses().Get(volume.Spec.StorageClassName, metav1.GetOptions{})
163+
if err != nil {
164+
return fmt.Errorf("Could not find storage class '%q'", volume.Spec.StorageClassName)
165+
}
166+
167+
storageType := getStorageTypeWithDefault(storageClass.Parameters[typeParameter])
168+
provisioner, ok := p.storageClassProvisioners[storageType]
146169
if !ok {
147-
return fmt.Errorf("Storage class '%s' not supported", volume.Spec.StorageClassName)
170+
return fmt.Errorf("Could not find a provisioner for storageType '%s'", storageType)
148171
}
149172

150173
return provisioner.Delete(volume)

0 commit comments

Comments
 (0)