Skip to content

Commit 570377e

Browse files
Guitarherouaillia-malachyn
authored andcommitted
add correct []string convertion
1 parent a09d085 commit 570377e

2 files changed

Lines changed: 58 additions & 25 deletions

File tree

admin/commands/storage/backfill_tx_error_messages.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -167,33 +167,54 @@ func (b *BackfillTxErrorMessagesCommand) Handler(ctx context.Context, request *a
167167
return nil, nil
168168
}
169169

170+
// convertToExecutionStringList converts a given input to a slice of strings containing execution node IDs.
171+
// Returns an error if the input is not a slice of strings or if the slice is empty.
172+
func convertToExecutionStringList(executionNodeIdsIn interface{}) ([]string, error) {
173+
var executionNodeIds []string
174+
switch executionNodeIdsConverted := executionNodeIdsIn.(type) {
175+
case []interface{}:
176+
for _, executionNodeIdIn := range executionNodeIdsConverted {
177+
executionNodeId, ok := executionNodeIdIn.(string)
178+
if !ok {
179+
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a list of strings", executionNodeIdsIn)
180+
}
181+
executionNodeIds = append(executionNodeIds, executionNodeId)
182+
}
183+
default:
184+
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a list of strings", executionNodeIdsIn)
185+
}
186+
187+
if len(executionNodeIds) == 0 {
188+
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a non empty list of strings", executionNodeIdsIn)
189+
}
190+
191+
return executionNodeIds, nil
192+
}
193+
170194
// parseExecutionNodeIds converts a list of node IDs from input to flow.IdentitySkeletonList.
171195
// Returns an error if the IDs are invalid or empty.
172196
//
173197
// Expected errors during normal operation:
174198
// - admin.InvalidAdminReqParameterError - if execution-node-ids is empty or has an invalid format.
175199
func (b *BackfillTxErrorMessagesCommand) parseExecutionNodeIds(executionNodeIdsIn interface{}, allIdentities flow.IdentityList) (flow.IdentityList, error) {
176-
var ids flow.IdentityList
200+
executionNodeIds, err := convertToExecutionStringList(executionNodeIdsIn)
201+
if err != nil {
202+
return nil, err
203+
}
177204

178-
switch executionNodeIds := executionNodeIdsIn.(type) {
179-
case []string:
180-
if len(executionNodeIds) == 0 {
181-
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a non empty list of strings", executionNodeIdsIn)
182-
}
183-
requestedENIdentifiers, err := commonrpc.IdentifierList(executionNodeIds)
184-
if err != nil {
185-
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", err.Error(), executionNodeIdsIn)
186-
}
205+
requestedENIdentifiers, err := commonrpc.IdentifierList(executionNodeIds)
206+
if err != nil {
207+
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", err.Error(), executionNodeIdsIn)
208+
}
187209

188-
for _, enId := range requestedENIdentifiers {
189-
id, exists := allIdentities.ByNodeID(enId)
190-
if !exists {
191-
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "could not find execution node by provided id", enId)
192-
}
193-
ids = append(ids, id)
210+
var ids flow.IdentityList
211+
212+
for _, enId := range requestedENIdentifiers {
213+
id, exists := allIdentities.ByNodeID(enId)
214+
if !exists {
215+
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "could not find execution node by provided id", enId)
194216
}
195-
default:
196-
return nil, admin.NewInvalidAdminReqParameterError("execution-node-ids", "must be a list of strings", executionNodeIdsIn)
217+
ids = append(ids, id)
197218
}
198219

199220
return ids, nil

admin/commands/storage/backfill_tx_error_messages_test.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,13 @@ func (suite *BackfillTxErrorMessagesSuite) TestValidateInvalidFormat() {
253253

254254
// invalid execution-node-ids param
255255
suite.Run("invalid execution-node-ids field", func() {
256+
executorIDsList, err := commands.ConvertToInterfaceList([]int{1, 2, 3})
257+
suite.Require().NoError(err)
258+
256259
// invalid type
257-
err := suite.command.Validator(&admin.CommandRequest{
260+
err = suite.command.Validator(&admin.CommandRequest{
258261
Data: map[string]interface{}{
259-
"execution-node-ids": []int{1, 2, 3},
262+
"execution-node-ids": executorIDsList,
260263
},
261264
})
262265
suite.Error(err)
@@ -275,11 +278,15 @@ func (suite *BackfillTxErrorMessagesSuite) TestValidateInvalidFormat() {
275278

276279
// invalid execution node id
277280
invalidENID := unittest.IdentifierFixture()
281+
282+
executorIDsList, err = commands.ConvertToInterfaceList([]string{invalidENID.String()})
283+
suite.Require().NoError(err)
284+
278285
err = suite.command.Validator(&admin.CommandRequest{
279286
Data: map[string]interface{}{
280287
"start-height": float64(1), // raw json parses to float64
281288
"end-height": float64(4), // raw json parses to float64
282-
"execution-node-ids": []string{invalidENID.String()},
289+
"execution-node-ids": executorIDsList,
283290
},
284291
})
285292
suite.Error(err)
@@ -306,11 +313,13 @@ func (suite *BackfillTxErrorMessagesSuite) TestValidateValidFormat() {
306313

307314
// all parameters are provided
308315
suite.Run("happy case, all parameters are provided", func() {
309-
err := suite.command.Validator(&admin.CommandRequest{
316+
executorIDsList, err := commands.ConvertToInterfaceList([]string{suite.allENIDs[0].ID().String()})
317+
suite.Require().NoError(err)
318+
err = suite.command.Validator(&admin.CommandRequest{
310319
Data: map[string]interface{}{
311320
"start-height": float64(1), // raw json parses to float64
312321
"end-height": float64(3), // raw json parses to float64
313-
"execution-node-ids": []string{suite.allENIDs[0].ID().String()},
322+
"execution-node-ids": executorIDsList,
314323
},
315324
})
316325
suite.NoError(err)
@@ -374,11 +383,14 @@ func (suite *BackfillTxErrorMessagesSuite) TestHandleBackfillTxErrorMessages() {
374383
suite.allENIDs = unittest.IdentityListFixture(3, unittest.WithRole(flow.RoleExecution))
375384

376385
executorID := suite.allENIDs[1].ID()
386+
executorIDsList, err := commands.ConvertToInterfaceList([]string{executorID.String()})
387+
suite.Require().NoError(err)
388+
377389
req = &admin.CommandRequest{
378390
Data: map[string]interface{}{
379391
"start-height": float64(startHeight), // raw json parses to float64
380392
"end-height": float64(endHeight), // raw json parses to float64
381-
"execution-node-ids": []string{executorID.String()},
393+
"execution-node-ids": executorIDsList,
382394
},
383395
}
384396
suite.Require().NoError(suite.command.Validator(req))
@@ -401,7 +413,7 @@ func (suite *BackfillTxErrorMessagesSuite) TestHandleBackfillTxErrorMessages() {
401413
suite.mockStoreTxErrorMessages(blockId, results, executorID)
402414
}
403415

404-
_, err := suite.command.Handler(ctx, req)
416+
_, err = suite.command.Handler(ctx, req)
405417
suite.Require().NoError(err)
406418
suite.assertAllExpectations()
407419
})

0 commit comments

Comments
 (0)