func TestPersistentClaimReadOnlyFlag(t *testing.T) { tmpDir, err := utiltesting.MkTmpdir("iscsi_test") if err != nil { t.Fatalf("error creating temp dir: %v", err) } defer os.RemoveAll(tmpDir) pv := &api.PersistentVolume{ ObjectMeta: api.ObjectMeta{ Name: "pvA", }, Spec: api.PersistentVolumeSpec{ PersistentVolumeSource: api.PersistentVolumeSource{ ISCSI: &api.ISCSIVolumeSource{ TargetPortal: "127.0.0.1:3260", IQN: "iqn.2014-12.server:storage.target01", FSType: "ext4", Lun: 0, }, }, ClaimRef: &api.ObjectReference{ Name: "claimA", }, }, } claim := &api.PersistentVolumeClaim{ ObjectMeta: api.ObjectMeta{ Name: "claimA", Namespace: "nsA", }, Spec: api.PersistentVolumeClaimSpec{ VolumeName: "pvA", }, Status: api.PersistentVolumeClaimStatus{ Phase: api.ClaimBound, }, } client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil, "" /* rootContext */)) plug, _ := plugMgr.FindPluginByName(iscsiPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes spec := volume.NewSpecFromPersistentVolume(pv, true) pod := &api.Pod{ObjectMeta: api.ObjectMeta{UID: types.UID("poduid")}} mounter, _ := plug.NewMounter(spec, pod, volume.VolumeOptions{}) if !mounter.GetAttributes().ReadOnly { t.Errorf("Expected true for mounter.IsReadOnly") } }
func TestPersistentClaimReadOnlyFlag(t *testing.T) { pv := &api.PersistentVolume{ ObjectMeta: api.ObjectMeta{ Name: "pvA", }, Spec: api.PersistentVolumeSpec{ PersistentVolumeSource: api.PersistentVolumeSource{ GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, }, ClaimRef: &api.ObjectReference{ Name: "claimA", }, }, } claim := &api.PersistentVolumeClaim{ ObjectMeta: api.ObjectMeta{ Name: "claimA", Namespace: "nsA", }, Spec: api.PersistentVolumeClaimSpec{ VolumeName: "pvA", }, Status: api.PersistentVolumeClaimStatus{ Phase: api.ClaimBound, }, } client := fake.NewSimpleClientset(pv, claim) tmpDir, err := utiltesting.MkTmpdir("gcepdTest") if err != nil { t.Fatalf("can't make a temp dir: %v", err) } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil, "" /* rootContext */)) plug, _ := plugMgr.FindPluginByName(gcePersistentDiskPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes spec := volume.NewSpecFromPersistentVolume(pv, true) pod := &api.Pod{ObjectMeta: api.ObjectMeta{UID: types.UID("poduid")}} mounter, _ := plug.NewMounter(spec, pod, volume.VolumeOptions{}) if !mounter.GetAttributes().ReadOnly { t.Errorf("Expected true for mounter.IsReadOnly") } }
// getPVSpecFromCache fetches the PV object with the given name from the shared // internal PV store and returns a volume.Spec representing it. // This method returns an error if a PV object does not exist in the cache with // the given name. // This method deep copies the PV object so the caller may use the returned // volume.Spec object without worrying about it mutating unexpectedly. func (adc *attachDetachController) getPVSpecFromCache( name string, pvcReadOnly bool, expectedClaimUID types.UID) (*volume.Spec, error) { pvObj, exists, err := adc.pvInformer.GetStore().GetByKey(name) if pvObj == nil || !exists || err != nil { return nil, fmt.Errorf( "failed to find PV %q in PVInformer cache. %v", name, err) } pv, ok := pvObj.(*api.PersistentVolume) if !ok || pv == nil { return nil, fmt.Errorf( "failed to cast %q object %#v to PersistentVolume", name, pvObj) } if pv.Spec.ClaimRef == nil { return nil, fmt.Errorf( "found PV object %q but it has a nil pv.Spec.ClaimRef indicating it is not yet bound to the claim", name) } if pv.Spec.ClaimRef.UID != expectedClaimUID { return nil, fmt.Errorf( "found PV object %q but its pv.Spec.ClaimRef.UID (%q) does not point to claim.UID (%q)", name, pv.Spec.ClaimRef.UID, expectedClaimUID) } // Do not return the object from the informer, since the store is shared it // may be mutated by another consumer. clonedPVObj, err := api.Scheme.DeepCopy(*pv) if err != nil || clonedPVObj == nil { return nil, fmt.Errorf( "failed to deep copy %q PV object. err=%v", name, err) } clonedPV, ok := clonedPVObj.(api.PersistentVolume) if !ok { return nil, fmt.Errorf( "failed to cast %q clonedPV %#v to PersistentVolume", name, pvObj) } return volume.NewSpecFromPersistentVolume(&clonedPV, pvcReadOnly), nil }
func TestPluginPersistentVolume(t *testing.T) { vol := &api.PersistentVolume{ ObjectMeta: api.ObjectMeta{ Name: "vol1", }, Spec: api.PersistentVolumeSpec{ PersistentVolumeSource: api.PersistentVolumeSource{ ISCSI: &api.ISCSIVolumeSource{ TargetPortal: "127.0.0.1:3260", IQN: "iqn.2014-12.server:storage.target01", FSType: "ext4", Lun: 0, }, }, }, } doTestPlugin(t, volume.NewSpecFromPersistentVolume(vol, false)) }