Merge pull request #18042 from markturansky/nil_pointer_fix

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2015-12-16 09:12:41 -08:00
commit 12552912c8
3 changed files with 66 additions and 20 deletions

View File

@ -94,24 +94,32 @@ func NewPersistentVolumeClaimBinder(kubeClient client.Interface, syncPeriod time
return binder return binder
} }
func (binder *PersistentVolumeClaimBinder) addVolume(obj interface{}) { func (binder *PersistentVolumeClaimBinder) addVolume(obj interface{}) {
binder.lock.Lock() binder.lock.Lock()
defer binder.lock.Unlock() defer binder.lock.Unlock()
volume := obj.(*api.PersistentVolume) pv, ok := obj.(*api.PersistentVolume)
err := syncVolume(binder.volumeIndex, binder.client, volume) if !ok {
if err != nil { glog.Errorf("Expected PersistentVolume but handler received %+v", obj)
glog.Errorf("PVClaimBinder could not add volume %s: %+v", volume.Name, err) return
}
if err := syncVolume(binder.volumeIndex, binder.client, pv); err != nil {
glog.Errorf("PVClaimBinder could not add volume %s: %+v", pv.Name, err)
} }
} }
func (binder *PersistentVolumeClaimBinder) updateVolume(oldObj, newObj interface{}) { func (binder *PersistentVolumeClaimBinder) updateVolume(oldObj, newObj interface{}) {
binder.lock.Lock() binder.lock.Lock()
defer binder.lock.Unlock() defer binder.lock.Unlock()
newVolume := newObj.(*api.PersistentVolume) newVolume, ok := newObj.(*api.PersistentVolume)
binder.volumeIndex.Update(newVolume) if !ok {
err := syncVolume(binder.volumeIndex, binder.client, newVolume) glog.Errorf("Expected PersistentVolume but handler received %+v", newObj)
if err != nil { return
}
if err := binder.volumeIndex.Update(newVolume); err != nil {
glog.Errorf("Error updating volume %s in index: %v", newVolume.Name, err)
return
}
if err := syncVolume(binder.volumeIndex, binder.client, newVolume); err != nil {
glog.Errorf("PVClaimBinder could not update volume %s: %+v", newVolume.Name, err) glog.Errorf("PVClaimBinder could not update volume %s: %+v", newVolume.Name, err)
} }
} }
@ -119,16 +127,25 @@ func (binder *PersistentVolumeClaimBinder) updateVolume(oldObj, newObj interface
func (binder *PersistentVolumeClaimBinder) deleteVolume(obj interface{}) { func (binder *PersistentVolumeClaimBinder) deleteVolume(obj interface{}) {
binder.lock.Lock() binder.lock.Lock()
defer binder.lock.Unlock() defer binder.lock.Unlock()
volume := obj.(*api.PersistentVolume) volume, ok := obj.(*api.PersistentVolume)
binder.volumeIndex.Delete(volume) if !ok {
glog.Errorf("Expected PersistentVolume but handler received %+v", obj)
return
}
if err := binder.volumeIndex.Delete(volume); err != nil {
glog.Errorf("Error deleting volume %s from index: %v", volume.Name, err)
}
} }
func (binder *PersistentVolumeClaimBinder) addClaim(obj interface{}) { func (binder *PersistentVolumeClaimBinder) addClaim(obj interface{}) {
binder.lock.Lock() binder.lock.Lock()
defer binder.lock.Unlock() defer binder.lock.Unlock()
claim := obj.(*api.PersistentVolumeClaim) claim, ok := obj.(*api.PersistentVolumeClaim)
err := syncClaim(binder.volumeIndex, binder.client, claim) if !ok {
if err != nil { glog.Errorf("Expected PersistentVolumeClaim but handler received %+v", obj)
return
}
if err := syncClaim(binder.volumeIndex, binder.client, claim); err != nil {
glog.Errorf("PVClaimBinder could not add claim %s: %+v", claim.Name, err) glog.Errorf("PVClaimBinder could not add claim %s: %+v", claim.Name, err)
} }
} }
@ -136,9 +153,11 @@ func (binder *PersistentVolumeClaimBinder) addClaim(obj interface{}) {
func (binder *PersistentVolumeClaimBinder) updateClaim(oldObj, newObj interface{}) { func (binder *PersistentVolumeClaimBinder) updateClaim(oldObj, newObj interface{}) {
binder.lock.Lock() binder.lock.Lock()
defer binder.lock.Unlock() defer binder.lock.Unlock()
newClaim := newObj.(*api.PersistentVolumeClaim) newClaim, ok := newObj.(*api.PersistentVolumeClaim)
err := syncClaim(binder.volumeIndex, binder.client, newClaim) if !ok {
if err != nil { glog.Errorf("Expected PersistentVolumeClaim but handler received %+v", newObj)
}
if err := syncClaim(binder.volumeIndex, binder.client, newClaim); err != nil {
glog.Errorf("PVClaimBinder could not update claim %s: %+v", newClaim.Name, err) glog.Errorf("PVClaimBinder could not update claim %s: %+v", newClaim.Name, err)
} }
} }

View File

@ -25,6 +25,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/client/unversioned/testclient" "k8s.io/kubernetes/pkg/client/unversioned/testclient"
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume"
"k8s.io/kubernetes/pkg/volume/host_path" "k8s.io/kubernetes/pkg/volume/host_path"
@ -369,6 +370,27 @@ func TestBindingWithExamples(t *testing.T) {
} }
} }
func TestCasting(t *testing.T) {
client := &testclient.Fake{}
binder := NewPersistentVolumeClaimBinder(client, 1*time.Second)
pv := &api.PersistentVolume{}
unk := cache.DeletedFinalStateUnknown{}
pvc := &api.PersistentVolumeClaim{
ObjectMeta: api.ObjectMeta{Name: "foo"},
Status: api.PersistentVolumeClaimStatus{Phase: api.ClaimBound},
}
// none of these should fail casting.
// the real test is not failing when passed DeletedFinalStateUnknown in the deleteHandler
binder.addVolume(pv)
binder.updateVolume(pv, pv)
binder.deleteVolume(pv)
binder.deleteVolume(unk)
binder.addClaim(pvc)
binder.updateClaim(pvc, pvc)
}
type mockBinderClient struct { type mockBinderClient struct {
volume *api.PersistentVolume volume *api.PersistentVolume
claim *api.PersistentVolumeClaim claim *api.PersistentVolumeClaim

View File

@ -71,15 +71,20 @@ func NewPersistentVolumeRecycler(kubeClient client.Interface, syncPeriod time.Du
}, },
}, },
&api.PersistentVolume{}, &api.PersistentVolume{},
// TODO: Can we have much longer period here?
syncPeriod, syncPeriod,
framework.ResourceEventHandlerFuncs{ framework.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
pv := obj.(*api.PersistentVolume) pv, ok := obj.(*api.PersistentVolume)
if !ok {
glog.Errorf("Error casting object to PersistentVolume: %v", obj)
}
recycler.reclaimVolume(pv) recycler.reclaimVolume(pv)
}, },
UpdateFunc: func(oldObj, newObj interface{}) { UpdateFunc: func(oldObj, newObj interface{}) {
pv := newObj.(*api.PersistentVolume) pv, ok := newObj.(*api.PersistentVolume)
if !ok {
glog.Errorf("Error casting object to PersistentVolume: %v", newObj)
}
recycler.reclaimVolume(pv) recycler.reclaimVolume(pv)
}, },
}, },