volume_host.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package kubelet
  14. import (
  15. "fmt"
  16. "net"
  17. "k8s.io/kubernetes/pkg/api"
  18. "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
  19. "k8s.io/kubernetes/pkg/cloudprovider"
  20. "k8s.io/kubernetes/pkg/types"
  21. "k8s.io/kubernetes/pkg/util/io"
  22. "k8s.io/kubernetes/pkg/util/mount"
  23. "k8s.io/kubernetes/pkg/volume"
  24. )
  25. // NewInitializedVolumePluginMgr returns a new instance of
  26. // volume.VolumePluginMgr initialized with kubelets implementation of the
  27. // volume.VolumeHost interface.
  28. //
  29. // kubelet - used by VolumeHost methods to expose kubelet specific parameters
  30. // plugins - used to initialize volumePluginMgr
  31. func NewInitializedVolumePluginMgr(
  32. kubelet *Kubelet,
  33. plugins []volume.VolumePlugin) (*volume.VolumePluginMgr, error) {
  34. kvh := &kubeletVolumeHost{
  35. kubelet: kubelet,
  36. volumePluginMgr: volume.VolumePluginMgr{},
  37. }
  38. if err := kvh.volumePluginMgr.InitPlugins(plugins, kvh); err != nil {
  39. return nil, fmt.Errorf(
  40. "Could not initialize volume plugins for KubeletVolumePluginMgr: %v",
  41. err)
  42. }
  43. return &kvh.volumePluginMgr, nil
  44. }
  45. // Compile-time check to ensure kubeletVolumeHost implements the VolumeHost interface
  46. var _ volume.VolumeHost = &kubeletVolumeHost{}
  47. func (kvh *kubeletVolumeHost) GetPluginDir(pluginName string) string {
  48. return kvh.kubelet.getPluginDir(pluginName)
  49. }
  50. type kubeletVolumeHost struct {
  51. kubelet *Kubelet
  52. volumePluginMgr volume.VolumePluginMgr
  53. }
  54. func (kvh *kubeletVolumeHost) GetPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string {
  55. return kvh.kubelet.getPodVolumeDir(podUID, pluginName, volumeName)
  56. }
  57. func (kvh *kubeletVolumeHost) GetPodPluginDir(podUID types.UID, pluginName string) string {
  58. return kvh.kubelet.getPodPluginDir(podUID, pluginName)
  59. }
  60. func (kvh *kubeletVolumeHost) GetKubeClient() internalclientset.Interface {
  61. return kvh.kubelet.kubeClient
  62. }
  63. func (kvh *kubeletVolumeHost) NewWrapperMounter(
  64. volName string,
  65. spec volume.Spec,
  66. pod *api.Pod,
  67. opts volume.VolumeOptions) (volume.Mounter, error) {
  68. // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}"
  69. wrapperVolumeName := "wrapped_" + volName
  70. if spec.Volume != nil {
  71. spec.Volume.Name = wrapperVolumeName
  72. }
  73. return kvh.kubelet.newVolumeMounterFromPlugins(&spec, pod, opts)
  74. }
  75. func (kvh *kubeletVolumeHost) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) {
  76. // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}"
  77. wrapperVolumeName := "wrapped_" + volName
  78. if spec.Volume != nil {
  79. spec.Volume.Name = wrapperVolumeName
  80. }
  81. plugin, err := kvh.kubelet.volumePluginMgr.FindPluginBySpec(&spec)
  82. if err != nil {
  83. return nil, err
  84. }
  85. return plugin.NewUnmounter(spec.Name(), podUID)
  86. }
  87. func (kvh *kubeletVolumeHost) GetCloudProvider() cloudprovider.Interface {
  88. return kvh.kubelet.cloud
  89. }
  90. func (kvh *kubeletVolumeHost) GetMounter() mount.Interface {
  91. return kvh.kubelet.mounter
  92. }
  93. func (kvh *kubeletVolumeHost) GetWriter() io.Writer {
  94. return kvh.kubelet.writer
  95. }
  96. func (kvh *kubeletVolumeHost) GetHostName() string {
  97. return kvh.kubelet.hostname
  98. }
  99. func (kvh *kubeletVolumeHost) GetHostIP() (net.IP, error) {
  100. return kvh.kubelet.GetHostIP()
  101. }
  102. func (kvh *kubeletVolumeHost) GetNodeAllocatable() (api.ResourceList, error) {
  103. node, err := kvh.kubelet.getNodeAnyWay()
  104. if err != nil {
  105. return nil, fmt.Errorf("error retrieving node: %v", err)
  106. }
  107. return node.Status.Allocatable, nil
  108. }
  109. func (kvh *kubeletVolumeHost) GetRootContext() string {
  110. rootContext, err := kvh.kubelet.getRootDirContext()
  111. if err != nil {
  112. return ""
  113. }
  114. return rootContext
  115. }