...
1 package compatibility
2
3 import (
4 "errors"
5 "strings"
6
7 "github.com/hashicorp/go-version"
8 )
9
10 var (
11
12 ErrStaticVersionRequired = errors.New("static version is required")
13
14 ErrActualVersionRequired = errors.New("expected version is required")
15
16 ErrStaticVersionCannotBeSHA = errors.New("static version cannot be a sha256")
17
18 ErrActualVersionCannotBeSHA = errors.New("expected version cannot be a sha256")
19 )
20
21
22
23
24
25
26
27 func Compare(op Operation, staticVersion, expectedVersion string) (bool, error) {
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