Interesting! So, is it accurate to say that all Python functions get their 
context for free? I never thought of trying a:

def create_cmds(**context):
   print(context)

say_hi = KubernetesPodOperator.partial(
        image="alpine",
        cmds=["/bin/sh", "-c"],
        task_id='test',
        name='test'
    ).expand(arguments=create_cmds())

Just to see what, if any, was available in the context object, because I didn’t 
think this was a freebie outside of using the PythonOperator as a task with the 
provide_context arg set. I’ll give this a try!

As far as the Cartesian product question, I haven’t wrapped my head around 
exactly how I’d want to architect this, for now I’m just trying to see what 
options are available.





> On Jun 15, 2022, at 12:33 PM, Daniel Standish <[email protected]> 
> wrote:
> 
> Yeah it does seem that templating does not work with expanded params at the 
> moment.  No promises but I would bet this will change at some point.  Seems 
> reasonable and I can't think of a technical problem.
> 
> Tal's approach looks good.  I came up with basically the same thing when 
> testing this out:
> @dag.task
> def gen_vars(ds=None):
>     return [{"MY_VAR": ds} for x in range(3)]
> 
> op2 = BashOperator.partial(task_id='task_mapped', bash_command="echo 
> $MY_VAR",).expand(
>     env=gen_vars(),
> )
> One thing I noticed in your example was, it appears, maybe you are mapping 
> from two upstream tasks, for two mapped arguments.  You may have noticed, 
> this will result in a cartesian product (maybe this is desirable for you?).  
> This is an area we are actively working on, so that you can provide multiple 
> kwargs to map from a single task.
> 
> 
> 
> On Wed, Jun 15, 2022 at 3:36 AM Tal Nagar <[email protected] 
> <mailto:[email protected]>> wrote:
> Hi Joe
> 
> Not sure if it's the recommended way to do it, however what worked for me is 
> rendering the templates in a python task and not directly in the 
> KubernetesPodOperator.
> 
> For example:
> 
>  
> 
>     @task()
> 
>     def create_cmds(**context):
> 
>         run_params = context["params"]
> 
>         size = int(run_params['size'])
> 
>         arr = []
> 
>         for s in range(int(size)):
> 
>             arr.append([f'echo hi {s}'])
> 
>         return arr
> 
>  
> 
>     say_hi = KubernetesPodOperator.partial(
> 
>         image="alpine",
> 
>         cmds=["/bin/sh", "-c"],
> 
>         task_id='test',
> 
>         name='test'
> 
>     ).expand(arguments=create_cmds())
> 
>  
> 
> From: Joe Auty <[email protected] <mailto:[email protected]>> 
> Sent: Tuesday, June 14, 2022 10:03 AM
> To: [email protected] <mailto:[email protected]>
> Subject: Templated fields and dynamic task mapping
> 
>  
> 
> Hello,
> 
> I'm trying to understand the docs here: 
> https://airflow.apache.org/docs/apache-airflow/2.3.2/concepts/dynamic-task-mapping.html#how-do-templated-fields-and-mapped-arguments-interact
>  
> <https://airflow.apache.org/docs/apache-airflow/2.3.2/concepts/dynamic-task-mapping.html#how-do-templated-fields-and-mapped-arguments-interact>
>  , specifically this section:
> 
> 
> 
> If you want to interpolate values either call task.render_template yourself, 
> or use interpolation:
> 
> 
> In the example in the previous section of what doesn't work we have:
> 
> 
> printer.expand(val=make_list())
> 
> What should the corrected version of this line be? IOW, how would I call 
> make_list passing in the context so that I can send templated fields to my 
> mapping function? Here is a more specific use case:
> 
> 
> 
> KubernetesPodOperator.partial(
>         task_id="schema-dump-input",
>         namespace=NAMESPACE,
>         image=REGISTRY_URL + "/postgres-client:12",
>         name="pg-schemadump",
>         in_cluster=True,
>         hostnetwork=False,
>         max_active_tis_per_dag=1,
>         dag=dag
>     ).expand(
>         cmds=schema_dump_input_cmds(ds),
>         env_vars=schema_dump_input_env_vars(ds)
>     )
> 
> In this example, ds has no value of course because it is not defined 
> anywhere, and of course {{ ds }} doesn't work either (this doesn't get 
> interpolated and is registered as literally "{{ ds }}"). How can I pass in a 
> templated field, such as {{ ds }}?
> 
> Thanks very much in advance!
> 
> 
> 
> 
> This message contains information that may be confidential. If you are not 
> the intended recipient, please delete it immediately and notify us at 
> [email protected] <mailto:[email protected]>. Please note that any disclosure 
> or copying of its content is forbidden
> 

Reply via email to