@@ -15,13 +15,13 @@ import (
15
15
16
16
var fleetDBTimeout = 3 * time .Minute
17
17
18
- type cmpResult int
18
+ type componentCompareResult int
19
19
20
20
const (
21
- NOT_FOUND cmpResult = iota
21
+ NOT_FOUND componentCompareResult = iota
22
22
ERROR_FETCH
23
- GAP
24
- SAME
23
+ DIFFERENT
24
+ EQUAL
25
25
)
26
26
27
27
// this is a map of "component_type_name" to the actual inventory data for each component
@@ -58,7 +58,7 @@ func fetchServerComponents(client internalfleetdb.Client, srvid uuid.UUID, l *za
58
58
return comps , nil
59
59
}
60
60
61
- func verifyComponent (c internalfleetdb.Client , server * fleetdb.Server , dev * rivets.Server , log * zap.Logger ) cmpResult {
61
+ func verifyComponent (c internalfleetdb.Client , server * fleetdb.Server , dev * rivets.Server , log * zap.Logger ) componentCompareResult {
62
62
fleetComponentsMap , err := fetchServerComponents (c , server .UUID , log )
63
63
if err != nil {
64
64
if strings .Contains (err .Error (), "404" ) {
@@ -68,6 +68,10 @@ func verifyComponent(c internalfleetdb.Client, server *fleetdb.Server, dev *rive
68
68
return ERROR_FETCH
69
69
}
70
70
71
+ if len (fleetComponentsMap ) == 0 {
72
+ return NOT_FOUND
73
+ }
74
+
71
75
alloyComponentsMap := make (map [string ][]* rivets.Component )
72
76
for _ , component := range dev .Components {
73
77
slug := component .Name
@@ -77,24 +81,83 @@ func verifyComponent(c internalfleetdb.Client, server *fleetdb.Server, dev *rive
77
81
alloyComponentsMap [slug ] = append (alloyComponentsMap [slug ], component )
78
82
}
79
83
80
- var diff strings.Builder
81
- for slug , fleetComponents := range fleetComponentsMap {
82
- if alloyComponents , ok := alloyComponentsMap [slug ]; ok {
83
- compareComponents (fleetComponents , alloyComponents , & diff )
84
- continue
84
+ serverID := server .UUID .String ()
85
+ var cmpResult componentCompareResult
86
+
87
+ for slug , alloyComponents := range alloyComponentsMap {
88
+ fleetComponents , _ := fleetComponentsMap [slug ]
89
+ // if fleetComponents is nil, we will print logs for
90
+ // each component in alloyComponents.
91
+ if changed := compareComponents (alloyComponents , fleetComponents , slug , serverID , log ); changed {
92
+ cmpResult = DIFFERENT
85
93
}
86
- // diff.WriteString("-", fleetComponents)
87
94
}
88
95
89
- for slug , alloyComponents := range alloyComponentsMap {
96
+ for slug , fleetComponents := range fleetComponentsMap {
90
97
if _ , ok := alloyComponentsMap [slug ]; ok {
98
+ // We have already compared this slug in the previous for loog.
91
99
continue
92
100
}
93
- // diff.WriteString("+", fleetComponents)
101
+ cmpResult = DIFFERENT
102
+ compareComponents (nil , fleetComponents , slug , serverID , log )
94
103
}
95
104
96
- return SAME
105
+ return cmpResult
97
106
}
98
107
99
- func compareComponents (src []* rivets.Component , tgt []* rivets.Component , diff * strings.Builder ) {
108
+ func compareComponents (expected []* rivets.Component , current []* rivets.Component , slug string , serverID string , log * zap.Logger ) bool {
109
+ var hasGap bool
110
+ expectedMap := make (map [string ]string )
111
+ currentMap := make (map [string ]string )
112
+ for _ , component := range expected {
113
+ expectedMap [component .Vendor + component .Model ] = component .Firmware .Installed
114
+ }
115
+ for _ , component := range current {
116
+ currentMap [component .Vendor + component .Model ] = component .Firmware .Installed
117
+ }
118
+
119
+ for key , expectedFirmwareVersion := range expectedMap {
120
+ currentFirmwareVersion , exist := currentMap [key ]
121
+ if ! exist {
122
+ hasGap = true
123
+ fields := []zap.Field {
124
+ zap .String ("device.id" , serverID ),
125
+ zap .String ("component" , slug ),
126
+ zap .String ("expected(alloy)" , expectedFirmwareVersion ),
127
+ zap .String ("current(fleetdb)" , "fleetdb firmware does not exist" ),
128
+ }
129
+ log .Warn ("alloy has component but not in fleetdb" , fields ... )
130
+ continue
131
+ }
132
+
133
+ if expectedFirmwareVersion != currentFirmwareVersion {
134
+ hasGap = true
135
+ fields := []zap.Field {
136
+ zap .String ("device.id" , serverID ),
137
+ zap .String ("component" , slug ),
138
+ zap .String ("expected(alloy)" , currentFirmwareVersion ),
139
+ zap .String ("current(fleetdb)" , expectedFirmwareVersion ),
140
+ }
141
+ log .Warn ("component firmware needs update" , fields ... )
142
+ }
143
+ }
144
+
145
+ for key , currentFirmwareVersion := range currentMap {
146
+ _ , exist := expectedMap [key ]
147
+ if exist {
148
+ // Already been compared in the previous for loop.
149
+ continue
150
+ }
151
+
152
+ hasGap = true
153
+ fields := []zap.Field {
154
+ zap .String ("device.id" , serverID ),
155
+ zap .String ("component" , slug ),
156
+ zap .String ("expected(alloy)" , "alloy firmware does not exist" ),
157
+ zap .String ("current(fleetdb)" , currentFirmwareVersion ),
158
+ }
159
+ log .Warn ("fleetdb component has component but not in alloy" , fields ... )
160
+ }
161
+
162
+ return hasGap
100
163
}
0 commit comments