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
6804ad6c
Commit
6804ad6c
authored
Nov 29, 2018
by
saad-ali
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Ensure volume mount err checking done inside op
Ensure volume mount error checking is done inside the operation so that failures get handled with exponential backoff, etc.
parent
598a0198
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
54 additions
and
50 deletions
+54
-50
operation_executor.go
pkg/volume/util/operationexecutor/operation_executor.go
+1
-1
operation_executor_test.go
pkg/volume/util/operationexecutor/operation_executor_test.go
+2
-2
operation_generator.go
pkg/volume/util/operationexecutor/operation_generator.go
+51
-47
No files found.
pkg/volume/util/operationexecutor/operation_executor.go
View file @
6804ad6c
...
...
@@ -725,7 +725,7 @@ func (oe *operationExecutor) MountVolume(
if
fsVolume
{
// Filesystem volume case
// Mount/remount a volume when a volume is attached
generatedOperations
,
err
=
oe
.
operationGenerator
.
GenerateMountVolumeFunc
(
generatedOperations
=
oe
.
operationGenerator
.
GenerateMountVolumeFunc
(
waitForAttachTimeout
,
volumeToMount
,
actualStateOfWorld
,
isRemount
)
}
else
{
...
...
pkg/volume/util/operationexecutor/operation_executor_test.go
View file @
6804ad6c
...
...
@@ -389,14 +389,14 @@ func newFakeOperationGenerator(ch chan interface{}, quit chan interface{}) Opera
}
}
func
(
fopg
*
fakeOperationGenerator
)
GenerateMountVolumeFunc
(
waitForAttachTimeout
time
.
Duration
,
volumeToMount
VolumeToMount
,
actualStateOfWorldMounterUpdater
ActualStateOfWorldMounterUpdater
,
isRemount
bool
)
(
volumetypes
.
GeneratedOperations
,
error
)
{
func
(
fopg
*
fakeOperationGenerator
)
GenerateMountVolumeFunc
(
waitForAttachTimeout
time
.
Duration
,
volumeToMount
VolumeToMount
,
actualStateOfWorldMounterUpdater
ActualStateOfWorldMounterUpdater
,
isRemount
bool
)
volumetypes
.
GeneratedOperations
{
opFunc
:=
func
()
(
error
,
error
)
{
startOperationAndBlock
(
fopg
.
ch
,
fopg
.
quit
)
return
nil
,
nil
}
return
volumetypes
.
GeneratedOperations
{
OperationFunc
:
opFunc
,
}
,
nil
}
}
func
(
fopg
*
fakeOperationGenerator
)
GenerateUnmountVolumeFunc
(
volumeToUnmount
MountedVolume
,
actualStateOfWorld
ActualStateOfWorldMounterUpdater
,
podsDir
string
)
(
volumetypes
.
GeneratedOperations
,
error
)
{
opFunc
:=
func
()
(
error
,
error
)
{
...
...
pkg/volume/util/operationexecutor/operation_generator.go
View file @
6804ad6c
...
...
@@ -40,6 +40,10 @@ import (
"k8s.io/kubernetes/pkg/volume/util/volumepathhandler"
)
const
(
unknownVolumePlugin
string
=
"UnknownVolumePlugin"
)
var
_
OperationGenerator
=
&
operationGenerator
{}
type
operationGenerator
struct
{
...
...
@@ -82,7 +86,7 @@ func NewOperationGenerator(kubeClient clientset.Interface,
// OperationGenerator interface that extracts out the functions from operation_executor to make it dependency injectable
type
OperationGenerator
interface
{
// Generates the MountVolume function needed to perform the mount of a volume plugin
GenerateMountVolumeFunc
(
waitForAttachTimeout
time
.
Duration
,
volumeToMount
VolumeToMount
,
actualStateOfWorldMounterUpdater
ActualStateOfWorldMounterUpdater
,
isRemount
bool
)
(
volumetypes
.
GeneratedOperations
,
error
)
GenerateMountVolumeFunc
(
waitForAttachTimeout
time
.
Duration
,
volumeToMount
VolumeToMount
,
actualStateOfWorldMounterUpdater
ActualStateOfWorldMounterUpdater
,
isRemount
bool
)
volumetypes
.
GeneratedOperations
// Generates the UnmountVolume function needed to perform the unmount of a volume plugin
GenerateUnmountVolumeFunc
(
volumeToUnmount
MountedVolume
,
actualStateOfWorld
ActualStateOfWorldMounterUpdater
,
podsDir
string
)
(
volumetypes
.
GeneratedOperations
,
error
)
...
...
@@ -436,61 +440,61 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
waitForAttachTimeout
time
.
Duration
,
volumeToMount
VolumeToMount
,
actualStateOfWorld
ActualStateOfWorldMounterUpdater
,
isRemount
bool
)
(
volumetypes
.
GeneratedOperations
,
error
)
{
isRemount
bool
)
volumetypes
.
GeneratedOperations
{
// Get mounter plugin
volumePluginName
:=
unknownVolumePlugin
volumePlugin
,
err
:=
og
.
volumePluginMgr
.
FindPluginBySpec
(
volumeToMount
.
VolumeSpec
)
if
err
!=
nil
||
volumePlugin
=
=
nil
{
return
volumetypes
.
GeneratedOperations
{},
volumeToMount
.
GenerateErrorDetailed
(
"MountVolume.FindPluginBySpec failed"
,
err
)
if
err
==
nil
&&
volumePlugin
!
=
nil
{
volumePluginName
=
volumePlugin
.
GetPluginName
(
)
}
affinityErr
:=
checkNodeAffinity
(
og
,
volumeToMount
,
volumePlugin
)
if
affinityErr
!=
nil
{
eventErr
,
detailedErr
:=
volumeToMount
.
GenerateError
(
"MountVolume.NodeAffinity check failed"
,
affinityErr
)
og
.
recorder
.
Eventf
(
volumeToMount
.
Pod
,
v1
.
EventTypeWarning
,
kevents
.
FailedMountVolume
,
eventErr
.
Error
())
return
volumetypes
.
GeneratedOperations
{},
detailedErr
}
mountVolumeFunc
:=
func
()
(
error
,
error
)
{
if
err
!=
nil
||
volumePlugin
==
nil
{
return
volumeToMount
.
GenerateError
(
"MountVolume.FindPluginBySpec failed"
,
err
)
}
volumeMounter
,
newMounterErr
:=
volumePlugin
.
NewMounter
(
volumeToMount
.
VolumeSpec
,
volumeToMount
.
Pod
,
volume
.
VolumeOptions
{})
if
newMounterErr
!=
nil
{
eventErr
,
detailedErr
:=
volumeToMount
.
GenerateError
(
"MountVolume.NewMounter initialization failed"
,
newMounterErr
)
og
.
recorder
.
Eventf
(
volumeToMount
.
Pod
,
v1
.
EventTypeWarning
,
kevents
.
FailedMountVolume
,
eventErr
.
Error
())
return
volumetypes
.
GeneratedOperations
{},
detailedErr
}
affinityErr
:=
checkNodeAffinity
(
og
,
volumeToMount
,
volumePlugin
)
if
affinityErr
!=
nil
{
return
volumeToMount
.
GenerateError
(
"MountVolume.NodeAffinity check failed"
,
affinityErr
)
}
mountCheckError
:=
checkMountOptionSupport
(
og
,
volumeToMount
,
volumePlugin
)
volumeMounter
,
newMounterErr
:=
volumePlugin
.
NewMounter
(
volumeToMount
.
VolumeSpec
,
volumeToMount
.
Pod
,
volume
.
VolumeOptions
{})
if
newMounterErr
!=
nil
{
return
volumeToMount
.
GenerateError
(
"MountVolume.NewMounter initialization failed"
,
newMounterErr
)
if
mountCheckError
!=
nil
{
eventErr
,
detailedErr
:=
volumeToMount
.
GenerateError
(
"MountVolume.MountOptionSupport check failed"
,
mountCheckError
)
og
.
recorder
.
Eventf
(
volumeToMount
.
Pod
,
v1
.
EventTypeWarning
,
kevents
.
UnsupportedMountOption
,
eventErr
.
Error
())
return
volumetypes
.
GeneratedOperations
{},
detailedErr
}
}
// Get attacher, if possible
attachableVolumePlugin
,
_
:=
og
.
volumePluginMgr
.
FindAttachablePluginBySpec
(
volumeToMount
.
VolumeSpec
)
var
volumeAttacher
volume
.
Attacher
if
attachableVolumePlugin
!=
nil
{
volumeAttacher
,
_
=
attachableVolumePlugin
.
NewAttacher
()
}
mountCheckError
:=
checkMountOptionSupport
(
og
,
volumeToMount
,
volumePlugin
)
// get deviceMounter, if possible
deviceMountableVolumePlugin
,
_
:=
og
.
volumePluginMgr
.
FindDeviceMountablePluginBySpec
(
volumeToMount
.
VolumeSpec
)
var
volumeDeviceMounter
volume
.
DeviceMounter
if
deviceMountableVolumePlugin
!=
nil
{
volumeDeviceMounter
,
_
=
deviceMountableVolumePlugin
.
NewDeviceMounter
()
}
if
mountCheckError
!=
nil
{
return
volumeToMount
.
GenerateError
(
"MountVolume.MountOptionSupport check failed"
,
mountCheckError
)
}
var
fsGroup
*
int64
if
volumeToMount
.
Pod
.
Spec
.
SecurityContext
!=
nil
&&
volumeToMount
.
Pod
.
Spec
.
SecurityContext
.
FSGroup
!=
nil
{
fsGroup
=
volumeToMount
.
Pod
.
Spec
.
SecurityContext
.
FSGroup
}
// Get attacher, if possible
attachableVolumePlugin
,
_
:=
og
.
volumePluginMgr
.
FindAttachablePluginBySpec
(
volumeToMount
.
VolumeSpec
)
var
volumeAttacher
volume
.
Attacher
if
attachableVolumePlugin
!=
nil
{
volumeAttacher
,
_
=
attachableVolumePlugin
.
NewAttacher
()
}
// get deviceMounter, if possible
deviceMountableVolumePlugin
,
_
:=
og
.
volumePluginMgr
.
FindDeviceMountablePluginBySpec
(
volumeToMount
.
VolumeSpec
)
var
volumeDeviceMounter
volume
.
DeviceMounter
if
deviceMountableVolumePlugin
!=
nil
{
volumeDeviceMounter
,
_
=
deviceMountableVolumePlugin
.
NewDeviceMounter
()
}
var
fsGroup
*
int64
if
volumeToMount
.
Pod
.
Spec
.
SecurityContext
!=
nil
&&
volumeToMount
.
Pod
.
Spec
.
SecurityContext
.
FSGroup
!=
nil
{
fsGroup
=
volumeToMount
.
Pod
.
Spec
.
SecurityContext
.
FSGroup
}
mountVolumeFunc
:=
func
()
(
error
,
error
)
{
devicePath
:=
volumeToMount
.
DevicePath
if
volumeAttacher
!=
nil
{
// Wait for attachable volumes to finish attaching
...
...
@@ -536,7 +540,7 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
// resizeFileSystem will resize the file system if user has requested a resize of
// underlying persistent volume and is allowed to do so.
resizeSimpleError
,
resizeDetailedError
:=
og
.
resizeFileSystem
(
volumeToMount
,
devicePath
,
deviceMountPath
,
volumePlugin
.
GetPluginName
()
)
resizeSimpleError
,
resizeDetailedError
:=
og
.
resizeFileSystem
(
volumeToMount
,
devicePath
,
deviceMountPath
,
volumePlugin
Name
)
if
resizeSimpleError
!=
nil
||
resizeDetailedError
!=
nil
{
return
resizeSimpleError
,
resizeDetailedError
...
...
@@ -593,8 +597,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
return
volumetypes
.
GeneratedOperations
{
OperationFunc
:
mountVolumeFunc
,
EventRecorderFunc
:
eventRecorderFunc
,
CompleteFunc
:
util
.
OperationCompleteHook
(
util
.
GetFullQualifiedPluginNameForVolume
(
volumePlugin
.
GetPluginName
()
,
volumeToMount
.
VolumeSpec
),
"volume_mount"
),
}
,
nil
CompleteFunc
:
util
.
OperationCompleteHook
(
util
.
GetFullQualifiedPluginNameForVolume
(
volumePlugin
Name
,
volumeToMount
.
VolumeSpec
),
"volume_mount"
),
}
}
func
(
og
*
operationGenerator
)
resizeFileSystem
(
volumeToMount
VolumeToMount
,
devicePath
,
deviceMountPath
,
pluginName
string
)
(
simpleErr
,
detailedErr
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