Skip to content

Commit c96db80

Browse files
fix: conflict in parsing of -h flag for help and hostname in container run
Signed-off-by: Shubharanshu Mahapatra <shubhum@amazon.com>
1 parent 779e638 commit c96db80

3 files changed

Lines changed: 106 additions & 49 deletions

File tree

cmd/finch/nerdctl.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,10 @@ func (nc *nerdctlCommand) shouldReplaceForHelp(cmdName string, args []string) bo
110110
}
111111
}
112112

113+
// this needs to handle cases of -h except for `container run`,`run`,`create`. For these options -h represent hostname
114+
// TODO: Refactor this function.
113115
for _, arg := range args {
114-
if arg == "--help" || arg == "-h" {
116+
if arg == "--help" || (arg == "-h" && !(cmdName == "container run" || cmdName == "run" || cmdName == "create")) {
115117
return true
116118
}
117119
}

cmd/finch/nerdctl_remote.go

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,12 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error {
141141
case arg == "--help":
142142
nerdctlArgs = append(nerdctlArgs, arg)
143143
case arg == "--add-host":
144-
// exact match to --add-host
145-
args[i+1], err = resolveIP(args[i+1], nc.logger, nc.ecc)
146-
if err != nil {
147-
return err
144+
// exact match to --add-host. resolve ip if param passed
145+
if len(args) > i+1 {
146+
args[i+1], err = resolveIP(args[i+1], nc.logger, nc.ecc)
147+
if err != nil {
148+
return err
149+
}
148150
}
149151
nerdctlArgs = append(nerdctlArgs, arg)
150152
case strings.HasPrefix(arg, "--add-host"):
@@ -158,21 +160,33 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error {
158160
case strings.HasPrefix(arg, "--env-file"):
159161
// exact match to --env-file
160162
// or arg begins with --env-file
161-
shouldSkip, addEnvs, err := handleEnvFile(nc.fs, nc.systemDeps, arg, args[i+1])
162-
if err != nil {
163-
return err
163+
if len(args) > i+1 {
164+
shouldSkip, addEnvs, err := handleEnvFile(nc.fs, nc.systemDeps, arg, args[i+1])
165+
if err != nil {
166+
return err
167+
}
168+
skip = shouldSkip
169+
fileEnvs = append(fileEnvs, addEnvs...)
170+
} else {
171+
// if --env-file is at the end of the args, its refers to entrypoint command
172+
// which need not be handled
173+
nerdctlArgs = append(nerdctlArgs, arg)
164174
}
165-
skip = shouldSkip
166-
fileEnvs = append(fileEnvs, addEnvs...)
167175
case argIsEnv(arg):
168176
// exact match to either -e or --env
169177
// or arg begins with -e or --env
170178
// -e="<value>", -e"<value>"
171179
// --env="<key>=<value>", --env"<key>=<value>"
172-
shouldSkip, addEnv := handleEnv(nc.systemDeps, arg, args[i+1])
173-
skip = shouldSkip
174-
if addEnv != "" {
175-
envs = append(envs, addEnv)
180+
if len(args) > i+1 {
181+
shouldSkip, addEnv := handleEnv(nc.systemDeps, arg, args[i+1])
182+
skip = shouldSkip
183+
if addEnv != "" {
184+
envs = append(envs, addEnv)
185+
}
186+
} else {
187+
// if -e or --env is at the end of the args, its refers to entrypoint command
188+
// which need not be handled
189+
nerdctlArgs = append(nerdctlArgs, arg)
176190
}
177191
case shortFlagBoolSet.Has(arg) || longFlagBoolSet.Has(arg):
178192
// exact match to a short no argument flag: -?
@@ -195,23 +209,35 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error {
195209
// or begins with a short arg flag:
196210
// short arg flag concatenated to value: -?"<value>"
197211
// short arg flag equated to value: -?="<value>" or -?=<value>
198-
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
199-
skip = shouldSkip
200-
if addKey != "" {
201-
nerdctlArgs = append(nerdctlArgs, addKey)
202-
nerdctlArgs = append(nerdctlArgs, addVal)
212+
if len(args) > i+1 {
213+
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
214+
skip = shouldSkip
215+
if addKey != "" {
216+
nerdctlArgs = append(nerdctlArgs, addKey)
217+
nerdctlArgs = append(nerdctlArgs, addVal)
218+
}
219+
} else {
220+
// no value found for short arg flag
221+
// pass the arg as a nerdctl command argument
222+
nerdctlArgs = append(nerdctlArgs, arg)
203223
}
204224
case strings.HasPrefix(arg, "--"):
205225
// exact match to a long arg flag: -<long_flag>
206226
// next arg must be the <value>
207227
// or begins with a long arg flag:
208228
// long arg flag concatenated to value: --<long_flag>"<value>"
209229
// long arg flag equated to value: --<long_flag>="<value>" or --<long_flag>=<value>
210-
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
211-
skip = shouldSkip
212-
if addKey != "" {
213-
nerdctlArgs = append(nerdctlArgs, addKey)
214-
nerdctlArgs = append(nerdctlArgs, addVal)
230+
if len(args) > i+1 {
231+
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
232+
skip = shouldSkip
233+
if addKey != "" {
234+
nerdctlArgs = append(nerdctlArgs, addKey)
235+
nerdctlArgs = append(nerdctlArgs, addVal)
236+
}
237+
} else {
238+
// if --<long flag> is at the end of the args, its refers to entrypoint command
239+
// which need not be handled
240+
nerdctlArgs = append(nerdctlArgs, arg)
215241
}
216242
default:
217243
// arg other than a flag ("-?","--<long_flag>") or a skipped <flag_value>

cmd/finch/nerdctl_test.go

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,48 +30,76 @@ func TestNerdctlCommand_shouldReplaceForHelp(t *testing.T) {
3030
t.Parallel()
3131

3232
testCases := []struct {
33-
name string
34-
cmdName string
35-
args []string
36-
mockSvc func(*mocks.NerdctlCmdCreator, *mocks.Logger, *gomock.Controller)
33+
name string
34+
cmdName string
35+
args []string
36+
expected bool
37+
mockSvc func(*mocks.NerdctlCmdCreator, *mocks.Logger, *gomock.Controller)
3738
}{
3839
{
39-
name: "with --help flag",
40-
cmdName: "pull",
41-
args: []string{"test:tag", "--help"},
40+
name: "with --help flag",
41+
cmdName: "pull",
42+
args: []string{"test:tag", "--help"},
43+
expected: true,
4244
},
4345
{
44-
name: "with -h",
45-
cmdName: "pull",
46-
args: []string{"test:tag", "-h"},
46+
name: "with -h",
47+
cmdName: "pull",
48+
args: []string{"test:tag", "-h"},
49+
expected: true,
4750
},
4851
{
49-
name: "system returns help",
50-
cmdName: "system",
52+
name: "system returns help",
53+
cmdName: "system",
54+
expected: true,
5155
},
5256
{
53-
name: "builder returns help",
54-
cmdName: "builder",
57+
name: "builder returns help",
58+
cmdName: "builder",
59+
expected: true,
5560
},
5661
{
57-
name: "container returns help",
58-
cmdName: "container",
62+
name: "container returns help",
63+
cmdName: "container",
64+
expected: true,
5965
},
6066
{
61-
name: "image returns help",
62-
cmdName: "image",
67+
name: "image returns help",
68+
cmdName: "image",
69+
expected: true,
6370
},
6471
{
65-
name: "network returns help",
66-
cmdName: "network",
72+
name: "network returns help",
73+
cmdName: "network",
74+
expected: true,
6775
},
6876
{
69-
name: "volume returns help",
70-
cmdName: "volume",
77+
name: "volume returns help",
78+
cmdName: "volume",
79+
expected: true,
7180
},
7281
{
73-
name: "compose returns help",
74-
cmdName: "compose",
82+
name: "compose returns help",
83+
cmdName: "compose",
84+
expected: true,
85+
},
86+
{
87+
name: "-h argument for hostname-related command",
88+
cmdName: "run",
89+
args: []string{"-h"},
90+
expected: false,
91+
},
92+
{
93+
name: "-h argument for hostname-related command",
94+
cmdName: "container run",
95+
args: []string{"-h"},
96+
expected: false,
97+
},
98+
{
99+
name: "-h argument for hostname-related command",
100+
cmdName: "create",
101+
args: []string{"-h"},
102+
expected: false,
75103
},
76104
}
77105

@@ -85,7 +113,8 @@ func TestNerdctlCommand_shouldReplaceForHelp(t *testing.T) {
85113
ecc := mocks.NewCommandCreator(ctrl)
86114
ncsd := mocks.NewNerdctlCommandSystemDeps(ctrl)
87115
logger := mocks.NewLogger(ctrl)
88-
assert.True(t, newNerdctlCommand(ncc, ecc, ncsd, logger, nil, &config.Finch{}).shouldReplaceForHelp(tc.cmdName, tc.args))
116+
assert.True(t, (newNerdctlCommand(ncc, ecc, ncsd, logger,
117+
nil, &config.Finch{}).shouldReplaceForHelp(tc.cmdName, tc.args) == tc.expected))
89118
})
90119
}
91120
}

0 commit comments

Comments
 (0)