Skip to content

Commit 7ab24a3

Browse files
authored
feature/tas yml segregation (#223)
* added tasconfigdownloader * refactor tasconfigdownloader * added YMLParsingMessage struct * modify YMLParsingMessage struct * refactor code * added message type for yml parsing * fix issue with github download * fix bitbucket download url * fix gitlab download url * resolve go lint error * resolve PR comments * fix panic in test case
1 parent 0d9cc27 commit 7ab24a3

File tree

20 files changed

+367
-97
lines changed

20 files changed

+367
-97
lines changed

cmd/synapse/bin.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import (
2020
"github.com/LambdaTest/test-at-scale/pkg/proxyserver"
2121
"github.com/LambdaTest/test-at-scale/pkg/runner/docker"
2222
"github.com/LambdaTest/test-at-scale/pkg/secrets"
23-
"github.com/LambdaTest/test-at-scale/pkg/synapse"
23+
synapsepkg "github.com/LambdaTest/test-at-scale/pkg/synapse"
24+
"github.com/LambdaTest/test-at-scale/pkg/tasconfigdownloader"
2425
"github.com/LambdaTest/test-at-scale/pkg/utils"
2526
"github.com/joho/godotenv"
2627
"github.com/spf13/cobra"
@@ -88,8 +89,8 @@ func run(cmd *cobra.Command, args []string) {
8889
if err != nil {
8990
logger.Fatalf("could not instantiate k8s runner %v", err)
9091
}
91-
92-
synapse := synapse.New(runner, logger, secretsManager)
92+
tasConfigDownloader := tasconfigdownloader.New(logger)
93+
synapse := synapsepkg.New(runner, logger, secretsManager, tasConfigDownloader)
9394

9495
proxyHandler, err := proxyserver.NewProxyHandler(logger)
9596
if err != nil {

pkg/core/interfaces.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,17 @@ type TASConfigManager interface {
2020

2121
// GetVersion returns TAS yml version
2222
GetVersion(path string) (int, error)
23+
24+
// GetTasConfigFilePath returns file path of tas config
25+
GetTasConfigFilePath(payload *Payload) (string, error)
2326
}
2427

2528
// GitManager manages the cloning of git repositories
2629
type GitManager interface {
2730
// Clone repository from TAS config
2831
Clone(ctx context.Context, payload *Payload, oauth *Oauth) error
32+
// DownloadFileByCommit download file from repo for given commit
33+
DownloadFileByCommit(ctx context.Context, gitProvider, repoSlug, commitID, filePath string, oauth *Oauth) (string, error)
2934
}
3035

3136
// DiffManager manages the diff findings for the given payload
@@ -173,5 +178,5 @@ type LogWriterStrategy interface {
173178
// Builder builds the driver for given tas yml version
174179
type Builder interface {
175180
// GetDriver returns driver for use
176-
GetDriver(version int) (Driver, error)
181+
GetDriver(version int, ymlFilePath string) (Driver, error)
177182
}

pkg/core/lifecycle.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,16 +136,19 @@ func (pl *Pipeline) Start(ctx context.Context) (err error) {
136136
return err
137137
}
138138
}
139-
// load tas yaml file
140-
version, err := pl.TASConfigManager.GetVersion(payload.TasFileName)
139+
filePath, err := pl.TASConfigManager.GetTasConfigFilePath(pl.Payload)
140+
if err != nil {
141+
return err
142+
}
143+
version, err := pl.TASConfigManager.GetVersion(filePath)
141144
if err != nil {
142145
pl.Logger.Errorf("Unable to load tas yaml file, error: %v", err)
143146
err = &errs.StatusFailed{Remark: err.Error()}
144147
return err
145148
}
146149
pl.Logger.Infof("TAS Version %f", version)
147150
pl.setEnv(payload, coverageDir)
148-
newDriver, err := pl.Builder.GetDriver(version)
151+
newDriver, err := pl.Builder.GetDriver(version, filePath)
149152
if err != nil {
150153
pl.Logger.Errorf("error crearing driver, error %v", err)
151154
return err

pkg/core/models.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,7 @@ type DiscoveryResult struct {
152152
TaskID string `json:"taskID"`
153153
OrgID string `json:"orgID"`
154154
Branch string `json:"branch"`
155-
Tier Tier `json:"tier"`
156155
SubModule string `json:"subModule"`
157-
ContainerImage string `json:"containerImage"`
158156
}
159157

160158
// ExecutionResult represents the request body for test and test suite execution
@@ -456,3 +454,29 @@ type TestExecutionArgs struct {
456454
FrameWorkVersion int
457455
CWD string
458456
}
457+
458+
// YMLParsingRequestMessage defines yml parsing request received from TAS server
459+
type YMLParsingRequestMessage struct {
460+
GitProvider string `json:"gitProvider"`
461+
CommitID string `json:"commitID"`
462+
Event EventType `json:"eventType"`
463+
RepoSlug string `json:"repoSlug"`
464+
TasFileName string `json:"tasFilePath"`
465+
LicenseTier Tier `json:"license_tier"`
466+
OrgID string `json:"orgID"`
467+
BuildID string `json:"buildID"`
468+
}
469+
470+
// TASConfigDownloaderOutput repersent output return by tasconfig downloader
471+
type TASConfigDownloaderOutput struct {
472+
Version int `json:"version"`
473+
TASConfig interface{} `json:"tasConfig"`
474+
}
475+
476+
// YMLParsingResultMessage repersent message sent to TAS server in response of yml parsing request
477+
type YMLParsingResultMessage struct {
478+
ErrorMsg string `json:"ErrorMsg"`
479+
OrgID string `json:"orgID"`
480+
BuildID string `json:"buildID"`
481+
YMLOutput TASConfigDownloaderOutput `json:"ymlOutput"`
482+
}

pkg/core/secrets.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ type SecretsManager interface {
2020

2121
// GetSynapseName returns synapse name mentioned in config
2222
GetSynapseName() string
23+
// GetOauthToken returns oauth token
24+
GetOauthToken() *Oauth
2325

2426
// GetGitSecretBytes get git secrets in bytes
2527
GetGitSecretBytes() ([]byte, error)

pkg/core/wsproto.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ type StatType string
1111

1212
// types of messages
1313
const (
14-
MsgLogin MessageType = "login"
15-
MsgLogout MessageType = "logout"
16-
MsgTask MessageType = "task"
17-
MsgInfo MessageType = "info"
18-
MsgError MessageType = "error"
19-
MsgResourceStats MessageType = "resourcestats"
20-
MsgJobInfo MessageType = "jobinfo"
21-
MsgBuildAbort MessageType = "build_abort"
14+
MsgLogin MessageType = "login"
15+
MsgLogout MessageType = "logout"
16+
MsgTask MessageType = "task"
17+
MsgInfo MessageType = "info"
18+
MsgError MessageType = "error"
19+
MsgResourceStats MessageType = "resourcestats"
20+
MsgJobInfo MessageType = "jobinfo"
21+
MsgBuildAbort MessageType = "build_abort"
22+
MsgYMLParsingRequest MessageType = "yml_parsing_request"
23+
MsgYMLParsingResult MessageType = "yml_parsing_result"
2224
)
2325

2426
// JobInfo types

pkg/driver/builder.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type (
3434
}
3535
)
3636

37-
func (b *Builder) GetDriver(version int) (core.Driver, error) {
37+
func (b *Builder) GetDriver(version int, filePath string) (core.Driver, error) {
3838
switch version {
3939
case firstVersion:
4040
return &driverV1{
@@ -49,6 +49,7 @@ func (b *Builder) GetDriver(version int) (core.Driver, error) {
4949
DiffManager: b.DiffManager,
5050
ListSubModuleService: b.ListSubModuleService,
5151
TASVersion: firstVersion,
52+
TASFilePath: filePath,
5253
nodeInstaller: NodeInstaller{
5354
logger: b.Logger,
5455
ExecutionManager: b.ExecutionManager,
@@ -67,6 +68,7 @@ func (b *Builder) GetDriver(version int) (core.Driver, error) {
6768
DiffManager: b.DiffManager,
6869
ListSubModuleService: b.ListSubModuleService,
6970
TASVersion: secondVersion,
71+
TASFilePath: filePath,
7072
nodeInstaller: NodeInstaller{
7173
logger: b.Logger,
7274
ExecutionManager: b.ExecutionManager,

pkg/driver/builder_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
func Test_driver(t *testing.T) {
99
b := Builder{}
1010
invalidVersion := 4
11-
_, err := b.GetDriver(invalidVersion)
11+
_, err := b.GetDriver(invalidVersion, "")
1212
wantErr := fmt.Sprintf("invalid version ( %d ) mentioned in yml file", invalidVersion)
1313
if err.Error() != wantErr {
1414
t.Errorf("want %s , got %s", err.Error(), wantErr)

pkg/driver/driver_v1.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ package driver
66
import (
77
"context"
88
"errors"
9+
"fmt"
910
"os"
1011

1112
"github.com/LambdaTest/test-at-scale/pkg/core"
1213
"github.com/LambdaTest/test-at-scale/pkg/errs"
1314
"github.com/LambdaTest/test-at-scale/pkg/global"
1415
"github.com/LambdaTest/test-at-scale/pkg/logwriter"
1516
"github.com/LambdaTest/test-at-scale/pkg/lumber"
17+
"github.com/LambdaTest/test-at-scale/pkg/utils"
1618
"golang.org/x/sync/errgroup"
1719
)
1820

@@ -32,6 +34,7 @@ type (
3234
DiffManager core.DiffManager
3335
ListSubModuleService core.ListSubModuleService
3436
TASVersion int
37+
TASFilePath string
3538
}
3639

3740
setUpResultV1 struct {
@@ -43,7 +46,7 @@ type (
4346

4447
func (d *driverV1) RunDiscovery(ctx context.Context, payload *core.Payload,
4548
taskPayload *core.TaskPayload, oauth *core.Oauth, coverageDir string, secretMap map[string]string) error {
46-
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, payload.TasFileName, payload.EventType, payload.LicenseTier)
49+
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, d.TASFilePath, payload.EventType, payload.LicenseTier)
4750
if err != nil {
4851
d.logger.Errorf("Unable to load tas yaml file, error: %v", err)
4952
err = &errs.StatusFailed{Remark: err.Error()}
@@ -117,13 +120,16 @@ func (d *driverV1) RunDiscovery(ctx context.Context, payload *core.Payload,
117120

118121
func (d *driverV1) RunExecution(ctx context.Context, payload *core.Payload,
119122
taskPayload *core.TaskPayload, oauth *core.Oauth, coverageDir string, secretMap map[string]string) error {
120-
tas, err := d.TASConfigManager.LoadAndValidate(ctx, 1, payload.TasFileName, payload.EventType, payload.LicenseTier)
123+
tas, err := d.TASConfigManager.LoadAndValidate(ctx, 1, d.TASFilePath, payload.EventType, payload.LicenseTier)
121124
if err != nil {
122125
d.logger.Errorf("Unable to load tas yaml file, error: %v", err)
123126
err = &errs.StatusFailed{Remark: err.Error()}
124127
return err
125128
}
126129
tasConfig := tas.(*core.TASConfig)
130+
if cachErr := d.setCache(tasConfig); cachErr != nil {
131+
return cachErr
132+
}
127133
if errG := d.BlockTestService.GetBlockTests(ctx, tasConfig.Blocklist, payload.BranchName); errG != nil {
128134
d.logger.Errorf("Unable to fetch blocklisted tests: %v", errG)
129135
errG = errs.New(errs.GenericErrRemark.Error())
@@ -164,7 +170,9 @@ func (d *driverV1) RunExecution(ctx context.Context, payload *core.Payload,
164170
func (d *driverV1) setUp(ctx context.Context, payload *core.Payload,
165171
tasConfig *core.TASConfig, oauth *core.Oauth, language string) (*setUpResultV1, error) {
166172
d.logger.Infof("Tas yaml: %+v", tasConfig)
167-
173+
if err := d.setCache(tasConfig); err != nil {
174+
return nil, err
175+
}
168176
cacheKey := ""
169177
if language == languageJs {
170178
cacheKey = tasConfig.Cache.Key
@@ -273,6 +281,20 @@ func (d *driverV1) getEnvAndPattern(payload *core.Payload, tasConfig *core.TASCo
273281
func populateDiscovery(testDiscoveryResult *core.DiscoveryResult, tasConfig *core.TASConfig) {
274282
testDiscoveryResult.Parallelism = tasConfig.Parallelism
275283
testDiscoveryResult.SplitMode = tasConfig.SplitMode
276-
testDiscoveryResult.ContainerImage = tasConfig.ContainerImage
277-
testDiscoveryResult.Tier = tasConfig.Tier
284+
}
285+
286+
func (d *driverV1) setCache(tasConfig *core.TASConfig) error {
287+
language := global.FrameworkLanguageMap[tasConfig.Framework]
288+
if tasConfig.Cache == nil && language == "javascript" {
289+
checksum, err := utils.ComputeChecksum(fmt.Sprintf("%s/%s", global.RepoDir, global.PackageJSON))
290+
if err != nil {
291+
d.logger.Errorf("Error while computing checksum, error %v", err)
292+
return err
293+
}
294+
tasConfig.Cache = &core.Cache{
295+
Key: checksum,
296+
Paths: []string{},
297+
}
298+
}
299+
return nil
278300
}

pkg/driver/driver_v2.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"bytes"
88
"context"
99
"errors"
10+
"fmt"
1011
"os"
1112
"path"
1213
"strings"
@@ -17,6 +18,7 @@ import (
1718
"github.com/LambdaTest/test-at-scale/pkg/global"
1819
"github.com/LambdaTest/test-at-scale/pkg/logwriter"
1920
"github.com/LambdaTest/test-at-scale/pkg/lumber"
21+
"github.com/LambdaTest/test-at-scale/pkg/utils"
2022
"golang.org/x/sync/errgroup"
2123
)
2224

@@ -36,6 +38,7 @@ type (
3638
nodeInstaller NodeInstaller
3739
TestDiscoveryService core.TestDiscoveryService
3840
TASVersion int
41+
TASFilePath string
3942
}
4043

4144
setUpResultV2 struct {
@@ -49,7 +52,7 @@ func (d *driverV2) RunDiscovery(ctx context.Context, payload *core.Payload,
4952
taskPayload *core.TaskPayload, oauth *core.Oauth, coverageDir string, secretMap map[string]string) error {
5053
// do something
5154
d.logger.Debugf("Running in %d version", d.TASVersion)
52-
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, payload.TasFileName, payload.EventType, payload.LicenseTier)
55+
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, d.TASFilePath, payload.EventType, payload.LicenseTier)
5356
if err != nil {
5457
d.logger.Errorf("Unable to load tas yaml file, error: %v", err)
5558
err = &errs.StatusFailed{Remark: err.Error()}
@@ -94,14 +97,18 @@ func (d *driverV2) RunDiscovery(ctx context.Context, payload *core.Payload,
9497

9598
func (d *driverV2) RunExecution(ctx context.Context, payload *core.Payload,
9699
taskPayload *core.TaskPayload, oauth *core.Oauth, coverageDir string, secretMap map[string]string) error {
97-
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, payload.TasFileName, payload.EventType, payload.LicenseTier)
100+
tas, err := d.TASConfigManager.LoadAndValidate(ctx, d.TASVersion, d.TASFilePath, payload.EventType, payload.LicenseTier)
98101
if err != nil {
99102
d.logger.Errorf("Unable to load tas yaml file, error: %v", err)
100103
err = &errs.StatusFailed{Remark: err.Error()}
101104
return err
102105
}
106+
103107
subModuleName := os.Getenv(global.SubModuleName)
104108
tasConfig := tas.(*core.TASConfigV2)
109+
if cachErr := d.setCache(tasConfig); cachErr != nil {
110+
return cachErr
111+
}
105112
subModule, err := d.findSubmodule(tasConfig, payload, subModuleName)
106113
if err != nil {
107114
d.logger.Errorf("Error finding sub module %s in tas config file", subModuleName)
@@ -355,6 +362,9 @@ func (d *driverV2) setUpDiscovery(ctx context.Context,
355362
payload *core.Payload,
356363
tasConfig *core.TASConfigV2,
357364
oauth *core.Oauth) (*setUpResultV2, error) {
365+
if err := d.setCache(tasConfig); err != nil {
366+
return nil, err
367+
}
358368
cacheKey := tasConfig.Cache.Key
359369

360370
g, errCtx := errgroup.WithContext(ctx)
@@ -445,8 +455,6 @@ func populateTestDiscoveryV2(testDiscoveryResult *core.DiscoveryResult, subModul
445455
testDiscoveryResult.Parallelism = subModule.Parallelism
446456
testDiscoveryResult.SplitMode = tasConfig.SplitMode
447457
testDiscoveryResult.SubModule = subModule.Name
448-
testDiscoveryResult.Tier = tasConfig.Tier
449-
testDiscoveryResult.ContainerImage = tasConfig.ContainerImage
450458
}
451459

452460
func (d *driverV2) findSubmodule(tasConfig *core.TASConfigV2, payload *core.Payload, subModuleName string) (*core.SubModule, error) {
@@ -503,3 +511,18 @@ func GetSubmoduleBasedDiff(diff map[string]int, subModulePath string) map[string
503511
}
504512
return newDiff
505513
}
514+
515+
func (d *driverV2) setCache(tasConfig *core.TASConfigV2) error {
516+
if tasConfig.Cache == nil {
517+
checksum, err := utils.ComputeChecksum(fmt.Sprintf("%s/%s", global.RepoDir, global.PackageJSON))
518+
if err != nil {
519+
d.logger.Errorf("Error while computing checksum, error %v", err)
520+
return err
521+
}
522+
tasConfig.Cache = &core.Cache{
523+
Key: checksum,
524+
Paths: []string{},
525+
}
526+
}
527+
return nil
528+
}

0 commit comments

Comments
 (0)