...

Source file src/edge-infra.dev/pkg/edge/compatibility/compatibility.go

Documentation: edge-infra.dev/pkg/edge/compatibility

     1  package compatibility
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  
     7  	"github.com/hashicorp/go-version"
     8  )
     9  
    10  var (
    11  	// ErrStaticVersionRequired error returned when the static version is not provided.
    12  	ErrStaticVersionRequired = errors.New("static version is required")
    13  	// ErrActualVersionRequired error returned when the actual version is not provided.
    14  	ErrActualVersionRequired = errors.New("expected version is required")
    15  	// ErrStaticVersionCannotBeSHA error returned when the static version provided is a sha256.
    16  	ErrStaticVersionCannotBeSHA = errors.New("static version cannot be a sha256")
    17  	// ErrActualVersionCannotBeSHA error returned when the actual version provided is a sha256.
    18  	ErrActualVersionCannotBeSHA = errors.New("expected version cannot be a sha256")
    19  )
    20  
    21  // Compare compares the static version against the expected version using the specified operation.
    22  // Examples:
    23  // Latest -> EQUAL -> Latest = true
    24  // Latest -> EQUAL -> 0.20 = false
    25  // Latest -> GreaterThan -> 0.20 = true
    26  // 0.20 -> LessThan -> 0.21 = true
    27  func Compare(op Operation, staticVersion, expectedVersion string) (bool, error) { //nolint
    28  	if staticVersion == "" {
    29  		return false, ErrStaticVersionRequired
    30  	}
    31  	if expectedVersion == "" {
    32  		return false, ErrActualVersionRequired
    33  	}
    34  	if strings.HasPrefix(staticVersion, "sha256:") {
    35  		return false, ErrStaticVersionCannotBeSHA
    36  	}
    37  	if strings.HasPrefix(expectedVersion, "sha256:") {
    38  		return false, ErrActualVersionCannotBeSHA
    39  	}
    40  	var (
    41  		staticVerifiedVersion *version.Version
    42  		fleetVersion          *version.Version
    43  		err                   error
    44  	)
    45  	if staticVersion != Latest {
    46  		staticVerifiedVersion, err = version.NewVersion(staticVersion)
    47  		if err != nil {
    48  			return false, err
    49  		}
    50  	}
    51  	if expectedVersion != Latest {
    52  		fleetVersion, err = version.NewVersion(expectedVersion)
    53  		if err != nil {
    54  			return false, err
    55  		}
    56  	}
    57  	switch op {
    58  	case Equal:
    59  		if staticVersion == Latest && expectedVersion == Latest {
    60  			return true, nil
    61  		}
    62  		if (staticVersion != Latest && expectedVersion == Latest) || (staticVersion == Latest && expectedVersion != Latest) {
    63  			return false, nil
    64  		}
    65  		return staticVerifiedVersion.Equal(fleetVersion), nil
    66  	case LessThan:
    67  		if staticVersion == Latest && expectedVersion != Latest {
    68  			return false, nil
    69  		}
    70  		if staticVersion != Latest && expectedVersion == Latest {
    71  			return true, nil
    72  		}
    73  		if staticVersion == Latest && expectedVersion == Latest {
    74  			return false, nil
    75  		}
    76  		return staticVerifiedVersion.LessThan(fleetVersion), nil
    77  	case GreaterThan:
    78  		if staticVersion == Latest && expectedVersion != Latest {
    79  			return true, nil
    80  		}
    81  		if staticVersion != Latest && expectedVersion == Latest {
    82  			return false, nil
    83  		}
    84  		if staticVersion == Latest && expectedVersion == Latest {
    85  			return false, nil
    86  		}
    87  		return staticVerifiedVersion.GreaterThan(fleetVersion), nil
    88  	case LessThanOrEqual:
    89  		if staticVersion == Latest && expectedVersion != Latest {
    90  			return false, nil
    91  		}
    92  		if staticVersion == Latest && expectedVersion == Latest {
    93  			return true, nil
    94  		}
    95  		if staticVersion != Latest && expectedVersion == Latest {
    96  			return true, nil
    97  		}
    98  		return staticVerifiedVersion.LessThanOrEqual(fleetVersion), nil
    99  	case GreaterThanOrEqual:
   100  		if staticVersion == Latest && expectedVersion != Latest {
   101  			return true, nil
   102  		}
   103  		if staticVersion == Latest && expectedVersion == Latest {
   104  			return true, nil
   105  		}
   106  		if staticVersion != Latest && expectedVersion == Latest {
   107  			return false, nil
   108  		}
   109  		return staticVerifiedVersion.GreaterThanOrEqual(fleetVersion), nil
   110  	default:
   111  		return false, nil
   112  	}
   113  }
   114  

View as plain text