Skip to content
This repository was archived by the owner on Jul 18, 2024. It is now read-only.

Commit 6338e71

Browse files
committed
compare components
1 parent 55c6e92 commit 6338e71

File tree

4 files changed

+76
-32
lines changed

4 files changed

+76
-32
lines changed

internal/fleetdb/fleetdb.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@ import (
55
"fmt"
66

77
"github.com/google/uuid"
8-
"github.com/metal-toolbox/alloy/types"
98
"github.com/metal-toolbox/component-inventory/internal/app"
109
"github.com/metal-toolbox/component-inventory/internal/inventoryconverter"
1110
fleetdb "github.com/metal-toolbox/fleetdb/pkg/api/v1"
11+
rivets "github.com/metal-toolbox/rivets/types"
1212
"go.uber.org/zap"
1313
)
1414

1515
type Client interface {
1616
GetServer(context.Context, uuid.UUID) (*fleetdb.Server, *fleetdb.ServerResponse, error)
1717
GetComponents(context.Context, uuid.UUID, *fleetdb.PaginationParams) (fleetdb.ServerComponentSlice, *fleetdb.ServerResponse, error)
18-
UpdateServerInventory(context.Context, *fleetdb.Server, *types.InventoryDevice, *zap.Logger, bool) error
18+
UpdateServerInventory(context.Context, *fleetdb.Server, *rivets.Server, *zap.Logger, bool) error
19+
GetInventoryConverter() *inventoryconverter.InventoryConverter
1920
}
2021

2122
// Creates a new Client, with reasonable defaults
@@ -59,17 +60,14 @@ func (fc fleetDBClient) GetComponents(ctx context.Context, id uuid.UUID, params
5960
return fc.client.GetComponents(ctx, id, params)
6061
}
6162

62-
func (fc fleetDBClient) UpdateServerInventory(ctx context.Context, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger, inband bool) error {
63-
log.Info("update server inventory", zap.String("server", server.Name))
64-
rivetsServer, err := fc.inventoryConverterInstance.ToRivetsServer(server.UUID.String(), server.FacilityCode, dev.Inv, dev.BiosCfg)
65-
if err != nil {
66-
log.Error("convert inventory fail", zap.String("server", server.Name), zap.String("err", err.Error()))
67-
return err
68-
}
69-
_, err = fc.client.SetServerInventory(ctx, server.UUID, rivetsServer, inband)
70-
if err != nil {
63+
func (fc fleetDBClient) UpdateServerInventory(ctx context.Context, server *fleetdb.Server, rivetsServer *rivets.Server, log *zap.Logger, inband bool) error {
64+
if _, err := fc.client.SetServerInventory(ctx, server.UUID, rivetsServer, inband); err != nil {
7165
log.Error("set inventory fail", zap.String("server", server.Name), zap.String("err", err.Error()))
7266
return err
7367
}
7468
return nil
7569
}
70+
71+
func (fc fleetDBClient) GetInventoryConverter() *inventoryconverter.InventoryConverter {
72+
return fc.inventoryConverterInstance
73+
}

pkg/api/routes/components.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package routes
22

33
import (
44
"context"
5+
"strings"
56
"time"
67

78
"github.com/google/uuid"
@@ -14,6 +15,15 @@ import (
1415

1516
var fleetDBTimeout = 3 * time.Minute
1617

18+
type cmpResult int
19+
20+
const (
21+
NOT_FOUND cmpResult = iota
22+
ERROR_FETCH
23+
GAP
24+
SAME
25+
)
26+
1727
// this is a map of "component_type_name" to the actual inventory data for each component
1828
type serverComponents map[string][]*rivets.Component
1929

@@ -47,3 +57,44 @@ func fetchServerComponents(client internalfleetdb.Client, srvid uuid.UUID, l *za
4757
}
4858
return comps, nil
4959
}
60+
61+
func verifyComponent(c internalfleetdb.Client, server *fleetdb.Server, dev *rivets.Server, log *zap.Logger) cmpResult {
62+
fleetComponentsMap, err := fetchServerComponents(c, server.UUID, log)
63+
if err != nil {
64+
if strings.Contains(err.Error(), "404") {
65+
// The server doesn't have components, we can create it.
66+
return NOT_FOUND
67+
}
68+
return ERROR_FETCH
69+
}
70+
71+
alloyComponentsMap := make(map[string][]*rivets.Component)
72+
for _, component := range dev.Components {
73+
slug := component.Name
74+
if _, ok := alloyComponentsMap[slug]; !ok {
75+
alloyComponentsMap[slug] = make([]*rivets.Component, 0)
76+
}
77+
alloyComponentsMap[slug] = append(alloyComponentsMap[slug], component)
78+
}
79+
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
85+
}
86+
// diff.WriteString("-", fleetComponents)
87+
}
88+
89+
for slug, alloyComponents := range alloyComponentsMap {
90+
if _, ok := alloyComponentsMap[slug]; ok {
91+
continue
92+
}
93+
// diff.WriteString("+", fleetComponents)
94+
}
95+
96+
return SAME
97+
}
98+
99+
func compareComponents(src []*rivets.Component, tgt []*rivets.Component, diff *strings.Builder) {
100+
}

pkg/api/routes/inventory.go

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package routes
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

87
"github.com/metal-toolbox/alloy/types"
98
internalfleetdb "github.com/metal-toolbox/component-inventory/internal/fleetdb"
@@ -13,33 +12,29 @@ import (
1312

1413
func processInband(ctx context.Context, c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error { //nolint
1514
log.Info("processing", zap.String("server", server.Name), zap.String("device", dev.Inv.Serial))
16-
if err := verifyComponent(c, server, dev, log); err != nil {
15+
rivetsServer, err := c.GetInventoryConverter().ToRivetsServer(server.UUID.String(), server.FacilityCode, dev.Inv, dev.BiosCfg)
16+
if err != nil {
17+
log.Error("convert inventory fail", zap.String("server", server.Name), zap.String("err", err.Error()))
1718
return err
1819
}
19-
return c.UpdateServerInventory(ctx, server, dev, log, true)
20+
21+
if cmp := verifyComponent(c, server, rivetsServer, log); cmp == SAME || cmp == ERROR_FETCH {
22+
log.Error("verify component", zap.String("server", server.Name), zap.String("err", cmp))
23+
return fmt.Errorf("failed to verify components %v", cmp)
24+
}
25+
return c.UpdateServerInventory(ctx, server, rivetsServer, log, true)
2026
}
2127

2228
func processOutofband(ctx context.Context, c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error { //nolint
2329
log.Info("processing", zap.String("server", server.Name), zap.String("device", dev.Inv.Serial))
24-
if err := verifyComponent(c, server, dev, log); err != nil {
25-
log.Error("verify component", zap.String("server", server.Name), zap.String("err", err.Error()))
30+
rivetsServer, err := c.GetInventoryConverter().ToRivetsServer(server.UUID.String(), server.FacilityCode, dev.Inv, dev.BiosCfg)
31+
if err != nil {
32+
log.Error("convert inventory fail", zap.String("server", server.Name), zap.String("err", err.Error()))
2633
return err
2734
}
28-
return c.UpdateServerInventory(ctx, server, dev, log, false)
29-
}
30-
31-
func verifyComponent(c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error {
32-
components, err := fetchServerComponents(c, server.UUID, log)
33-
if err != nil {
34-
if strings.Contains(err.Error(), "404") {
35-
// The server doesn't have components, we can create it.
36-
return nil
37-
}
35+
if cmp := verifyComponent(c, server, rivetsServer, log); cmp == SAME || cmp == ERROR_FETCH {
36+
log.Error("verify component", zap.String("server", server.Name), zap.String("err", cmp))
3837
return err
3938
}
40-
return isBadComponents(components, dev)
41-
}
42-
43-
func isBadComponents(_ serverComponents, _ *types.InventoryDevice) error {
44-
return fmt.Errorf("unimplement")
39+
return c.UpdateServerInventory(ctx, server, rivetsServer, log, false)
4540
}

pkg/api/routes/routes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func composeInventoryHandler(theApp *app.App, fn inventoryHandler) gin.HandlerFu
225225
}
226226

227227
if dev.Inv == nil {
228-
reject(ctx, http.StatusBadRequest, "empty inventory")
228+
reject(ctx, http.StatusBadRequest, "empty inventory", "")
229229
return
230230
}
231231

0 commit comments

Comments
 (0)