@@ -2,26 +2,24 @@ package internalfleetdb
2
2
3
3
import (
4
4
"context"
5
- "encoding/json"
6
5
"fmt"
7
6
8
7
"github.com/google/uuid"
9
8
"github.com/metal-toolbox/alloy/types"
10
9
"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 "
12
11
fleetdb "github.com/metal-toolbox/fleetdb/pkg/api/v1"
13
12
"go.uber.org/zap"
14
13
)
15
14
16
15
type Client interface {
17
16
GetServer (context.Context , uuid.UUID ) (* fleetdb.Server , * fleetdb.ServerResponse , error )
18
17
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
21
19
}
22
20
23
21
// 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 ) {
25
23
client , err := fleetdb .NewClient (cfg .FleetDBAddress , nil )
26
24
if err != nil {
27
25
return nil , err
@@ -31,13 +29,27 @@ func NewFleetDBClient(cfg *app.Configuration) (Client, error) {
31
29
client .SetToken (cfg .FleetDBToken )
32
30
}
33
31
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
+
34
41
return & fleetDBClient {
35
- client : client ,
42
+ client : client ,
43
+ slugs : slugs ,
44
+ inventoryConverterInstance : inventoryconverter .NewInventoryConverter (slugs ),
36
45
}, nil
37
46
}
38
47
39
48
type fleetDBClient struct {
40
49
client * fleetdb.Client
50
+ // We may want to support slug refresh.
51
+ slugs map [string ]* fleetdb.ServerComponentType
52
+ inventoryConverterInstance * inventoryconverter.InventoryConverter
41
53
}
42
54
43
55
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
48
60
return fc .client .GetComponents (ctx , id , params )
49
61
}
50
62
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 )
58
65
if err != nil {
59
66
return err
60
67
}
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 {
104
70
return err
105
71
}
106
-
107
72
return nil
108
73
}
109
-
110
- func (fc fleetDBClient ) UpdateServerBIOSConfig () error {
111
- return createUpdateServerBIOSConfig ()
112
- }
113
-
114
- func createUpdateServerBIOSConfig () error {
115
- return fmt .Errorf ("unimplemented" )
116
- }
0 commit comments