Skip to content

Commit 670f267

Browse files
committed
add soci convert feature tests
Signed-off-by: Arjun Raja Yogidas <[email protected]>
1 parent e676c3f commit 670f267

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

cmd/nerdctl/image/image_convert_linux_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func TestImageConvert(t *testing.T) {
9393
Require: require.All(
9494
require.Not(nerdtest.Docker),
9595
nerdtest.Soci,
96+
nerdtest.SociVersion("0.10.0"),
9697
),
9798
Cleanup: func(data test.Data, helpers test.Helpers) {
9899
helpers.Anyhow("rmi", "-f", data.Identifier("converted-image"))

docs/command-reference.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -960,8 +960,7 @@ Flags:
960960
- `--oci` : convert Docker media types to OCI media types
961961
- `--platform=<PLATFORM>` : convert content for a specific platform
962962
- `--all-platforms` : convert content for all platforms (default: false)
963-
- `--soci`: generate SOCI v2 Indices to oci images.
964-
*[**Note**: content is converted for all platforms by default when using this flag, use the `--platorm` flag to limit this behavior]*
963+
- `--soci`: generate SOCI v2 Indices to oci images. *[**Note**: content is converted for all platforms by default when using this flag, use the `--platorm` flag to limit this behavior]*
965964
- `--soci-min-layer-size` : Span size in bytes that soci index uses to segment layer data. Default is 4 MiB.
966965
- `--soci-min-layer-size`: Minimum layer size in bytes to build zTOC for. Smaller layers won't have zTOC and not lazy pulled. Default is 10 MiB.
967966

pkg/testutil/nerdtest/requirements.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,53 @@ var RemapIDs = &test.Requirement{
419419
},
420420
}
421421

422+
// SociVersion returns a requirement that checks if the installed SOCI version
423+
// meets the minimum required version
424+
func SociVersion(minVersion string) *test.Requirement {
425+
return &test.Requirement{
426+
Check: func(data test.Data, helpers test.Helpers) (bool, string) {
427+
sociExecutable, err := exec.LookPath("soci")
428+
if err != nil {
429+
return false, fmt.Sprintf("soci executable not found in path $PATH: %v", err)
430+
}
431+
432+
cmd := exec.Command(sociExecutable, "--version")
433+
output, err := cmd.Output()
434+
if err != nil {
435+
return false, fmt.Sprintf("failed to get soci version: %v", err)
436+
}
437+
438+
// Parse version from output
439+
// Example output format: "soci version v0.9.0 737f61a3db40c386f997c1f126344158aa3ad43c"
440+
versionStr := strings.TrimSpace(string(output))
441+
parts := strings.Fields(versionStr)
442+
if len(parts) < 3 {
443+
return false, fmt.Sprintf("unexpected soci version output format: %s", versionStr)
444+
}
445+
446+
// Extract version number without 'v' prefix
447+
installedVersion := strings.TrimPrefix(parts[2], "v")
448+
449+
// Compare versions
450+
v1, err := semver.NewVersion(installedVersion)
451+
if err != nil {
452+
return false, fmt.Sprintf("failed to parse installed version %s: %v", installedVersion, err)
453+
}
454+
455+
v2, err := semver.NewVersion(minVersion)
456+
if err != nil {
457+
return false, fmt.Sprintf("failed to parse minimum required version %s: %v", minVersion, err)
458+
}
459+
460+
if v1.LessThan(v2) {
461+
return false, fmt.Sprintf("installed soci version %s is older than required version %s", installedVersion, minVersion)
462+
}
463+
464+
return true, fmt.Sprintf("soci version %s meets minimum requirement %s", installedVersion, minVersion)
465+
},
466+
}
467+
}
468+
422469
func ContainerdVersion(v string) *test.Requirement {
423470
return &test.Requirement{
424471
Check: func(data test.Data, helpers test.Helpers) (bool, string) {

0 commit comments

Comments
 (0)