From 5da78632a18ebd16bca2c7c37bf1e32b518bca0c Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Tue, 20 Mar 2018 10:40:45 -0700 Subject: [PATCH] CMD command and unit tests --- pkg/commands/cmd.go | 63 ++++++++++++++++++++++++++++++++++++++++ pkg/commands/cmd_test.go | 61 ++++++++++++++++++++++++++++++++++++++ pkg/commands/commands.go | 2 ++ 3 files changed, 126 insertions(+) create mode 100644 pkg/commands/cmd.go create mode 100644 pkg/commands/cmd_test.go diff --git a/pkg/commands/cmd.go b/pkg/commands/cmd.go new file mode 100644 index 000000000..54e18e241 --- /dev/null +++ b/pkg/commands/cmd.go @@ -0,0 +1,63 @@ +/* +Copyright 2018 Google LLC + +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 commands + +import ( + "github.com/containers/image/manifest" + "github.com/docker/docker/builder/dockerfile/instructions" + "github.com/sirupsen/logrus" + "strings" +) + +type CmdCommand struct { + cmd *instructions.CmdCommand +} + +// ExecuteCommand executes the CMD command +// Argument handling is the same as RUN. +func (c *CmdCommand) ExecuteCommand(config *manifest.Schema2Config) error { + logrus.Info("cmd: CMD") + var newCommand []string + if c.cmd.PrependShell { + // This is the default shell on Linux + // TODO: Support shell command here + shell := []string{"/bin/sh", "-c"} + newCommand = append(shell, strings.Join(c.cmd.CmdLine, " ")) + } else { + newCommand = c.cmd.CmdLine + } + + logrus.Infof("Replacing CMD in config with %v", newCommand) + config.Cmd = newCommand + return nil +} + +// FilesToSnapshot returns an empty array since this is a metadata command +func (c *CmdCommand) FilesToSnapshot() []string { + return []string{} +} + +// CreatedBy returns some information about the command for the image config history +func (c *CmdCommand) CreatedBy() string { + cmdLine := strings.Join(c.cmd.CmdLine, " ") + if c.cmd.PrependShell { + // TODO: Support shell command here + shell := []string{"/bin/sh", "-c"} + return strings.Join(append(shell, cmdLine), " ") + } + return cmdLine +} diff --git a/pkg/commands/cmd_test.go b/pkg/commands/cmd_test.go new file mode 100644 index 000000000..3a966da11 --- /dev/null +++ b/pkg/commands/cmd_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2018 Google LLC + +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 commands + +import ( + "github.com/GoogleCloudPlatform/k8s-container-builder/testutil" + "github.com/containers/image/manifest" + "github.com/containers/image/pkg/strslice" + "github.com/docker/docker/builder/dockerfile/instructions" + "testing" +) + +var cmdTests = []struct { + prependShell bool + cmdLine []string + expectedCmd strslice.StrSlice +}{ + { + prependShell: true, + cmdLine: []string{"echo", "cmd1"}, + expectedCmd: strslice.StrSlice{"/bin/sh", "-c", "echo cmd1"}, + }, + { + prependShell: false, + cmdLine: []string{"echo", "cmd2"}, + expectedCmd: strslice.StrSlice{"echo", "cmd2"}, + }, +} + +func TestExecuteCmd(t *testing.T) { + + cfg := &manifest.Schema2Config{ + Cmd: nil, + } + + for _, test := range cmdTests { + cmd := CmdCommand{ + &instructions.CmdCommand{ + ShellDependantCmdLine: instructions.ShellDependantCmdLine{ + PrependShell: test.prependShell, + CmdLine: test.cmdLine, + }, + }, + } + err := cmd.ExecuteCommand(cfg) + testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Cmd) + } +} diff --git a/pkg/commands/commands.go b/pkg/commands/commands.go index 6fc2a8c1a..3ce6960aa 100644 --- a/pkg/commands/commands.go +++ b/pkg/commands/commands.go @@ -40,6 +40,8 @@ func GetCommand(cmd instructions.Command) (DockerCommand, error) { return &RunCommand{cmd: c}, nil case *instructions.EnvCommand: return &EnvCommand{cmd: c}, nil + case *instructions.CmdCommand: + return &CmdCommand{cmd: c}, nil } return nil, errors.Errorf("%s is not a supported command", cmd.Name()) }