8000 fix(agent/agentcontainers): improve testing of convertDockerInspect, return correct host port by johnstcn · Pull Request #16887 · coder/coder · GitHub
[go: up one dir, main page]

Skip to content

fix(agent/agentcontainers): improve testing of convertDockerInspect, return correct host port #16887

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Mar 18, 2025
Merged
Prev Previous commit
Next Next commit
use a []byte instead of a string
  • Loading branch information
johnstcn committed Mar 13, 2025
commit 393f6e98860f46fab16a02c9b7ffde3011994ea3
20 changes: 10 additions & 10 deletions agent/agentcontainers/containers_dockercli.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,16 +279,16 @@ func (dcl *DockerCLILister) List(ctx context.Context) (codersdk.WorkspaceAgentLi
// will still contain valid JSON. We will just end up missing
// information about the removed container. We could potentially
// log this error, but I'm not sure it's worth it.
ins, dockerInspectStderr, err := runDockerInspect(ctx, dcl.execer, ids...)
dockerInspectStdout, dockerInspectStderr, err := runDockerInspect(ctx, dcl.execer, ids...)
if err != nil {
return codersdk.WorkspaceAgentListContainersResponse{}, xerrors.Errorf("run docker inspect: %w", err)
}

if dockerInspectStderr != "" {
res.Warnings = append(res.Warnings, dockerInspectStderr)
if len(dockerInspectStderr) > 0 {
res.Warnings = append(res.Warnings, string(dockerInspectStderr))
}

outs, warns, err := convertDockerInspect(ins)
outs, warns, err := convertDockerInspect(dockerInspectStdout)
if err != nil {
return codersdk.WorkspaceAgentListContainersResponse{}, xerrors.Errorf("convert docker inspect output: %w", err)
}
Expand All @@ -301,19 +301,19 @@ func (dcl *DockerCLILister) List(ctx context.Context) (codersdk.WorkspaceAgentLi
// runDockerInspect is a helper function that runs `docker inspect` on the given
// container IDs and returns the parsed output.
// The stderr output is also returned for logging purposes.
func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...string) (stdout, stderr string, err error) {
func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...string) (stdout, stderr []byte, err error) {
var stdoutBuf, stderrBuf bytes.Buffer
cmd := execer.CommandContext(ctx, "docker", append([]string{"inspect"}, ids...)...)
cmd.Stdout = &stdoutBuf
cmd.Stderr = &stderrBuf
err = cmd.Run()
stdout = strings.TrimSpace(stdoutBuf.String())
stderr = strings.TrimSpace(stderrBuf.String())
stdout = bytes.TrimSpace(stdoutBuf.Bytes())
stderr = bytes.TrimSpace(stderrBuf.Bytes())
if err != nil {
return stdout, stderr, err
}

return stdoutBuf.String(), stderr, nil
return stdout, stderr, nil
}

// To avoid a direct dependency on the Docker API, we use the docker CLI
Expand Down Expand Up @@ -371,10 +371,10 @@ func (dis dockerInspectState) String() string {
return sb.String()
}

func convertDockerInspect(raw string) ([]codersdk.WorkspaceAgentDevcontainer, []string, error) {
func convertDockerInspect(raw []byte) ([]codersdk.WorkspaceAgentDevcontainer, []string, error) {
var warns []string
var ins []dockerInspect
if err := json.NewDecoder(strings.NewReader(raw)).Decode(&ins); err != nil {
if err := json.NewDecoder(bytes.NewReader(raw)).Decode(&ins); err != nil {
return nil, nil, xerrors.Errorf("decode docker inspect output: %w", err)
}
outs := make([]codersdk.WorkspaceAgentDevcontainer, 0, len(ins))
Expand Down
2 changes: 1 addition & 1 deletion agent/agentcontainers/containers_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ func TestConvertDockerInspect(t *testing.T) {
t.Parallel()
bs, err := os.ReadFile(filepath.Join("testdata", tt.name, "docker_inspect.json"))
require.NoError(t, err, "failed to read testdata file")
actual, warns, err := convertDockerInspect(string(bs))
actual, warns, err := convertDockerInspect(bs)
if len(tt.expectWarns) > 0 {
assert.Len(t, warns, len(tt.expectWarns), "expected warnings")
for _, warn := range tt.expectWarns {
Expand Down
0