Entrypoint command and unit tests
This commit is contained in:
		
							parent
							
								
									773d2b06fd
								
							
						
					
					
						commit
						d49c7c5ed1
					
				|  | @ -42,6 +42,8 @@ func GetCommand(cmd instructions.Command) (DockerCommand, error) { | ||||||
| 		return &EnvCommand{cmd: c}, nil | 		return &EnvCommand{cmd: c}, nil | ||||||
| 	case *instructions.CmdCommand: | 	case *instructions.CmdCommand: | ||||||
| 		return &CmdCommand{cmd: c}, nil | 		return &CmdCommand{cmd: c}, nil | ||||||
|  | 	case *instructions.EntrypointCommand: | ||||||
|  | 		return &EntrypointCommand{cmd: c}, nil | ||||||
| 	} | 	} | ||||||
| 	return nil, errors.Errorf("%s is not a supported command", cmd.Name()) | 	return nil, errors.Errorf("%s is not a supported command", cmd.Name()) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,64 @@ | ||||||
|  | /* | ||||||
|  | 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 EntrypointCommand struct { | ||||||
|  | 	cmd *instructions.EntrypointCommand | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ExecuteCommand handles command processing similar to CMD and RUN,
 | ||||||
|  | func (e *EntrypointCommand) ExecuteCommand(config *manifest.Schema2Config) error { | ||||||
|  | 	logrus.Info("cmd: ENTRYPOINT") | ||||||
|  | 	var newCommand []string | ||||||
|  | 	if e.cmd.PrependShell { | ||||||
|  | 		// This is the default shell on Linux
 | ||||||
|  | 		// TODO: Support shell command here
 | ||||||
|  | 		shell := []string{"/bin/sh", "-c"} | ||||||
|  | 		newCommand = append(shell, strings.Join(e.cmd.CmdLine, " ")) | ||||||
|  | 	} else { | ||||||
|  | 		newCommand = e.cmd.CmdLine | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	logrus.Infof("Replacing Entrypoint in config with %v", newCommand) | ||||||
|  | 	config.Entrypoint = newCommand | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FilesToSnapshot returns an empty array since this is a metadata command
 | ||||||
|  | func (e *EntrypointCommand) FilesToSnapshot() []string { | ||||||
|  | 	return []string{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CreatedBy returns some information about the command for the image config history
 | ||||||
|  | func (e *EntrypointCommand) CreatedBy() string { | ||||||
|  | 	entrypoint := []string{"ENTRYPOINT"} | ||||||
|  | 	cmdLine := strings.Join(e.cmd.CmdLine, " ") | ||||||
|  | 	if e.cmd.PrependShell { | ||||||
|  | 		// TODO: Support shell command here
 | ||||||
|  | 		shell := []string{"/bin/sh", "-c"} | ||||||
|  | 		appendedShell := append(entrypoint, shell...) | ||||||
|  | 		return strings.Join(append(appendedShell, cmdLine), " ") | ||||||
|  | 	} | ||||||
|  | 	return strings.Join(append(entrypoint, cmdLine), " ") | ||||||
|  | } | ||||||
|  | @ -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 entrypointTests = []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 TestEntrypointExecuteCmd(t *testing.T) { | ||||||
|  | 
 | ||||||
|  | 	cfg := &manifest.Schema2Config{ | ||||||
|  | 		Cmd: nil, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, test := range entrypointTests { | ||||||
|  | 		cmd := EntrypointCommand{ | ||||||
|  | 			&instructions.EntrypointCommand{ | ||||||
|  | 				ShellDependantCmdLine: instructions.ShellDependantCmdLine{ | ||||||
|  | 					PrependShell: test.prependShell, | ||||||
|  | 					CmdLine:      test.cmdLine, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		} | ||||||
|  | 		err := cmd.ExecuteCommand(cfg) | ||||||
|  | 		testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Entrypoint) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue