/
labels.go
96 lines (76 loc) · 2 KB
/
labels.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
package preflight
import (
"runtime"
"github.com/code-ready/crc/pkg/crc/network"
)
type LabelName uint32
const (
Os LabelName = iota
NetworkMode
// Keep it last
// will be used in OS-specific go files to extend LabelName
lastLabelName // nolint
)
type LabelValue uint32
const (
// os
Darwin LabelValue = iota
Linux
Windows
// network mode
User
System
// Keep it last
// will be used in OS-specific go files to extend LabelValue
lastLabelValue // nolint
)
var (
None = labels{}
)
type labels map[LabelName]LabelValue
type preflightFilter map[LabelName]LabelValue
func newFilter() preflightFilter {
switch runtime.GOOS {
case "darwin":
return preflightFilter{Os: Darwin}
case "linux":
return preflightFilter{Os: Linux}
case "windows":
return preflightFilter{Os: Windows}
default:
// In case of different platform (Should not happen)
return preflightFilter{Os: Linux}
}
}
func (filter preflightFilter) SetNetworkMode(networkMode network.Mode) {
switch networkMode {
case network.SystemNetworkingMode:
filter[NetworkMode] = System
case network.UserNetworkingMode:
filter[NetworkMode] = User
}
}
/* This will iterate over 'checks' and only keep the checks which match the filter:
* - if a key is present in the filter and not in the check labels, the check is kept
* - if a key is present in the check labels, but not in the filter, the check is kept
* - if a key is present both in the filter and in the check labels, the check
* is kept only if they have the same value, it is dropped if their values differ
*/
func (filter preflightFilter) Apply(checks []Check) []Check {
var filteredChecks []Check
for _, check := range checks {
if !skipCheck(check, filter) {
filteredChecks = append(filteredChecks, check)
}
}
return filteredChecks
}
func skipCheck(check Check, filter preflightFilter) bool {
for filterKey, filterValue := range filter {
checkValue, present := check.labels[filterKey]
if present && checkValue != filterValue {
return true
}
}
return false
}