...
1 package types
2
3 import (
4 "k8s.io/apimachinery/pkg/labels"
5
6 "edge-infra.dev/pkg/edge/compatibility"
7 "edge-infra.dev/pkg/k8s/unstructured"
8 )
9
10 type Pallet struct {
11 Name string
12 MinFleetVersion string
13 filter *ManifestSelector
14 }
15
16
17
18 func NewPallet(name, minFleetVersion string, filters ...ManifestSelectorOption) Pallet {
19 selector := &ManifestSelector{}
20 for _, opt := range filters {
21 opt(selector)
22 }
23
24 return Pallet{
25 Name: name,
26 MinFleetVersion: minFleetVersion,
27 filter: selector,
28 }
29 }
30
31
32
33 func (p *Pallet) IsDeployable(fleetVersion string) (bool, error) {
34 deploy, err := compatibility.Compare(compatibility.LessThanOrEqual, p.MinFleetVersion, fleetVersion)
35 if err != nil {
36 return false, err
37 }
38
39 return deploy, nil
40 }
41
42
43
44 func (p *Pallet) IsManifestDeployable(uns *unstructured.Unstructured) bool {
45 return p.filter.Matches(uns)
46 }
47
48
49 type Selector interface {
50 Matches(string) bool
51 }
52
53
54
55
56 type GenericSelector struct {
57 Include []string
58 Exclude []string
59 }
60
61
62
63
64 func (g *GenericSelector) Matches(target string) bool {
65 for _, exclude := range g.Exclude {
66 if exclude == target {
67 return false
68 }
69 }
70
71 if len(g.Include) == 0 {
72 return true
73 }
74
75 for _, include := range g.Include {
76 if include == target {
77 return true
78 }
79 }
80
81 return false
82 }
83
84
85
86 type ManifestSelector struct {
87
88
89 LabelSelector labels.Selector
90
91 KindSelector Selector
92
93 NamespaceSelector Selector
94 }
95
96
97
98 func (m *ManifestSelector) Matches(uns *unstructured.Unstructured) bool {
99 if m.LabelSelector != nil && !m.LabelSelector.Matches(labels.Set(uns.GetLabels())) {
100 return false
101 }
102
103 if m.KindSelector != nil && !m.KindSelector.Matches(uns.GetKind()) {
104 return false
105 }
106
107 return m.NamespaceSelector == nil || m.NamespaceSelector.Matches(uns.GetNamespace())
108 }
109
110
111
112 type ManifestSelectorOption func(*ManifestSelector)
113
114
115 func WithLabelSelector(s labels.Selector) ManifestSelectorOption {
116 return func(f *ManifestSelector) {
117 f.LabelSelector = s
118 }
119 }
120
121
122 func WithKindSelector(s Selector) ManifestSelectorOption {
123 return func(f *ManifestSelector) {
124 f.KindSelector = s
125 }
126 }
127
128
129 func WithNamespaceSelector(s Selector) ManifestSelectorOption {
130 return func(f *ManifestSelector) {
131 f.NamespaceSelector = s
132 }
133 }
134
View as plain text