Fix persistent volumes.

Check Spec.PersistentVolumeSource in NFS, RBD, Gluster and iSCSI volume
plugins.
This commit is contained in:
Jan Safranek
2015-06-01 16:34:40 +02:00
committed by markturansky
parent 74b688dc0e
commit d2b4ae4df4
8 changed files with 172 additions and 54 deletions

View File

@@ -74,15 +74,17 @@ func (plugin *RBDPlugin) GetAccessModes() []api.PersistentVolumeAccessMode {
func (plugin *RBDPlugin) NewBuilder(spec *volume.Spec, pod *api.Pod, _ volume.VolumeOptions, mounter mount.Interface) (volume.Builder, error) {
secret := ""
if spec.VolumeSource.RBD.SecretRef != nil {
source := plugin.getRBDVolumeSource(spec)
if source.SecretRef != nil {
kubeClient := plugin.host.GetKubeClient()
if kubeClient == nil {
return nil, fmt.Errorf("Cannot get kube client")
}
secretName, err := kubeClient.Secrets(pod.Namespace).Get(spec.VolumeSource.RBD.SecretRef.Name)
secretName, err := kubeClient.Secrets(pod.Namespace).Get(source.SecretRef.Name)
if err != nil {
glog.Errorf("Couldn't get secret %v/%v", pod.Namespace, spec.VolumeSource.RBD.SecretRef)
glog.Errorf("Couldn't get secret %v/%v", pod.Namespace, source.SecretRef)
return nil, err
}
for name, data := range secretName.Data {
@@ -95,16 +97,25 @@ func (plugin *RBDPlugin) NewBuilder(spec *volume.Spec, pod *api.Pod, _ volume.Vo
return plugin.newBuilderInternal(spec, pod.UID, &RBDUtil{}, mounter, secret)
}
func (plugin *RBDPlugin) getRBDVolumeSource(spec *volume.Spec) *api.RBDVolumeSource {
if spec.VolumeSource.RBD != nil {
return spec.VolumeSource.RBD
} else {
return spec.PersistentVolumeSource.RBD
}
}
func (plugin *RBDPlugin) newBuilderInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface, secret string) (volume.Builder, error) {
pool := spec.VolumeSource.RBD.RBDPool
source := plugin.getRBDVolumeSource(spec)
pool := source.RBDPool
if pool == "" {
pool = "rbd"
}
id := spec.VolumeSource.RBD.RadosUser
id := source.RadosUser
if id == "" {
id = "admin"
}
keyring := spec.VolumeSource.RBD.Keyring
keyring := source.Keyring
if keyring == "" {
keyring = "/etc/ceph/keyring"
}
@@ -112,14 +123,14 @@ func (plugin *RBDPlugin) newBuilderInternal(spec *volume.Spec, podUID types.UID,
return &rbd{
podUID: podUID,
volName: spec.Name,
mon: spec.VolumeSource.RBD.CephMonitors,
image: spec.VolumeSource.RBD.RBDImage,
mon: source.CephMonitors,
image: source.RBDImage,
pool: pool,
id: id,
keyring: keyring,
secret: secret,
fsType: spec.VolumeSource.RBD.FSType,
readOnly: spec.VolumeSource.RBD.ReadOnly,
fsType: source.FSType,
readOnly: source.ReadOnly,
manager: manager,
mounter: mounter,
plugin: plugin,

View File

@@ -65,7 +65,7 @@ func (fake *fakeDiskManager) DetachDisk(disk rbd, mntPath string) error {
return nil
}
func TestPlugin(t *testing.T) {
func doTestPlugin(t *testing, spec *volume.SpecT) {
plugMgr := volume.VolumePluginMgr{}
plugMgr.InitPlugins(ProbeVolumePlugins(), volume.NewFakeVolumeHost("/tmp/fake", nil, nil))
@@ -73,17 +73,7 @@ func TestPlugin(t *testing.T) {
if err != nil {
t.Errorf("Can't find the plugin by name")
}
spec := &api.Volume{
Name: "vol1",
VolumeSource: api.VolumeSource{
RBD: &api.RBDVolumeSource{
CephMonitors: []string{"a", "b"},
RBDImage: "bar",
FSType: "ext4",
},
},
}
builder, err := plug.(*RBDPlugin).newBuilderInternal(volume.NewSpecFromVolume(spec), types.UID("poduid"), &fakeDiskManager{}, &mount.FakeMounter{}, "secrets")
builder, err := plug.(*RBDPlugin).newBuilderInternal(spec, types.UID("poduid"), &fakeDiskManager{}, &mount.FakeMounter{}, "secrets")
if err != nil {
t.Errorf("Failed to make a new Builder: %v", err)
}
@@ -131,3 +121,35 @@ func TestPlugin(t *testing.T) {
t.Errorf("SetUp() failed: %v", err)
}
}
func TestPluginVolume(t *testing.T) {
vol := &api.Volume{
Name: "vol1",
VolumeSource: api.VolumeSource{
RBD: &api.RBDVolumeSource{
CephMonitors: []string{"a", "b"},
RBDImage: "bar",
FSType: "ext4",
},
},
}
doTestPlugin(t, volume.NewSpecFromVolume(vol))
}
func TestPluginPersistentVolume(t *testing.T) {
vol := &api.PersistentVolume{
ObjectMeta: api.ObjectMeta{
Name: "vol1",
},
Spec: api.PersistentVolumeSpec{
PersistentVolumeSource: api.PersistentVolumeSource{
RBD: &api.RBDVolumeSource{
CephMonitors: []string{"a", "b"},
RBDImage: "bar",
FSType: "ext4",
},
},
},
}
doTestPlugin(t, volume.NewSpecFromPersistentVolume(vol))
}