123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- Copyright 2019 The Kubernetes Authors.
- 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 subpath
- import "os"
- // Interface defines the set of methods all subpathers must implement
- type Interface interface {
- // CleanSubPaths removes any bind-mounts created by PrepareSafeSubpath in given
- // pod volume directory.
- CleanSubPaths(poodDir string, volumeName string) error
- // PrepareSafeSubpath does everything that's necessary to prepare a subPath
- // that's 1) inside given volumePath and 2) immutable after this call.
- //
- // newHostPath - location of prepared subPath. It should be used instead of
- // hostName when running the container.
- // cleanupAction - action to run when the container is running or it failed to start.
- //
- // CleanupAction must be called immediately after the container with given
- // subpath starts. On the other hand, Interface.CleanSubPaths must be called
- // when the pod finishes.
- PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error)
- // SafeMakeDir creates subdir within given base. It makes sure that the
- // created directory does not escape given base directory mis-using
- // symlinks. Note that the function makes sure that it creates the directory
- // somewhere under the base, nothing else. E.g. if the directory already
- // exists, it may exist outside of the base due to symlinks.
- // This method should be used if the directory to create is inside volume
- // that's under user control. User must not be able to use symlinks to
- // escape the volume to create directories somewhere else.
- SafeMakeDir(subdir string, base string, perm os.FileMode) error
- }
- // Subpath defines the attributes of a subpath
- type Subpath struct {
- // index of the VolumeMount for this container
- VolumeMountIndex int
- // Full path to the subpath directory on the host
- Path string
- // name of the volume that is a valid directory name.
- VolumeName string
- // Full path to the volume path
- VolumePath string
- // Path to the pod's directory, including pod UID
- PodDir string
- // Name of the container
- ContainerName string
- }
- // Compile time-check for all implementers of subpath interface
- var _ Interface = &subpath{}
- var _ Interface = &FakeSubpath{}
- // FakeSubpath is a subpather implementation for testing
- type FakeSubpath struct{}
- // PrepareSafeSubpath is a fake implementation of PrepareSafeSubpath. Always returns
- // newHostPath == subPath.Path
- func (fs *FakeSubpath) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) {
- return subPath.Path, nil, nil
- }
- // CleanSubPaths is a fake implementation of CleanSubPaths. It is a noop
- func (fs *FakeSubpath) CleanSubPaths(podDir string, volumeName string) error {
- return nil
- }
- // SafeMakeDir is a fake implementation of SafeMakeDir. It is a noop
- func (fs *FakeSubpath) SafeMakeDir(pathname string, base string, perm os.FileMode) error {
- return nil
- }
|