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
d62afa85
Commit
d62afa85
authored
Mar 31, 2015
by
Deyuan Deng
Committed by
Deyuan Deng
Apr 01, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Abstract ismountpoint and use platform mounter for NFS volume
parent
2de37624
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
70 additions
and
92 deletions
+70
-92
fake.go
pkg/util/mount/fake.go
+17
-0
mount.go
pkg/util/mount/mount.go
+8
-8
mount_linux.go
pkg/util/mount/mount_linux.go
+22
-4
mount_unsupported.go
pkg/util/mount/mount_unsupported.go
+4
-0
mountpoint_unix.go
pkg/util/mount/mountpoint_unix.go
+0
-40
mountpoint_unsupported.go
pkg/util/mount/mountpoint_unsupported.go
+0
-28
empty_dir.go
pkg/volume/empty_dir/empty_dir.go
+2
-2
empty_dir_linux.go
pkg/volume/empty_dir/empty_dir_linux.go
+4
-2
empty_dir_unsupported.go
pkg/volume/empty_dir/empty_dir_unsupported.go
+5
-1
gce_pd.go
pkg/volume/gce_pd/gce_pd.go
+5
-5
gce_util.go
pkg/volume/gce_pd/gce_util.go
+1
-1
nfs_mount.go
pkg/volume/nfs/nfs_mount.go
+2
-1
No files found.
pkg/util/mount/fake.go
View file @
d62afa85
...
...
@@ -39,11 +39,19 @@ func (f *FakeMounter) ResetLog() {
}
func
(
f
*
FakeMounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
flags
uintptr
,
data
string
)
error
{
f
.
MountPoints
=
append
(
f
.
MountPoints
,
MountPoint
{
Device
:
source
,
Path
:
target
,
Type
:
fstype
})
f
.
Log
=
append
(
f
.
Log
,
FakeAction
{
Action
:
FakeActionMount
,
Target
:
target
,
Source
:
source
,
FSType
:
fstype
})
return
nil
}
func
(
f
*
FakeMounter
)
Unmount
(
target
string
,
flags
int
)
error
{
newMountpoints
:=
[]
MountPoint
{}
for
_
,
mp
:=
range
f
.
MountPoints
{
if
mp
.
Path
!=
target
{
newMountpoints
=
append
(
newMountpoints
,
MountPoint
{
Device
:
mp
.
Device
,
Path
:
mp
.
Path
,
Type
:
mp
.
Type
})
}
}
f
.
MountPoints
=
newMountpoints
f
.
Log
=
append
(
f
.
Log
,
FakeAction
{
Action
:
FakeActionUnmount
,
Target
:
target
})
return
nil
}
...
...
@@ -51,3 +59,12 @@ func (f *FakeMounter) Unmount(target string, flags int) error {
func
(
f
*
FakeMounter
)
List
()
([]
MountPoint
,
error
)
{
return
f
.
MountPoints
,
nil
}
func
(
f
*
FakeMounter
)
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
for
_
,
mp
:=
range
f
.
MountPoints
{
if
mp
.
Path
==
file
{
return
true
,
nil
}
}
return
false
,
nil
}
pkg/util/mount/mount.go
View file @
d62afa85
...
...
@@ -24,20 +24,15 @@ package mount
type
Interface
interface
{
// Mount wraps syscall.Mount().
Mount
(
source
string
,
target
string
,
fstype
string
,
flags
uintptr
,
data
string
)
error
// Umount wraps syscall.Mount().
Unmount
(
target
string
,
flags
int
)
error
// List returns a list of all mounted filesystems. This can be large.
// On some platforms, reading mounts is not guaranteed consistent (i.e.
// it could change between chunked reads). This is guaranteed to be
// consistent.
List
()
([]
MountPoint
,
error
)
}
// New returns a mount.Interface for the current system.
func
New
()
Interface
{
return
&
Mounter
{}
// IsMountPoint determines if a directory is a mountpoint.
IsMountPoint
(
file
string
)
(
bool
,
error
)
}
// This represents a single line in /proc/mounts or /etc/fstab.
...
...
@@ -50,7 +45,12 @@ type MountPoint struct {
Pass
int
}
// Examines /proc/mounts to find all other references to the device referenced
// New returns a mount.Interface for the current system.
func
New
()
Interface
{
return
&
Mounter
{}
}
// GetMountRefs finds all other references to the device referenced
// by mountPath; returns a list of paths.
func
GetMountRefs
(
mounter
Interface
,
mountPath
string
)
([]
string
,
error
)
{
mps
,
err
:=
mounter
.
List
()
...
...
pkg/util/mount/mount_linux.go
View file @
d62afa85
...
...
@@ -34,15 +34,16 @@ import (
const
FlagBind
=
syscall
.
MS_BIND
const
FlagReadOnly
=
syscall
.
MS_RDONLY
// Mounter implements mount.Interface for linux platform.
type
Mounter
struct
{}
//
W
raps syscall.Mount()
//
Mount w
raps syscall.Mount()
func
(
mounter
*
Mounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
flags
uintptr
,
data
string
)
error
{
glog
.
V
(
5
)
.
Infof
(
"Mounting %s %s %s %d %s"
,
source
,
target
,
fstype
,
flags
,
data
)
return
syscall
.
Mount
(
source
,
target
,
fstype
,
flags
,
data
)
}
//
W
raps syscall.Unmount()
//
Unmount w
raps syscall.Unmount()
func
(
mounter
*
Mounter
)
Unmount
(
target
string
,
flags
int
)
error
{
return
syscall
.
Unmount
(
target
,
flags
)
}
...
...
@@ -50,6 +51,7 @@ func (mounter *Mounter) Unmount(target string, flags int) error {
// How many times to retry for a consistent read of /proc/mounts.
const
maxListTries
=
3
// List returns a list of all mounted filesystems.
func
(
*
Mounter
)
List
()
([]
MountPoint
,
error
)
{
hash1
,
err
:=
readProcMounts
(
nil
)
if
err
!=
nil
{
...
...
@@ -71,11 +73,27 @@ func (*Mounter) List() ([]MountPoint, error) {
return
nil
,
fmt
.
Errorf
(
"failed to get a consistent snapshot of /proc/mounts after %d tries"
,
maxListTries
)
}
// IsMountPoint determines if a directory is a mountpoint, by comparing the device for the
// directory with the device for it's parent. If they are the same, it's not a mountpoint,
// if they're different, it is.
func
(
mounter
*
Mounter
)
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
stat
,
err
:=
os
.
Stat
(
file
)
if
err
!=
nil
{
return
false
,
err
}
rootStat
,
err
:=
os
.
Lstat
(
file
+
"/.."
)
if
err
!=
nil
{
return
false
,
err
}
// If the directory has the same device as parent, then it's not a mountpoint.
return
stat
.
Sys
()
.
(
*
syscall
.
Stat_t
)
.
Dev
!=
rootStat
.
Sys
()
.
(
*
syscall
.
Stat_t
)
.
Dev
,
nil
}
// As per the fstab man page.
const
expectedNumFieldsPerLine
=
6
//
Read /proc/mounts and produces a hash of the contents. If the out argumen
t
// is not nil, this fills it with MountPoint structs.
//
readProcMounts reads /proc/mounts and produces a hash of the contents. If the ou
t
//
argument
is not nil, this fills it with MountPoint structs.
func
readProcMounts
(
out
*
[]
MountPoint
)
(
uint32
,
error
)
{
file
,
err
:=
os
.
Open
(
"/proc/mounts"
)
if
err
!=
nil
{
...
...
pkg/util/mount/mount_unsupported.go
View file @
d62afa85
...
...
@@ -34,3 +34,7 @@ func (mounter *Mounter) Unmount(target string, flags int) error {
func
(
mounter
*
Mounter
)
List
()
([]
MountPoint
,
error
)
{
return
[]
MountPoint
{},
nil
}
func
(
mounter
*
Mounter
)
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
return
false
,
nil
}
pkg/util/mount/mountpoint_unix.go
deleted
100644 → 0
View file @
2de37624
// +build !windows
/*
Copyright 2014 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package
mount
import
(
"os"
"syscall"
)
// Determine if a directory is a mountpoint, by comparing the device for the directory
// with the device for it's parent. If they are the same, it's not a mountpoint, if they're
// different, it is.
func
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
stat
,
err
:=
os
.
Stat
(
file
)
if
err
!=
nil
{
return
false
,
err
}
rootStat
,
err
:=
os
.
Lstat
(
file
+
"/.."
)
if
err
!=
nil
{
return
false
,
err
}
// If the directory has the same device as parent, then it's not a mountpoint.
return
stat
.
Sys
()
.
(
*
syscall
.
Stat_t
)
.
Dev
!=
rootStat
.
Sys
()
.
(
*
syscall
.
Stat_t
)
.
Dev
,
nil
}
pkg/util/mount/mountpoint_unsupported.go
deleted
100644 → 0
View file @
2de37624
// +build windows
/*
Copyright 2014 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package
mount
import
(
"fmt"
)
// Dummy implementation for Windows
func
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
return
false
,
fmt
.
Errorf
(
"unimplemented"
)
}
pkg/volume/empty_dir/empty_dir.go
View file @
d62afa85
...
...
@@ -82,7 +82,7 @@ func (plugin *emptyDirPlugin) CanSupport(spec *api.Volume) bool {
func
(
plugin
*
emptyDirPlugin
)
NewBuilder
(
spec
*
api
.
Volume
,
podRef
*
api
.
ObjectReference
)
(
volume
.
Builder
,
error
)
{
// Inject real implementations here, test through the internal function.
return
plugin
.
newBuilderInternal
(
spec
,
podRef
,
plugin
.
mounter
,
&
realMountDetector
{})
return
plugin
.
newBuilderInternal
(
spec
,
podRef
,
plugin
.
mounter
,
&
realMountDetector
{
plugin
.
mounter
})
}
func
(
plugin
*
emptyDirPlugin
)
newBuilderInternal
(
spec
*
api
.
Volume
,
podRef
*
api
.
ObjectReference
,
mounter
mount
.
Interface
,
mountDetector
mountDetector
)
(
volume
.
Builder
,
error
)
{
...
...
@@ -107,7 +107,7 @@ func (plugin *emptyDirPlugin) newBuilderInternal(spec *api.Volume, podRef *api.O
func
(
plugin
*
emptyDirPlugin
)
NewCleaner
(
volName
string
,
podUID
types
.
UID
)
(
volume
.
Cleaner
,
error
)
{
// Inject real implementations here, test through the internal function.
return
plugin
.
newCleanerInternal
(
volName
,
podUID
,
plugin
.
mounter
,
&
realMountDetector
{})
return
plugin
.
newCleanerInternal
(
volName
,
podUID
,
plugin
.
mounter
,
&
realMountDetector
{
plugin
.
mounter
})
}
func
(
plugin
*
emptyDirPlugin
)
newCleanerInternal
(
volName
string
,
podUID
types
.
UID
,
mounter
mount
.
Interface
,
mountDetector
mountDetector
)
(
volume
.
Cleaner
,
error
)
{
...
...
pkg/volume/empty_dir/empty_dir_linux.go
View file @
d62afa85
...
...
@@ -27,10 +27,12 @@ import (
const
linuxTmpfsMagic
=
0x01021994
// realMountDetector implements mountDetector in terms of syscalls.
type
realMountDetector
struct
{}
type
realMountDetector
struct
{
mounter
mount
.
Interface
}
func
(
m
*
realMountDetector
)
GetMountMedium
(
path
string
)
(
storageMedium
,
bool
,
error
)
{
isMnt
,
err
:=
m
ount
.
IsMountPoint
(
path
)
isMnt
,
err
:=
m
.
mounter
.
IsMountPoint
(
path
)
if
err
!=
nil
{
return
0
,
false
,
fmt
.
Errorf
(
"IsMountPoint(%q): %v"
,
path
,
err
)
}
...
...
pkg/volume/empty_dir/empty_dir_unsupported.go
View file @
d62afa85
...
...
@@ -18,8 +18,12 @@ limitations under the License.
package
empty_dir
import
"github.com/GoogleCloudPlatform/kubernetes/pkg/util/mount"
// realMountDetector pretends to implement mediumer.
type
realMountDetector
struct
{}
type
realMountDetector
struct
{
mounter
mount
.
Interface
}
func
(
m
*
realMountDetector
)
GetMountMedium
(
path
string
)
(
storageMedium
,
bool
,
error
)
{
return
mediumUnknown
,
false
,
nil
...
...
pkg/volume/gce_pd/gce_pd.go
View file @
d62afa85
...
...
@@ -183,7 +183,7 @@ func (pd *gcePersistentDisk) SetUpAt(dir string) error {
}
// TODO: handle failed mounts here.
mountpoint
,
err
:=
mount
.
IsMountPoint
(
dir
)
mountpoint
,
err
:=
pd
.
mounter
.
IsMountPoint
(
dir
)
glog
.
V
(
4
)
.
Infof
(
"PersistentDisk set up: %s %v %v"
,
dir
,
mountpoint
,
err
)
if
err
!=
nil
&&
!
os
.
IsNotExist
(
err
)
{
return
err
...
...
@@ -211,7 +211,7 @@ func (pd *gcePersistentDisk) SetUpAt(dir string) error {
// Perform a bind mount to the full path to allow duplicate mounts of the same PD.
err
=
pd
.
mounter
.
Mount
(
globalPDPath
,
dir
,
""
,
mount
.
FlagBind
|
flags
,
""
)
if
err
!=
nil
{
mountpoint
,
mntErr
:=
mount
.
IsMountPoint
(
dir
)
mountpoint
,
mntErr
:=
pd
.
mounter
.
IsMountPoint
(
dir
)
if
mntErr
!=
nil
{
glog
.
Errorf
(
"isMountpoint check failed: %v"
,
mntErr
)
return
err
...
...
@@ -221,7 +221,7 @@ func (pd *gcePersistentDisk) SetUpAt(dir string) error {
glog
.
Errorf
(
"Failed to unmount: %v"
,
mntErr
)
return
err
}
mountpoint
,
mntErr
:=
mount
.
IsMountPoint
(
dir
)
mountpoint
,
mntErr
:=
pd
.
mounter
.
IsMountPoint
(
dir
)
if
mntErr
!=
nil
{
glog
.
Errorf
(
"isMountpoint check failed: %v"
,
mntErr
)
return
err
...
...
@@ -262,7 +262,7 @@ func (pd *gcePersistentDisk) TearDown() error {
// Unmounts the bind mount, and detaches the disk only if the PD
// resource was the last reference to that disk on the kubelet.
func
(
pd
*
gcePersistentDisk
)
TearDownAt
(
dir
string
)
error
{
mountpoint
,
err
:=
mount
.
IsMountPoint
(
dir
)
mountpoint
,
err
:=
pd
.
mounter
.
IsMountPoint
(
dir
)
if
err
!=
nil
{
return
err
}
...
...
@@ -287,7 +287,7 @@ func (pd *gcePersistentDisk) TearDownAt(dir string) error {
return
err
}
}
mountpoint
,
mntErr
:=
mount
.
IsMountPoint
(
dir
)
mountpoint
,
mntErr
:=
pd
.
mounter
.
IsMountPoint
(
dir
)
if
mntErr
!=
nil
{
glog
.
Errorf
(
"isMountpoint check failed: %v"
,
mntErr
)
return
err
...
...
pkg/volume/gce_pd/gce_util.go
View file @
d62afa85
...
...
@@ -68,7 +68,7 @@ func (util *GCEDiskUtil) AttachAndMountDisk(pd *gcePersistentDisk, globalPDPath
}
// Only mount the PD globally once.
mountpoint
,
err
:=
mount
.
IsMountPoint
(
globalPDPath
)
mountpoint
,
err
:=
pd
.
mounter
.
IsMountPoint
(
globalPDPath
)
if
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
if
err
:=
os
.
MkdirAll
(
globalPDPath
,
0750
);
err
!=
nil
{
...
...
pkg/volume/nfs/nfs_mount.go
View file @
d62afa85
...
...
@@ -67,5 +67,6 @@ func (mounter *nfsMounter) List() ([]mount.MountPoint, error) {
}
func
(
mounter
*
nfsMounter
)
IsMountPoint
(
dir
string
)
(
bool
,
error
)
{
return
mount
.
IsMountPoint
(
dir
)
isMounter
:=
mount
.
New
()
return
isMounter
.
IsMountPoint
(
dir
)
}
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