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  }