Skip to content

Commit 96dc5ff

Browse files
authored
Merge pull request #268 from Clara12062/fix-ipmi-client-no-close
FIX: native ipmi client not close
2 parents d032965 + 864ffce commit 96dc5ff

9 files changed

+42
-20
lines changed

collector.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func targetName(target string) string {
130130
return target
131131
}
132132

133-
func NewNativeClient(target ipmiTarget) (*ipmi.Client, error) {
133+
func NewNativeClient(ctx context.Context, target ipmiTarget) (*ipmi.Client, error) {
134134
var client *ipmi.Client
135135
var err error
136136

@@ -164,9 +164,15 @@ func NewNativeClient(target ipmiTarget) (*ipmi.Client, error) {
164164
client = client.WithMaxPrivilegeLevel(priv)
165165
}
166166
// TODO workaround-flags not used in native client
167-
if err := client.Connect(context.TODO()); err != nil {
167+
if err := client.Connect(ctx); err != nil {
168168
logger.Error("Error connecting to IPMI device", "target", target.host, "error", err)
169169
return nil, err
170170
}
171171
return client, nil
172172
}
173+
174+
func CloseNativeClient(ctx context.Context, client *ipmi.Client) {
175+
if closeErr := client.Close(ctx); closeErr != nil {
176+
logger.Warn("Failed to close IPMI client", "target", client.Host, "error", closeErr)
177+
}
178+
}

collector_bmc_native.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ func (c BMCNativeCollector) Args() []string {
4848
}
4949

5050
func (c BMCNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
51-
client, err := NewNativeClient(target)
51+
ctx := context.TODO()
52+
client, err := NewNativeClient(ctx, target)
5253
if err != nil {
5354
return 0, err
5455
}
55-
res, err := client.GetDeviceID(context.TODO())
56+
defer CloseNativeClient(ctx, client)
57+
res, err := client.GetDeviceID(ctx)
5658
if err != nil {
5759
return 0, err
5860
}
@@ -65,7 +67,7 @@ func (c BMCNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metr
6567
},
6668
SystemFirmwareVersions: make([]*ipmi.SystemInfoParam_SystemFirmwareVersion, 0),
6769
}
68-
err = client.GetSystemInfoParamsFor(context.TODO(), &systemInfo)
70+
err = client.GetSystemInfoParamsFor(ctx, &systemInfo)
6971
// This one is not always available
7072
systemFirmwareVersion := "N/A"
7173
if err != nil {

collector_bmc_watchdog_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,13 @@ func (c BMCWatchdogNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometh
9595

9696
// TODO this now works remotely
9797

98-
client, err := NewNativeClient(target)
98+
ctx := context.TODO()
99+
client, err := NewNativeClient(ctx, target)
99100
if err != nil {
100101
return 0, err
101102
}
102-
res, err := client.GetWatchdogTimer(context.TODO())
103+
defer CloseNativeClient(ctx, client)
104+
res, err := client.GetWatchdogTimer(ctx)
103105
if err != nil {
104106
return 0, err
105107
}

collector_chassis_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@ func (c ChassisNativeCollector) Args() []string {
5858
}
5959

6060
func (c ChassisNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
61-
client, err := NewNativeClient(target)
61+
ctx := context.TODO()
62+
client, err := NewNativeClient(ctx, target)
6263
if err != nil {
6364
return 0, err
6465
}
65-
res, err := client.GetChassisStatus(context.TODO())
66+
defer CloseNativeClient(ctx, client)
67+
res, err := client.GetChassisStatus(ctx)
6668
if err != nil {
6769
return 0, err
6870
}

collector_dcmi_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ func (c DCMINativeCollector) Args() []string {
4646
}
4747

4848
func (c DCMINativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
49-
client, err := NewNativeClient(target)
49+
ctx := context.TODO()
50+
client, err := NewNativeClient(ctx, target)
5051
if err != nil {
5152
return 0, err
5253
}
53-
res, err := client.GetDCMIPowerReading(context.TODO())
54+
defer CloseNativeClient(ctx, client)
55+
res, err := client.GetDCMIPowerReading(ctx)
5456
if err != nil {
5557
logger.Error("Failed to collect DCMI data", "target", targetName(target.host), "error", err)
5658
return 0, err

collector_ipmi_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,13 @@ func (c IPMINativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Met
146146
return true
147147
}
148148

149-
client, err := NewNativeClient(target)
149+
ctx := context.TODO()
150+
client, err := NewNativeClient(ctx, target)
150151
if err != nil {
151152
return 0, err
152153
}
153-
res, err := client.GetSensors(context.TODO(), filter)
154+
defer CloseNativeClient(ctx, client)
155+
res, err := client.GetSensors(ctx, filter)
154156
if err != nil {
155157
return 0, err
156158
}

collector_sel_events_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ func (c SELEventsNativeCollector) Args() []string {
6060
func (c SELEventsNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
6161
selEventConfigs := target.config.SELEvents
6262

63-
client, err := NewNativeClient(target)
63+
ctx := context.TODO()
64+
client, err := NewNativeClient(ctx, target)
6465
if err != nil {
6566
return 0, err
6667
}
67-
res, err := client.GetSELEntries(context.TODO(), 0)
68+
defer CloseNativeClient(ctx, client)
69+
res, err := client.GetSELEntries(ctx, 0)
6870
if err != nil {
6971
return 0, err
7072
}

collector_sel_native.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@ func (c SELNativeCollector) Args() []string {
5353
}
5454

5555
func (c SELNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
56-
client, err := NewNativeClient(target)
56+
ctx := context.TODO()
57+
client, err := NewNativeClient(ctx, target)
5758
if err != nil {
5859
return 0, err
5960
}
60-
res, err := client.GetSELInfo(context.TODO())
61+
defer CloseNativeClient(ctx, client)
62+
res, err := client.GetSELInfo(ctx)
6163
if err != nil {
6264
return 0, err
6365
}

collector_sm_lan_mode_native.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,17 @@ func (c SMLANModeNativeCollector) Args() []string {
4848
}
4949

5050
func (c SMLANModeNativeCollector) Collect(_ freeipmi.Result, ch chan<- prometheus.Metric, target ipmiTarget) (int, error) {
51-
client, err := NewNativeClient(target)
51+
ctx := context.TODO()
52+
client, err := NewNativeClient(ctx, target)
5253
if err != nil {
5354
return 0, err
5455
}
55-
if _, err := client.SetSessionPrivilegeLevel(context.TODO(), ipmi.PrivilegeLevelAdministrator); err != nil {
56+
defer CloseNativeClient(ctx, client)
57+
if _, err := client.SetSessionPrivilegeLevel(ctx, ipmi.PrivilegeLevelAdministrator); err != nil {
5658
logger.Error("Failed to set privilege level to admin", "target", targetName(target.host))
5759
return 0, fmt.Errorf("failed to set privilege level to admin")
5860
}
59-
res, err := client.RawCommand(context.TODO(), ipmi.NetFnOEMSupermicroRequest, 0x70, []byte{0x0C, 0x00}, "GetSupermicroLanMode")
61+
res, err := client.RawCommand(ctx, ipmi.NetFnOEMSupermicroRequest, 0x70, []byte{0x0C, 0x00}, "GetSupermicroLanMode")
6062
if err != nil {
6163
logger.Error("raw command failed", "error", err)
6264
return 0, err

0 commit comments

Comments
 (0)