1
16
17 package app
18
19 import (
20
21
22
23
24 "fmt"
25
26 "k8s.io/klog/v2"
27
28
29 _ "k8s.io/kubernetes/pkg/cloudprovider/providers"
30
31 "k8s.io/kubernetes/pkg/volume"
32 "k8s.io/kubernetes/pkg/volume/csi"
33 "k8s.io/kubernetes/pkg/volume/fc"
34 "k8s.io/kubernetes/pkg/volume/flexvolume"
35 "k8s.io/kubernetes/pkg/volume/hostpath"
36 "k8s.io/kubernetes/pkg/volume/iscsi"
37 "k8s.io/kubernetes/pkg/volume/local"
38 "k8s.io/kubernetes/pkg/volume/nfs"
39 volumeutil "k8s.io/kubernetes/pkg/volume/util"
40
41 utilfeature "k8s.io/apiserver/pkg/util/feature"
42 persistentvolumeconfig "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/config"
43 "k8s.io/utils/exec"
44 )
45
46
47
48
49
50 func ProbeAttachableVolumePlugins(logger klog.Logger) ([]volume.VolumePlugin, error) {
51 var err error
52 allPlugins := []volume.VolumePlugin{}
53 allPlugins, err = appendAttachableLegacyProviderVolumes(logger, allPlugins, utilfeature.DefaultFeatureGate)
54 if err != nil {
55 return allPlugins, err
56 }
57 allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
58 allPlugins = append(allPlugins, iscsi.ProbeVolumePlugins()...)
59 allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
60 return allPlugins, nil
61 }
62
63
64
65
66 func GetDynamicPluginProber(config persistentvolumeconfig.VolumeConfiguration) volume.DynamicPluginProber {
67 return flexvolume.GetDynamicPluginProber(config.FlexVolumePluginDir, exec.New() )
68 }
69
70
71 func ProbeExpandableVolumePlugins(logger klog.Logger, config persistentvolumeconfig.VolumeConfiguration) ([]volume.VolumePlugin, error) {
72 var err error
73 allPlugins := []volume.VolumePlugin{}
74 allPlugins, err = appendExpandableLegacyProviderVolumes(logger, allPlugins, utilfeature.DefaultFeatureGate)
75 if err != nil {
76 return allPlugins, err
77 }
78 allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
79 return allPlugins, nil
80 }
81
82
83
84
85 func ProbeControllerVolumePlugins(logger klog.Logger, config persistentvolumeconfig.VolumeConfiguration) ([]volume.VolumePlugin, error) {
86 allPlugins := []volume.VolumePlugin{}
87
88
89
90
91
92
93
94
95
96
97 hostPathConfig := volume.VolumeConfig{
98 RecyclerMinimumTimeout: int(config.PersistentVolumeRecyclerConfiguration.MinimumTimeoutHostPath),
99 RecyclerTimeoutIncrement: int(config.PersistentVolumeRecyclerConfiguration.IncrementTimeoutHostPath),
100 RecyclerPodTemplate: volume.NewPersistentVolumeRecyclerPodTemplate(),
101 ProvisioningEnabled: config.EnableHostPathProvisioning,
102 }
103 if err := AttemptToLoadRecycler(config.PersistentVolumeRecyclerConfiguration.PodTemplateFilePathHostPath, &hostPathConfig); err != nil {
104 logger.Error(err, "Could not create hostpath recycler pod from file", "path", config.PersistentVolumeRecyclerConfiguration.PodTemplateFilePathHostPath)
105 klog.FlushAndExit(klog.ExitFlushTimeout, 1)
106 }
107 allPlugins = append(allPlugins, hostpath.ProbeVolumePlugins(hostPathConfig)...)
108
109 nfsConfig := volume.VolumeConfig{
110 RecyclerMinimumTimeout: int(config.PersistentVolumeRecyclerConfiguration.MinimumTimeoutNFS),
111 RecyclerTimeoutIncrement: int(config.PersistentVolumeRecyclerConfiguration.IncrementTimeoutNFS),
112 RecyclerPodTemplate: volume.NewPersistentVolumeRecyclerPodTemplate(),
113 }
114 if err := AttemptToLoadRecycler(config.PersistentVolumeRecyclerConfiguration.PodTemplateFilePathNFS, &nfsConfig); err != nil {
115 logger.Error(err, "Could not create NFS recycler pod from file", "path", config.PersistentVolumeRecyclerConfiguration.PodTemplateFilePathNFS)
116 klog.FlushAndExit(klog.ExitFlushTimeout, 1)
117 }
118 allPlugins = append(allPlugins, nfs.ProbeVolumePlugins(nfsConfig)...)
119
120 var err error
121 allPlugins, err = appendExpandableLegacyProviderVolumes(logger, allPlugins, utilfeature.DefaultFeatureGate)
122 if err != nil {
123 return allPlugins, err
124 }
125
126 allPlugins = append(allPlugins, local.ProbeVolumePlugins()...)
127 allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
128
129 return allPlugins, nil
130 }
131
132
133
134
135 func AttemptToLoadRecycler(path string, config *volume.VolumeConfig) error {
136 if path != "" {
137 recyclerPod, err := volumeutil.LoadPodFromFile(path)
138 if err != nil {
139 return err
140 }
141 if err = volume.ValidateRecyclerPodTemplate(recyclerPod); err != nil {
142 return fmt.Errorf("pod specification (%v): %v", path, err)
143 }
144 config.RecyclerPodTemplate = recyclerPod
145 }
146 return nil
147 }
148
View as plain text