@@ -419,6 +419,53 @@ var RemapIDs = &test.Requirement{
419
419
},
420
420
}
421
421
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
+
422
469
func ContainerdVersion (v string ) * test.Requirement {
423
470
return & test.Requirement {
424
471
Check : func (data test.Data , helpers test.Helpers ) (bool , string ) {
0 commit comments