From 63725e3e3c69737c8afbc43cdcf0a6ebec3ec292 Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Tue, 15 Aug 2017 16:42:11 +0800 Subject: [PATCH] Mark the volumes as detached when node does not exist If node doesn't exist, OpenStack Nova will assume the volumes are not attached to it. So mark the volumes as detached and return false without error. Fix: #50200 --- .../providers/openstack/openstack_instances.go | 3 +++ pkg/volume/cinder/attacher.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 70f29ff7bd0..2f44527d6fe 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -157,6 +157,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 901876d16b8..ecac8629fe9 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 }