Hey everyone,

I hope I'm not late to the discussion. :)

IMO, there is a similarity between Airflow's Setup/Teardown and
Pytest's Setup/Teardown, and Pytest allows setup and teardown to exist
independently. There are cases where you might need one and not the other.
But I'm not sure of any airflow-specific concerns here.

Thanks,
Utkarsh

On Tue, Jul 4, 2023 at 3:45 PM Jarek Potiuk <ja...@potiuk.com> wrote:

> >  we require that a setup always have a teardown
>
> I'd personally prefer this one because "explicit is better than implicit".
> I see the cases where it could be useful (I was also contemplating no
> setup/no teardown before), but I think the wiggly behaviour is a recipe for
> a number of mistakes (and issues raised by users), especially when someone
> modifies existing DAG and adds teardown without realising the consequences.
>
> Not a strong preference, I am ok with both, but if I got to choose, I'd
> require teardown.
>
> J.
>
>
>
>
> On Fri, Jun 30, 2023 at 10:28 PM Daniel Standish
> <daniel.stand...@astronomer.io.invalid> wrote:
>
> > Ok want to pick back up setup / teardown discussion as we get closer to
> > 2.7.
> >
> > For personal reasons I had to take some time off work just as we were
> > wrapping up work on 2.6, and at least partly due to that, we punted
> setup /
> > teardown to 2.7.
> >
> > But we've picked it back up and continued along the path outlined in this
> > thread and things look good for 2.7.
> >
> > In the time since the previous discussion, not a lot has changed except
> > that we've implemented in main some of the things discussed.
> >
> > For one we added a one-liner syntax.
> >
> > So now if you have an existing dag such as this:
> >
> > create_cluster >> run_query >> delete_cluster
> >
> > You can convert it to use setup / teardown with the following:
> >
> > create_cluster >> run_query >>
> > delete_cluster.as_teardown(setups=create_cluster)
> >
> > The context manager suggested by Ash has been added, so if you have setup
> > `s` and teardown `t`, you can do the following:
> >
> > with s >> t:
> >     some_work(other_work())
> >
> > Notably, just as with task group context manager, you must instantiate
> the
> > task inside the context in order for it to be registered.  Ephraim is
> > working on some improvements to the context manager to address this (so
> > that you can explicitly add tasks to the context in that scenario) and so
> > that we can throw an error on non-sensical usages such as `with a >> b >>
> > c:`
> >
> > There is a docs PR outlining the current state of the feature here
> > <https://github.com/apache/airflow/pull/32169> and you are all welcome
> to
> > comment.  There's still time to make adjustments if desired.
> >
> > But I wanted to raise one point for discussion here.  It's something I
> > could have gone either way on, and I want to tap into the wisdom of the
> > community.
> >
> > The question of whether a setup with no teardown, or a teardown with no
> > setup, should be added.
> >
> > There are two options as I see it.
> >
> > Option 1: if a setup has no teardown, then all the downstreams are
> assumed
> > to be "in scope" for the setup
> > Note: the notion of "scope" is about the clearing behavior aspect of
> setup
> > / teardown: you clear a task, it clears its setups too.  A work task is
> in
> > the scope of s and t if it's between s and t.
> > So then with s1 >> w1 >> w2, clearing work task w1 would clear w1 w2 and
> > s1.
> > And clearing w2 would clear w2 and s1.
> > This makes it easy to have a setup with no teardown. But it makes the
> > behavior slightly more... wiggly... for lack of a better term.  With this
> > example, s1 is a setup for w2.  But then suppose you add a teardown after
> > w1: s1 >> w1 >> [w2, t1.as_teardown(setups=s1)].  Now s1 is not a setup
> for
> > w2.
> > So the logic is ... "a work task is in scope of a setup if it is in
> between
> > the setup and its teardown, *or *if the setup has no teardowns".
> >
> > Option 1: we require that a setup always have a teardown
> > With this approach, the rule is simpler and it forces unambiguously
> defined
> > scopes.  If you just want to use a setup and don't need a teardown task,
> > you add an empty teardown.  The rule is then "a work task is in scope of
> a
> > setup if it is in between the setup and its teardown" -- i.e. the same
> rule
> > minus the `or` clause.
> > So the example would have to be s1 >> w1 >> w2 >>
> > EmptyOperator().as_teardown(setups=s1).
> >
> > Thanks in advance for your engagement.
> >
> > P.S. note that those of us in the U.S. will be off for holiday soon so
> may
> > be slower to respond but just wanted to get this conversation started so
> > that we can get this feature to a place that people generally feel good
> > enough about in 2.7.
> >
> > P.P.S. Random-ish note... we should consider marking some features as
> beta
> > I think.  There's a difference between beta and experimental, though
> > historically we've only employed the latter.  But I think beta can be
> good
> > to signal "we are committed to this feature we just might make a change
> or
> > two to the API".  Not saying we should do this with setup / teardown
> > necessarily but it's an option.  Sometimes I think it can be a little
> > overwhelming to put out features with the spectre of being locked in by
> > backcompat guarantees and perhaps something like a beta feature could be
> a
> > way to get things out there a little bit more freely and allow for a
> > feedback loop.
> >
> > Thanks again,
> >
> > Daniel
> >
>

Reply via email to