@@ -8,6 +8,7 @@ open System.Runtime.InteropServices
8
8
open Microsoft.FSharp .Collections
9
9
10
10
open Serilog
11
+ open Spectre.Console
11
12
open FsToolkit.ErrorHandling
12
13
13
14
open NBomber
@@ -43,7 +44,6 @@ type internal TestHost(dep: IGlobalDependency,
43
44
let mutable _targetScenarios = List.empty< Scenario>
44
45
let mutable _sessionArgs = SessionArgs.empty
45
46
let mutable _currentOperation = OperationType.None
46
- let mutable _globalCancelToken = new CancellationTokenSource()
47
47
let _defaultNodeInfo = NodeInfo.init None
48
48
49
49
let getCurrentNodeInfo () =
@@ -92,85 +92,59 @@ type internal TestHost(dep: IGlobalDependency,
92
92
let stopSchedulers ( schedulers : ScenarioScheduler list ) =
93
93
schedulers |> List.iter( fun x -> x.Stop())
94
94
95
- let initScenarios ( sessionArgs : SessionArgs ) ( cancelToken : CancellationToken ) = taskResult {
96
-
97
- let targetScenarios = regScenarios |> TestHostScenario.getTargetScenarios sessionArgs
95
+ let initScenarios ( consoleStatus : StatusContext ) ( cancelToken : CancellationToken ) ( sessionArgs : SessionArgs ) = taskResult {
98
96
99
97
let baseContext = NBomberContext.createBaseContext( sessionArgs.TestInfo, getCurrentNodeInfo, cancelToken, _ log)
100
- let defaultScnContext = Scenario.ScenarioContext.create baseContext
101
98
102
99
do ! dep.WorkerPlugins |> WorkerPlugins.init dep baseContext
103
100
do ! dep.ReportingSinks |> ReportingSinks.init dep baseContext
104
101
105
- return ! TestHostScenario.initScenarios( dep, baseContext , defaultScnContext , sessionArgs, targetScenarios )
102
+ return ! TestHostScenario.initScenarios( dep, consoleStatus , baseContext , sessionArgs, regScenarios )
106
103
}
107
104
108
- let startWarmUp ( schedulers : ScenarioScheduler list ) = backgroundTask {
109
- let isWarmUp = true
110
- TestHostConsole.displayBombingProgress( dep.ApplicationType, schedulers, isWarmUp)
111
-
112
- let schedulersArray = schedulers |> List.toArray
113
- use schedulerTimer = new System.Timers.Timer( Constants.SchedulerTickIntervalMs)
114
- schedulerTimer.Elapsed.Add( fun _ ->
115
- schedulersArray
116
- |> Array.Parallel.iter( fun x ->
117
- x.ExecScheduler()
118
- x.UpdateProgress()
119
- )
120
- )
121
-
122
- schedulerTimer.Start()
123
- do ! schedulers |> List.map( fun x -> x.Start()) |> Task.WhenAll
124
- schedulerTimer.Stop()
125
-
126
- // wait on warmup progress bar to finish rendering
127
- do ! Task.Delay Constants.WarmUpFinishPause
128
- }
105
+ let startScenarios ( schedulers : ScenarioScheduler list ) ( reportingManager : IReportingManager option ) = backgroundTask {
129
106
130
- let startBombing ( schedulers : ScenarioScheduler list )
131
- ( reportingManager : IReportingManager ) = backgroundTask {
107
+ let isWarmUp = reportingManager.IsNone
132
108
133
- let isWarmUp = false
134
- TestHostConsole.displayBombingProgress( dep.ApplicationType, schedulers, isWarmUp)
109
+ if not isWarmUp then
110
+ dep.WorkerPlugins |> WorkerPlugins.start _ log
111
+ dep.ReportingSinks |> ReportingSinks.start _ log
135
112
136
- dep.WorkerPlugins |> WorkerPlugins.start _ log
137
- dep.ReportingSinks |> ReportingSinks.start _ log
113
+ use cancelToken = new CancellationTokenSource ()
114
+ schedulers |> TestHostConsole.LiveStatusTable.display cancelToken.Token isWarmUp
138
115
139
- reportingManager.Start()
116
+ if reportingManager.IsSome then reportingManager.Value .Start()
140
117
141
118
// waiting on all scenarios to finish
142
119
let schedulersArray = schedulers |> List.toArray
143
120
use schedulerTimer = new System.Timers.Timer( Constants.SchedulerTickIntervalMs)
144
- schedulerTimer.Elapsed.Add( fun _ ->
145
- schedulersArray
146
- |> Array.Parallel.iter( fun x ->
147
- x.ExecScheduler()
148
- x.UpdateProgress()
149
- )
150
- )
121
+ schedulerTimer.Elapsed.Add( fun _ -> schedulersArray |> Array.Parallel.iter( fun x -> x.ExecScheduler()))
151
122
152
123
schedulerTimer.Start()
153
124
do ! schedulers |> List.map( fun x -> x.Start()) |> Task.WhenAll
125
+ cancelToken.Cancel()
154
126
schedulerTimer.Stop()
155
127
156
- // wait on final metrics and reporting tick
157
- do ! Task.Delay Constants.ReportingTimerCompleteMs
128
+ if not isWarmUp then
129
+ // wait on final metrics and reporting tick
130
+ do ! Task.Delay Constants.ReportingTimerCompleteMs
158
131
159
- // waiting (in case of cluster) on all raw stats
160
- do ! reportingManager.Stop()
132
+ // waiting (in case of cluster) on all raw stats
133
+ do ! reportingManager.Value .Stop()
161
134
162
- do ! dep.WorkerPlugins |> WorkerPlugins.stop _ log
163
- do ! dep.ReportingSinks |> ReportingSinks.stop _ log
135
+ do ! dep.WorkerPlugins |> WorkerPlugins.stop _ log
136
+ do ! dep.ReportingSinks |> ReportingSinks.stop _ log
164
137
}
165
138
166
139
let cleanScenarios ( sessionArgs : SessionArgs ,
140
+ consoleStatus : StatusContext ,
167
141
cancelToken : CancellationToken ,
168
142
scenarios : Scenario list ) =
169
143
170
144
let baseContext = NBomberContext.createBaseContext( sessionArgs.TestInfo, getCurrentNodeInfo, cancelToken, _ log)
171
145
let defaultScnContext = Scenario.ScenarioContext.create baseContext
172
146
let enabledScenarios = scenarios |> List.filter( fun x -> x.IsEnabled)
173
- TestHostScenario.cleanScenarios dep baseContext defaultScnContext enabledScenarios
147
+ TestHostScenario.cleanScenarios dep consoleStatus baseContext defaultScnContext enabledScenarios
174
148
175
149
member _.SessionArgs = _ sessionArgs
176
150
member _.CurrentOperation = _ currentOperation
@@ -179,28 +153,30 @@ type internal TestHost(dep: IGlobalDependency,
179
153
member _.TargetScenarios = _ targetScenarios
180
154
member _.CurrentSchedulers = _ currentSchedulers
181
155
182
- member _.StartInit ( sessionArgs : SessionArgs ) = backgroundTask {
156
+ member _.StartInit ( sessionArgs : SessionArgs ) =
183
157
_ stopped <- false
184
158
_ currentOperation <- OperationType.Init
185
159
186
160
TestHostConsole.printContextInfo dep
187
161
_ log.Information " Starting init..."
188
- _ globalCancelToken.Dispose()
189
- _ globalCancelToken <- new CancellationTokenSource()
190
-
191
- match ! initScenarios sessionArgs _ globalCancelToken.Token with
192
- | Ok initializedScenarios ->
193
- _ log.Information " Init finished"
194
- _ targetScenarios <- initializedScenarios
195
- _ sessionArgs <- sessionArgs
196
- _ currentOperation <- OperationType.None
197
- return Ok _ targetScenarios
198
-
199
- | Error appError ->
200
- _ log.Error " Init failed"
201
- _ currentOperation <- OperationType.Stop
202
- return AppError.createResult appError
203
- }
162
+
163
+ TestHostConsole.displayStatus " Initializing scenarios..." ( fun consoleStatus -> backgroundTask {
164
+ use cancelToken = new CancellationTokenSource()
165
+ match ! initScenarios consoleStatus cancelToken.Token sessionArgs with
166
+ | Ok initializedScenarios ->
167
+ _ log.Information " Init finished"
168
+ cancelToken.Cancel()
169
+ _ targetScenarios <- initializedScenarios
170
+ _ sessionArgs <- sessionArgs
171
+ _ currentOperation <- OperationType.None
172
+ return Ok _ targetScenarios
173
+
174
+ | Error appError ->
175
+ _ log.Error " Init failed"
176
+ cancelToken.Cancel()
177
+ _ currentOperation <- OperationType.Stop
178
+ return AppError.createResult appError
179
+ })
204
180
205
181
member _.StartWarmUp ( scenarios : Scenario list , ? getScenarioClusterCount : ScenarioName -> int ) = backgroundTask {
206
182
_ stopped <- false
@@ -220,7 +196,7 @@ type internal TestHost(dep: IGlobalDependency,
220
196
221
197
_ currentSchedulers <- warmUpSchedulers
222
198
223
- do ! startWarmUp warmUpSchedulers
199
+ do ! startScenarios warmUpSchedulers None
224
200
stopSchedulers warmUpSchedulers
225
201
226
202
_ currentOperation <- OperationType.None
@@ -232,13 +208,13 @@ type internal TestHost(dep: IGlobalDependency,
232
208
_ currentSchedulers <- schedulers
233
209
234
210
_ log.Information " Starting bombing..."
235
- do ! startBombing schedulers reportingManager
211
+ do ! startScenarios schedulers ( Some reportingManager)
236
212
237
213
do ! this.StopScenarios()
238
214
_ currentOperation <- OperationType.Complete
239
215
}
240
216
241
- member _.StopScenarios ( [<Optional; DefaultParameterValue( " " : string) >] reason : string ) = backgroundTask {
217
+ member _.StopScenarios ( [<Optional; DefaultParameterValue( " " : string) >] reason : string ) =
242
218
if _ currentOperation <> OperationType.Stop && not _ stopped then
243
219
_ currentOperation <- OperationType.Stop
244
220
@@ -247,12 +223,17 @@ type internal TestHost(dep: IGlobalDependency,
247
223
else
248
224
_ log.Information " Stopping scenarios..."
249
225
250
- stopSchedulers _ currentSchedulers
251
- do ! cleanScenarios(_ sessionArgs, _ globalCancelToken.Token, _ targetScenarios)
226
+ TestHostConsole.displayStatus " Cleaning scenarios..." ( fun consoleStatus -> backgroundTask {
227
+ use cancelToken = new CancellationTokenSource()
228
+ stopSchedulers _ currentSchedulers
252
229
253
- _ stopped <- true
254
- _ currentOperation <- OperationType.None
255
- }
230
+ do ! cleanScenarios(_ sessionArgs, consoleStatus, cancelToken.Token, _ targetScenarios)
231
+
232
+ _ stopped <- true
233
+ _ currentOperation <- OperationType.None
234
+ })
235
+ else
236
+ Task.FromResult()
256
237
257
238
member _.CreateScenarioSchedulers ( scenarios : Scenario list ,
258
239
operation : ScenarioOperation ,
0 commit comments