forked from LaconicNetwork/kompose
added more e2e, more tests
fallback to skip volume mount and log warning when path cannot be resolved, as /sys, /root, /var/lib/docker in e2e TestMultipleContainersInPod directory /data replaced with /data-dir Signed-off-by: jose luis <2064537+sosan@users.noreply.github.com>
This commit is contained in:
@@ -989,14 +989,18 @@ func reformatSecretConfigUnderscoreWithDash(secretConfig types.ServiceSecretConf
|
||||
// isConfigFile checks if the given filePath should be used as a configMap
|
||||
// if dir is not empty, withindir are treated as cofigmaps
|
||||
// if it's configMap, mount readonly as default
|
||||
func isConfigFile(filePath string) (useConfigMap bool, readonly bool) {
|
||||
if strings.HasSuffix(filePath, ".sock") {
|
||||
func isConfigFile(filePath string) (useConfigMap bool, readonly bool, skip bool) {
|
||||
if filePath == "" || strings.HasSuffix(filePath, ".sock") {
|
||||
skip = true
|
||||
return
|
||||
}
|
||||
|
||||
fi, err := os.Stat(filePath)
|
||||
if err != nil {
|
||||
log.Warnf("Failed to check if the directory is empty: %v", err)
|
||||
log.Warnf("File don't exist or failed to check if the directory is empty: %v", err)
|
||||
// dir/file not exist
|
||||
// here not assigned skip to true,
|
||||
// maybe dont want to skip
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1004,26 +1008,36 @@ func isConfigFile(filePath string) (useConfigMap bool, readonly bool) {
|
||||
isDirEmpty, err := checkIsEmptyDir(filePath)
|
||||
if err != nil {
|
||||
log.Warnf("Failed to check if the directory is empty: %v", err)
|
||||
skip = true
|
||||
return
|
||||
}
|
||||
|
||||
if isDirEmpty {
|
||||
return false, false
|
||||
return
|
||||
}
|
||||
}
|
||||
return true, true
|
||||
return true, true, skip
|
||||
}
|
||||
|
||||
// checkIsEmptyDir checks if filepath is empty
|
||||
func checkIsEmptyDir(filePath string) (bool, error) {
|
||||
entries, err := os.ReadDir(filePath)
|
||||
files, err := os.ReadDir(filePath)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if len(entries) == 0 {
|
||||
if len(files) == 0 {
|
||||
return true, err
|
||||
}
|
||||
return false, err
|
||||
for _, file := range files {
|
||||
if !file.IsDir() {
|
||||
return false, nil
|
||||
}
|
||||
_, err := checkIsEmptyDir(file.Name())
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// setVolumeAccessMode sets the access mode for a volume based on the mode string
|
||||
|
||||
@@ -817,7 +817,17 @@ func Test_isConfigFile(t *testing.T) {
|
||||
args args
|
||||
wantUseConfigMap bool
|
||||
wantReadonly bool
|
||||
wantSkip bool
|
||||
}{
|
||||
{
|
||||
name: "dir not empty",
|
||||
args: args{
|
||||
filePath: "../../../script/test/fixtures/configmap-file-configs/certs",
|
||||
},
|
||||
wantUseConfigMap: true,
|
||||
wantReadonly: true,
|
||||
wantSkip: false,
|
||||
},
|
||||
{
|
||||
name: "sock",
|
||||
args: args{
|
||||
@@ -825,6 +835,7 @@ func Test_isConfigFile(t *testing.T) {
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: true,
|
||||
},
|
||||
{
|
||||
name: "cannot resolve filepath",
|
||||
@@ -833,6 +844,7 @@ func Test_isConfigFile(t *testing.T) {
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: false,
|
||||
},
|
||||
{
|
||||
name: "file cert",
|
||||
@@ -841,25 +853,66 @@ func Test_isConfigFile(t *testing.T) {
|
||||
},
|
||||
wantUseConfigMap: true,
|
||||
wantReadonly: true,
|
||||
wantSkip: false,
|
||||
},
|
||||
{
|
||||
name: "dir not empty",
|
||||
name: "docker sock",
|
||||
args: args{
|
||||
filePath: "../../../script/test/fixtures/configmap-file-configs/certs",
|
||||
filePath: "/var/run/docker.sock",
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: true,
|
||||
},
|
||||
{
|
||||
name: "dir sys",
|
||||
args: args{
|
||||
filePath: "/sys",
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: true,
|
||||
},
|
||||
{
|
||||
name: "dir root",
|
||||
args: args{
|
||||
filePath: "/root",
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: true,
|
||||
},
|
||||
{
|
||||
name: "docker var lib",
|
||||
args: args{
|
||||
filePath: "/var/lib/docker",
|
||||
},
|
||||
wantUseConfigMap: false,
|
||||
wantReadonly: false,
|
||||
wantSkip: true,
|
||||
},
|
||||
{
|
||||
name: "file from 3 levels",
|
||||
args: args{
|
||||
filePath: "../../../script/test/fixtures/configmap-file-configs/certs-level1/certs-level2/certs-level3/cert2.pem",
|
||||
},
|
||||
wantUseConfigMap: true,
|
||||
wantReadonly: true,
|
||||
wantSkip: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
gotUseConfigMap, gotReadonly := isConfigFile(tt.args.filePath)
|
||||
gotUseConfigMap, gotReadonly, gotSkip := isConfigFile(tt.args.filePath)
|
||||
if gotUseConfigMap != tt.wantUseConfigMap {
|
||||
t.Errorf("isConfigFile() gotUseConfigMap = %v, want %v", gotUseConfigMap, tt.wantUseConfigMap)
|
||||
}
|
||||
if gotReadonly != tt.wantReadonly {
|
||||
t.Errorf("isConfigFile() gotReadonly = %v, want %v", gotReadonly, tt.wantReadonly)
|
||||
}
|
||||
if gotSkip != tt.wantSkip {
|
||||
t.Errorf("isConfigFile() gotSkip = %v, want %v", gotSkip, tt.wantSkip)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -951,13 +951,22 @@ func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) (
|
||||
volumes = append(volumes, secretsVolumes...)
|
||||
|
||||
var count int
|
||||
skip := false
|
||||
//iterating over array of `Vols` struct as it contains all necessary information about volumes
|
||||
for _, volume := range service.Volumes {
|
||||
// check if ro/rw mode is defined, default rw
|
||||
readonly := len(volume.Mode) > 0 && (volume.Mode == "ro" || volume.Mode == "rox")
|
||||
mountHost := volume.Host
|
||||
if mountHost == "" {
|
||||
mountHost = volume.MountPath
|
||||
}
|
||||
// return useconfigmap and readonly,
|
||||
// not used asigned readonly because dont break e2e
|
||||
useConfigMap, _ = isConfigFile(volume.Host)
|
||||
useConfigMap, _, skip = isConfigFile(mountHost)
|
||||
if skip {
|
||||
log.Warnf("Skip file in path %s ", volume.Host)
|
||||
continue
|
||||
}
|
||||
if volume.VolumeName == "" {
|
||||
if useEmptyVolumes {
|
||||
volumeName = strings.Replace(volume.PVCName, "claim", "empty", 1)
|
||||
|
||||
@@ -757,7 +757,7 @@ func TestMultipleContainersInPod(t *testing.T) {
|
||||
config.Volumes = []kobject.Volumes{
|
||||
{
|
||||
VolumeName: "mountVolume",
|
||||
MountPath: "/data",
|
||||
MountPath: "/data-dir",
|
||||
},
|
||||
}
|
||||
return config
|
||||
|
||||
Reference in New Issue
Block a user