github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/edged/volume_host.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 16 @CHANGELOG 17 KubeEdge Authors: To create mini-kubelet for edge deployment scenario, 18 This file is derived from K8S Kubelet code with reduced set of methods 19 Changes done are 20 1. This file is derived from kubernetes/pkg/kubelet/volume_host.go 21 edgedVolumeHost is derived from kubeletVolumeHost but pruned sections that we don't need 22 and made some variant. 23 */ 24 25 package edged 26 27 import ( 28 "fmt" 29 "net" 30 "os" 31 32 authenticationv1 "k8s.io/api/authentication/v1" 33 api "k8s.io/api/core/v1" 34 "k8s.io/apimachinery/pkg/types" 35 "k8s.io/client-go/informers" 36 "k8s.io/client-go/kubernetes" 37 storagelisters "k8s.io/client-go/listers/storage/v1beta1" 38 "k8s.io/client-go/tools/cache" 39 recordtools "k8s.io/client-go/tools/record" 40 cloudprovider "k8s.io/cloud-provider" 41 "k8s.io/klog" 42 "k8s.io/kubernetes/pkg/volume" 43 "k8s.io/kubernetes/pkg/volume/util/hostutil" 44 "k8s.io/kubernetes/pkg/volume/util/subpath" 45 utilexec "k8s.io/utils/exec" 46 "k8s.io/utils/mount" 47 ) 48 49 // NewInitializedVolumePluginMgr returns a new instance of volume.VolumePluginMgr 50 func NewInitializedVolumePluginMgr( 51 edge *edged, 52 plugins []volume.VolumePlugin) *volume.VolumePluginMgr { 53 evh := &edgedVolumeHost{ 54 edge: edge, 55 volumePluginMgr: volume.VolumePluginMgr{}, 56 } 57 58 if err := evh.volumePluginMgr.InitPlugins(plugins, nil, evh); err != nil { 59 klog.Errorf("Could not initialize volume plugins for KubeletVolumePluginMgr: %v", err) 60 os.Exit(1) 61 } 62 63 return &evh.volumePluginMgr 64 } 65 66 // Compile-time check to ensure kubeletVolumeHost implements the VolumeHost interface 67 var _ volume.VolumeHost = &edgedVolumeHost{} 68 69 func (evh *edgedVolumeHost) GetSecretStore() cache.Store { 70 return evh.edge.secretStore 71 } 72 73 func (evh *edgedVolumeHost) GetConfigMapStore() cache.Store { 74 return evh.edge.configMapStore 75 } 76 77 func (evh *edgedVolumeHost) GetPluginDir(pluginName string) string { 78 return evh.edge.getPluginDir(pluginName) 79 } 80 81 type edgedVolumeHost struct { 82 edge *edged 83 volumePluginMgr volume.VolumePluginMgr 84 } 85 86 func (evh *edgedVolumeHost) GetPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string { 87 return evh.edge.getPodVolumeDir(podUID, pluginName, volumeName) 88 } 89 90 func (evh *edgedVolumeHost) GetPodPluginDir(podUID types.UID, pluginName string) string { 91 return evh.edge.getPodPluginDir(podUID, pluginName) 92 } 93 94 func (evh *edgedVolumeHost) GetKubeClient() kubernetes.Interface { 95 // TODO: we need figure out a way to return metaClient 96 // return evh.edge.metaClient 97 return evh.edge.kubeClient 98 } 99 100 func (evh *edgedVolumeHost) NewWrapperMounter( 101 volName string, 102 spec volume.Spec, 103 pod *api.Pod, 104 opts volume.VolumeOptions) (volume.Mounter, error) { 105 // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}" 106 wrapperVolumeName := "wrapped_" + volName 107 if spec.Volume != nil { 108 spec.Volume.Name = wrapperVolumeName 109 } 110 111 return evh.edge.newVolumeMounterFromPlugins(&spec, pod, opts) 112 } 113 114 func (evh *edgedVolumeHost) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { 115 // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}" 116 wrapperVolumeName := "wrapped_" + volName 117 if spec.Volume != nil { 118 spec.Volume.Name = wrapperVolumeName 119 } 120 121 plugin, err := evh.edge.volumePluginMgr.FindPluginBySpec(&spec) 122 if err != nil { 123 return nil, err 124 } 125 126 return plugin.NewUnmounter(spec.Name(), podUID) 127 } 128 129 // Below is part of k8s.io/kubernetes/pkg/volume.VolumeHost interface. 130 func (evh *edgedVolumeHost) GetMounter(pluginName string) mount.Interface { return evh.edge.mounter } 131 func (evh *edgedVolumeHost) GetHostName() string { return evh.edge.hostname } 132 func (evh *edgedVolumeHost) GetCloudProvider() cloudprovider.Interface { return nil } 133 func (evh *edgedVolumeHost) GetConfigMapFunc() func(namespace, name string) (*api.ConfigMap, error) { 134 return func(namespace, name string) (*api.ConfigMap, error) { 135 return evh.edge.metaClient.ConfigMaps(namespace).Get(name) 136 } 137 } 138 func (evh *edgedVolumeHost) GetExec(pluginName string) utilexec.Interface { return nil } 139 func (evh *edgedVolumeHost) GetHostIP() (net.IP, error) { return nil, nil } 140 func (evh *edgedVolumeHost) GetNodeAllocatable() (api.ResourceList, error) { return nil, nil } 141 func (evh *edgedVolumeHost) GetNodeLabels() (map[string]string, error) { return nil, nil } 142 func (evh *edgedVolumeHost) GetNodeName() types.NodeName { return types.NodeName(evh.edge.nodeName) } 143 func (evh *edgedVolumeHost) GetPodVolumeDeviceDir(podUID types.UID, pluginName string) string { 144 return "" 145 } 146 func (evh *edgedVolumeHost) GetSecretFunc() func(namespace, name string) (*api.Secret, error) { 147 return func(namespace, name string) (*api.Secret, error) { 148 return evh.edge.metaClient.Secrets(namespace).Get(name) 149 } 150 } 151 func (evh *edgedVolumeHost) GetVolumeDevicePluginDir(pluginName string) string { return "" } 152 153 func (evh *edgedVolumeHost) DeleteServiceAccountTokenFunc() func(podUID types.UID) { 154 return func(types.UID) {} 155 } 156 157 func (evh *edgedVolumeHost) GetEventRecorder() recordtools.EventRecorder { 158 return evh.edge.recorder 159 } 160 161 func (evh *edgedVolumeHost) GetPodsDir() string { 162 return evh.edge.getPodsDir() 163 } 164 165 func (evh *edgedVolumeHost) GetServiceAccountTokenFunc() func(namespace, name string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) { 166 return func(_, _ string, _ *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) { 167 return nil, fmt.Errorf("GetServiceAccountToken unsupported") 168 } 169 } 170 171 func (evh *edgedVolumeHost) GetSubpather() subpath.Interface { 172 // No volume plugin needs Subpaths 173 return subpath.New(evh.edge.mounter) 174 } 175 176 func (evh *edgedVolumeHost) GetHostUtil() hostutil.HostUtils { 177 return evh.edge.hostUtil 178 } 179 180 // TODO: Evaluate the funcs releated to csi 181 func (evh *edgedVolumeHost) SetKubeletError(err error) { 182 } 183 184 func (evh *edgedVolumeHost) GetInformerFactory() informers.SharedInformerFactory { 185 const resyncPeriod = 0 186 return informers.NewSharedInformerFactory(evh.edge.kubeClient, resyncPeriod) 187 } 188 189 func (evh *edgedVolumeHost) CSIDriverLister() storagelisters.CSIDriverLister { 190 return nil 191 } 192 193 func (evh *edgedVolumeHost) CSIDriversSynced() cache.InformerSynced { 194 return nil 195 } 196 197 // WaitForCacheSync is a helper function that waits for cache sync for CSIDriverLister 198 func (evh *edgedVolumeHost) WaitForCacheSync() error { 199 return nil 200 }