Skip to content

Commit 7617c49

Browse files
committed
separate actions in backend
1 parent 25321c4 commit 7617c49

File tree

18 files changed

+93
-51
lines changed

18 files changed

+93
-51
lines changed

designer/deployment-manager-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/OverridingProcessStateDefinitionManager.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ class OverridingProcessStateDefinitionManager(
2727
statusTooltipsPF: PartialFunction[StateStatus, String] = PartialFunction.empty,
2828
statusDescriptionsPF: PartialFunction[StateStatus, String] = PartialFunction.empty,
2929
customStateDefinitions: Map[StatusName, StateDefinitionDetails] = Map.empty,
30-
customVisibleActions: Option[List[ScenarioActionName]] = None,
30+
customVisibleActions: Option[Set[ScenarioActionName]] = None,
3131
customActionTooltips: Option[ScenarioStatusWithScenarioContext => Map[ScenarioActionName, String]] = None,
3232
) extends ProcessStateDefinitionManager {
3333

34-
override def visibleActions(input: ScenarioStatusWithScenarioContext): List[ScenarioActionName] =
35-
customVisibleActions.getOrElse(delegate.visibleActions(input))
34+
override def visibleActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
35+
delegate.visibleActions(input) ++ customVisibleActions.getOrElse(Set.empty)
3636

37-
override def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
38-
statusActionsPF.applyOrElse(input, delegate.statusActions)
37+
override def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
38+
statusActionsPF.applyOrElse(input, delegate.allowedActions)
3939

4040
override def actionTooltips(input: ScenarioStatusWithScenarioContext): Map[ScenarioActionName, String] =
4141
customActionTooltips.map(_(input)).getOrElse(delegate.actionTooltips(input))

designer/deployment-manager-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/ProcessStateDefinitionManager.scala

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package pl.touk.nussknacker.engine.api.deployment
22

33
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.{
4-
DefaultVisibleActions,
54
ScenarioStatusPresentationDetails,
65
ScenarioStatusWithScenarioContext
76
}
@@ -46,27 +45,27 @@ trait ProcessStateDefinitionManager {
4645
stateDefinitions(status.name).icon
4746

4847
/**
49-
* Actions that are applicable to scenario in general. They may be available only in particular states, as defined by `def statusActions`
48+
* Actions that are applicable to scenario in given state. They may be available to execute only in particular states, as defined by `def allowedActions`
5049
*/
51-
def visibleActions(input: ScenarioStatusWithScenarioContext): List[ScenarioActionName] = DefaultVisibleActions
50+
def visibleActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName]
5251

5352
/**
54-
* Custom tooltips for actions
53+
* Allowed transitions between states.
5554
*/
56-
def actionTooltips(input: ScenarioStatusWithScenarioContext): Map[ScenarioActionName, String] = Map.empty
55+
def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName]
5756

5857
/**
59-
* Allowed transitions between states.
60-
*/
61-
def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName]
58+
* Custom tooltips for actions
59+
*/
60+
def actionTooltips(input: ScenarioStatusWithScenarioContext): Map[ScenarioActionName, String] = Map.empty
6261

6362
/**
6463
* Returns presentations details of status
6564
*/
6665
def statusPresentation(input: ScenarioStatusWithScenarioContext): ScenarioStatusPresentationDetails = {
6766
ScenarioStatusPresentationDetails(
6867
visibleActions(input),
69-
statusActions(input),
68+
allowedActions(input),
7069
actionTooltips(input),
7170
statusIcon(input),
7271
statusTooltip(input),
@@ -92,7 +91,7 @@ object ProcessStateDefinitionManager {
9291
)
9392

9493
final case class ScenarioStatusPresentationDetails(
95-
visibleActions: List[ScenarioActionName],
94+
visibleActions: Set[ScenarioActionName],
9695
// This one is not exactly a part of presentation, it is rather a thing related with scenario lifecycle but for now it is kept here
9796
allowedActions: Set[ScenarioActionName],
9897
actionTooltips: Map[ScenarioActionName, String],

designer/deployment-manager-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/simple/SimpleProcessStateDefinitionManager.scala

+13-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@ import pl.touk.nussknacker.engine.api.deployment.{
66
StateDefinitionDetails,
77
StateStatus
88
}
9-
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.ScenarioStatusWithScenarioContext
9+
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.{
10+
DefaultVisibleActions,
11+
ScenarioStatusWithScenarioContext
12+
}
1013
import pl.touk.nussknacker.engine.api.deployment.ScenarioActionName.DefaultActions
1114
import pl.touk.nussknacker.engine.api.deployment.StateStatus.StatusName
12-
import pl.touk.nussknacker.engine.api.deployment.simple.SimpleStateStatus.{statusActionsPF, ProblemStateStatus}
15+
import pl.touk.nussknacker.engine.api.deployment.simple.SimpleStateStatus.{
16+
statusActionsPF,
17+
visibleActionsPF,
18+
ProblemStateStatus
19+
}
1320

1421
/**
1522
* Base [[ProcessStateDefinitionManager]] with basic state definitions and state transitions.
@@ -18,7 +25,10 @@ import pl.touk.nussknacker.engine.api.deployment.simple.SimpleStateStatus.{statu
1825
*/
1926
object SimpleProcessStateDefinitionManager extends ProcessStateDefinitionManager {
2027

21-
override def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
28+
override def visibleActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
29+
visibleActionsPF.lift(input.scenarioStatus).getOrElse(DefaultVisibleActions.toSet)
30+
31+
override def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] =
2232
statusActionsPF.lift(input.scenarioStatus).getOrElse(DefaultActions.toSet)
2333

2434
override def statusDescription(input: ScenarioStatusWithScenarioContext): String = statusDescription(

designer/deployment-manager-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/simple/SimpleStateStatus.scala

+25-2
Original file line numberDiff line numberDiff line change
@@ -102,21 +102,44 @@ object SimpleStateStatus {
102102
status
103103
)
104104

105+
// TODO: does it need to be PF?
106+
val visibleActionsPF: PartialFunction[StateStatus, Set[ScenarioActionName]] = {
107+
case SimpleStateStatus.Running =>
108+
Set(
109+
ScenarioActionName.Cancel,
110+
ScenarioActionName.Redeploy, // when running or cancelling we display redeploy instead of deploy
111+
ScenarioActionName.Pause,
112+
ScenarioActionName.Archive,
113+
ScenarioActionName.UnArchive,
114+
ScenarioActionName.Rename,
115+
)
116+
case SimpleStateStatus.DuringCancel =>
117+
Set(
118+
ScenarioActionName.Cancel,
119+
ScenarioActionName.Redeploy, // when running or cancelling we display redeploy instead of deploy
120+
ScenarioActionName.Pause,
121+
ScenarioActionName.Archive,
122+
ScenarioActionName.UnArchive,
123+
ScenarioActionName.Rename,
124+
)
125+
}
126+
127+
// TODO: does it need to be PF?
105128
val statusActionsPF: PartialFunction[StateStatus, Set[ScenarioActionName]] = {
106129
case SimpleStateStatus.NotDeployed =>
107130
Set(ScenarioActionName.Deploy, ScenarioActionName.Archive, ScenarioActionName.Rename)
108131
case SimpleStateStatus.DuringDeploy =>
109132
Set(ScenarioActionName.Deploy, ScenarioActionName.Cancel)
110133
case SimpleStateStatus.Running =>
111-
Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Deploy)
134+
Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Redeploy)
112135
case SimpleStateStatus.Canceled =>
113136
Set(ScenarioActionName.Deploy, ScenarioActionName.Archive, ScenarioActionName.Rename)
114137
case SimpleStateStatus.Restarting =>
115138
Set(ScenarioActionName.Deploy, ScenarioActionName.Cancel)
116139
case SimpleStateStatus.Finished =>
117140
Set(ScenarioActionName.Deploy, ScenarioActionName.Archive, ScenarioActionName.Rename)
118141
case SimpleStateStatus.DuringCancel =>
119-
Set(ScenarioActionName.Deploy, ScenarioActionName.Cancel)
142+
Set(ScenarioActionName.Redeploy, ScenarioActionName.Cancel)
120143
// When Failed - process is in terminal state in Flink and it doesn't require any cleanup in Flink, but in NK it does
121144
// - that's why Cancel action is available
122145
case SimpleStateStatus.ProblemStateStatus(_, allowedActions, _) => allowedActions

designer/deployment-manager-api/src/test/scala/pl/touk/nussknacker/engine/api/deployment/OverridingProcessStateDefinitionManagerTest.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import org.scalatest.matchers.should.Matchers
55
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.ScenarioStatusWithScenarioContext
66
import pl.touk.nussknacker.engine.api.deployment.StateDefinitionDetails.UnknownIcon
77
import pl.touk.nussknacker.engine.api.deployment.StateStatus.StatusName
8-
import pl.touk.nussknacker.engine.api.process.VersionId
98

109
class OverridingProcessStateDefinitionManagerTest extends AnyFunSuite with Matchers {
1110

@@ -29,7 +28,9 @@ class OverridingProcessStateDefinitionManagerTest extends AnyFunSuite with Match
2928
)
3029
)
3130

32-
override def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
31+
override def visibleActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
32+
33+
override def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
3334
}
3435

3536
test("should combine delegate state definitions with custom overrides") {

designer/deployment-manager-api/src/test/scala/pl/touk/nussknacker/engine/api/deployment/SimpleScenarioStatusDtoSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class SimpleScenarioStatusDtoSpec extends AnyFunSuiteLike with Matchers with Ins
2828

2929
test("scenario state should be running") {
3030
val state = statusPresentation(SimpleStateStatus.Running)
31-
state.allowedActions shouldBe Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Deploy)
31+
state.allowedActions shouldBe Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Redeploy)
3232
}
3333

3434
test("scenario state should be finished") {

designer/server/src/main/scala/pl/touk/nussknacker/ui/api/ScenarioStatusPresenter.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ScenarioStatusPresenter(dispatcher: DeploymentManagerDispatcher) {
3030
)
3131
ScenarioStatusDto(
3232
status = ScenarioStatusNameWrapperDto(scenarioStatus.name),
33-
visibleActions = presentation.visibleActions,
33+
visibleActions = presentation.visibleActions.toList.sortBy(_.value),
3434
allowedActions = presentation.allowedActions.toList.sortBy(_.value),
3535
actionTooltips = presentation.actionTooltips,
3636
icon = presentation.icon,

designer/server/src/main/scala/pl/touk/nussknacker/ui/config/scenariotoolbar/ToolbarButtonConfig.scala

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ object ToolbarButtonConfigType extends Enumeration {
4545
val ProcessSave: Value = Value("process-save")
4646
val ProcessCancel: Value = Value("process-cancel")
4747
val ProcessDeploy: Value = Value("process-deploy")
48+
val ProcessRedeploy: Value = Value("process-redeploy")
4849
val ProcessRunOffSchedule: Value = Value("process-run-off-schedule")
4950

5051
val EditUndo: Value = Value("edit-undo")

designer/server/src/main/scala/pl/touk/nussknacker/ui/process/deployment/scenariostatus/ScenarioStatusProvider.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class ScenarioStatusProvider(
124124
dispatcher
125125
.deploymentManagerUnsafe(processDetails.processingType)
126126
.processStateDefinitionManager
127-
.statusActions(
127+
.allowedActions(
128128
ScenarioStatusWithScenarioContext(
129129
scenarioStatus = scenarioStatus,
130130
deployedVersionId = processDetails.lastDeployedAction.map(_.processVersionId),

designer/server/src/main/scala/pl/touk/nussknacker/ui/process/periodic/PeriodicProcessStateDefinitionManager.scala

+4-7
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import pl.touk.nussknacker.engine.api.deployment.{
66
ScenarioActionName,
77
StateStatus
88
}
9-
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.{
10-
DefaultVisibleActions,
11-
ScenarioStatusWithScenarioContext
12-
}
9+
import pl.touk.nussknacker.engine.api.deployment.ProcessStateDefinitionManager.ScenarioStatusWithScenarioContext
1310
import pl.touk.nussknacker.ui.process.periodic.PeriodicProcessService.{
1411
MaxDeploymentsStatus,
1512
PeriodicDeploymentStatus,
@@ -24,13 +21,13 @@ class PeriodicProcessStateDefinitionManager(delegate: ProcessStateDefinitionMana
2421
statusTooltipsPF = PeriodicStateStatus.statusTooltipsPF,
2522
statusDescriptionsPF = PeriodicStateStatus.statusDescriptionsPF,
2623
customStateDefinitions = PeriodicStateStatus.customStateDefinitions,
27-
customVisibleActions = Some(DefaultVisibleActions ::: ScenarioActionName.RunOffSchedule :: Nil),
24+
customVisibleActions = Some(PeriodicStateStatus.customVisibleActions),
2825
customActionTooltips = Some(PeriodicStateStatus.customActionTooltips),
2926
delegate = delegate
3027
) {
3128

32-
override def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = {
33-
super.statusActions(
29+
override def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = {
30+
super.allowedActions(
3431
extractPeriodicStatus(input.scenarioStatus)
3532
.map(periodic => input.copy(scenarioStatus = periodic.mergedStatus))
3633
.getOrElse(input) // We have to handle also statuses resolved by core (for example NotDeployed)

designer/server/src/main/scala/pl/touk/nussknacker/ui/process/periodic/PeriodicStateStatus.scala

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ object PeriodicStateStatus {
3030

3131
val WaitingForScheduleStatus: StateStatus = StateStatus("WAITING_FOR_SCHEDULE")
3232

33+
val customVisibleActions: Set[ScenarioActionName] = Set(ScenarioActionName.RunOffSchedule)
34+
3335
val statusActionsPF: PartialFunction[ScenarioStatusWithScenarioContext, Set[ScenarioActionName]] =
3436
Function.unlift((input: ScenarioStatusWithScenarioContext) =>
3537
(input.scenarioStatus, input.deployedVersionId, input.currentlyPresentedVersionId) match {

designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ProcessesResourcesSpec.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,12 @@ import pl.touk.nussknacker.ui.api.description.scenarioActivity.Dtos.ScenarioActi
5656
NotAvailable
5757
}
5858
import pl.touk.nussknacker.ui.config.scenariotoolbar.CategoriesScenarioToolbarsConfigParser
59-
import pl.touk.nussknacker.ui.config.scenariotoolbar.ToolbarButtonConfigType.{CustomLink, ProcessDeploy, ProcessSave}
59+
import pl.touk.nussknacker.ui.config.scenariotoolbar.ToolbarButtonConfigType.{
60+
CustomLink,
61+
ProcessDeploy,
62+
ProcessRedeploy,
63+
ProcessSave
64+
}
6065
import pl.touk.nussknacker.ui.config.scenariotoolbar.ToolbarPanelTypeConfig.{
6166
CreatorPanel,
6267
ProcessActionsPanel,
@@ -1314,6 +1319,7 @@ class ProcessesResourcesSpec
13141319
List(
13151320
ToolbarButton(ProcessSave, None, None, None, None, disabled = true),
13161321
ToolbarButton(ProcessDeploy, None, None, None, None, disabled = false),
1322+
ToolbarButton(ProcessRedeploy, None, None, None, None, disabled = false),
13171323
ToolbarButton(
13181324
CustomLink,
13191325
Some("custom"),

designer/server/src/test/scala/pl/touk/nussknacker/ui/process/ProcessStateDefinitionServiceSpec.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ class ProcessStateDefinitionServiceSpec extends AnyFunSuite with Matchers {
159159
}
160160

161161
private val emptyStateDefinitionManager = new ProcessStateDefinitionManager {
162-
override def stateDefinitions: Map[StatusName, StateDefinitionDetails] = Map.empty
163-
override def statusActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
162+
override def stateDefinitions: Map[StatusName, StateDefinitionDetails] = Map.empty
163+
override def visibleActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
164+
override def allowedActions(input: ScenarioStatusWithScenarioContext): Set[ScenarioActionName] = Set.empty
164165
}
165166

166167
private def createProcessingTypeDataMap(

designer/server/src/test/scala/pl/touk/nussknacker/ui/process/deployment/DeploymentServiceSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ class DeploymentServiceSpec
932932
ProcessName("proces_" + UUID.randomUUID())
933933
}
934934

935-
private def getAllowedActions(status: StateStatus) = deploymentManager.processStateDefinitionManager.statusActions(
935+
private def getAllowedActions(status: StateStatus) = deploymentManager.processStateDefinitionManager.allowedActions(
936936
ScenarioStatusWithScenarioContext(
937937
scenarioStatus = status,
938938
deployedVersionId = None,

designer/server/src/test/scala/pl/touk/nussknacker/ui/process/periodic/flink/PeriodicDeploymentManagerTest.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class PeriodicDeploymentManagerTest
147147
scenarioStatus: StateStatus
148148
): Set[ScenarioActionName] = {
149149
periodicDeploymentManager.processStateDefinitionManager
150-
.statusActions(
150+
.allowedActions(
151151
ScenarioStatusWithScenarioContext(
152152
scenarioStatus = scenarioStatus,
153153
deployedVersionId = None,

engine/flink/kafka-components-utils/src/main/scala/pl/touk/nussknacker/engine/kafka/source/flink/FlinkKafkaSource.scala

+14-12
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ import pl.touk.nussknacker.engine.kafka.serialization.FlinkSerializationSchemaCo
3636
FlinkDeserializationSchemaWrapper
3737
}
3838
import pl.touk.nussknacker.engine.kafka.source.KafkaSourceFactory.KafkaTestParametersInfo
39-
import pl.touk.nussknacker.engine.kafka.source.flink.FlinkKafkaSource.OFFSET_RESET_STRATEGY_PARAM_NAME
39+
import pl.touk.nussknacker.engine.kafka.source.flink.FlinkKafkaSource.{
40+
OFFSET_RESET_STRATEGY_LABEL,
41+
OFFSET_RESET_STRATEGY_PARAM_NAME
42+
}
4043
import pl.touk.nussknacker.engine.util.parameters.TestingParametersSupport
4144

4245
import java.util
@@ -101,25 +104,23 @@ class FlinkKafkaSource[T](
101104
)
102105
),
103106
validators = None,
104-
label = Some("Offset reset strategy"),
107+
label = Some(OFFSET_RESET_STRATEGY_LABEL),
105108
hintText = None
106109
),
107110
),
108111
ScenarioActionName.Redeploy -> Map(
109-
OFFSET_RESET_STRATEGY_PARAM_NAME -> ParameterConfig(
112+
OFFSET_RESET_STRATEGY_PARAM_NAME -> StaticParameterConfig(
110113
defaultValue = Some(OffsetResetStrategy.None.toString),
111-
editor = Some(
112-
FixedValuesWithRadioParameterEditor(
113-
List(
114-
FixedExpressionValue(
115-
OffsetResetStrategy.None.toString,
116-
s"Resume reading where it previously stopped"
117-
),
118-
)
114+
editor = FixedValuesWithRadioParameterEditor(
115+
List(
116+
FixedExpressionValue(
117+
OffsetResetStrategy.None.toString,
118+
s"Resume reading where it previously stopped"
119+
),
119120
)
120121
),
121122
validators = None,
122-
label = Some("Offset reset strategy"),
123+
label = Some(OFFSET_RESET_STRATEGY_LABEL),
123124
hintText = None
124125
),
125126
),
@@ -218,6 +219,7 @@ class FlinkKafkaSource[T](
218219

219220
object FlinkKafkaSource {
220221
val OFFSET_RESET_STRATEGY_PARAM_NAME: ParameterName = ParameterName("offsetResetStrategy")
222+
val OFFSET_RESET_STRATEGY_LABEL: String = "Offset reset strategy"
221223
}
222224

223225
// TODO: Tricks like deserializationSchema.setExceptionHandlingData and FlinkKafkaConsumer overriding could be replaced by

engine/flink/management/src/test/scala/pl/touk/nussknacker/engine/management/FlinkScenarioStatusDtoSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class FlinkScenarioStatusDtoSpec extends AnyFunSuiteLike with Matchers with Insi
2828

2929
test("scenario state should be running") {
3030
val state = statusPresentation(SimpleStateStatus.Running)
31-
state.allowedActions shouldBe Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Deploy)
31+
state.allowedActions shouldBe Set(ScenarioActionName.Cancel, ScenarioActionName.Pause, ScenarioActionName.Redeploy)
3232
}
3333

3434
test("scenario state should be finished") {

extensions-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/ProcessAction.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ object ScenarioActionName {
9292
// In the meantime, there are methods serialize and deserialize, which operate on name RUN_OFF_SCHEDULE instead.
9393
val RunOffSchedule: ScenarioActionName = ScenarioActionName("run now")
9494

95-
// For now redeploy is used to handle different UI behaviour when deploy and redeploy actions must have different sets of parameters.
95+
// Distinguish behaviour for deploy and redeploy actions
9696
val Redeploy: ScenarioActionName = ScenarioActionName("REDEPLOY")
9797

9898
val DefaultActions: List[ScenarioActionName] = Nil

0 commit comments

Comments
 (0)