@@ -3,10 +3,9 @@ package provisioner
33import (
44 "context"
55 "fmt"
6+ "slices"
67 "strconv"
78
8- "k8s.io/klog/v2"
9-
109 "github.com/ccremer/kubernetes-zfs-provisioner/pkg/zfs"
1110
1211 v1 "k8s.io/api/core/v1"
@@ -24,8 +23,9 @@ func (p *ZFSProvisioner) Provision(ctx context.Context, options controller.Provi
2423 datasetPath := fmt .Sprintf ("%s/%s" , parameters .ParentDataset , options .PVName )
2524 properties := make (map [string ]string )
2625
27- if parameters .NFS != nil {
28- properties ["sharenfs" ] = parameters .NFS .ShareProperties
26+ useHostPath := canUseHostPath (parameters , options )
27+ if ! useHostPath {
28+ properties [ShareNfsProperty ] = parameters .NFSShareProperties
2929 }
3030
3131 var reclaimPolicy v1.PersistentVolumeReclaimPolicy
@@ -73,28 +73,44 @@ func (p *ZFSProvisioner) Provision(ctx context.Context, options controller.Provi
7373 },
7474 Spec : v1.PersistentVolumeSpec {
7575 PersistentVolumeReclaimPolicy : reclaimPolicy ,
76- AccessModes : []v1. PersistentVolumeAccessMode { v1 . ReadWriteMany , v1 . ReadOnlyMany , v1 . ReadWriteOnce } ,
76+ AccessModes : createAccessModes ( options , useHostPath ) ,
7777 Capacity : v1.ResourceList {
7878 v1 .ResourceStorage : options .PVC .Spec .Resources .Requests [v1 .ResourceStorage ],
7979 },
80- PersistentVolumeSource : createVolumeSource (parameters , dataset ),
81- NodeAffinity : createNodeAffinity (parameters ),
80+ PersistentVolumeSource : createVolumeSource (parameters , dataset , useHostPath ),
81+ NodeAffinity : createNodeAffinity (parameters , useHostPath ),
8282 },
8383 }
8484 return pv , controller .ProvisioningFinished , nil
8585}
8686
87- func createVolumeSource (parameters * ZFSStorageClassParameters , dataset * zfs.Dataset ) v1.PersistentVolumeSource {
88- if parameters .NFS != nil {
89- return v1.PersistentVolumeSource {
90- NFS : & v1.NFSVolumeSource {
91- Server : parameters .Hostname ,
92- Path : dataset .Mountpoint ,
93- ReadOnly : false ,
94- },
87+ func canUseHostPath (parameters * ZFSStorageClassParameters , options controller.ProvisionOptions ) bool {
88+ switch parameters .Type {
89+ case Nfs :
90+ return false
91+ case HostPath :
92+ return true
93+ case Auto :
94+ if ! slices .Contains (options .PVC .Spec .AccessModes , v1 .ReadOnlyMany ) && ! slices .Contains (options .PVC .Spec .AccessModes , v1 .ReadWriteMany ) {
95+ return true
9596 }
9697 }
97- if parameters .HostPath != nil {
98+ return false
99+ }
100+
101+ func createAccessModes (options controller.ProvisionOptions , useHostPath bool ) []v1.PersistentVolumeAccessMode {
102+ if slices .Contains (options .PVC .Spec .AccessModes , v1 .ReadWriteOncePod ) {
103+ return []v1.PersistentVolumeAccessMode {v1 .ReadWriteOncePod }
104+ }
105+ accessModes := []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }
106+ if ! useHostPath {
107+ accessModes = append (accessModes , v1 .ReadOnlyMany , v1 .ReadWriteMany )
108+ }
109+ return accessModes
110+ }
111+
112+ func createVolumeSource (parameters * ZFSStorageClassParameters , dataset * zfs.Dataset , useHostPath bool ) v1.PersistentVolumeSource {
113+ if useHostPath {
98114 hostPathType := v1 .HostPathDirectory
99115 return v1.PersistentVolumeSource {
100116 HostPath : & v1.HostPathVolumeSource {
@@ -103,27 +119,34 @@ func createVolumeSource(parameters *ZFSStorageClassParameters, dataset *zfs.Data
103119 },
104120 }
105121 }
106- klog .Exitf ("Programmer error: Missing implementation for volume source: %v" , parameters )
107- return v1.PersistentVolumeSource {}
122+
123+ return v1.PersistentVolumeSource {
124+ NFS : & v1.NFSVolumeSource {
125+ Server : parameters .Hostname ,
126+ Path : dataset .Mountpoint ,
127+ ReadOnly : false ,
128+ },
129+ }
108130}
109131
110- func createNodeAffinity (parameters * ZFSStorageClassParameters ) * v1.VolumeNodeAffinity {
111- if parameters .HostPath != nil {
112- node := parameters .HostPath .NodeName
113- if node == "" {
114- node = parameters .Hostname
115- }
116- return & v1.VolumeNodeAffinity {Required : & v1.NodeSelector {NodeSelectorTerms : []v1.NodeSelectorTerm {
117- {
118- MatchExpressions : []v1.NodeSelectorRequirement {
119- {
120- Values : []string {node },
121- Operator : v1 .NodeSelectorOpIn ,
122- Key : v1 .LabelHostname ,
123- },
132+ func createNodeAffinity (parameters * ZFSStorageClassParameters , useHostPath bool ) * v1.VolumeNodeAffinity {
133+ if ! useHostPath {
134+ return nil
135+ }
136+
137+ node := parameters .HostPathNodeName
138+ if node == "" {
139+ node = parameters .Hostname
140+ }
141+ return & v1.VolumeNodeAffinity {Required : & v1.NodeSelector {NodeSelectorTerms : []v1.NodeSelectorTerm {
142+ {
143+ MatchExpressions : []v1.NodeSelectorRequirement {
144+ {
145+ Values : []string {node },
146+ Operator : v1 .NodeSelectorOpIn ,
147+ Key : v1 .LabelHostname ,
124148 },
125149 },
126- }}}
127- }
128- return nil
150+ },
151+ }}}
129152}
0 commit comments