@@ -18,10 +18,12 @@ import (
18
18
"context"
19
19
"fmt"
20
20
"strings"
21
+ "sync"
21
22
22
23
assessment "github.com/GoogleCloudPlatform/spanner-migration-tool/assessment/collectors"
23
24
"github.com/GoogleCloudPlatform/spanner-migration-tool/assessment/sources/mysql"
24
25
"github.com/GoogleCloudPlatform/spanner-migration-tool/assessment/utils"
26
+ "github.com/GoogleCloudPlatform/spanner-migration-tool/common/task"
25
27
"github.com/GoogleCloudPlatform/spanner-migration-tool/internal"
26
28
"github.com/GoogleCloudPlatform/spanner-migration-tool/logger"
27
29
"github.com/GoogleCloudPlatform/spanner-migration-tool/profiles"
@@ -35,6 +37,11 @@ type assessmentCollectors struct {
35
37
appAssessmentCollector * assessment.MigrationCodeSummarizer
36
38
}
37
39
40
+ type assessmentTaskInput struct {
41
+ taskName string
42
+ taskFunc func (ctx context.Context , c assessmentCollectors ) (utils.AssessmentOutput , error )
43
+ }
44
+
38
45
func PerformAssessment (conv * internal.Conv , sourceProfile profiles.SourceProfile , assessmentConfig map [string ]string , projectId string ) (utils.AssessmentOutput , error ) {
39
46
40
47
logger .Log .Info ("performing assessment" )
@@ -56,15 +63,48 @@ func PerformAssessment(conv *internal.Conv, sourceProfile profiles.SourceProfile
56
63
// Iterate over assessment rules and order output by confidence of each element. Merge outputs where required
57
64
// Select the highest confidence output for each attribute
58
65
// Populate assessment struct
66
+ parallelTaskRunner := & task.RunParallelTasksImpl [assessmentTaskInput , utils.AssessmentOutput ]{}
67
+
68
+ assessmentTasksInput := []assessmentTaskInput {
69
+ {
70
+ taskName : "schemaAssessment" ,
71
+ taskFunc : func (ctx context.Context , c assessmentCollectors ) (utils.AssessmentOutput , error ) {
72
+ result , err := performSchemaAssessment (ctx , c )
73
+ return utils.AssessmentOutput {SchemaAssessment : result }, err
74
+ },
75
+ },
76
+ {
77
+ taskName : "appAssessment" ,
78
+ taskFunc : func (ctx context.Context , c assessmentCollectors ) (utils.AssessmentOutput , error ) {
79
+ result , err := performAppAssessment (ctx , c )
80
+ return utils.AssessmentOutput {AppCodeAssessment : result }, err
81
+ },
82
+ },
83
+ }
84
+
85
+ assessmentResults , err := parallelTaskRunner .RunParallelTasks (assessmentTasksInput , 2 , func (input assessmentTaskInput , mutex * sync.Mutex ) task.TaskResult [utils.AssessmentOutput ] {
86
+ result , err := input .taskFunc (ctx , c )
87
+ if err != nil {
88
+ logger .Log .Error (fmt .Sprintf ("could not complete %s: " , input .taskName ), zap .Error (err ))
89
+ }
90
+ return task.TaskResult [utils.AssessmentOutput ]{Result : result , Err : err }
91
+ }, false )
59
92
60
- output .SchemaAssessment , err = performSchemaAssessment (ctx , c )
61
93
if err != nil {
62
- logger . Log . Info ( fmt . Sprintf ( "could not complete schema assessment: %s" , err ))
94
+ // Handle any error from the parallel task runner itself
63
95
return output , err
64
96
}
65
- output .AppCodeAssessment , err = performAppAssessment (ctx , c )
66
97
67
- return output , err
98
+ for _ , result := range assessmentResults {
99
+ if result .Result .SchemaAssessment != nil {
100
+ output .SchemaAssessment = result .Result .SchemaAssessment
101
+ }
102
+ if result .Result .AppCodeAssessment != nil {
103
+ output .AppCodeAssessment = result .Result .AppCodeAssessment
104
+ }
105
+ }
106
+
107
+ return output , nil
68
108
}
69
109
70
110
// Initilize collectors. Take a decision here on which collectors are mandatory and which are optional
@@ -81,13 +121,10 @@ func initializeCollectors(conv *internal.Conv, sourceProfile profiles.SourceProf
81
121
}
82
122
c .infoSchemaCollector = & infoSchemaCollector
83
123
84
- //Initiialize App Assessment Collector
85
-
124
+ //Initialize App Assessment Collector
86
125
language , exists := assessmentConfig ["language" ]
87
- if ! exists {
88
- // defaulting to Golang
89
- language = "go"
90
- }
126
+ sourceFramework , exists := assessmentConfig ["sourceFramework" ]
127
+ targetFramework , exists := assessmentConfig ["targetFramework" ]
91
128
92
129
codeDirectory , exists := assessmentConfig ["codeDirectory" ]
93
130
if exists {
@@ -104,7 +141,7 @@ func initializeCollectors(conv *internal.Conv, sourceProfile profiles.SourceProf
104
141
logger .Log .Debug ("spannerSchema" , zap .String ("schema" , spannerSchema ))
105
142
106
143
summarizer , err := assessment .NewMigrationCodeSummarizer (
107
- ctx , nil , projectId , assessmentConfig ["location" ], mysqlSchema , spannerSchema , codeDirectory , language )
144
+ ctx , nil , projectId , assessmentConfig ["location" ], mysqlSchema , spannerSchema , codeDirectory , language , sourceFramework , targetFramework )
108
145
if err != nil {
109
146
logger .Log .Error ("error initiating migration summarizer" )
110
147
return c , err
@@ -118,8 +155,9 @@ func initializeCollectors(conv *internal.Conv, sourceProfile profiles.SourceProf
118
155
return c , err
119
156
}
120
157
121
- func performSchemaAssessment (ctx context.Context , collectors assessmentCollectors ) (utils.SchemaAssessmentOutput , error ) {
122
- schemaOut := utils.SchemaAssessmentOutput {}
158
+ func performSchemaAssessment (ctx context.Context , collectors assessmentCollectors ) (* utils.SchemaAssessmentOutput , error ) {
159
+ logger .Log .Info ("starting schema assessment..." )
160
+ schemaOut := & utils.SchemaAssessmentOutput {}
123
161
124
162
srcTableDefs , spTableDefs := collectors .infoSchemaCollector .ListTables ()
125
163
srcColDefs , spColDefs := collectors .infoSchemaCollector .ListColumnDefinitions ()
@@ -180,6 +218,7 @@ func performSchemaAssessment(ctx context.Context, collectors assessmentCollector
180
218
schemaOut .ViewAssessmentOutput = collectors .infoSchemaCollector .ListViews ()
181
219
schemaOut .SpSequences = collectors .infoSchemaCollector .ListSpannerSequences ()
182
220
221
+ logger .Log .Info ("schema assessment completed successfully." )
183
222
return schemaOut , nil
184
223
}
185
224
@@ -190,7 +229,7 @@ func performAppAssessment(ctx context.Context, collectors assessmentCollectors)
190
229
return nil , nil
191
230
}
192
231
193
- logger .Log .Info ("adding app assessment details " )
232
+ logger .Log .Info ("starting app assessment... " )
194
233
codeAssessment , err := collectors .appAssessmentCollector .AnalyzeProject (ctx )
195
234
196
235
if err != nil {
@@ -200,6 +239,7 @@ func performAppAssessment(ctx context.Context, collectors assessmentCollectors)
200
239
201
240
logger .Log .Debug ("snippets: " , zap .Any ("codeAssessment.Snippets" , codeAssessment .Snippets ))
202
241
242
+ logger .Log .Info ("app assessment completed successfully." )
203
243
return & utils.AppCodeAssessmentOutput {
204
244
Language : codeAssessment .Language ,
205
245
Framework : codeAssessment .Framework ,
0 commit comments