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

Commit 4db79dc

Browse files
committed
forward inventory to fleetdb
1 parent 1acc2d2 commit 4db79dc

File tree

5 files changed

+51
-77
lines changed

5 files changed

+51
-77
lines changed

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
module github.com/metal-toolbox/component-inventory
22

3-
go 1.21
3+
go 1.22
4+
5+
toolchain go1.22.2
46

57
require (
68
github.com/bmc-toolbox/common v0.0.0-20240416132216-a56a09c16f4e
79
github.com/equinix-labs/otel-init-go v0.0.9
810
github.com/gin-gonic/gin v1.9.1
911
github.com/google/uuid v1.6.0
1012
github.com/metal-toolbox/alloy v0.3.3-0.20240320183632-05dfbd5e9110
11-
github.com/metal-toolbox/fleetdb v0.17.1
13+
github.com/metal-toolbox/fleetdb v0.17.2-0.20240419204835-60c421433f0a
1214
github.com/metal-toolbox/rivets v1.0.3
1315
github.com/pkg/errors v0.9.1
1416
github.com/prometheus/client_golang v1.19.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,8 @@ github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW
506506
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
507507
github.com/metal-toolbox/alloy v0.3.3-0.20240320183632-05dfbd5e9110 h1:v3PTHUK9KIF/mEmctQ5mgsBtG8dtdfboHI/7QQg/Ft0=
508508
github.com/metal-toolbox/alloy v0.3.3-0.20240320183632-05dfbd5e9110/go.mod h1:NcVZtbVhBCcpyTHew0TJ8yzon69vMf+rGMLoGb9jTa0=
509-
github.com/metal-toolbox/fleetdb v0.17.1 h1:eyaCg4yGQnbXIjiBMZPsLqmEpxbltlEUNDG+Mn27Fsc=
510-
github.com/metal-toolbox/fleetdb v0.17.1/go.mod h1:TbRbU+ppHIknqiAONR7JDQfzKij30uiPkehgxlA1Hv0=
509+
github.com/metal-toolbox/fleetdb v0.17.2-0.20240419204835-60c421433f0a h1:Jrjbk0M8EiljlgxeLso232AizQzuaQ4Bnqf8L9ITkug=
510+
github.com/metal-toolbox/fleetdb v0.17.2-0.20240419204835-60c421433f0a/go.mod h1:U9YArAdibILSBJzNbmtJAz6m+Cljce6a7pL0JkOckqQ=
511511
github.com/metal-toolbox/rivets v1.0.3 h1:ZW9q8V3vz6VxAczC4eR1YJdl+kapHF3ebVc+4r3NmR8=
512512
github.com/metal-toolbox/rivets v1.0.3/go.mod h1:EMQJRT1mjIyFRXxvKNaBlz7Z4Sp88rTaGO8W18olN2I=
513513
github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ=

internal/fleetdb/fleetdb.go

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,24 @@ package internalfleetdb
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
76

87
"github.com/google/uuid"
98
"github.com/metal-toolbox/alloy/types"
109
"github.com/metal-toolbox/component-inventory/internal/app"
11-
"github.com/metal-toolbox/component-inventory/pkg/api/constants"
10+
"github.com/metal-toolbox/component-inventory/internal/inventoryconverter"
1211
fleetdb "github.com/metal-toolbox/fleetdb/pkg/api/v1"
1312
"go.uber.org/zap"
1413
)
1514

1615
type Client interface {
1716
GetServer(context.Context, uuid.UUID) (*fleetdb.Server, *fleetdb.ServerResponse, error)
1817
GetComponents(context.Context, uuid.UUID, *fleetdb.PaginationParams) (fleetdb.ServerComponentSlice, *fleetdb.ServerResponse, error)
19-
UpdateAttributes(context.Context, *fleetdb.Server, *types.InventoryDevice, *zap.Logger) error
20-
UpdateServerBIOSConfig() error
18+
UpdateServerInventory(context.Context, *fleetdb.Server, *types.InventoryDevice, *zap.Logger, bool) error
2119
}
2220

2321
// Creates a new Client, with reasonable defaults
24-
func NewFleetDBClient(cfg *app.Configuration) (Client, error) {
22+
func NewFleetDBClient(ctx context.Context, cfg *app.Configuration) (Client, error) {
2523
client, err := fleetdb.NewClient(cfg.FleetDBAddress, nil)
2624
if err != nil {
2725
return nil, err
@@ -31,13 +29,27 @@ func NewFleetDBClient(cfg *app.Configuration) (Client, error) {
3129
client.SetToken(cfg.FleetDBToken)
3230
}
3331

32+
slugs := make(map[string]*fleetdb.ServerComponentType)
33+
serverComponentTypes, _, err := client.ListServerComponentTypes(ctx, nil)
34+
if err != nil {
35+
return nil, fmt.Errorf("failed to get server component types: %w", err)
36+
}
37+
for _, ct := range serverComponentTypes {
38+
slugs[ct.Slug] = ct
39+
}
40+
3441
return &fleetDBClient{
35-
client: client,
42+
client: client,
43+
slugs: slugs,
44+
inventoryConverterInstance: inventoryconverter.NewInventoryConverter(slugs),
3645
}, nil
3746
}
3847

3948
type fleetDBClient struct {
4049
client *fleetdb.Client
50+
// We may want to support slug refresh.
51+
slugs map[string]*fleetdb.ServerComponentType
52+
inventoryConverterInstance *inventoryconverter.InventoryConverter
4153
}
4254

4355
func (fc fleetDBClient) GetServer(ctx context.Context, id uuid.UUID) (*fleetdb.Server, *fleetdb.ServerResponse, error) {
@@ -48,69 +60,14 @@ func (fc fleetDBClient) GetComponents(ctx context.Context, id uuid.UUID, params
4860
return fc.client.GetComponents(ctx, id, params)
4961
}
5062

51-
func (fc fleetDBClient) UpdateAttributes(ctx context.Context, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error {
52-
return createUpdateServerAttributes(ctx, fc.client, server, dev, log)
53-
}
54-
55-
// Functions below may be refactored in the near future.
56-
func createUpdateServerAttributes(ctx context.Context, c *fleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error {
57-
newVendorData, newVendorAttrs, err := deviceVendorAttributes(dev)
63+
func (fc fleetDBClient) UpdateServerInventory(ctx context.Context, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger, inband bool) error {
64+
typeServer, err := fc.inventoryConverterInstance.ToRivetsServer(server.UUID.String(), server.FacilityCode, dev.Inv, *dev.BiosCfg)
5865
if err != nil {
5966
return err
6067
}
61-
62-
// identify current vendor data in the inventory
63-
existingVendorAttrs := attributeByNamespace(constants.ServerVendorAttributeNS, server.Attributes)
64-
if existingVendorAttrs == nil {
65-
// create if none exists
66-
_, err = c.CreateAttributes(ctx, server.UUID, *newVendorAttrs)
67-
return err
68-
}
69-
70-
// unpack vendor data from inventory
71-
existingVendorData := map[string]string{}
72-
if err := json.Unmarshal(existingVendorAttrs.Data, &existingVendorData); err != nil {
73-
// update vendor data since it seems to be invalid
74-
log.Warn("server vendor attributes data invalid, updating..")
75-
76-
_, err = c.UpdateAttributes(ctx, server.UUID, constants.ServerVendorAttributeNS, newVendorAttrs.Data)
77-
78-
return err
79-
}
80-
81-
updatedVendorData := existingVendorData
82-
var changes bool
83-
for key := range newVendorData {
84-
if updatedVendorData[key] == "" || updatedVendorData[key] == "unknown" {
85-
if newVendorData[key] != "unknown" {
86-
changes = true
87-
updatedVendorData[key] = newVendorData[key]
88-
}
89-
}
90-
}
91-
92-
if !changes {
93-
return nil
94-
}
95-
96-
if len(updatedVendorData) > 0 {
97-
updateBytes, err := json.Marshal(updatedVendorData)
98-
if err != nil {
99-
return err
100-
}
101-
102-
_, err = c.UpdateAttributes(ctx, server.UUID, constants.ServerVendorAttributeNS, updateBytes)
103-
68+
_, err = fc.client.SetServerInventory(ctx, server.UUID, typeServer, inband)
69+
if err != nil {
10470
return err
10571
}
106-
10772
return nil
10873
}
109-
110-
func (fc fleetDBClient) UpdateServerBIOSConfig() error {
111-
return createUpdateServerBIOSConfig()
112-
}
113-
114-
func createUpdateServerBIOSConfig() error {
115-
return fmt.Errorf("unimplemented")
116-
}

pkg/api/routes/inventory.go

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

33
import (
44
"context"
5-
"errors"
5+
"fmt"
6+
"strings"
67

78
"github.com/metal-toolbox/alloy/types"
89
internalfleetdb "github.com/metal-toolbox/component-inventory/internal/fleetdb"
@@ -12,13 +13,26 @@ import (
1213

1314
func processInband(ctx context.Context, c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error { //nolint
1415
log.Info("processing", zap.String("server", server.Name), zap.String("device", dev.Inv.Serial))
15-
if err := c.UpdateAttributes(ctx, server, dev, log); err != nil {
16-
return err
17-
}
18-
return errors.New("not implemented")
16+
return c.UpdateServerInventory(ctx, server, dev, log, true)
1917
}
2018

2119
func processOutofband(ctx context.Context, c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error { //nolint
2220
log.Info("processing", zap.String("server", server.Name), zap.String("device", dev.Inv.Serial))
23-
return errors.New("not implemented")
21+
return c.UpdateServerInventory(ctx, server, dev, log, false)
22+
}
23+
24+
func verifyComponent(c internalfleetdb.Client, server *fleetdb.Server, dev *types.InventoryDevice, log *zap.Logger) error {
25+
components, err := fetchServerComponents(c, server.UUID, log)
26+
if err != nil {
27+
if strings.Contains(err.Error(), "404") {
28+
// The server doesn't have components, we can create it.
29+
return nil
30+
}
31+
return err
32+
}
33+
return isBadComponents(components, dev)
34+
}
35+
36+
func isBadComponents(componenets serverComponents, dev *types.InventoryDevice) error {
37+
return fmt.Errorf("unimplement")
2438
}

pkg/api/routes/routes.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func ComposeHTTPServer(theApp *app.App) *http.Server {
132132
return
133133
}
134134

135-
client, err := internalfleetdb.NewFleetDBClient(theApp.Cfg)
135+
client, err := internalfleetdb.NewFleetDBClient(ctx, theApp.Cfg)
136136
if err != nil {
137137
ctx.JSON(http.StatusInternalServerError, map[string]any{
138138
"message": "failed to connect to fleetdb",
@@ -224,7 +224,7 @@ func composeInventoryHandler(theApp *app.App, fn inventoryHandler) gin.HandlerFu
224224
return
225225
}
226226

227-
fleetDBClient, err := internalfleetdb.NewFleetDBClient(theApp.Cfg)
227+
fleetDBClient, err := internalfleetdb.NewFleetDBClient(ctx, theApp.Cfg)
228228
if err != nil {
229229
ctx.JSON(http.StatusInternalServerError, map[string]any{
230230
"message": "failed to connect to fleetdb",
@@ -236,6 +236,7 @@ func composeInventoryHandler(theApp *app.App, fn inventoryHandler) gin.HandlerFu
236236
server, _, err := fleetDBClient.GetServer(ctx, serverID)
237237
if err != nil {
238238
reject(ctx, http.StatusBadRequest, "server not exisit", err.Error())
239+
return
239240
}
240241

241242
if err := fn(

0 commit comments

Comments
 (0)