127 lines
2.3 KiB
Go
127 lines
2.3 KiB
Go
package file
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/golang/glog"
|
|
|
|
"k8s.io/kubernetes/pkg/util/filesystem"
|
|
)
|
|
|
|
// Filesystem is an interface that we can use to mock various filesystem operations
|
|
type Filesystem interface {
|
|
filesystem.Filesystem
|
|
}
|
|
|
|
// NewLocalFS implements Filesystem using same-named functions from "os" and "io/ioutil".
|
|
func NewLocalFS() (Filesystem, error) {
|
|
fs := filesystem.DefaultFs{}
|
|
|
|
err := initialize(false, fs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return fs, nil
|
|
}
|
|
|
|
// NewFakeFS creates an in-memory filesytem with all the required
|
|
// paths used by the ingress controller.
|
|
// This allows running test without polluting the local machine.
|
|
func NewFakeFS() (Filesystem, error) {
|
|
fs := filesystem.NewFakeFs()
|
|
|
|
err := initialize(true, fs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return fs, nil
|
|
}
|
|
|
|
// initialize creates the required directory structure and when
|
|
// runs as virtual filesystem it copies the local files to it
|
|
func initialize(isVirtual bool, fs Filesystem) error {
|
|
for _, directory := range directories {
|
|
err := fs.MkdirAll(directory, 0655)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if !isVirtual {
|
|
return nil
|
|
}
|
|
|
|
for _, file := range files {
|
|
f, err := fs.Create(file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = f.Write([]byte(""))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = f.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
err := fs.MkdirAll("/proc", 0655)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
glog.Info("Restoring generated (go-bindata) assets in virtual filesystem...")
|
|
for _, assetName := range AssetNames() {
|
|
err := restoreAsset("/", assetName, fs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// restoreAsset restores an asset under the given directory
|
|
func restoreAsset(dir, name string, fs Filesystem) error {
|
|
data, err := Asset(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
info, err := AssetInfo(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = fs.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
f, err := fs.Create(_filePath(dir, name))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = f.Write(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = f.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
//Missing info.Mode()
|
|
|
|
err = fs.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|