def add(self, task: DAGNode) -> None: """Add a task to this TaskGroup. :meta private: """ from airflow.models.abstractoperator import AbstractOperator existing_tg = task.task_group if isinstance(task, AbstractOperator ) and existing_tg is not None and existing_tg != self: raise TaskAlreadyInTaskGroup(task.node_id, existing_tg.node_id, self.node_id) # Set the TG first, as setting it might change the return value of node_id! task.task_group = weakref.proxy(self) key = task.node_id if key in self.children: node_type = "Task" if hasattr(task, 'task_id') else "Task Group" raise DuplicateTaskIdFound( f"{node_type} id '{key}' has already been added to the DAG") if isinstance(task, TaskGroup): if self.dag: if task.dag is not None and self.dag is not task.dag: raise RuntimeError( "Cannot mix TaskGroups from different DAGs: %s and %s", self.dag, task.dag) task.dag = self.dag if task.children: raise AirflowException("Cannot add a non-empty TaskGroup") self.children[key] = task
def _remove(self, task: DAGNode) -> None: key = task.node_id if key not in self.children: raise KeyError(f"Node id {key!r} not part of this task group") self.used_group_ids.remove(key) del self.children[key] task.task_group = None
def add(self, task: DAGNode) -> None: """Add a task to this TaskGroup.""" key = task.node_id if key in self.children: node_type = "Task" if hasattr(task, 'task_id') else "Task Group" raise DuplicateTaskIdFound( f"{node_type} id '{key}' has already been added to the DAG") if isinstance(task, TaskGroup): if self.dag: if task.dag is not None and self.dag is not task.dag: raise RuntimeError( "Cannot mix TaskGroups from different DAGs: %s and %s", self.dag, task.dag) task.dag = self.dag if task.children: raise AirflowException("Cannot add a non-empty TaskGroup") self.children[key] = task task.task_group = weakref.proxy(self)