|
@@ -21,6 +21,7 @@ from ..common._utils import _Subscriber
|
|
from ..common.reason import Reason
|
|
from ..common.reason import Reason
|
|
from ..common.warn_if_inputs_not_ready import _warn_if_inputs_not_ready
|
|
from ..common.warn_if_inputs_not_ready import _warn_if_inputs_not_ready
|
|
from ..exceptions.exceptions import (
|
|
from ..exceptions.exceptions import (
|
|
|
|
+ InvalidSequence,
|
|
InvalidSequenceId,
|
|
InvalidSequenceId,
|
|
ModelNotFound,
|
|
ModelNotFound,
|
|
NonExistingSequence,
|
|
NonExistingSequence,
|
|
@@ -137,18 +138,8 @@ class _SequenceManager(_Manager[Sequence], _VersionMixin):
|
|
cls._logger.error(f"Sequence {sequence.id} belongs to a non-existing Scenario {scenario_id}.")
|
|
cls._logger.error(f"Sequence {sequence.id} belongs to a non-existing Scenario {scenario_id}.")
|
|
raise SequenceBelongsToNonExistingScenario(sequence.id, scenario_id)
|
|
raise SequenceBelongsToNonExistingScenario(sequence.id, scenario_id)
|
|
|
|
|
|
- @classmethod
|
|
|
|
- def _create(
|
|
|
|
- cls,
|
|
|
|
- sequence_name: str,
|
|
|
|
- tasks: Union[List[Task], List[TaskId]],
|
|
|
|
- subscribers: Optional[List[_Subscriber]] = None,
|
|
|
|
- properties: Optional[Dict] = None,
|
|
|
|
- scenario_id: Optional[ScenarioId] = None,
|
|
|
|
- version: Optional[str] = None,
|
|
|
|
- ) -> Sequence:
|
|
|
|
- sequence_id = Sequence._new_id(sequence_name, scenario_id)
|
|
|
|
-
|
|
|
|
|
|
+ @staticmethod
|
|
|
|
+ def __get_sequence_tasks(tasks: Union[List[Task], List[TaskId]]) -> List[Task]:
|
|
task_manager = _TaskManagerFactory._build_manager()
|
|
task_manager = _TaskManagerFactory._build_manager()
|
|
_tasks: List[Task] = []
|
|
_tasks: List[Task] = []
|
|
for task in tasks:
|
|
for task in tasks:
|
|
@@ -158,11 +149,24 @@ class _SequenceManager(_Manager[Sequence], _VersionMixin):
|
|
_tasks.append(_task)
|
|
_tasks.append(_task)
|
|
else:
|
|
else:
|
|
raise NonExistingTask(task)
|
|
raise NonExistingTask(task)
|
|
|
|
+ return _tasks
|
|
|
|
|
|
|
|
+ @classmethod
|
|
|
|
+ def _build_sequence(
|
|
|
|
+ cls,
|
|
|
|
+ sequence_name: str,
|
|
|
|
+ tasks: Union[List[Task], List[TaskId]],
|
|
|
|
+ subscribers: Optional[List[_Subscriber]] = None,
|
|
|
|
+ properties: Optional[Dict] = None,
|
|
|
|
+ scenario_id: Optional[ScenarioId] = None,
|
|
|
|
+ version: Optional[str] = None,
|
|
|
|
+ ) -> Sequence:
|
|
|
|
+ sequence_id = Sequence._new_id(sequence_name, scenario_id)
|
|
|
|
+ _tasks = cls.__get_sequence_tasks(tasks)
|
|
properties = properties if properties else {}
|
|
properties = properties if properties else {}
|
|
properties["name"] = sequence_name
|
|
properties["name"] = sequence_name
|
|
version = version if version else cls._get_latest_version()
|
|
version = version if version else cls._get_latest_version()
|
|
- sequence = Sequence(
|
|
|
|
|
|
+ return Sequence(
|
|
properties=properties,
|
|
properties=properties,
|
|
tasks=_tasks,
|
|
tasks=_tasks,
|
|
sequence_id=sequence_id,
|
|
sequence_id=sequence_id,
|
|
@@ -171,10 +175,52 @@ class _SequenceManager(_Manager[Sequence], _VersionMixin):
|
|
subscribers=subscribers,
|
|
subscribers=subscribers,
|
|
version=version,
|
|
version=version,
|
|
)
|
|
)
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def _bulk_create_from_scenario(cls, scenario: Scenario) -> Dict[str, Sequence]:
|
|
|
|
+ _sequences: Dict[str, Sequence] = {}
|
|
|
|
+
|
|
|
|
+ for sequence_name, sequence_data in scenario._sequences.items():
|
|
|
|
+ sequence = cls._create(
|
|
|
|
+ sequence_name,
|
|
|
|
+ sequence_data.get(scenario._SEQUENCE_TASKS_KEY, []),
|
|
|
|
+ sequence_data.get(scenario._SEQUENCE_SUBSCRIBERS_KEY, []),
|
|
|
|
+ sequence_data.get(scenario._SEQUENCE_PROPERTIES_KEY, {}),
|
|
|
|
+ scenario.id,
|
|
|
|
+ scenario.version,
|
|
|
|
+ )
|
|
|
|
+ if not isinstance(sequence, Sequence):
|
|
|
|
+ raise NonExistingSequence(sequence_name, scenario.id)
|
|
|
|
+ _sequences[sequence_name] = sequence
|
|
|
|
+
|
|
|
|
+ Notifier.publish(_make_event(sequence, EventOperation.CREATION))
|
|
|
|
+
|
|
|
|
+ return _sequences
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def _create(
|
|
|
|
+ cls,
|
|
|
|
+ sequence_name: str,
|
|
|
|
+ tasks: Union[List[Task], List[TaskId]],
|
|
|
|
+ subscribers: Optional[List[_Subscriber]] = None,
|
|
|
|
+ properties: Optional[Dict] = None,
|
|
|
|
+ scenario_id: Optional[ScenarioId] = None,
|
|
|
|
+ version: Optional[str] = None,
|
|
|
|
+ ) -> Sequence:
|
|
|
|
+ task_manager = _TaskManagerFactory._build_manager()
|
|
|
|
+ _tasks = cls.__get_sequence_tasks(tasks)
|
|
|
|
+
|
|
|
|
+ sequence = cls._build_sequence(sequence_name, _tasks, subscribers, properties, scenario_id, version)
|
|
|
|
+ sequence_id = sequence.id
|
|
|
|
+
|
|
for task in _tasks:
|
|
for task in _tasks:
|
|
if sequence_id not in task._parent_ids:
|
|
if sequence_id not in task._parent_ids:
|
|
task._parent_ids.update([sequence_id])
|
|
task._parent_ids.update([sequence_id])
|
|
task_manager._set(task)
|
|
task_manager._set(task)
|
|
|
|
+
|
|
|
|
+ if not sequence._is_consistent():
|
|
|
|
+ raise InvalidSequence(sequence.id)
|
|
|
|
+
|
|
return sequence
|
|
return sequence
|
|
|
|
|
|
@classmethod
|
|
@classmethod
|