Change container RunMethod to allow extending
This will make sure that when we add new features to how the docker container is run, we don't need to change interface method signature everywhere we use it. Relates-To: #458 Change-Id: I12273264c1a8061300017246a1a4a17125ca8ae2
This commit is contained in:
parent
aaf738396e
commit
3ae387e9f2
@ -197,7 +197,7 @@ func (options *BootstrapContainerOptions) CreateBootstrapContainer() error {
|
|||||||
fmt.Sprintf("%s=%s", envBootstrapVolume, containerVolMount),
|
fmt.Sprintf("%s=%s", envBootstrapVolume, containerVolMount),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := options.Container.RunCommand([]string{}, nil, vols, envVars)
|
err := options.Container.RunCommand(container.RunCommandOptions{EnvVars: envVars, VolumeMounts: vols})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ func (opts BootstrapIsoOptions) CreateBootstrapIso() error {
|
|||||||
fmt.Sprintf("NO_PROXY=%s", os.Getenv("NO_PROXY")),
|
fmt.Sprintf("NO_PROXY=%s", os.Getenv("NO_PROXY")),
|
||||||
}
|
}
|
||||||
|
|
||||||
err = opts.Builder.RunCommand([]string{}, nil, vols, envVars)
|
err = opts.Builder.RunCommand(container.RunCommandOptions{EnvVars: envVars, VolumeMounts: vols})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ type State struct {
|
|||||||
// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)
|
// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)
|
||||||
type Container interface {
|
type Container interface {
|
||||||
ImagePull() error
|
ImagePull() error
|
||||||
RunCommand([]string, io.Reader, []string, []string) error
|
RunCommand(RunCommandOptions) error
|
||||||
GetContainerLogs() (io.ReadCloser, error)
|
GetContainerLogs() (io.ReadCloser, error)
|
||||||
InspectContainer() (State, error)
|
InspectContainer() (State, error)
|
||||||
WaitUntilFinished() error
|
WaitUntilFinished() error
|
||||||
@ -43,6 +43,14 @@ type Container interface {
|
|||||||
GetID() string
|
GetID() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RunCommandOptions options for RunCommand
|
||||||
|
type RunCommandOptions struct {
|
||||||
|
Cmd []string
|
||||||
|
EnvVars []string
|
||||||
|
VolumeMounts []string
|
||||||
|
Input io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
// NewContainer returns instance of Container interface implemented by particular driver
|
// NewContainer returns instance of Container interface implemented by particular driver
|
||||||
// Returned instance type (i.e. implementation) depends on driver specified via function
|
// Returned instance type (i.e. implementation) depends on driver specified via function
|
||||||
// arguments (e.g. "docker").
|
// arguments (e.g. "docker").
|
||||||
|
@ -241,18 +241,13 @@ func (c *DockerContainer) ImagePull() error {
|
|||||||
|
|
||||||
// RunCommand executes specified command in Docker container. Method handles
|
// RunCommand executes specified command in Docker container. Method handles
|
||||||
// container STDIN and volume binds
|
// container STDIN and volume binds
|
||||||
func (c *DockerContainer) RunCommand(
|
func (c *DockerContainer) RunCommand(opts RunCommandOptions) error {
|
||||||
cmd []string,
|
realCmd, err := c.getCmd(opts.Cmd)
|
||||||
containerInput io.Reader,
|
|
||||||
volumeMounts []string,
|
|
||||||
envVars []string,
|
|
||||||
) error {
|
|
||||||
realCmd, err := c.getCmd(cmd)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
containerConfig, hostConfig := c.getConfig(realCmd, volumeMounts, envVars)
|
containerConfig, hostConfig := c.getConfig(realCmd, opts.VolumeMounts, opts.EnvVars)
|
||||||
resp, err := c.dockerClient.ContainerCreate(
|
resp, err := c.dockerClient.ContainerCreate(
|
||||||
c.ctx,
|
c.ctx,
|
||||||
&containerConfig,
|
&containerConfig,
|
||||||
@ -266,7 +261,7 @@ func (c *DockerContainer) RunCommand(
|
|||||||
|
|
||||||
c.id = resp.ID
|
c.id = resp.ID
|
||||||
|
|
||||||
if containerInput != nil {
|
if opts.Input != nil {
|
||||||
conn, attachErr := c.dockerClient.ContainerAttach(c.ctx, c.id, types.ContainerAttachOptions{
|
conn, attachErr := c.dockerClient.ContainerAttach(c.ctx, c.id, types.ContainerAttachOptions{
|
||||||
Stream: true,
|
Stream: true,
|
||||||
Stdin: true,
|
Stdin: true,
|
||||||
@ -274,7 +269,7 @@ func (c *DockerContainer) RunCommand(
|
|||||||
if attachErr != nil {
|
if attachErr != nil {
|
||||||
return attachErr
|
return attachErr
|
||||||
}
|
}
|
||||||
if _, err = io.Copy(conn.Conn, containerInput); err != nil {
|
if _, err = io.Copy(conn.Conn, opts.Input); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -268,7 +268,9 @@ func TestImagePull(t *testing.T) {
|
|||||||
|
|
||||||
func TestGetId(t *testing.T) {
|
func TestGetId(t *testing.T) {
|
||||||
cnt := getDockerContainerMock(mockDockerClient{})
|
cnt := getDockerContainerMock(mockDockerClient{})
|
||||||
err := cnt.RunCommand([]string{"testCmd"}, nil, nil, []string{})
|
err := cnt.RunCommand(RunCommandOptions{
|
||||||
|
Cmd: []string{"testCmd"},
|
||||||
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
actualID := cnt.GetID()
|
actualID := cnt.GetID()
|
||||||
|
|
||||||
@ -419,7 +421,11 @@ func TestRunCommand(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
cnt := getDockerContainerMock(tt.mockDockerClient)
|
cnt := getDockerContainerMock(tt.mockDockerClient)
|
||||||
actualErr := cnt.RunCommand(tt.cmd, tt.containerInput, tt.volumeMounts, []string{})
|
actualErr := cnt.RunCommand(RunCommandOptions{
|
||||||
|
Input: tt.containerInput,
|
||||||
|
Cmd: tt.cmd,
|
||||||
|
VolumeMounts: tt.volumeMounts,
|
||||||
|
})
|
||||||
assert.Equal(t, tt.expectedRunErr, actualErr)
|
assert.Equal(t, tt.expectedRunErr, actualErr)
|
||||||
actualErr = cnt.WaitUntilFinished()
|
actualErr = cnt.WaitUntilFinished()
|
||||||
assert.Equal(t, tt.expectedWaitErr, actualErr)
|
assert.Equal(t, tt.expectedWaitErr, actualErr)
|
||||||
@ -461,7 +467,11 @@ func TestRunCommandOutput(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
cnt := getDockerContainerMock(tt.mockDockerClient)
|
cnt := getDockerContainerMock(tt.mockDockerClient)
|
||||||
actualErr := cnt.RunCommand(tt.cmd, tt.containerInput, tt.volumeMounts, []string{})
|
actualErr := cnt.RunCommand(RunCommandOptions{
|
||||||
|
Input: tt.containerInput,
|
||||||
|
Cmd: tt.cmd,
|
||||||
|
VolumeMounts: tt.volumeMounts,
|
||||||
|
})
|
||||||
assert.Equal(t, tt.expectedErr, actualErr)
|
assert.Equal(t, tt.expectedErr, actualErr)
|
||||||
actualRes, actualErr := cnt.GetContainerLogs()
|
actualRes, actualErr := cnt.GetContainerLogs()
|
||||||
require.NoError(t, actualErr)
|
require.NoError(t, actualErr)
|
||||||
|
@ -37,7 +37,7 @@ func (mc *MockContainer) ImagePull() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RunCommand Container interface implementation for unit test purposes
|
// RunCommand Container interface implementation for unit test purposes
|
||||||
func (mc *MockContainer) RunCommand([]string, io.Reader, []string, []string) error {
|
func (mc *MockContainer) RunCommand(container.RunCommandOptions) error {
|
||||||
return mc.MockRunCommand()
|
return mc.MockRunCommand()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user