summaryrefslogtreecommitdiff
path: root/cmd/kpod
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/kpod')
-rw-r--r--cmd/kpod/create.go7
-rw-r--r--cmd/kpod/create_cli.go18
-rw-r--r--cmd/kpod/create_cli_test.go99
-rw-r--r--cmd/kpod/run.go2
-rw-r--r--cmd/kpod/spec.go3
-rw-r--r--cmd/kpod/spec_test.go38
6 files changed, 154 insertions, 13 deletions
diff --git a/cmd/kpod/create.go b/cmd/kpod/create.go
index 9d4d08b08..caee0c7f0 100644
--- a/cmd/kpod/create.go
+++ b/cmd/kpod/create.go
@@ -170,7 +170,7 @@ func createCmd(c *cli.Context) error {
if err != nil {
return err
}
- options, err := createConfig.GetContainerCreateOptions(c)
+ options, err := createConfig.GetContainerCreateOptions()
if err != nil {
return errors.Wrapf(err, "unable to parse new container options")
}
@@ -252,13 +252,12 @@ func parseCreateOpts(c *cli.Context, runtime *libpod.Runtime) (*createConfig, er
}
// LABEL VARIABLES
- labels, err := getAllLabels(c)
+ labels, err := getAllLabels(c.StringSlice("label-file"), c.StringSlice("labels"))
if err != nil {
return &createConfig{}, errors.Wrapf(err, "unable to process labels")
}
// ENVIRONMENT VARIABLES
- // TODO where should env variables be verified to be x=y format
- env, err := getAllEnvironmentVariables(c)
+ env, err := getAllEnvironmentVariables(c.StringSlice("env-file"), c.StringSlice("env"))
if err != nil {
return &createConfig{}, errors.Wrapf(err, "unable to process environment variables")
}
diff --git a/cmd/kpod/create_cli.go b/cmd/kpod/create_cli.go
index 996155ba0..eaad46591 100644
--- a/cmd/kpod/create_cli.go
+++ b/cmd/kpod/create_cli.go
@@ -4,13 +4,12 @@ import (
"strings"
"github.com/pkg/errors"
- "github.com/urfave/cli"
)
-func getAllLabels(cli *cli.Context) (map[string]string, error) {
+func getAllLabels(labelFile, inputLabels []string) (map[string]string, error) {
var labelValues []string
labels := make(map[string]string)
- labelValues, labelErr := readKVStrings(cli.StringSlice("label-file"), cli.StringSlice("label"))
+ labelValues, labelErr := readKVStrings(labelFile, inputLabels)
if labelErr != nil {
return labels, errors.Wrapf(labelErr, "unable to process labels from --label and label-file")
}
@@ -18,7 +17,7 @@ func getAllLabels(cli *cli.Context) (map[string]string, error) {
if len(labelValues) > 0 {
for _, i := range labelValues {
spliti := strings.Split(i, "=")
- if len(spliti) > 1 {
+ if len(spliti) < 2 {
return labels, errors.Errorf("labels must be in KEY=VALUE format: %s is invalid", i)
}
labels[spliti[0]] = spliti[1]
@@ -27,8 +26,8 @@ func getAllLabels(cli *cli.Context) (map[string]string, error) {
return labels, nil
}
-func getAllEnvironmentVariables(cli *cli.Context) ([]string, error) {
- env, err := readKVStrings(cli.StringSlice("env-file"), cli.StringSlice("env"))
+func getAllEnvironmentVariables(envFiles, envInput []string) ([]string, error) {
+ env, err := readKVStrings(envFiles, envInput)
if err != nil {
return []string{}, errors.Wrapf(err, "unable to process variables from --env and --env-file")
}
@@ -36,6 +35,13 @@ func getAllEnvironmentVariables(cli *cli.Context) ([]string, error) {
if len(env) == 0 {
env = append(env, defaultEnvVariables...)
}
+ // Each environment variable must be in the K=V format
+ for _, i := range env {
+ spliti := strings.Split(i, "=")
+ if len(spliti) != 2 {
+ return env, errors.Errorf("environment variables must be in the format KEY=VALUE: %s is invalid", i)
+ }
+ }
return env, nil
}
diff --git a/cmd/kpod/create_cli_test.go b/cmd/kpod/create_cli_test.go
new file mode 100644
index 000000000..af5c5afae
--- /dev/null
+++ b/cmd/kpod/create_cli_test.go
@@ -0,0 +1,99 @@
+package main
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+var (
+ Var1 = []string{"ONE=1", "TWO=2"}
+)
+
+func createTmpFile(content []byte) (string, error) {
+ tmpfile, err := ioutil.TempFile(os.TempDir(), "unittest")
+ if err != nil {
+ return "", err
+ }
+
+ if _, err := tmpfile.Write(content); err != nil {
+ return "", err
+
+ }
+ if err := tmpfile.Close(); err != nil {
+ return "", err
+ }
+ return tmpfile.Name(), nil
+}
+
+func TestConvertStringSliceToMap(t *testing.T) {
+ strSlice := []string{"BLAU=BLUE", "GELB=YELLOW"}
+ result, _ := convertStringSliceToMap(strSlice, "=")
+ assert.Equal(t, result["BLAU"], "BLUE")
+}
+
+func TestConvertStringSliceToMapBadData(t *testing.T) {
+ strSlice := []string{"BLAU=BLUE", "GELB^YELLOW"}
+ _, err := convertStringSliceToMap(strSlice, "=")
+ assert.Error(t, err)
+}
+
+func TestGetAllLabels(t *testing.T) {
+ fileLabels := []string{}
+ labels, _ := getAllLabels(fileLabels, Var1)
+ assert.Equal(t, len(labels), 2)
+}
+
+func TestGetAllLabelsBadKeyValue(t *testing.T) {
+ inLabels := []string{"ONE1", "TWO=2"}
+ fileLabels := []string{}
+ _, err := getAllLabels(fileLabels, inLabels)
+ assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllLabelsBadLabelFile(t *testing.T) {
+ fileLabels := []string{"/foobar5001/be"}
+ _, err := getAllLabels(fileLabels, Var1)
+ assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllLabelsFile(t *testing.T) {
+ content := []byte("THREE=3")
+ tFile, err := createTmpFile(content)
+ defer os.Remove(tFile)
+ assert.NoError(t, err)
+ fileLabels := []string{tFile}
+ result, _ := getAllLabels(fileLabels, Var1)
+ assert.Equal(t, len(result), 3)
+}
+
+func TestGetAllEnvironmentVariables(t *testing.T) {
+ fileEnvs := []string{}
+ result, _ := getAllEnvironmentVariables(fileEnvs, Var1)
+ assert.Equal(t, len(result), 2)
+}
+
+func TestGetAllEnvironmentVariablesBadKeyValue(t *testing.T) {
+ inEnvs := []string{"ONE1", "TWO=2"}
+ fileEnvs := []string{}
+ _, err := getAllEnvironmentVariables(fileEnvs, inEnvs)
+ assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllEnvironmentVariablesBadEnvFile(t *testing.T) {
+ fileEnvs := []string{"/foobar5001/be"}
+ _, err := getAllEnvironmentVariables(fileEnvs, Var1)
+ assert.Error(t, err, assert.AnError)
+}
+
+func TestGetAllEnvironmentVariablesFile(t *testing.T) {
+ content := []byte("THREE=3")
+ tFile, err := createTmpFile(content)
+ defer os.Remove(tFile)
+ assert.NoError(t, err)
+ fileEnvs := []string{tFile}
+ result, _ := getAllEnvironmentVariables(fileEnvs, Var1)
+ assert.Equal(t, len(result), 3)
+}
diff --git a/cmd/kpod/run.go b/cmd/kpod/run.go
index cefa1d2d0..904977940 100644
--- a/cmd/kpod/run.go
+++ b/cmd/kpod/run.go
@@ -63,7 +63,7 @@ func runCmd(c *cli.Context) error {
}
logrus.Debug("imageID is ", imageID)
- options, err := createConfig.GetContainerCreateOptions(c)
+ options, err := createConfig.GetContainerCreateOptions()
if err != nil {
return errors.Wrapf(err, "unable to parse new container options")
}
diff --git a/cmd/kpod/spec.go b/cmd/kpod/spec.go
index 6041f301a..54a532803 100644
--- a/cmd/kpod/spec.go
+++ b/cmd/kpod/spec.go
@@ -12,7 +12,6 @@ import (
"github.com/projectatomic/libpod/libpod"
ann "github.com/projectatomic/libpod/pkg/annotations"
"github.com/sirupsen/logrus"
- "github.com/urfave/cli"
"golang.org/x/sys/unix"
)
@@ -485,7 +484,7 @@ func (c *createConfig) GetTmpfsMounts() []spec.Mount {
return m
}
-func (c *createConfig) GetContainerCreateOptions(cli *cli.Context) ([]libpod.CtrCreateOption, error) {
+func (c *createConfig) GetContainerCreateOptions() ([]libpod.CtrCreateOption, error) {
var options []libpod.CtrCreateOption
// Uncomment after talking to mheon about unimplemented funcs
diff --git a/cmd/kpod/spec_test.go b/cmd/kpod/spec_test.go
new file mode 100644
index 000000000..c3de84324
--- /dev/null
+++ b/cmd/kpod/spec_test.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+ "reflect"
+ "testing"
+
+ spec "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestCreateConfig_GetVolumeMounts(t *testing.T) {
+ data := spec.Mount{
+ Destination: "/foobar",
+ Type: "bind",
+ Source: "foobar",
+ Options: []string{"ro", "rbind"},
+ }
+ config := createConfig{
+ volumes: []string{"foobar:/foobar:ro"},
+ }
+ specMount := config.GetVolumeMounts()
+ assert.True(t, reflect.DeepEqual(data, specMount[0]))
+}
+
+func TestCreateConfig_GetTmpfsMounts(t *testing.T) {
+ data := spec.Mount{
+ Destination: "/homer",
+ Type: "tmpfs",
+ Source: "tmpfs",
+ Options: []string{"rw", "size=787448k", "mode=1777"},
+ }
+ config := createConfig{
+ tmpfs: []string{"/homer:rw,size=787448k,mode=1777"},
+ }
+ tmpfsMount := config.GetTmpfsMounts()
+ assert.True(t, reflect.DeepEqual(data, tmpfsMount[0]))
+
+}