Skip to content

Commit 11b9958

Browse files
authored
refactor multi config nucleus code (#211)
* move list sumodule logic out of dicovery * refactor submodue * bug fix panic in test discovery * fix process working directory for submodules * added comments * remove deadcode * fix runner install location for flag runPreRunEveryTime in exec mode * fix tests * rename files driverV1 -> driver_v1 and driverV2 -> driver_v2 * resolve PR comments * fix typo * remove unused mock file
1 parent 6e80039 commit 11b9958

31 files changed

+1532
-1667
lines changed

cmd/nucleus/bin.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import (
2121
"github.com/LambdaTest/test-at-scale/pkg/command"
2222
"github.com/LambdaTest/test-at-scale/pkg/core"
2323
"github.com/LambdaTest/test-at-scale/pkg/diffmanager"
24+
"github.com/LambdaTest/test-at-scale/pkg/driver"
2425
"github.com/LambdaTest/test-at-scale/pkg/gitmanager"
2526
"github.com/LambdaTest/test-at-scale/pkg/global"
27+
"github.com/LambdaTest/test-at-scale/pkg/listsubmoduleservice"
2628
"github.com/LambdaTest/test-at-scale/pkg/lumber"
2729
"github.com/LambdaTest/test-at-scale/pkg/payloadmanager"
2830
"github.com/LambdaTest/test-at-scale/pkg/requestutils"
@@ -145,6 +147,20 @@ func run(cmd *cobra.Command, args []string) {
145147
if err != nil {
146148
logger.Fatalf("failed to initialize coverage service: %v", err)
147149
}
150+
listsubmodule := listsubmoduleservice.New(defaultRequests, logger)
151+
152+
builder := driver.Builder{
153+
Logger: logger,
154+
TestExecutionService: tes,
155+
TestDiscoveryService: tds,
156+
AzureClient: azureClient,
157+
BlockTestService: tbs,
158+
ExecutionManager: execManager,
159+
TASConfigManager: tcm,
160+
CacheStore: cache,
161+
DiffManager: dm,
162+
ListSubModuleService: listsubmodule,
163+
}
148164

149165
pl.PayloadManager = pm
150166
pl.TASConfigManager = tcm
@@ -159,6 +175,7 @@ func run(cmd *cobra.Command, args []string) {
159175
pl.Task = t
160176
pl.CacheStore = cache
161177
pl.SecretParser = secretParser
178+
pl.Builder = &builder
162179

163180
logger.Infof("LambdaTest Nucleus version: %s", global.NucleusBinaryVersion)
164181

pkg/blocktestservice/setup.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,3 @@ func (tbs *TestBlockTestService) populateBlockList(blocktestSource string, block
163163
}
164164
}
165165
}
166-
167-
func (tbs *TestBlockTestService) GetBlocklistYMLV1(tasConfig *core.TASConfig) []string {
168-
return tasConfig.Blocklist
169-
}
170-
171-
func (tbs *TestBlockTestService) GetBlocklistYMLV2(subModule *core.SubModule) []string {
172-
return subModule.Blocklist
173-
}

pkg/command/run.go

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package command
22

33
import (
4-
"bytes"
54
"context"
65
"fmt"
76
"io"
@@ -35,6 +34,7 @@ func (m *manager) ExecuteUserCommands(ctx context.Context,
3534
payload *core.Payload,
3635
runConfig *core.Run,
3736
secretData map[string]string,
37+
logwriter core.LogWriterStrategy,
3838
cwd string) error {
3939
script, err := m.createScript(runConfig.Commands, secretData)
4040
if err != nil {
@@ -44,12 +44,10 @@ func (m *manager) ExecuteUserCommands(ctx context.Context,
4444
if err != nil {
4545
return err
4646
}
47-
4847
azureReader, azureWriter := io.Pipe()
4948
defer azureWriter.Close()
5049

51-
blobPath := fmt.Sprintf("%s/%s/%s/%s.log", payload.OrgID, payload.BuildID, os.Getenv("TASK_ID"), commandType)
52-
errChan := m.StoreCommandLogs(ctx, blobPath, azureReader)
50+
errChan := logwriter.Write(ctx, azureReader)
5351
defer m.closeAndWriteLog(azureWriter, errChan, commandType)
5452
logWriter := lumber.NewWriter(m.logger)
5553
defer logWriter.Close()
@@ -78,56 +76,6 @@ func (m *manager) ExecuteUserCommands(ctx context.Context,
7876
return nil
7977
}
8078

81-
// ExecuteUserCommandsV2 executes user commands for version 2
82-
func (m *manager) ExecuteUserCommandsV2(ctx context.Context,
83-
commandType core.CommandType,
84-
payload *core.Payload,
85-
runConfig *core.Run,
86-
secretData map[string]string,
87-
cwd, subModule string,
88-
buffer *bytes.Buffer) error {
89-
script, err := m.createScript(runConfig.Commands, secretData)
90-
if err != nil {
91-
return err
92-
}
93-
envVars, err := m.GetEnvVariables(runConfig.EnvMap, secretData)
94-
if err != nil {
95-
return err
96-
}
97-
98-
reader, writer := io.Pipe()
99-
100-
errChan := m.writeCommandLogsToBuffer(subModule, buffer, reader)
101-
defer func() {
102-
writer.Close()
103-
if uploadErr := <-errChan; uploadErr != nil {
104-
// not returning error here as upload logs should not fail the task
105-
m.logger.Errorf("failed to upload logs for command %s, error: %v", commandType, uploadErr)
106-
}
107-
}()
108-
logWriter := lumber.NewWriter(m.logger)
109-
defer logWriter.Close()
110-
multiWriter := io.MultiWriter(logWriter, writer)
111-
maskWriter := logstream.NewMasker(multiWriter, secretData)
112-
113-
cmd := exec.CommandContext(ctx, "/bin/bash", "-c", script)
114-
cmd.Dir = cwd
115-
cmd.Env = envVars
116-
cmd.Stdout = maskWriter
117-
cmd.Stderr = maskWriter
118-
119-
if startErr := cmd.Start(); startErr != nil {
120-
m.logger.Errorf("failed to start command: %s, error: %v", commandType, startErr)
121-
return startErr
122-
}
123-
if execErr := cmd.Wait(); execErr != nil {
124-
m.logger.Errorf("command %s, exited with error: %v", commandType, execErr)
125-
return execErr
126-
}
127-
128-
return nil
129-
}
130-
13179
// ExecuteInternalCommands executes internal commands
13280
func (m *manager) ExecuteInternalCommands(ctx context.Context,
13381
commandType core.CommandType,
@@ -164,46 +112,6 @@ func (m *manager) GetEnvVariables(envMap, secretData map[string]string) ([]strin
164112
return envVars, nil
165113
}
166114

167-
// StoreCommandLogs stores the command logs to blob
168-
func (m *manager) StoreCommandLogs(ctx context.Context, blobPath string, reader io.Reader) <-chan error {
169-
errChan := make(chan error, 1)
170-
go func() {
171-
sasURL, err := m.azureClient.GetSASURL(ctx, blobPath, core.LogsContainer)
172-
if err != nil {
173-
m.logger.Errorf("failed to genereate SAS URL for path %s, error: %v", blobPath, err)
174-
errChan <- err
175-
return
176-
}
177-
blobPath, err := m.azureClient.CreateUsingSASURL(ctx, sasURL, reader, "text/plain")
178-
if err != nil {
179-
m.logger.Errorf("failed to create SAS URL for path %s, error: %v", blobPath, err)
180-
errChan <- err
181-
return
182-
}
183-
close(errChan)
184-
m.logger.Debugf("created blob path %s", blobPath)
185-
}()
186-
return errChan
187-
}
188-
189-
func (m *manager) writeCommandLogsToBuffer(submodule string, buffer *bytes.Buffer, reader io.Reader) <-chan error {
190-
errChan := make(chan error, 1)
191-
go func() {
192-
if _, err := fmt.Fprintf(buffer, "<------ PRE RUN for submodule %s ------> \n", submodule); err != nil {
193-
m.logger.Debugf("Error writing the logs separator for submodule %s, error %v", submodule, err)
194-
errChan <- err
195-
return
196-
}
197-
if _, err := buffer.ReadFrom(reader); err != nil {
198-
m.logger.Debugf("Error writing the logs to buffer for submodule %s, error %v", submodule, err)
199-
errChan <- err
200-
return
201-
}
202-
close(errChan)
203-
m.logger.Debugf("written logs for sub module %s to buffer", submodule)
204-
}()
205-
return errChan
206-
}
207115
func (m *manager) closeAndWriteLog(azureWriter *io.PipeWriter, errChan <-chan error, commandType core.CommandType) {
208116
azureWriter.Close()
209117
if uploadErr := <-errChan; uploadErr != nil {

pkg/command/run_test.go

Lines changed: 0 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package command
22

33
import (
4-
"context"
54
"fmt"
6-
"io"
75
"os"
86
"reflect"
97
"sort"
108
"testing"
119

1210
"github.com/LambdaTest/test-at-scale/pkg/core"
13-
"github.com/LambdaTest/test-at-scale/pkg/errs"
1411
"github.com/LambdaTest/test-at-scale/pkg/lumber"
1512
"github.com/LambdaTest/test-at-scale/pkg/secret"
1613
"github.com/LambdaTest/test-at-scale/testutils"
1714
"github.com/LambdaTest/test-at-scale/testutils/mocks"
18-
"github.com/stretchr/testify/mock"
1915
)
2016

2117
func TestNewExecutionManager(t *testing.T) {
@@ -119,131 +115,3 @@ func Test_manager_GetEnvVariables(t *testing.T) {
119115
})
120116
}
121117
}
122-
123-
func Test_manager_StoreCommandLogs(t *testing.T) {
124-
logger, err := testutils.GetLogger()
125-
if err != nil {
126-
t.Errorf("Couldn't initialize logger, error: %v", err)
127-
}
128-
secretParser := new(mocks.SecretParser)
129-
azureClientGetSASURL := new(mocks.AzureClient)
130-
mockUtil(azureClientGetSASURL, "getSASURL", "createUsingSASURL", "error in GetSASURL", "error in CreateUsingSASURL", true, false)
131-
132-
azureClientCreateSASURL := new(mocks.AzureClient)
133-
mockUtil(azureClientCreateSASURL, "getSASURL", "createUsingSASURL", "error in GetSASURL", "error in CreateUsingSASURL", false, true)
134-
135-
azureClientSuccess := new(mocks.AzureClient)
136-
mockUtil(azureClientSuccess, "getSASURL", "createUsingSASURL", "error in GetSASURL", "error in CreateUsingSASURL", false, false)
137-
138-
errGetSASURL := make(chan error, 1)
139-
defer func() { close(errGetSASURL) }()
140-
141-
errCreateUsingSASURL := make(chan error, 1)
142-
defer func() { close(errCreateUsingSASURL) }()
143-
144-
errSuccess := make(chan error, 1)
145-
defer func() { close(errSuccess) }()
146-
147-
type fields struct {
148-
azureClient core.AzureClient
149-
}
150-
type args struct {
151-
ctx context.Context
152-
blobPath string
153-
reader io.Reader
154-
}
155-
tests := []struct {
156-
name string
157-
fields fields
158-
args args
159-
want <-chan error
160-
wantErr bool
161-
}{
162-
{"Test StoreCommandLogs for getSASURL error",
163-
fields{
164-
azureClient: azureClientGetSASURL,
165-
},
166-
args{
167-
ctx: context.TODO(),
168-
blobPath: "blobpath",
169-
reader: &mocks.Reader{},
170-
},
171-
errGetSASURL,
172-
true,
173-
},
174-
{"Test StoreCommandLogs for CreateUsingSASURL error",
175-
fields{
176-
azureClient: azureClientCreateSASURL,
177-
},
178-
args{
179-
ctx: context.TODO(),
180-
blobPath: "blobpath",
181-
reader: &mocks.Reader{},
182-
},
183-
errCreateUsingSASURL,
184-
true,
185-
},
186-
{"Test StoreCommandLogs for success",
187-
fields{
188-
azureClient: azureClientSuccess,
189-
},
190-
args{
191-
ctx: context.TODO(),
192-
blobPath: "blobpath",
193-
reader: &mocks.Reader{},
194-
},
195-
errSuccess,
196-
false,
197-
},
198-
}
199-
errGetSASURL <- errs.New("error in GetSASURL")
200-
errCreateUsingSASURL <- errs.New("error in CreateUsingSASURL")
201-
errSuccess <- errs.New("")
202-
for _, tt := range tests {
203-
t.Run(tt.name, func(t *testing.T) {
204-
m := &manager{
205-
logger: logger,
206-
secretParser: secretParser,
207-
azureClient: tt.fields.azureClient,
208-
}
209-
got := m.StoreCommandLogs(tt.args.ctx, tt.args.blobPath, tt.args.reader)
210-
if !tt.wantErr {
211-
if len(got) != 0 {
212-
t.Errorf("Expected channel to be empty, received: %v", <-got)
213-
}
214-
return
215-
}
216-
received := <-got
217-
want := <-tt.want
218-
if received.Error() != want.Error() {
219-
t.Errorf("manager.StoreCommandLogs() = %+v, want %+v", received, want)
220-
}
221-
})
222-
}
223-
}
224-
225-
func mockUtil(azureClient *mocks.AzureClient, msgGet, msgCreate, errGet, errCreate string, wantErrGet, wantErrCreate bool) {
226-
azureClient.On("GetSASURL", mock.AnythingOfType("*context.emptyCtx"),
227-
mock.AnythingOfType("string"), mock.AnythingOfType("core.ContainerType")).Return(
228-
func(ctx context.Context, containerPath string, containerType core.ContainerType) string {
229-
return msgGet
230-
},
231-
func(ctx context.Context, containerPath string, containerType core.ContainerType) error {
232-
if !wantErrGet {
233-
return nil
234-
}
235-
return errs.New(errGet)
236-
})
237-
238-
azureClient.On("CreateUsingSASURL", mock.AnythingOfType("*context.emptyCtx"),
239-
mock.AnythingOfType("string"), mock.AnythingOfType("*mocks.Reader"), "text/plain").Return(
240-
func(ctx context.Context, sasURL string, reader io.Reader, mimeType string) string {
241-
return msgCreate
242-
},
243-
func(ctx context.Context, sasURL string, reader io.Reader, mimeType string) error {
244-
if !wantErrCreate {
245-
return nil
246-
}
247-
return errs.New(errCreate)
248-
})
249-
}

0 commit comments

Comments
 (0)