diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 5f010918116..2ae872cc999 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -126,6 +126,9 @@ func (os *OpenStack) InstanceID() (string, error) { func (i *Instances) InstanceID(name types.NodeName) (string, error) { srv, err := getServerByName(i.compute, name) if err != nil { + if err == ErrNotFound { + return "", cloudprovider.InstanceNotFound + } return "", err } // In the future it is possible to also return an endpoint as: diff --git a/pkg/volume/cinder/attacher.go b/pkg/volume/cinder/attacher.go index 467e6c89420..53dc22a8e4e 100644 --- a/pkg/volume/cinder/attacher.go +++ b/pkg/volume/cinder/attacher.go @@ -26,6 +26,7 @@ import ( "github.com/golang/glog" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" @@ -186,6 +187,17 @@ func (attacher *cinderDiskAttacher) VolumesAreAttached(specs []*volume.Spec, nod instanceID, err := attacher.nodeInstanceID(nodeName) if err != nil { + if err == cloudprovider.InstanceNotFound { + // If node doesn't exist, OpenStack Nova will assume the volumes are not attached to it. + // Mark the volumes as detached and return false without error. + glog.Warningf("VolumesAreAttached: node %q does not exist.", nodeName) + for spec := range volumesAttachedCheck { + volumesAttachedCheck[spec] = false + } + + return volumesAttachedCheck, nil + } + return volumesAttachedCheck, err }