Skip to content

Commit fa9ec6b

Browse files
committed
Addressed review feedback; removed getter, merged into action. Renamed and regenerated protobufs to reflect. Some tests to make codecov happy.
Signed-off-by: Matthew Burns <[email protected]>
1 parent e719e0e commit fa9ec6b

File tree

7 files changed

+302
-153
lines changed

7 files changed

+302
-153
lines changed

api/v1/diagnostic.proto

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ service Diagnostic {
1313
rpc Screenshot (ScreenshotRequest) returns (ScreenshotResponse);
1414
rpc ClearSystemEventLog (ClearSystemEventLogRequest) returns (ClearSystemEventLogResponse);
1515
rpc SendNMI (SendNMIRequest) returns (google.protobuf.Empty);
16-
rpc GetSystemEventLog (GetSystemEventLogRequest) returns (GetSystemEventLogResponse);
17-
rpc GetSystemEventLogRaw (GetSystemEventLogRawRequest) returns (GetSystemEventLogRawResponse);
16+
rpc SystemEventLog (SystemEventLogRequest) returns (SystemEventLogResponse);
17+
rpc SystemEventLogRaw (SystemEventLogRawRequest) returns (SystemEventLogRawResponse);
1818
}
1919

2020
message ScreenshotRequest {
@@ -40,7 +40,7 @@ message SendNMIRequest {
4040
v1.Authn authn = 1;
4141
}
4242

43-
message GetSystemEventLogRequest {
43+
message SystemEventLogRequest {
4444
v1.Authn authn = 1;
4545
v1.Vendor vendor = 2;
4646
}
@@ -52,15 +52,15 @@ message SystemEventLogEntry {
5252
string message = 4;
5353
}
5454

55-
message GetSystemEventLogResponse {
55+
message SystemEventLogResponse {
5656
repeated SystemEventLogEntry events = 1;
5757
}
5858

59-
message GetSystemEventLogRawRequest {
59+
message SystemEventLogRawRequest {
6060
v1.Authn authn = 1;
6161
v1.Vendor vendor = 2;
6262
}
6363

64-
message GetSystemEventLogRawResponse {
64+
message SystemEventLogRawResponse {
6565
string log = 1;
6666
}

client/client.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,14 @@ func ClearSystemEventLog(ctx context.Context, client v1.DiagnosticClient, taskCl
150150
func SendNMI(ctx context.Context, client v1.DiagnosticClient, request *v1.SendNMIRequest) error {
151151
_, err := client.SendNMI(ctx, request)
152152
return err
153+
}
153154

154-
// GetSystemEventLog retrieves the System Event Log of the server.
155-
func GetSystemEventLog(ctx context.Context, client v1.DiagnosticClient, request *v1.GetSystemEventLogRequest) (*v1.GetSystemEventLogResponse, error) {
156-
return client.GetSystemEventLog(ctx, request)
155+
// SystemEventLog retrieves the System Event Log of the server.
156+
func SystemEventLog(ctx context.Context, client v1.DiagnosticClient, request *v1.SystemEventLogRequest) (*v1.SystemEventLogResponse, error) {
157+
return client.SystemEventLog(ctx, request)
157158
}
158159

159-
// GetSystemEventLogRaw retrieves the System Event Log of the server.
160-
func GetSystemEventLogRaw(ctx context.Context, client v1.DiagnosticClient, request *v1.GetSystemEventLogRawRequest) (*v1.GetSystemEventLogRawResponse, error) {
161-
return client.GetSystemEventLogRaw(ctx, request)
160+
// SystemEventLogRaw retrieves the System Event Log of the server.
161+
func SystemEventLogRaw(ctx context.Context, client v1.DiagnosticClient, request *v1.SystemEventLogRawRequest) (*v1.SystemEventLogRawResponse, error) {
162+
return client.SystemEventLogRaw(ctx, request)
162163
}

cmd/sel.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ var (
7979
defer conn.Close()
8080
client := v1.NewDiagnosticClient(conn)
8181

82-
resp, err := v1Client.GetSystemEventLog(ctx, client, &v1.GetSystemEventLogRequest{
82+
resp, err := v1Client.SystemEventLog(ctx, client, &v1.SystemEventLogRequest{
8383
Authn: &v1.Authn{
8484
Authn: &v1.Authn_DirectAuthn{
8585
DirectAuthn: &v1.DirectAuthn{
@@ -123,7 +123,7 @@ var (
123123
defer conn.Close()
124124
client := v1.NewDiagnosticClient(conn)
125125

126-
resp, err := v1Client.GetSystemEventLogRaw(ctx, client, &v1.GetSystemEventLogRawRequest{
126+
resp, err := v1Client.SystemEventLogRaw(ctx, client, &v1.SystemEventLogRawRequest{
127127
Authn: &v1.Authn{
128128
Authn: &v1.Authn_DirectAuthn{
129129
DirectAuthn: &v1.DirectAuthn{

grpc/oob/diagnostic/diagnostic.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import (
88

99
type Action struct {
1010
common.Accessory
11-
ScreenshotRequest *v1.ScreenshotRequest
12-
ClearSystemEventLogRequest *v1.ClearSystemEventLogRequest
13-
SendNMIRequest *v1.SendNMIRequest
14-
ScreenshotRequest *v1.ScreenshotRequest
15-
ClearSystemEventLogRequest *v1.ClearSystemEventLogRequest
16-
GetSystemEventLogRequest *v1.GetSystemEventLogRequest
17-
GetSystemEventLogRawRequest *v1.GetSystemEventLogRawRequest
11+
ScreenshotRequest *v1.ScreenshotRequest
12+
ClearSystemEventLogRequest *v1.ClearSystemEventLogRequest
13+
SendNMIRequest *v1.SendNMIRequest
14+
SystemEventLogRequest *v1.SystemEventLogRequest
15+
SystemEventLogRawRequest *v1.SystemEventLogRawRequest
16+
ActionName string
17+
RPCName string
1818
}
1919

2020
// WithLogger adds a logr to an Action struct.
@@ -33,5 +33,14 @@ func WithStatusMessage(s chan string) Option {
3333
}
3434
}
3535

36+
// WithLabels adds the custom tracing and logging labels to an Action struct.
37+
func WithLabels(actionName string, rpcName string) Option {
38+
return func(a *Action) error {
39+
a.ActionName = actionName
40+
a.RPCName = rpcName
41+
return nil
42+
}
43+
}
44+
3645
// Option to add to an Actions.
3746
type Option func(a *Action) error

grpc/oob/diagnostic/getsel.go

Lines changed: 47 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -18,53 +18,50 @@ import (
1818
"go.opentelemetry.io/otel/trace"
1919
)
2020

21-
func NewSystemEventLogGetter(req *v1.GetSystemEventLogRequest, opts ...Option) (*Action, error) {
21+
func NewSystemEventLogAction(req interface{}, opts ...Option) (*Action, error) {
2222
a := &Action{}
23-
a.GetSystemEventLogRequest = req
24-
for _, opt := range opts {
25-
err := opt(a)
26-
if err != nil {
27-
return nil, err
28-
}
23+
switch r := req.(type) {
24+
case *v1.SystemEventLogRequest:
25+
a.SystemEventLogRequest = r
26+
case *v1.SystemEventLogRawRequest:
27+
a.SystemEventLogRawRequest = r
28+
default:
29+
return nil, fmt.Errorf("unsupported request type")
2930
}
30-
return a, nil
31-
}
3231

33-
func NewSystemEventLogRawGetter(req *v1.GetSystemEventLogRawRequest, opts ...Option) (*Action, error) {
34-
a := &Action{}
35-
a.GetSystemEventLogRawRequest = req
3632
for _, opt := range opts {
3733
err := opt(a)
3834
if err != nil {
3935
return nil, err
4036
}
4137
}
38+
4239
return a, nil
4340
}
4441

45-
func (m Action) GetSystemEventLog(ctx context.Context) (result bmc.SystemEventLogEntries, err error) {
42+
func (m Action) SystemEventLog(ctx context.Context) (entries bmc.SystemEventLogEntries, raw string, err error) {
4643
labels := prometheus.Labels{
4744
"service": "diagnostic",
48-
"action": "get_system_event_log",
45+
"action": m.ActionName,
4946
}
5047

5148
timer := prometheus.NewTimer(metrics.ActionDuration.With(labels))
5249
defer timer.ObserveDuration()
5350

5451
tracer := otel.Tracer("pbnj")
55-
ctx, span := tracer.Start(ctx, "diagnostic.GetSystemEventLog", trace.WithAttributes(
56-
attribute.String("bmc.device", m.GetSystemEventLogRequest.GetAuthn().GetDirectAuthn().GetHost().GetHost()),
52+
ctx, span := tracer.Start(ctx, "diagnostic."+m.RPCName, trace.WithAttributes(
53+
attribute.String("bmc.device", m.SystemEventLogRequest.GetAuthn().GetDirectAuthn().GetHost().GetHost()),
5754
))
5855
defer span.End()
5956

60-
if v := m.GetSystemEventLogRequest.GetVendor(); v != nil {
57+
if v := m.SystemEventLogRequest.GetVendor(); v != nil {
6158
span.SetAttributes(attribute.String("bmc.vendor", v.GetName()))
6259
}
6360

64-
host, user, password, parseErr := m.ParseAuth(m.GetSystemEventLogRequest.GetAuthn())
61+
host, user, password, parseErr := m.ParseAuth(m.SystemEventLogRequest.GetAuthn())
6562
if parseErr != nil {
6663
span.SetStatus(codes.Error, "error parsing credentials: "+parseErr.Error())
67-
return result, parseErr
64+
return entries, raw, parseErr
6865
}
6966

7067
span.SetAttributes(attribute.String("bmc.host", host), attribute.String("bmc.username", user))
@@ -75,96 +72,25 @@ func (m Action) GetSystemEventLog(ctx context.Context) (result bmc.SystemEventLo
7572
}
7673

7774
client := bmclib.NewClient(host, user, password, opts...)
78-
client.Registry.Drivers = client.Registry.Supports(providers.FeatureGetSystemEventLog)
79-
80-
m.SendStatusMessage("connecting to BMC")
81-
err = client.Open(ctx)
82-
meta := client.GetMetadata()
83-
span.SetAttributes(attribute.StringSlice("bmc.open.providersAttempted", meta.ProvidersAttempted),
84-
attribute.StringSlice("bmc.open.successfulOpenConns", meta.SuccessfulOpenConns))
85-
if err != nil {
86-
span.SetStatus(codes.Error, err.Error())
87-
return nil, &repository.Error{
88-
Code: v1.Code_value["PERMISSION_DENIED"],
89-
Message: err.Error(),
90-
}
91-
}
92-
log := m.Log.WithValues("host", host, "user", user)
93-
defer func() {
94-
client.Close(ctx)
95-
log.Info("closed connections", logMetadata(client.GetMetadata())...)
96-
}()
97-
log.Info("connected to BMC", logMetadata(client.GetMetadata())...)
98-
m.SendStatusMessage("connected to BMC")
99-
100-
// Get the system event log
101-
m.SendStatusMessage("getting system event log")
102-
sel, err := client.GetSystemEventLog(ctx)
103-
log = m.Log.WithValues(logMetadata(client.GetMetadata())...)
104-
meta = client.GetMetadata()
105-
span.SetAttributes(attribute.StringSlice("bmc.get_system_event_log.providersAttempted", meta.ProvidersAttempted),
106-
attribute.StringSlice("bmc.get_system_event_log.successfulOpenConns", meta.SuccessfulOpenConns))
107-
if err != nil {
108-
log.Error(err, "error getting system event log")
109-
span.SetStatus(codes.Error, "error getting system event log: "+err.Error())
110-
m.SendStatusMessage(fmt.Sprintf("failed to get system event log %v", host))
111-
112-
return nil, &repository.Error{
113-
Code: v1.Code_value["UNKNOWN"],
114-
Message: err.Error(),
115-
}
116-
}
117-
118-
span.SetStatus(codes.Ok, "")
119-
log.Info("got system event log", logMetadata(client.GetMetadata())...)
120-
m.SendStatusMessage(fmt.Sprintf("got system event log on %v", host))
121-
122-
return sel, nil
123-
}
124-
125-
func (m Action) GetSystemEventLogRaw(ctx context.Context) (result string, err error) {
126-
labels := prometheus.Labels{
127-
"service": "diagnostic",
128-
"action": "get_system_event_log_raw",
129-
}
130-
131-
timer := prometheus.NewTimer(metrics.ActionDuration.With(labels))
132-
defer timer.ObserveDuration()
133-
134-
tracer := otel.Tracer("pbnj")
135-
ctx, span := tracer.Start(ctx, "diagnostic.GetSystemEventLogRaw", trace.WithAttributes(
136-
attribute.String("bmc.device", m.GetSystemEventLogRawRequest.GetAuthn().GetDirectAuthn().GetHost().GetHost()),
137-
))
138-
defer span.End()
13975

140-
if v := m.GetSystemEventLogRawRequest.GetVendor(); v != nil {
141-
span.SetAttributes(attribute.String("bmc.vendor", v.GetName()))
76+
// Set the driver(s) to use based on the request type
77+
switch {
78+
case m.SystemEventLogRequest != nil:
79+
client.Registry.Drivers = client.Registry.Supports(providers.FeatureGetSystemEventLog)
80+
case m.SystemEventLogRawRequest != nil:
81+
client.Registry.Drivers = client.Registry.Supports(providers.FeatureGetSystemEventLogRaw)
82+
default:
83+
return entries, raw, fmt.Errorf("unsupported request type")
14284
}
14385

144-
host, user, password, parseErr := m.ParseAuth(m.GetSystemEventLogRawRequest.GetAuthn())
145-
if parseErr != nil {
146-
span.SetStatus(codes.Error, "error parsing credentials: "+parseErr.Error())
147-
return result, parseErr
148-
}
149-
150-
span.SetAttributes(attribute.String("bmc.host", host), attribute.String("bmc.username", user))
151-
152-
opts := []bmclib.Option{
153-
bmclib.WithLogger(m.Log),
154-
bmclib.WithPerProviderTimeout(common.BMCTimeoutFromCtx(ctx)),
155-
}
156-
157-
client := bmclib.NewClient(host, user, password, opts...)
158-
client.Registry.Drivers = client.Registry.Supports(providers.FeatureGetSystemEventLogRaw)
159-
16086
m.SendStatusMessage("connecting to BMC")
16187
err = client.Open(ctx)
16288
meta := client.GetMetadata()
16389
span.SetAttributes(attribute.StringSlice("bmc.open.providersAttempted", meta.ProvidersAttempted),
16490
attribute.StringSlice("bmc.open.successfulOpenConns", meta.SuccessfulOpenConns))
16591
if err != nil {
16692
span.SetStatus(codes.Error, err.Error())
167-
return "", &repository.Error{
93+
return entries, raw, &repository.Error{
16894
Code: v1.Code_value["PERMISSION_DENIED"],
16995
Message: err.Error(),
17096
}
@@ -177,27 +103,37 @@ func (m Action) GetSystemEventLogRaw(ctx context.Context) (result string, err er
177103
log.Info("connected to BMC", logMetadata(client.GetMetadata())...)
178104
m.SendStatusMessage("connected to BMC")
179105

180-
// Get the system event log
181-
m.SendStatusMessage("getting system event log")
182-
sel, err := client.GetSystemEventLogRaw(ctx)
106+
m.SendStatusMessage("getting " + m.ActionName + " on " + host)
107+
108+
switch {
109+
case m.SystemEventLogRequest != nil:
110+
// Get the system event log
111+
entries, err = client.GetSystemEventLog(ctx)
112+
case m.SystemEventLogRawRequest != nil:
113+
// Get the system event log
114+
raw, err = client.GetSystemEventLogRaw(ctx)
115+
default:
116+
return entries, raw, fmt.Errorf("unsupported request type")
117+
}
118+
183119
log = m.Log.WithValues(logMetadata(client.GetMetadata())...)
184120
meta = client.GetMetadata()
185-
span.SetAttributes(attribute.StringSlice("bmc.get_system_event_log_raw.providersAttempted", meta.ProvidersAttempted),
186-
attribute.StringSlice("bmc.get_system_event_log_raw.successfulOpenConns", meta.SuccessfulOpenConns))
121+
span.SetAttributes(attribute.StringSlice("bmc."+m.ActionName+".providersAttempted", meta.ProvidersAttempted),
122+
attribute.StringSlice("bmc."+m.ActionName+".successfulOpenConns", meta.SuccessfulOpenConns))
187123
if err != nil {
188-
log.Error(err, "error getting raw system event log")
189-
span.SetStatus(codes.Error, "error getting raw system event log: "+err.Error())
190-
m.SendStatusMessage(fmt.Sprintf("failed to get raw system event log %v", host))
124+
log.Error(err, "error getting "+m.ActionName)
125+
span.SetStatus(codes.Error, "error getting "+m.ActionName+": "+err.Error())
126+
m.SendStatusMessage(fmt.Sprintf("failed to get "+m.ActionName+" %v", host))
191127

192-
return "", &repository.Error{
128+
return entries, raw, &repository.Error{
193129
Code: v1.Code_value["UNKNOWN"],
194130
Message: err.Error(),
195131
}
196132
}
197133

198134
span.SetStatus(codes.Ok, "")
199-
log.Info("got raw system event log", logMetadata(client.GetMetadata())...)
200-
m.SendStatusMessage(fmt.Sprintf("got raw system event log on %v", host))
135+
log.Info("got "+m.ActionName, logMetadata(client.GetMetadata())...)
136+
m.SendStatusMessage(fmt.Sprintf("got "+m.ActionName+" on %v", host))
201137

202-
return sel, nil
138+
return entries, raw, nil
203139
}

0 commit comments

Comments
 (0)