@@ -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+
422469func ContainerdVersion (v string ) * test.Requirement {
423470 return & test.Requirement {
424471 Check : func (data test.Data , helpers test.Helpers ) (bool , string ) {
0 commit comments