Skip to content

Commit

Permalink
Add variable for global flags to runlabel
Browse files Browse the repository at this point in the history
use $GLOBAL_OPTS to pass global flags to the runlabel command.

Signed-off-by: Qi Wang <qiwan@redhat.com>
  • Loading branch information
QiWang19 committed Apr 16, 2019
1 parent 6f3f026 commit 19859cb
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 11 deletions.
4 changes: 3 additions & 1 deletion cmd/podman/runlabel.go
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/pkg/util"
"github.com/containers/libpod/utils"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -144,7 +145,8 @@ func runlabelCmd(c *cliconfig.RunlabelValues) error {
return errors.Errorf("%s does not have a label of %s", runlabelImage, label)
}

cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, c.Name, opts, extraArgs)
globalOpts := util.GetGlobalOpts(c)
cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, c.Name, opts, extraArgs, globalOpts)
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/podman/shared/container.go
Expand Up @@ -882,7 +882,7 @@ func GetRunlabel(label string, runlabelImage string, ctx context.Context, runtim
}

// GenerateRunlabelCommand generates the command that will eventually be execucted by podman
func GenerateRunlabelCommand(runLabel, imageName, name string, opts map[string]string, extraArgs []string) ([]string, []string, error) {
func GenerateRunlabelCommand(runLabel, imageName, name string, opts map[string]string, extraArgs []string, globalOpts string) ([]string, []string, error) {
// If no name is provided, we use the image's basename instead
if name == "" {
baseName, err := image.GetImageBaseName(imageName)
Expand All @@ -895,7 +895,7 @@ func GenerateRunlabelCommand(runLabel, imageName, name string, opts map[string]s
if len(extraArgs) > 0 {
runLabel = fmt.Sprintf("%s %s", runLabel, strings.Join(extraArgs, " "))
}
cmd, err := GenerateCommand(runLabel, imageName, name)
cmd, err := GenerateCommand(runLabel, imageName, name, globalOpts)
if err != nil {
return nil, nil, errors.Wrapf(err, "unable to generate command")
}
Expand Down
6 changes: 5 additions & 1 deletion cmd/podman/shared/funcs.go
Expand Up @@ -41,7 +41,7 @@ func substituteCommand(cmd string) (string, error) {
}

// GenerateCommand takes a label (string) and converts it to an executable command
func GenerateCommand(command, imageName, name string) ([]string, error) {
func GenerateCommand(command, imageName, name, globalOpts string) ([]string, error) {
var (
newCommand []string
)
Expand All @@ -60,6 +60,8 @@ func GenerateCommand(command, imageName, name string) ([]string, error) {
}
newCommand = append(newCommand, prog)

fmt.Println(strings.Join(cmd, ","))

for _, arg := range cmd[1:] {
var newArg string
switch arg {
Expand All @@ -79,6 +81,8 @@ func GenerateCommand(command, imageName, name string) ([]string, error) {
newArg = fmt.Sprintf("NAME=%s", name)
case "$NAME":
newArg = name
case "$GLOBAL_OPTS":
newArg = globalOpts
default:
newArg = arg
}
Expand Down
12 changes: 6 additions & 6 deletions cmd/podman/shared/funcs_test.go
Expand Up @@ -20,7 +20,7 @@ var (
func TestGenerateCommand(t *testing.T) {
inputCommand := "docker run -it --name NAME -e NAME=NAME -e IMAGE=IMAGE IMAGE echo \"hello world\""
correctCommand := "/proc/self/exe run -it --name bar -e NAME=bar -e IMAGE=foo foo echo hello world"
newCommand, err := GenerateCommand(inputCommand, "foo", "bar")
newCommand, err := GenerateCommand(inputCommand, "foo", "bar", "")
assert.Nil(t, err)
assert.Equal(t, "hello world", newCommand[11])
assert.Equal(t, correctCommand, strings.Join(newCommand, " "))
Expand Down Expand Up @@ -83,7 +83,7 @@ func TestGenerateCommandCheckSubstitution(t *testing.T) {
}

for _, test := range tests {
newCommand, err := GenerateCommand(test.input, "foo", "bar")
newCommand, err := GenerateCommand(test.input, "foo", "bar", "")
if test.shouldFail {
assert.NotNil(t, err)
} else {
Expand All @@ -96,30 +96,30 @@ func TestGenerateCommandCheckSubstitution(t *testing.T) {
func TestGenerateCommandPath(t *testing.T) {
inputCommand := "docker run -it --name NAME -e NAME=NAME -e IMAGE=IMAGE IMAGE echo install"
correctCommand := "/proc/self/exe run -it --name bar -e NAME=bar -e IMAGE=foo foo echo install"
newCommand, _ := GenerateCommand(inputCommand, "foo", "bar")
newCommand, _ := GenerateCommand(inputCommand, "foo", "bar", "")
assert.Equal(t, correctCommand, strings.Join(newCommand, " "))
}

func TestGenerateCommandNoSetName(t *testing.T) {
inputCommand := "docker run -it --name NAME -e NAME=NAME -e IMAGE=IMAGE IMAGE echo install"
correctCommand := "/proc/self/exe run -it --name foo -e NAME=foo -e IMAGE=foo foo echo install"
newCommand, err := GenerateCommand(inputCommand, "foo", "")
newCommand, err := GenerateCommand(inputCommand, "foo", "", "")
assert.Nil(t, err)
assert.Equal(t, correctCommand, strings.Join(newCommand, " "))
}

func TestGenerateCommandNoName(t *testing.T) {
inputCommand := "docker run -it -e IMAGE=IMAGE IMAGE echo install"
correctCommand := "/proc/self/exe run -it -e IMAGE=foo foo echo install"
newCommand, err := GenerateCommand(inputCommand, "foo", "")
newCommand, err := GenerateCommand(inputCommand, "foo", "", "")
assert.Nil(t, err)
assert.Equal(t, correctCommand, strings.Join(newCommand, " "))
}

func TestGenerateCommandAlreadyPodman(t *testing.T) {
inputCommand := "podman run -it --name NAME -e NAME=NAME -e IMAGE=IMAGE IMAGE echo install"
correctCommand := "/proc/self/exe run -it --name bar -e NAME=bar -e IMAGE=foo foo echo install"
newCommand, err := GenerateCommand(inputCommand, "foo", "bar")
newCommand, err := GenerateCommand(inputCommand, "foo", "bar", "")
assert.Nil(t, err)
assert.Equal(t, correctCommand, strings.Join(newCommand, " "))
}
Expand Down
65 changes: 65 additions & 0 deletions pkg/util/utils.go
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/BurntSushi/toml"
"github.com/containers/image/types"
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/storage"
"github.com/containers/storage/pkg/idtools"
Expand Down Expand Up @@ -324,3 +325,67 @@ func ParseInputTime(inputTime string) (time.Time, error) {
}
return time.Now().Add(-duration), nil
}

// GetGlobalOpts checks all global flags and generates the command string
func GetGlobalOpts(c *cliconfig.RunlabelValues) string {
var optsCommand []string
if c.Flag("cgroup-manager").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--cgroup-manager %s", c.GlobalFlags.CGroupManager))
}
if c.Flag("cni-config-dir").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--cni-config-dir %s", c.GlobalFlags.CniConfigDir))
}
if c.Flag("conmon").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--conmon %s", c.GlobalFlags.ConmonPath))
}
if c.Flag("default-mounts-file").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--default-mounts-file %s", c.GlobalFlags.DefaultMountsFile))
}
if c.Flag("hooks-dir").Changed {
for _, dir := range c.GlobalFlags.HooksDir {
optsCommand = append(optsCommand, fmt.Sprintf("--hooks-dir %s", dir))
}
}
if c.Flag("namespace").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--namespace %s", c.GlobalFlags.Namespace))
}
if c.Flag("root").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--root %s", c.GlobalFlags.Root))
}
if c.Flag("runroot").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--runroot %s", c.GlobalFlags.Runroot))
}
if c.Flag("runtime").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--runtime %s", c.GlobalFlags.Runtime))
}
if c.Flag("storage-driver").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--storage-driver %s", c.GlobalFlags.StorageDriver))
}
if c.Flag("storage-opt").Changed {
for _, opt := range c.GlobalFlags.StorageOpts {
optsCommand = append(optsCommand, fmt.Sprintf("--storage-opt %s", opt))
}
}
if c.Flag("syslog").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--syslog %t", c.GlobalFlags.Syslog))
}
if c.Flag("trace").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--trace %t", c.GlobalFlags.Trace))
}
if c.Flag("network-cmd-path").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--network-cmd-path %s", c.GlobalFlags.NetworkCmdPath))
}
if c.Flag("config").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--config %s", c.GlobalFlags.Config))
}
if c.Flag("cpu-profile").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--cpu-profile %s", c.GlobalFlags.CpuProfile))
}
if c.Flag("log-level").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--log-level %s", c.GlobalFlags.LogLevel))
}
if c.Flag("tmpdir").Changed {
optsCommand = append(optsCommand, fmt.Sprintf("--tmpdir %s", c.GlobalFlags.TmpDir))
}
return strings.Join(optsCommand, " ")
}
2 changes: 1 addition & 1 deletion pkg/varlinkapi/images.go
Expand Up @@ -727,7 +727,7 @@ func (i *LibpodAPI) ContainerRunlabel(call iopodman.VarlinkCall, input iopodman.
return call.ReplyErrorOccurred(fmt.Sprintf("%s does not contain the label %s", input.Image, input.Label))
}

cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, input.Name, input.Opts, input.ExtraArgs)
cmd, env, err := shared.GenerateRunlabelCommand(runLabel, imageName, input.Name, input.Opts, input.ExtraArgs, "")
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}
Expand Down
18 changes: 18 additions & 0 deletions test/e2e/runlabel_test.go
Expand Up @@ -18,6 +18,11 @@ var LsDockerfile = `
FROM alpine:latest
LABEL RUN ls -la`

var GlobalDockerfile = `
FROM alpine:latest
LABEL RUN echo \$GLOBAL_OPTS
`

var _ = Describe("podman container runlabel", func() {
var (
tempdir string
Expand Down Expand Up @@ -78,4 +83,17 @@ var _ = Describe("podman container runlabel", func() {
Expect(result.ExitCode()).ToNot(Equal(0))

})

It("podman container runlabel global options", func() {
image := "podman-global-test:ls"
podmanTest.BuildImage(GlobalDockerfile, image, "false")
result := podmanTest.Podman([]string{"--syslog", "--log-level", "debug", "container", "runlabel", "RUN", image})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))

Expect(result.OutputToString()).To(ContainSubstring("--syslog true --log-level debug"))
result = podmanTest.Podman([]string{"rmi", image})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
})
})

0 comments on commit 19859cb

Please sign in to comment.