Skip to content

Commit

Permalink
#499 Added support for ScenarioPartition
Browse files Browse the repository at this point in the history
  • Loading branch information
AntyaDev committed Feb 10, 2023
1 parent 460e4da commit 29e53f9
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 52 deletions.
2 changes: 2 additions & 0 deletions src/NBomber/Contracts.fs
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@ type Measurement = {
type SessionArgs = {
TestInfo: TestInfo
NBomberConfig: NBomberConfig
ScenarioPartitions: Map<string,ScenarioPartition> // ScenarioName * ScenarioPartition
} with

static member empty = {
TestInfo = { SessionId = ""; TestSuite = ""; TestName = ""; ClusterId = "" }
NBomberConfig = Unchecked.defaultof<_>
ScenarioPartitions = Map.empty
}

member this.GetReportingInterval() = this.NBomberConfig.GlobalSettings.Value.ReportingInterval.Value
Expand Down
23 changes: 8 additions & 15 deletions src/NBomber/Domain/Scenario.fs
Original file line number Diff line number Diff line change
Expand Up @@ -56,28 +56,21 @@ module Validation =

module ScenarioInitContext =

let create (context: IBaseContext) = {
new IScenarioInitContext with
member _.TestInfo = context.TestInfo
member _.NodeInfo = context.GetNodeInfo()
member _.CustomSettings = ConfigurationBuilder().Build() :> IConfiguration
member _.Logger = context.Logger
}

let setCustomSettings (context: IScenarioInitContext) (customSettings: string) =

let create (context: IBaseContext) (customSettings: string) (partition: ScenarioPartition) =

let parseCustomSettings (settings: string) =
try
let stream = new MemoryStream(settings |> Encoding.UTF8.GetBytes)
ConfigurationBuilder().AddJsonStream(stream).Build() :> IConfiguration
with
| _ -> ConfigurationBuilder().Build() :> IConfiguration

{ new IScenarioInitContext with
{ new IScenarioInitContext with
member _.TestInfo = context.TestInfo
member _.NodeInfo = context.NodeInfo
member _.CustomSettings = parseCustomSettings(customSettings)
member _.Logger = context.Logger }
member _.NodeInfo = context.GetNodeInfo()
member _.CustomSettings = parseCustomSettings customSettings
member _.Logger = context.Logger
member _.ScenarioPartition = partition }

let createScenarioInfo (scenarioName: string, duration: TimeSpan, threadNumber: int, operation: ScenarioOperation) =
{ ThreadId = $"{scenarioName}_{threadNumber}"
Expand Down
2 changes: 1 addition & 1 deletion src/NBomber/DomainServices/NBomberContext.fs
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ let createSessionArgs (testInfo: TestInfo) (scenarios: DomainTypes.Scenario list
}
}

return { TestInfo = testInfo; NBomberConfig = nbConfig }
return { TestInfo = testInfo; NBomberConfig = nbConfig; ScenarioPartitions = Map.empty }
}

let createScenarios (context: NBomberContext) =
Expand Down
8 changes: 4 additions & 4 deletions src/NBomber/DomainServices/TestHost/TestHost.fs
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,13 @@ type internal TestHost(dep: IGlobalDependency, regScenarios: Scenario list) as t
return! TestHostScenario.initScenarios dep consoleStatus baseContext sessionArgs regScenarios
}

let startClean (sessionArgs: SessionArgs)
(consoleStatus: StatusContext option)
let startClean (consoleStatus: StatusContext option)
(sessionArgs: SessionArgs)
(scenarios: Scenario list) =

let baseContext = NBomberContext.createBaseContext sessionArgs.TestInfo getCurrentNodeInfo dep.Logger
let enabledScenarios = scenarios |> List.filter(fun x -> x.IsEnabled)
TestHostScenario.cleanScenarios dep consoleStatus baseContext enabledScenarios
TestHostScenario.cleanScenarios dep consoleStatus baseContext sessionArgs enabledScenarios

member _.SessionArgs = _sessionArgs
member _.CurrentOperation = _currentOperation
Expand Down Expand Up @@ -196,7 +196,7 @@ type internal TestHost(dep: IGlobalDependency, regScenarios: Scenario list) as t
TestHostConsole.displayStatus dep "Cleaning scenarios..." (fun consoleStatus -> backgroundTask {
stopSchedulers _currentSchedulers

do! startClean _sessionArgs consoleStatus _targetScenarios
do! startClean consoleStatus _sessionArgs _targetScenarios

_stopped <- true
_currentOperation <- OperationType.None
Expand Down
58 changes: 31 additions & 27 deletions src/NBomber/DomainServices/TestHost/TestHostScenario.fs
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,28 @@ let getTargetScenarios (sessionArgs: SessionArgs) (regScenarios: Scenario list)
let initEnabledScenarios (dep: IGlobalDependency)
(consoleStatus: StatusContext option)
(baseContext: IBaseContext)
(enabledScenarios: Scenario list) =

let defaultScnContext = Scenario.ScenarioInitContext.create baseContext

backgroundTask {
try
for scn in enabledScenarios do
if scn.Init.IsSome then
dep.LogInfo("Start init scenario: {0}", scn.ScenarioName)

if consoleStatus.IsSome then
consoleStatus.Value.Status <- $"Initializing scenario: {Console.okColor scn.ScenarioName}"
consoleStatus.Value.Refresh()

let scnContext = Scenario.ScenarioInitContext.setCustomSettings defaultScnContext scn.CustomSettings
do! scn.Init.Value scnContext

return Ok()
with
| ex -> return AppError.createResult(InitScenarioError ex)
}
(sessionArgs: SessionArgs)
(enabledScenarios: Scenario list) = backgroundTask {
try
for scn in enabledScenarios do
if scn.Init.IsSome then
dep.LogInfo("Start init scenario: {0}", scn.ScenarioName)

let initScnContext =
sessionArgs.ScenarioPartitions.TryFind scn.ScenarioName
|> Option.defaultValue ScenarioPartition.empty
|> Scenario.ScenarioInitContext.create baseContext scn.CustomSettings

if consoleStatus.IsSome then
consoleStatus.Value.Status <- $"Initializing scenario: {Console.okColor scn.ScenarioName}"
consoleStatus.Value.Refresh()

do! scn.Init.Value initScnContext

return Ok()
with
| ex -> return AppError.createResult(InitScenarioError ex)
}

let initScenarios (dep: IGlobalDependency)
(consoleStatus: StatusContext option)
Expand All @@ -51,7 +52,7 @@ let initScenarios (dep: IGlobalDependency)
TestHostConsole.printTargetScenarios dep enabledScenarios

do! enabledScenarios
|> initEnabledScenarios dep consoleStatus baseContext
|> initEnabledScenarios dep consoleStatus baseContext sessionArgs

return
targetScenarios
Expand All @@ -63,9 +64,8 @@ let initScenarios (dep: IGlobalDependency)
let cleanScenarios (dep: IGlobalDependency)
(consoleStatus: StatusContext option)
(baseContext: IBaseContext)
(enabledScenarios: Scenario list) = backgroundTask {

let defaultScnContext = Scenario.ScenarioInitContext.create baseContext
(sessionArgs: SessionArgs)
(enabledScenarios: Scenario list) = backgroundTask {

for scn in enabledScenarios do
if scn.Clean.IsSome then
Expand All @@ -75,9 +75,13 @@ let cleanScenarios (dep: IGlobalDependency)
consoleStatus.Value.Status <- $"Cleaning scenario: {Console.okColor scn.ScenarioName}"
consoleStatus.Value.Refresh()

let context = Scenario.ScenarioInitContext.setCustomSettings defaultScnContext scn.CustomSettings
let initScnContext =
sessionArgs.ScenarioPartitions.TryFind scn.ScenarioName
|> Option.defaultValue ScenarioPartition.empty
|> Scenario.ScenarioInitContext.create baseContext scn.CustomSettings

try
do! scn.Clean.Value context
do! scn.Clean.Value initScnContext
with
| ex -> dep.LogWarn(ex, "Cleaning scenario failed: {0}", scn.ScenarioName)
}
6 changes: 3 additions & 3 deletions src/NBomber/Extensions/Internal.fs
Original file line number Diff line number Diff line change
Expand Up @@ -187,13 +187,13 @@ module internal Internal =

module Dict =

let ofSeq (src: seq<'a*'b>) =
let d = new Dictionary<'a, 'b>()
let ofSeq<'K,'V when 'K : equality> (src: seq<'K*'V>) =
let d = Dictionary<_, _>()
for (k,v) in src do
d.Add(k,v)
d

let inline empty<'K,'V when 'K : equality>() =
let empty<'K,'V when 'K : equality>() =
Dictionary<'K,'V>()

namespace NBomber.Extensions.Operator
Expand Down
4 changes: 2 additions & 2 deletions src/NBomber/NBomber.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="NBomber.Contracts" Version="[4.0.0]" />
<PackageReference Include="NBomber.Contracts" Version="[4.1.0-beta.0]" />
<PackageReference Include="CommandLineParser" Version="2.8.0" />
<PackageReference Include="FsToolkit.ErrorHandling.TaskResult" Version="2.13.0" />
<PackageReference Include="FuncyDown" Version="1.3.0" />
Expand All @@ -92,6 +92,6 @@
<EmbeddedResource Include="Resources\HtmlReport\assets\css\sidebar.css" />
<EmbeddedResource Include="Resources\HtmlReport\assets\css\index.css" />
<EmbeddedResource Include="Resources\HtmlReport\index.html" />
</ItemGroup>
</ItemGroup>

</Project>

0 comments on commit 29e53f9

Please sign in to comment.