Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/e2e-linux.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ jobs:
sudo systemctl daemon-reload
sudo rm -rf /etc/finch
sudo rm -rf /var/lib/finch
sudo rm -rf /var/lib/nerdctl
sudo rm -rf /var/lib/containerd
sudo rm -rf /var/soci-snapshotter
sudo rm -rf ./_output
Expand All @@ -99,6 +100,18 @@ jobs:
- name: Install Finch
run: |
sudo rpm -i ./_output/packages/$(ls -t ./_output/packages/ | grep runfinch-finch | head -1)

# TODO: remove this once nerdctl v2.2.1 is released in AL
ARCH=$(uname -m)
case $ARCH in
x86_64) NERDCTL_ARCH="amd64" ;;
aarch64) NERDCTL_ARCH="arm64" ;;
esac
wget "https://github.com/containerd/nerdctl/releases/download/v2.2.1/nerdctl-2.2.1-linux-${NERDCTL_ARCH}.tar.gz"
sudo tar Cxzvf /usr/local/bin nerdctl-2.2.1-linux-${NERDCTL_ARCH}.tar.gz
rm nerdctl-2.2.1-linux-${NERDCTL_ARCH}.tar.gz
/usr/local/bin/nerdctl --version

sudo systemctl daemon-reload
sudo systemctl restart containerd.service
sudo systemctl restart finch.socket
Expand Down
38 changes: 34 additions & 4 deletions cmd/finch/nerdctl_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -507,8 +507,11 @@ func (nc *nerdctlCommand) handleFlagArg(arg string, nextArg string) (bool, strin
// long flag concatenated to value by '=': --<long_flag>="<value>"
skip = false
flagKey, flagVal, _ = strings.Cut(arg, "=")
case strings.HasPrefix(arg, "--") && !strings.HasPrefix(nextArg, "-"):
// long flag followed by a value: --<long_flag> "<value>"
case strings.HasPrefix(arg, "--") && isNumericArg(nextArg),
strings.HasPrefix(arg, "--") && !strings.HasPrefix(nextArg, "-"):
// long flag followed by a value (including a negative number): --<long_flag> "<value>".
// the isNumeric check is needed because the value can be a negative number.
// for example, in our health check tests where we pass --health-retries -5 or --health-timeout -5s
skip = true
flagKey = arg
flagVal = nextArg
Expand All @@ -522,8 +525,9 @@ func (nc *nerdctlCommand) handleFlagArg(arg string, nextArg string) (bool, strin
skip = false
flagKey = arg[:2]
flagVal = arg[2:]
case strings.HasPrefix(arg, "-") && len(arg) == 2 && !strings.HasPrefix(nextArg, "-"):
// short flag followed by a value: -? "<value>" or -? <value>
case strings.HasPrefix(arg, "-") && len(arg) == 2 && isNumericArg(nextArg),
strings.HasPrefix(arg, "-") && len(arg) == 2 && !strings.HasPrefix(nextArg, "-"):
// short flag followed by a value (including a negative number): -? "<value>" or -? <value>
skip = true
flagKey = arg
flagVal = nextArg
Expand Down Expand Up @@ -613,3 +617,29 @@ func handleEnvFile(fs afero.Fs, systemDeps NerdctlCommandSystemDeps, arg, arg2 s
}
return skip, envs, nil
}

// isNumericArg returns whether the passed argument is a numeric argument or not.
// For example, it returns true for cases like 5, -5, 5s and -5s.
func isNumericArg(arg string) bool {
if arg == "" {
return false
}
// handle the case where the arg is a negative number followed by a char
// for example: --health-timeout -5s
if arg[0] == '-' && len(arg) > 1 {
for i := 1; i < len(arg); i++ {
if arg[i] < '0' || arg[i] > '9' {
return i > 1
}
}
return true
}
// handle the case where the arg is a positive number followed by a char
// for example: --health-timeout -5s
for i := 0; i < len(arg); i++ {
if arg[i] < '0' || arg[i] > '9' {
return i > 0
}
}
return true
}
174 changes: 174 additions & 0 deletions cmd/finch/nerdctl_remote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,177 @@ func TestNerdctlCommand_withVMErrors(t *testing.T) {
})
}
}

func TestHandleFlagArg(t *testing.T) {
t.Parallel()
testCases := []struct {
inputArgs []string
expectedArgs []string
}{
{
inputArgs: []string{"--flag", "value"},
expectedArgs: []string{"--flag", "value"},
},
{
inputArgs: []string{"--flag=value", ""},
expectedArgs: []string{"--flag", "value"},
},
{
inputArgs: []string{"--flag=\"value\"", ""},
expectedArgs: []string{"--flag", "\"value\""},
},
{
inputArgs: []string{"--flag", "10"},
expectedArgs: []string{"--flag", "10"},
},
{
inputArgs: []string{"--flag", "-10"},
expectedArgs: []string{"--flag", "-10"},
},
{
inputArgs: []string{"--flag", "10s"},
expectedArgs: []string{"--flag", "10s"},
},
{
inputArgs: []string{"--flag", "-10s"},
expectedArgs: []string{"--flag", "-10s"},
},
{
inputArgs: []string{"--flag=10", ""},
expectedArgs: []string{"--flag", "10"},
},
{
inputArgs: []string{"--flag=10s", ""},
expectedArgs: []string{"--flag", "10s"},
},
{
inputArgs: []string{"--flag=-10", ""},
expectedArgs: []string{"--flag", "-10"},
},
{
inputArgs: []string{"--flag=-10s", ""},
expectedArgs: []string{"--flag", "-10s"},
},
{
inputArgs: []string{"--flag=\"10\"", ""},
expectedArgs: []string{"--flag", "\"10\""},
},
{
inputArgs: []string{"--flag=\"-10\"", ""},
expectedArgs: []string{"--flag", "\"-10\""},
},
{
inputArgs: []string{"--flag=\"10s\"", ""},
expectedArgs: []string{"--flag", "\"10s\""},
},
{
inputArgs: []string{"--flag=\"-10s\"", ""},
expectedArgs: []string{"--flag", "\"-10s\""},
},
{
inputArgs: []string{"-f", "value"},
expectedArgs: []string{"-f", "value"},
},
{
inputArgs: []string{"-f=value", ""},
expectedArgs: []string{"-f", "value"},
},
{
inputArgs: []string{"-f=\"value\"", ""},
expectedArgs: []string{"-f", "\"value\""},
},
{
inputArgs: []string{"-f", "10s"},
expectedArgs: []string{"-f", "10s"},
},
{
inputArgs: []string{"-f", "-10s"},
expectedArgs: []string{"-f", "-10s"},
},
{
inputArgs: []string{"-f=10", ""},
expectedArgs: []string{"-f", "10"},
},
{
inputArgs: []string{"-f=10s", ""},
expectedArgs: []string{"-f", "10s"},
},
{
inputArgs: []string{"-f=-10", ""},
expectedArgs: []string{"-f", "-10"},
},
{
inputArgs: []string{"-f=-10s", ""},
expectedArgs: []string{"-f", "-10s"},
},
{
inputArgs: []string{"-f=\"10\"", ""},
expectedArgs: []string{"-f", "\"10\""},
},
{
inputArgs: []string{"-f=\"10s\"", ""},
expectedArgs: []string{"-f", "\"10s\""},
},
{
inputArgs: []string{"-f=\"-10\"", ""},
expectedArgs: []string{"-f", "\"-10\""},
},
{
inputArgs: []string{"-f=\"-10s\"", ""},
expectedArgs: []string{"-f", "\"-10s\""},
},
{
inputArgs: []string{"-f10", ""},
expectedArgs: []string{"-f", "10"},
},
}
for _, tc := range testCases {
ctrl := gomock.NewController(t)
ecc := mocks.NewCommandCreator(ctrl)
ncc := mocks.NewNerdctlCmdCreator(ctrl)
ncsd := mocks.NewNerdctlCommandSystemDeps(ctrl)
logger := mocks.NewLogger(ctrl)
fs := afero.NewMemMapFs()
nc := newNerdctlCommand(ncc, ecc, ncsd, logger, fs, nil)
// the first return value is never used
_, flagKey, flagVal := nc.handleFlagArg(tc.inputArgs[0], tc.inputArgs[1])
assert.Equal(t, flagKey, tc.expectedArgs[0])
assert.Equal(t, flagVal, tc.expectedArgs[1])
}
}

func TestIsNumericArg(t *testing.T) {
t.Parallel()
testCases := []struct {
arg string
expected bool
}{
{
arg: "5",
expected: true,
},
{
arg: "5s",
expected: true,
},
{
arg: "-5",
expected: true,
},
{
arg: "-5s",
expected: true,
},
{
arg: "abc",
expected: false,
},
{
arg: "-abc",
expected: false,
},
}
for _, tc := range testCases {
assert.Equal(t, tc.expected, isNumericArg(tc.arg))
}
}
1 change: 1 addition & 0 deletions e2e/container/container_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ func TestContainer(t *testing.T) {
tests.NetworkInspect(o)
tests.NetworkLs(o)
tests.NetworkRm(o)
tests.HealthCheck(o)
testCosign(o)
testCrossPlatformRun(o)
})
Expand Down
2 changes: 1 addition & 1 deletion e2e/container/container_test_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
package container

import (
"github.com/containerd/cgroups"
"github.com/containerd/cgroups/v3"
"github.com/runfinch/common-tests/tests"
)

Expand Down
7 changes: 4 additions & 3 deletions e2e/vm/version_remote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ import (
"github.com/runfinch/finch/pkg/version"
)

// TODO: read this from finch-core/deps.
const (
nerdctlVersion = "v2.1.3"
buildKitVersion = "v0.23.2"
containerdVersion = "v2.1.3"
nerdctlVersion = "v2.2.1"
buildKitVersion = "v0.26.3"
containerdVersion = "v2.2.1"
runcVersion = "1.3.3"
)

Expand Down
Loading
Loading