-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathversion.go
132 lines (111 loc) · 3.77 KB
/
version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright (c) 2022 Veritas Technologies LLC. All rights reserved. IP63-2828-7171-04-15-9
package version
import (
"encoding/json"
"fmt"
"strings"
logger "github.com/VeritasOS/plugin-manager/utils/log"
)
// V1VersionInfo would be decoded from the V1VersionInfo JSON array.
type V1VersionInfo struct {
Description []string `json:"Description"`
Version string `json:"Version"`
Reboot string `json:"Reboot"`
Estimate struct {
Hours string `json:"hours"`
Minutes string `json:"minutes"`
Seconds string `json:"seconds"`
} `json:"Estimate"`
}
// Compare checks whether the specified version (with '*' patterns)
//
// matches the given product version.
func Compare(productVersion string, version string) bool {
logger.Debug.Printf("Entering version::Compare(%s, %s)", productVersion, version)
defer logger.Debug.Println("Exiting version::Compare")
var num1, num2 string
productVersionNums := strings.Split(productVersion, ".")
versionNums := strings.Split(version, ".")
maxLen := len(productVersionNums)
if len(versionNums) > maxLen {
maxLen = len(versionNums)
}
for i := 0; i < maxLen; i++ {
num1, num2 = "0", "0"
if i < len(productVersionNums) {
num1 = productVersionNums[i]
}
if i < len(versionNums) {
num2 = versionNums[i]
}
if num2 == "*" {
return true
}
if num1 != num2 {
return false
}
}
return true
}
func validateJSONFormat(versionInfoString string) ([]V1VersionInfo, error) {
logger.Debug.Printf("Entering version::validateJSONFormat(%s)...",
versionInfoString)
defer logger.Debug.Printf("Exiting version::validateJSONFormat...")
versionInfoArray := make([]V1VersionInfo, 0)
err := json.Unmarshal([]byte(versionInfoString), &versionInfoArray)
if err != nil {
logger.Error.Printf("Failed to call json.Unmarshal(%s, %v), err=%s",
versionInfoString, &versionInfoArray, err.Error())
err = fmt.Errorf("RPM V1VersionInfo is not in valid JSON format: %v", err)
return versionInfoArray, err
}
return versionInfoArray, nil
}
func validateVersion(productVersion string, versionInfoArray []V1VersionInfo) (V1VersionInfo, error) {
logger.Debug.Printf("Entering version::validateVersion(%s, %s)...",
productVersion, versionInfoArray)
defer logger.Debug.Println("Exiting version::validateVersion")
versionSet := map[string]bool{}
info := V1VersionInfo{}
for _, versionInfo := range versionInfoArray {
if versionSet[versionInfo.Version] {
err := fmt.Errorf("updating version is not compatible for the product version %v", productVersion)
logger.Error.Printf("Validating version failed, err=%v", err)
return info, err
}
versionSet[versionInfo.Version] = true
}
for _, versionInfo := range versionInfoArray {
if productVersion == versionInfo.Version {
return versionInfo, nil
}
if Compare(productVersion, versionInfo.Version) {
info = versionInfo
}
}
if (info.Version == V1VersionInfo{}.Version) {
err := fmt.Errorf("update version is not "+
"compatible for the product version %s", productVersion)
logger.Error.Printf("Validating version failed, err=%v", err)
return V1VersionInfo{}, err
}
return info, nil
}
// GetCompatibileVersionInfo checks whether the product version is in the
//
// compatibility list, and returns version info for that product version.
func GetCompatibileVersionInfo(productVersion, versionInfoString string) (V1VersionInfo, error) {
logger.Debug.Printf("Entering version::GetCompatibileVersionInfo(%s, %s)...",
productVersion, versionInfoString)
defer logger.Debug.Printf("Exiting version::GetCompatibileVersionInfo...")
info := V1VersionInfo{}
versionInfoArray, err := validateJSONFormat(versionInfoString)
if err != nil {
return info, err
}
info, err = validateVersion(productVersion, versionInfoArray)
if err != nil {
return info, err
}
return info, nil
}