diff --git a/internal/decomposer/decomposer.go b/internal/decomposer/decomposer.go index 6eef0ae3..cf6a9f0a 100644 --- a/internal/decomposer/decomposer.go +++ b/internal/decomposer/decomposer.go @@ -34,7 +34,7 @@ type ExecutionDetails struct { } type IDecomposer interface { - Execute(playbook cacao.Playbook, details chan string) (*ExecutionDetails, error) + Execute(playbook cacao.Playbook, details chan ExecutionDetails) (*ExecutionDetails, error) } func init() { @@ -69,7 +69,7 @@ type Decomposer struct { } // Execute a Playbook -func (decomposer *Decomposer) Execute(playbook cacao.Playbook, detailsch chan string) (*ExecutionDetails, error) { +func (decomposer *Decomposer) Execute(playbook cacao.Playbook, execution_details_ch chan ExecutionDetails) (*ExecutionDetails, error) { executionId := decomposer.guid.New() log.Debugf("Starting execution %s for Playbook %s", executionId, playbook.ID) @@ -77,10 +77,8 @@ func (decomposer *Decomposer) Execute(playbook cacao.Playbook, detailsch chan st details := ExecutionDetails{executionId, playbook.ID, playbook.PlaybookVariables} decomposer.details = details - if detailsch != nil { - // Ad-hoc format using '///' separator - execution_ids := playbook.ID + "///" + executionId.String() - detailsch <- execution_ids + if execution_details_ch != nil { + execution_details_ch <- details } decomposer.playbook = playbook diff --git a/routes/trigger/trigger_api.go b/routes/trigger/trigger_api.go index 78f45baf..2b1acb30 100644 --- a/routes/trigger/trigger_api.go +++ b/routes/trigger/trigger_api.go @@ -4,10 +4,10 @@ import ( "io" "net/http" "reflect" - "strings" "time" "soarca/internal/controller/decomposer_controller" + "soarca/internal/decomposer" "soarca/logger" "soarca/models/decoder" "soarca/routes/error" @@ -29,14 +29,14 @@ func init() { type TriggerApi struct { controller decomposer_controller.IController - Executionsch chan string + Executionsch chan decomposer.ExecutionDetails } func New(controller decomposer_controller.IController) *TriggerApi { instance := TriggerApi{} instance.controller = controller // Channel to get back execution details - instance.Executionsch = make(chan string) + instance.Executionsch = make(chan decomposer.ExecutionDetails) return &instance } @@ -75,10 +75,10 @@ func (trigger *TriggerApi) Execute(context *gin.Context) { } context.JSON(http.StatusRequestTimeout, msg) log.Error("async execution timed out for playbook ", playbook.ID) - case execution_ids := <-trigger.Executionsch: + case exec_details := <-trigger.Executionsch: // Ad-hoc format using '///' separator - playbook_id := strings.Split(execution_ids, "///")[0] - exec_id := strings.Split(execution_ids, "///")[1] + playbook_id := exec_details.PlaybookId + exec_id := exec_details.ExecutionId if playbook_id == playbook.ID { msg := gin.H{ "execution_id": exec_id, diff --git a/test/unittest/decomposer/decomposer_test.go b/test/unittest/decomposer/decomposer_test.go index 776fef2b..a302d7da 100644 --- a/test/unittest/decomposer/decomposer_test.go +++ b/test/unittest/decomposer/decomposer_test.go @@ -7,6 +7,7 @@ import ( "time" "soarca/internal/decomposer" + decomposer_model "soarca/internal/decomposer" "soarca/internal/executors/action" "soarca/models/cacao" "soarca/models/execution" @@ -112,7 +113,7 @@ func TestExecutePlaybook(t *testing.T) { mock_reporter.On("ReportWorkflowEnd", executionId, playbook, nil).Return() mock_action_executor.On("Execute", metaStep1, playbookStepMetadata).Return(cacao.NewVariables(cacao.Variable{Name: "return", Value: "value"}), nil) - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails details, err := decomposer.Execute(playbook, nilch) uuid_mock.AssertExpectations(t) fmt.Println(err) @@ -261,7 +262,7 @@ func TestExecutePlaybookMultiStep(t *testing.T) { mock_action_executor.On("Execute", metaStep2, playbookStepMetadata2).Return(cacao.NewVariables(cacao.Variable{Name: "result", Value: "updated"}), nil) - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails details, err := decomposer.Execute(playbook, nilch) uuid_mock.AssertExpectations(t) fmt.Println(err) @@ -342,7 +343,7 @@ func TestExecuteEmptyMultiStep(t *testing.T) { mock_time.On("Sleep", time.Second*0).Return() mock_reporter.On("ReportWorkflowEnd", id, playbook, errors.New("empty success step")).Return() - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails returnedId, err := decomposer2.Execute(playbook, nilch) uuid_mock2.AssertExpectations(t) fmt.Println(err) @@ -406,7 +407,7 @@ func TestExecuteIllegalMultiStep(t *testing.T) { mock_time.On("Sleep", time.Second*0).Return() mock_reporter.On("ReportWorkflowEnd", id, playbook, errors.New("empty success step")).Return() - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails returnedId, err := decomposer2.Execute(playbook, nilch) uuid_mock2.AssertExpectations(t) mock_reporter.AssertExpectations(t) @@ -472,7 +473,7 @@ func TestExecutePlaybookAction(t *testing.T) { step1, cacao.NewVariables(expectedVariables)).Return(cacao.NewVariables(cacao.Variable{Name: "return", Value: "value"}), nil) - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails details, err := decomposer.Execute(playbook, nilch) uuid_mock.AssertExpectations(t) fmt.Println(err) @@ -653,7 +654,7 @@ func TestExecuteIfCondition(t *testing.T) { metaStepCompletion, stepCompletionDetails).Return(cacao.NewVariables(), nil) mock_reporter.On("ReportWorkflowEnd", executionId, playbook, nil).Return() - var nilch chan string + var nilch chan decomposer_model.ExecutionDetails details, err := decomposer.Execute(playbook, nilch) uuid_mock.AssertExpectations(t) fmt.Println(err) diff --git a/test/unittest/executor/playbook_action/playbook_action_executor_test.go b/test/unittest/executor/playbook_action/playbook_action_executor_test.go index 8603009a..76bf8faf 100644 --- a/test/unittest/executor/playbook_action/playbook_action_executor_test.go +++ b/test/unittest/executor/playbook_action/playbook_action_executor_test.go @@ -80,11 +80,13 @@ func TestExecutePlaybook(t *testing.T) { playbook2 := cacao.Playbook{ID: playbookId, PlaybookVariables: cacao.NewVariables(expectedVariables)} - var nilch chan string - mockDecomposer.On("Execute", playbook2, nilch).Return(&details, nil) + var nilch chan decomposer.ExecutionDetails + + mockDecomposer.On("Execute", playbook2, nilch).Return(&details, nil, executionId) results, err := executerObject.Execute(metadata, step, cacao.NewVariables(addedVariables)) + mockDecomposer.AssertExpectations(t) mock_reporter.AssertExpectations(t) assert.Equal(t, err, nil) assert.Equal(t, results, cacao.NewVariables(returnedVariables)) diff --git a/test/unittest/mocks/mock_decomposer/mock_decomposer.go b/test/unittest/mocks/mock_decomposer/mock_decomposer.go index 519ca48f..9f3233dd 100644 --- a/test/unittest/mocks/mock_decomposer/mock_decomposer.go +++ b/test/unittest/mocks/mock_decomposer/mock_decomposer.go @@ -4,6 +4,7 @@ import ( "soarca/internal/decomposer" "soarca/models/cacao" + "github.com/google/uuid" "github.com/stretchr/testify/mock" ) @@ -11,11 +12,11 @@ type Mock_Decomposer struct { mock.Mock } -func (mock *Mock_Decomposer) Execute(playbook cacao.Playbook, detailsch chan string) (*decomposer.ExecutionDetails, error) { +func (mock *Mock_Decomposer) Execute(playbook cacao.Playbook, detailsch chan decomposer.ExecutionDetails) (*decomposer.ExecutionDetails, error) { args := mock.Called(playbook, detailsch) if detailsch != nil { - execution_ids := playbook.ID + "///" + "mock_uuid_string_defined_in_mock_decomposer" - detailsch <- execution_ids + details := decomposer.ExecutionDetails{ExecutionId: args.Get(2).(uuid.UUID), PlaybookId: playbook.ID, Variables: cacao.NewVariables()} + detailsch <- details } return args.Get(0).(*decomposer.ExecutionDetails), args.Error(1) } diff --git a/test/unittest/routes/trigger_api/tigger_api_test.go b/test/unittest/routes/trigger_api/tigger_api_test.go index 75bffa20..38e47fa3 100644 --- a/test/unittest/routes/trigger_api/tigger_api_test.go +++ b/test/unittest/routes/trigger_api/tigger_api_test.go @@ -17,6 +17,7 @@ import ( "github.com/gin-gonic/gin" "github.com/go-playground/assert/v2" + "github.com/google/uuid" ) func TestTriggerExecutionOfPlaybook(t *testing.T) { @@ -39,14 +40,15 @@ func TestTriggerExecutionOfPlaybook(t *testing.T) { recorder := httptest.NewRecorder() trigger.Routes(app, trigger_api) - mock_decomposer.On("Execute", *playbook, trigger_api.Executionsch).Return(&decomposer.ExecutionDetails{}, nil) + executionId, _ := uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + mock_decomposer.On("Execute", *playbook, trigger_api.Executionsch).Return(&decomposer.ExecutionDetails{}, nil, executionId) request, err := http.NewRequest("POST", "/trigger/playbook", bytes.NewBuffer(byteValue)) if err != nil { t.Fail() } - expected_return_string := `{"execution_id":"mock_uuid_string_defined_in_mock_decomposer","payload":"playbook--61a6c41e-6efc-4516-a242-dfbc5c89d562"}` + expected_return_string := `{"execution_id":"6ba7b810-9dad-11d1-80b4-00c04fd430c8","payload":"playbook--61a6c41e-6efc-4516-a242-dfbc5c89d562"}` app.ServeHTTP(recorder, request) assert.Equal(t, expected_return_string, recorder.Body.String()) assert.Equal(t, 200, recorder.Code)