Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
4e1b5c6a
Commit
4e1b5c6a
authored
Jan 07, 2018
by
Jesse Haka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
move detach out of os volumes attach
add test add test fix bazel fix tests change loglevel, remove else statement
parent
bac27053
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
151 additions
and
67 deletions
+151
-67
openstack_volumes.go
pkg/cloudprovider/providers/openstack/openstack_volumes.go
+64
-26
attacher.go
pkg/volume/cinder/attacher.go
+2
-29
attacher_test.go
pkg/volume/cinder/attacher_test.go
+83
-11
cinder.go
pkg/volume/cinder/cinder.go
+2
-1
No files found.
pkg/cloudprovider/providers/openstack/openstack_volumes.go
View file @
4e1b5c6a
...
...
@@ -26,6 +26,7 @@ import (
"time"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/types"
k8s_volume
"k8s.io/kubernetes/pkg/volume"
volumeutil
"k8s.io/kubernetes/pkg/volume/util"
...
...
@@ -319,33 +320,18 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) {
if
instanceID
==
volume
.
AttachedServerId
{
glog
.
V
(
4
)
.
Infof
(
"Disk %s is already attached to instance %s"
,
volumeID
,
instanceID
)
return
volume
.
ID
,
nil
}
else
{
nodeName
,
err
:=
os
.
GetNodeNameByID
(
volume
.
AttachedServerId
)
attachErr
:=
fmt
.
Sprintf
(
"disk %s path %s is attached to a different instance (%s)"
,
volumeID
,
volume
.
AttachedDevice
,
volume
.
AttachedServerId
)
if
err
!=
nil
{
glog
.
Error
(
attachErr
)
return
""
,
errors
.
New
(
attachErr
)
}
// using volume.AttachedDevice may cause problems because cinder does not report device path correctly see issue #33128
devicePath
:=
volume
.
AttachedDevice
danglingErr
:=
volumeutil
.
NewDanglingError
(
attachErr
,
nodeName
,
devicePath
)
glog
.
V
(
4
)
.
Infof
(
"volume %s is already attached to node %s path %s"
,
volumeID
,
nodeName
,
devicePath
)
// check special case, if node is deleted from cluster but exist still in openstack
// we need to check can we detach the cinder, node is deleted from cluster if state is not ACTIVE
srv
,
err
:=
getServerByName
(
cClient
,
nodeName
,
false
)
if
err
!=
nil
{
return
""
,
err
}
if
srv
.
Status
!=
"ACTIVE"
{
err
=
os
.
DetachDisk
(
volume
.
AttachedServerId
,
volumeID
)
if
err
!=
nil
{
glog
.
Error
(
err
)
return
""
,
err
}
glog
.
V
(
4
)
.
Infof
(
"detached volume %s node state was %s"
,
volumeID
,
srv
.
Status
)
}
return
""
,
danglingErr
}
nodeName
,
err
:=
os
.
GetNodeNameByID
(
volume
.
AttachedServerId
)
attachErr
:=
fmt
.
Sprintf
(
"disk %s path %s is attached to a different instance (%s)"
,
volumeID
,
volume
.
AttachedDevice
,
volume
.
AttachedServerId
)
if
err
!=
nil
{
glog
.
Error
(
attachErr
)
return
""
,
errors
.
New
(
attachErr
)
}
// using volume.AttachedDevice may cause problems because cinder does not report device path correctly see issue #33128
devicePath
:=
volume
.
AttachedDevice
danglingErr
:=
volumeutil
.
NewDanglingError
(
attachErr
,
nodeName
,
devicePath
)
glog
.
V
(
2
)
.
Infof
(
"Found dangling volume %s attached to node %s"
,
volumeID
,
nodeName
)
return
""
,
danglingErr
}
startTime
:=
time
.
Now
()
...
...
@@ -605,6 +591,9 @@ func (os *OpenStack) GetAttachmentDiskPath(instanceID, volumeID string) (string,
// DiskIsAttached queries if a volume is attached to a compute instance
func
(
os
*
OpenStack
)
DiskIsAttached
(
instanceID
,
volumeID
string
)
(
bool
,
error
)
{
if
instanceID
==
""
{
glog
.
Warningf
(
"calling DiskIsAttached with empty instanceid: %s %s"
,
instanceID
,
volumeID
)
}
volume
,
err
:=
os
.
getVolume
(
volumeID
)
if
err
!=
nil
{
return
false
,
err
...
...
@@ -613,6 +602,29 @@ func (os *OpenStack) DiskIsAttached(instanceID, volumeID string) (bool, error) {
return
instanceID
==
volume
.
AttachedServerId
,
nil
}
// DiskIsAttachedByName queries if a volume is attached to a compute instance by name
func
(
os
*
OpenStack
)
DiskIsAttachedByName
(
nodeName
types
.
NodeName
,
volumeID
string
)
(
bool
,
string
,
error
)
{
cClient
,
err
:=
os
.
NewComputeV2
()
if
err
!=
nil
{
return
false
,
""
,
err
}
srv
,
err
:=
getServerByName
(
cClient
,
nodeName
,
false
)
if
err
!=
nil
{
if
err
==
ErrNotFound
{
// instance not found anymore in cloudprovider, assume that cinder is detached
return
false
,
""
,
nil
}
else
{
return
false
,
""
,
err
}
}
instanceID
:=
"/"
+
srv
.
ID
if
ind
:=
strings
.
LastIndex
(
instanceID
,
"/"
);
ind
>=
0
{
instanceID
=
instanceID
[(
ind
+
1
)
:
]
}
attached
,
err
:=
os
.
DiskIsAttached
(
instanceID
,
volumeID
)
return
attached
,
instanceID
,
err
}
// DisksAreAttached queries if a list of volumes are attached to a compute instance
func
(
os
*
OpenStack
)
DisksAreAttached
(
instanceID
string
,
volumeIDs
[]
string
)
(
map
[
string
]
bool
,
error
)
{
attached
:=
make
(
map
[
string
]
bool
)
...
...
@@ -627,6 +639,32 @@ func (os *OpenStack) DisksAreAttached(instanceID string, volumeIDs []string) (ma
return
attached
,
nil
}
// DisksAreAttachedByName queries if a list of volumes are attached to a compute instance by name
func
(
os
*
OpenStack
)
DisksAreAttachedByName
(
nodeName
types
.
NodeName
,
volumeIDs
[]
string
)
(
map
[
string
]
bool
,
error
)
{
attached
:=
make
(
map
[
string
]
bool
)
cClient
,
err
:=
os
.
NewComputeV2
()
if
err
!=
nil
{
return
attached
,
err
}
srv
,
err
:=
getServerByName
(
cClient
,
nodeName
,
false
)
if
err
!=
nil
{
if
err
==
ErrNotFound
{
// instance not found anymore, mark all volumes as detached
for
_
,
volumeID
:=
range
volumeIDs
{
attached
[
volumeID
]
=
false
}
return
attached
,
nil
}
else
{
return
attached
,
err
}
}
instanceID
:=
"/"
+
srv
.
ID
if
ind
:=
strings
.
LastIndex
(
instanceID
,
"/"
);
ind
>=
0
{
instanceID
=
instanceID
[(
ind
+
1
)
:
]
}
return
os
.
DisksAreAttached
(
instanceID
,
volumeIDs
)
}
// diskIsUsed returns true a disk is attached to any node.
func
(
os
*
OpenStack
)
diskIsUsed
(
volumeID
string
)
(
bool
,
error
)
{
volume
,
err
:=
os
.
getVolume
(
volumeID
)
...
...
pkg/volume/cinder/attacher.go
View file @
4e1b5c6a
...
...
@@ -27,7 +27,6 @@ import (
"k8s.io/api/core/v1"
"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"
...
...
@@ -187,23 +186,7 @@ func (attacher *cinderDiskAttacher) VolumesAreAttached(specs []*volume.Spec, nod
volumeSpecMap
[
volumeSource
.
VolumeID
]
=
spec
}
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
}
attachedResult
,
err
:=
attacher
.
cinderProvider
.
DisksAreAttached
(
instanceID
,
volumeIDList
)
attachedResult
,
err
:=
attacher
.
cinderProvider
.
DisksAreAttachedByName
(
nodeName
,
volumeIDList
)
if
err
!=
nil
{
// Log error and continue with attach
glog
.
Errorf
(
...
...
@@ -381,20 +364,10 @@ func (detacher *cinderDiskDetacher) waitDiskDetached(instanceID, volumeID string
func
(
detacher
*
cinderDiskDetacher
)
Detach
(
volumeName
string
,
nodeName
types
.
NodeName
)
error
{
volumeID
:=
path
.
Base
(
volumeName
)
instances
,
res
:=
detacher
.
cinderProvider
.
Instances
()
if
!
res
{
return
fmt
.
Errorf
(
"failed to list openstack instances"
)
}
instanceID
,
err
:=
instances
.
InstanceID
(
nodeName
)
if
ind
:=
strings
.
LastIndex
(
instanceID
,
"/"
);
ind
>=
0
{
instanceID
=
instanceID
[(
ind
+
1
)
:
]
}
if
err
:=
detacher
.
waitOperationFinished
(
volumeID
);
err
!=
nil
{
return
err
}
attached
,
err
:=
detacher
.
cinderProvider
.
DiskIsAttached
(
instanceID
,
volumeID
)
attached
,
instanceID
,
err
:=
detacher
.
cinderProvider
.
DiskIsAttachedByName
(
nodeName
,
volumeID
)
if
err
!=
nil
{
// Log error and continue with detach
glog
.
Errorf
(
...
...
pkg/volume/cinder/attacher_test.go
View file @
4e1b5c6a
This diff is collapsed.
Click to expand it.
pkg/volume/cinder/cinder.go
View file @
4e1b5c6a
...
...
@@ -52,7 +52,8 @@ type CinderProvider interface {
GetAttachmentDiskPath
(
instanceID
,
volumeID
string
)
(
string
,
error
)
OperationPending
(
diskName
string
)
(
bool
,
string
,
error
)
DiskIsAttached
(
instanceID
,
volumeID
string
)
(
bool
,
error
)
DisksAreAttached
(
instanceID
string
,
volumeIDs
[]
string
)
(
map
[
string
]
bool
,
error
)
DiskIsAttachedByName
(
nodeName
types
.
NodeName
,
volumeID
string
)
(
bool
,
string
,
error
)
DisksAreAttachedByName
(
nodeName
types
.
NodeName
,
volumeIDs
[]
string
)
(
map
[
string
]
bool
,
error
)
ShouldTrustDevicePath
()
bool
Instances
()
(
cloudprovider
.
Instances
,
bool
)
ExpandVolume
(
volumeID
string
,
oldSize
resource
.
Quantity
,
newSize
resource
.
Quantity
)
(
resource
.
Quantity
,
error
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment