util.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. Copyright 2017 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 flexvolume
  14. import (
  15. "encoding/base64"
  16. "fmt"
  17. "os"
  18. "k8s.io/klog"
  19. "k8s.io/kubernetes/pkg/util/mount"
  20. "k8s.io/kubernetes/pkg/volume"
  21. "k8s.io/kubernetes/pkg/volume/util"
  22. )
  23. func addSecretsToOptions(options map[string]string, spec *volume.Spec, namespace string, driverName string, host volume.VolumeHost) error {
  24. secretName, secretNamespace, err := getSecretNameAndNamespace(spec, namespace)
  25. if err != nil {
  26. return err
  27. }
  28. if len(secretName) == 0 || len(secretNamespace) == 0 {
  29. return nil
  30. }
  31. kubeClient := host.GetKubeClient()
  32. if kubeClient == nil {
  33. return fmt.Errorf("Cannot get kube client")
  34. }
  35. secrets, err := util.GetSecretForPV(secretNamespace, secretName, driverName, host.GetKubeClient())
  36. if err != nil {
  37. err = fmt.Errorf("Couldn't get secret %v/%v err: %v", secretNamespace, secretName, err)
  38. return err
  39. }
  40. for name, data := range secrets {
  41. options[optionKeySecret+"/"+name] = base64.StdEncoding.EncodeToString([]byte(data))
  42. klog.V(1).Infof("found flex volume secret info: %s", name)
  43. }
  44. return nil
  45. }
  46. var errNotFlexVolume = fmt.Errorf("not a flex volume")
  47. func getDriver(spec *volume.Spec) (string, error) {
  48. if spec.Volume != nil && spec.Volume.FlexVolume != nil {
  49. return spec.Volume.FlexVolume.Driver, nil
  50. }
  51. if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.FlexVolume != nil {
  52. return spec.PersistentVolume.Spec.FlexVolume.Driver, nil
  53. }
  54. return "", errNotFlexVolume
  55. }
  56. func getFSType(spec *volume.Spec) (string, error) {
  57. if spec.Volume != nil && spec.Volume.FlexVolume != nil {
  58. return spec.Volume.FlexVolume.FSType, nil
  59. }
  60. if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.FlexVolume != nil {
  61. return spec.PersistentVolume.Spec.FlexVolume.FSType, nil
  62. }
  63. return "", errNotFlexVolume
  64. }
  65. func getSecretNameAndNamespace(spec *volume.Spec, podNamespace string) (string, string, error) {
  66. if spec.Volume != nil && spec.Volume.FlexVolume != nil {
  67. if spec.Volume.FlexVolume.SecretRef == nil {
  68. return "", "", nil
  69. }
  70. return spec.Volume.FlexVolume.SecretRef.Name, podNamespace, nil
  71. }
  72. if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.FlexVolume != nil {
  73. if spec.PersistentVolume.Spec.FlexVolume.SecretRef == nil {
  74. return "", "", nil
  75. }
  76. secretName := spec.PersistentVolume.Spec.FlexVolume.SecretRef.Name
  77. secretNamespace := spec.PersistentVolume.Spec.FlexVolume.SecretRef.Namespace
  78. if len(secretNamespace) == 0 {
  79. secretNamespace = podNamespace
  80. }
  81. return secretName, secretNamespace, nil
  82. }
  83. return "", "", errNotFlexVolume
  84. }
  85. func getReadOnly(spec *volume.Spec) (bool, error) {
  86. if spec.Volume != nil && spec.Volume.FlexVolume != nil {
  87. return spec.Volume.FlexVolume.ReadOnly, nil
  88. }
  89. if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.FlexVolume != nil {
  90. // ReadOnly is specified at the PV level
  91. return spec.ReadOnly, nil
  92. }
  93. return false, errNotFlexVolume
  94. }
  95. func getOptions(spec *volume.Spec) (map[string]string, error) {
  96. if spec.Volume != nil && spec.Volume.FlexVolume != nil {
  97. return spec.Volume.FlexVolume.Options, nil
  98. }
  99. if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.FlexVolume != nil {
  100. return spec.PersistentVolume.Spec.FlexVolume.Options, nil
  101. }
  102. return nil, errNotFlexVolume
  103. }
  104. func prepareForMount(mounter mount.Interface, deviceMountPath string) (bool, error) {
  105. notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
  106. if err != nil {
  107. if os.IsNotExist(err) {
  108. if err := os.MkdirAll(deviceMountPath, 0750); err != nil {
  109. return false, err
  110. }
  111. notMnt = true
  112. } else {
  113. return false, err
  114. }
  115. }
  116. return !notMnt, nil
  117. }
  118. // Mounts the device at the given path.
  119. // It is expected that prepareForMount has been called before.
  120. func doMount(mounter mount.Interface, devicePath, deviceMountPath, fsType string, options []string) error {
  121. err := mounter.Mount(devicePath, deviceMountPath, fsType, options)
  122. if err != nil {
  123. klog.Errorf("Failed to mount the volume at %s, device: %s, error: %s", deviceMountPath, devicePath, err.Error())
  124. return err
  125. }
  126. return nil
  127. }
  128. func isNotMounted(mounter mount.Interface, deviceMountPath string) (bool, error) {
  129. notmnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
  130. if err != nil {
  131. klog.Errorf("Error checking mount point %s, error: %v", deviceMountPath, err)
  132. return false, err
  133. }
  134. return notmnt, nil
  135. }