package compatibility import ( "errors" "strings" "github.com/hashicorp/go-version" ) var ( // ErrStaticVersionRequired error returned when the static version is not provided. ErrStaticVersionRequired = errors.New("static version is required") // ErrActualVersionRequired error returned when the actual version is not provided. ErrActualVersionRequired = errors.New("expected version is required") // ErrStaticVersionCannotBeSHA error returned when the static version provided is a sha256. ErrStaticVersionCannotBeSHA = errors.New("static version cannot be a sha256") // ErrActualVersionCannotBeSHA error returned when the actual version provided is a sha256. ErrActualVersionCannotBeSHA = errors.New("expected version cannot be a sha256") ) // Compare compares the static version against the expected version using the specified operation. // Examples: // Latest -> EQUAL -> Latest = true // Latest -> EQUAL -> 0.20 = false // Latest -> GreaterThan -> 0.20 = true // 0.20 -> LessThan -> 0.21 = true func Compare(op Operation, staticVersion, expectedVersion string) (bool, error) { //nolint if staticVersion == "" { return false, ErrStaticVersionRequired } if expectedVersion == "" { return false, ErrActualVersionRequired } if strings.HasPrefix(staticVersion, "sha256:") { return false, ErrStaticVersionCannotBeSHA } if strings.HasPrefix(expectedVersion, "sha256:") { return false, ErrActualVersionCannotBeSHA } var ( staticVerifiedVersion *version.Version fleetVersion *version.Version err error ) if staticVersion != Latest { staticVerifiedVersion, err = version.NewVersion(staticVersion) if err != nil { return false, err } } if expectedVersion != Latest { fleetVersion, err = version.NewVersion(expectedVersion) if err != nil { return false, err } } switch op { case Equal: if staticVersion == Latest && expectedVersion == Latest { return true, nil } if (staticVersion != Latest && expectedVersion == Latest) || (staticVersion == Latest && expectedVersion != Latest) { return false, nil } return staticVerifiedVersion.Equal(fleetVersion), nil case LessThan: if staticVersion == Latest && expectedVersion != Latest { return false, nil } if staticVersion != Latest && expectedVersion == Latest { return true, nil } if staticVersion == Latest && expectedVersion == Latest { return false, nil } return staticVerifiedVersion.LessThan(fleetVersion), nil case GreaterThan: if staticVersion == Latest && expectedVersion != Latest { return true, nil } if staticVersion != Latest && expectedVersion == Latest { return false, nil } if staticVersion == Latest && expectedVersion == Latest { return false, nil } return staticVerifiedVersion.GreaterThan(fleetVersion), nil case LessThanOrEqual: if staticVersion == Latest && expectedVersion != Latest { return false, nil } if staticVersion == Latest && expectedVersion == Latest { return true, nil } if staticVersion != Latest && expectedVersion == Latest { return true, nil } return staticVerifiedVersion.LessThanOrEqual(fleetVersion), nil case GreaterThanOrEqual: if staticVersion == Latest && expectedVersion != Latest { return true, nil } if staticVersion == Latest && expectedVersion == Latest { return true, nil } if staticVersion != Latest && expectedVersion == Latest { return false, nil } return staticVerifiedVersion.GreaterThanOrEqual(fleetVersion), nil default: return false, nil } }