Skip to content
This repository was archived by the owner on Mar 22, 2018. It is now read-only.

Commit 0c0f1a1

Browse files
committed
use danglingerror
add getNodeNameByID and use volume.AttachedDevice as devicepath use uppercase functionname do not delete automatically nodes if node is shutdowned in openstack do not delete node fix gofmt fix cinder detach if instance is not in active state fix gofmt
1 parent 9fad374 commit 0c0f1a1

6 files changed

Lines changed: 58 additions & 11 deletions

File tree

pkg/cloudprovider/providers/openstack/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ go_library(
2626
"//pkg/controller:go_default_library",
2727
"//pkg/util/mount:go_default_library",
2828
"//pkg/volume:go_default_library",
29+
"//pkg/volume/util:go_default_library",
2930
"//vendor/github.com/golang/glog:go_default_library",
3031
"//vendor/github.com/gophercloud/gophercloud:go_default_library",
3132
"//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library",

pkg/cloudprovider/providers/openstack/openstack.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,22 @@ func mapNodeNameToServerName(nodeName types.NodeName) string {
319319
return string(nodeName)
320320
}
321321

322+
// getNodeNameByID maps instanceid to types.NodeName
323+
func (os *OpenStack) GetNodeNameByID(instanceID string) (types.NodeName, error) {
324+
client, err := os.NewComputeV2()
325+
var nodeName types.NodeName
326+
if err != nil {
327+
return nodeName, err
328+
}
329+
330+
server, err := servers.Get(client, instanceID).Extract()
331+
if err != nil {
332+
return nodeName, err
333+
}
334+
nodeName = mapServerToNodeName(server)
335+
return nodeName, nil
336+
}
337+
322338
// mapServerToNodeName maps an OpenStack Server to a k8s NodeName
323339
func mapServerToNodeName(server *servers.Server) types.NodeName {
324340
// Node names are always lowercase, and (at least)
@@ -346,11 +362,14 @@ func foreachServer(client *gophercloud.ServiceClient, opts servers.ListOptsBuild
346362
return err
347363
}
348364

349-
func getServerByName(client *gophercloud.ServiceClient, name types.NodeName) (*servers.Server, error) {
365+
func getServerByName(client *gophercloud.ServiceClient, name types.NodeName, showOnlyActive bool) (*servers.Server, error) {
350366
opts := servers.ListOpts{
351-
Name: fmt.Sprintf("^%s$", regexp.QuoteMeta(mapNodeNameToServerName(name))),
352-
Status: "ACTIVE",
367+
Name: fmt.Sprintf("^%s$", regexp.QuoteMeta(mapNodeNameToServerName(name))),
353368
}
369+
if showOnlyActive {
370+
opts.Status = "ACTIVE"
371+
}
372+
354373
pager := servers.List(client, opts)
355374

356375
serverList := make([]servers.Server, 0, 1)
@@ -432,7 +451,7 @@ func nodeAddresses(srv *servers.Server) ([]v1.NodeAddress, error) {
432451
}
433452

434453
func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName) ([]v1.NodeAddress, error) {
435-
srv, err := getServerByName(client, name)
454+
srv, err := getServerByName(client, name, true)
436455
if err != nil {
437456
return nil, err
438457
}
@@ -582,7 +601,7 @@ func (os *OpenStack) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Z
582601
return cloudprovider.Zone{}, err
583602
}
584603

585-
srv, err := getServerByName(compute, nodeName)
604+
srv, err := getServerByName(compute, nodeName, true)
586605
if err != nil {
587606
if err == ErrNotFound {
588607
return cloudprovider.Zone{}, cloudprovider.InstanceNotFound

pkg/cloudprovider/providers/openstack/openstack_instances.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func (i *Instances) NodeAddressesByProviderID(providerID string) ([]v1.NodeAddre
103103

104104
// ExternalID returns the cloud provider ID of the specified instance (deprecated).
105105
func (i *Instances) ExternalID(name types.NodeName) (string, error) {
106-
srv, err := getServerByName(i.compute, name)
106+
srv, err := getServerByName(i.compute, name, true)
107107
if err != nil {
108108
if err == ErrNotFound {
109109
return "", cloudprovider.InstanceNotFound
@@ -151,7 +151,7 @@ func (os *OpenStack) InstanceID() (string, error) {
151151

152152
// InstanceID returns the cloud provider ID of the specified instance.
153153
func (i *Instances) InstanceID(name types.NodeName) (string, error) {
154-
srv, err := getServerByName(i.compute, name)
154+
srv, err := getServerByName(i.compute, name, true)
155155
if err != nil {
156156
if err == ErrNotFound {
157157
return "", cloudprovider.InstanceNotFound
@@ -184,7 +184,7 @@ func (i *Instances) InstanceTypeByProviderID(providerID string) (string, error)
184184

185185
// InstanceType returns the type of the specified instance.
186186
func (i *Instances) InstanceType(name types.NodeName) (string, error) {
187-
srv, err := getServerByName(i.compute, name)
187+
srv, err := getServerByName(i.compute, name, true)
188188

189189
if err != nil {
190190
return "", err

pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ func getNodeSecurityGroupIDForLB(compute *gophercloud.ServiceClient, nodes []*v1
551551

552552
for _, node := range nodes {
553553
nodeName := types.NodeName(node.Name)
554-
srv, err := getServerByName(compute, nodeName)
554+
srv, err := getServerByName(compute, nodeName, true)
555555
if err != nil {
556556
return nodeSecurityGroupIDs.List(), err
557557
}

pkg/cloudprovider/providers/openstack/openstack_routes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ func (r *Routes) DeleteRoute(clusterName string, route *cloudprovider.Route) err
288288
}
289289

290290
func getPortIDByIP(compute *gophercloud.ServiceClient, targetNode types.NodeName, ipAddress string) (string, error) {
291-
srv, err := getServerByName(compute, targetNode)
291+
srv, err := getServerByName(compute, targetNode, true)
292292
if err != nil {
293293
return "", err
294294
}

pkg/cloudprovider/providers/openstack/openstack_volumes.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package openstack
1818

1919
import (
20+
"errors"
2021
"fmt"
2122
"io/ioutil"
2223
"path"
@@ -26,6 +27,7 @@ import (
2627

2728
"k8s.io/apimachinery/pkg/api/resource"
2829
k8s_volume "k8s.io/kubernetes/pkg/volume"
30+
volumeutil "k8s.io/kubernetes/pkg/volume/util"
2931

3032
"github.com/gophercloud/gophercloud"
3133
volumeexpand "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions"
@@ -317,8 +319,33 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) {
317319
if instanceID == volume.AttachedServerId {
318320
glog.V(4).Infof("Disk %s is already attached to instance %s", volumeID, instanceID)
319321
return volume.ID, nil
322+
} else {
323+
nodeName, err := os.GetNodeNameByID(volume.AttachedServerId)
324+
attachErr := fmt.Sprintf("disk %s path %s is attached to a different instance (%s)", volumeID, volume.AttachedDevice, volume.AttachedServerId)
325+
if err != nil {
326+
glog.Error(attachErr)
327+
return "", errors.New(attachErr)
328+
}
329+
// using volume.AttachedDevice may cause problems because cinder does not report device path correctly see issue #33128
330+
devicePath := volume.AttachedDevice
331+
danglingErr := volumeutil.NewDanglingError(attachErr, nodeName, devicePath)
332+
glog.V(4).Infof("volume %s is already attached to node %s path %s", volumeID, nodeName, devicePath)
333+
// check special case, if node is deleted from cluster but exist still in openstack
334+
// we need to check can we detach the cinder, node is deleted from cluster if state is not ACTIVE
335+
srv, err := getServerByName(cClient, nodeName, false)
336+
if err != nil {
337+
return "", err
338+
}
339+
if srv.Status != "ACTIVE" {
340+
err = os.DetachDisk(volume.AttachedServerId, volumeID)
341+
if err != nil {
342+
glog.Error(err)
343+
return "", err
344+
}
345+
glog.V(4).Infof("detached volume %s node state was %s", volumeID, srv.Status)
346+
}
347+
return "", danglingErr
320348
}
321-
return "", fmt.Errorf("disk %s is attached to a different instance (%s)", volumeID, volume.AttachedServerId)
322349
}
323350

324351
startTime := time.Now()

0 commit comments

Comments
 (0)