Передача переменной на основе даты в действии электронной почты oozie для вложений

Я использую oozie для отправки электронных писем с вложениями. Я делаю, как показано ниже.

<workflow-app name="Email" xmlns="uri:oozie:workflow:0.5">
    <start to="email-0fdf"/>
    <kill name="Kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <action name="email-0fdf">
        <email xmlns="uri:oozie:email-action:0.2">
            <to>xxxxxxxxxxxxxxx@xxxxx</to>
            <subject>job success</subject>
            <content_type>text/plain</content_type>
            <attachment>/user/XXXX/logs/2017-05-03/exec.log</attachment>
        </email>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <end name="End"/>
</workflow-app>

Теперь в рабочем процессе возле <attachment>/user/XXXX/logs/2017-05-03/exec.log</attachment> дата всегда меняется.

Как я могу передать переменную, что при вызове рабочего процесса я хочу отправить вложение для этого конкретного дня.

отредактированный вопрос.

Мой сценарий оболочки:

#!/bin/bash

TIMESTAMP=`date "+%Y-%m-%d"`
path=/user/$USER/logging/${TIMESTAMP}/status/${TIMESTAMP}.fail_log

path1=/user/$USER/logging/`date -d "-1 days" '+%Y-%m-%d'`/status/`date -d "-1 days" '+%Y-%m-%d'`.fail_log

echo filePath=$path
echo filePath1=$path1

Мой новый рабочий процесс:

<workflow-app name="My_Workflow" xmlns="uri:oozie:workflow:0.5">
<start to="shell-05e6"/>
<kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="shell-05e6">
    <shell xmlns="uri:oozie:shell-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <exec>shell.sh</exec>
        <file>/user/xxxxx/oozie/email/lib/shell.sh#shell.sh</file>
          <capture-output/>
    </shell>
    <ok to="email-66c2"/>
    <error to="Kill"/>
</action>
<action name="email-66c2">
    <email xmlns="uri:oozie:email-action:0.2">
        <to>[email protected]</to>
        <subject>job status</subject>
        <body>job status ${wf:actionData('shell-05e6')['filePath']}</body>
        <content_type>text/plain</content_type> 
       <attachment>${wf:actionData('shell-05e6')['filePath']},${wf:actionData('shell-05e6')['filePath1']}</attachment>
    </email>
    <ok to="End"/>
    <error to="Kill"/>
</action>
<end name="End"/>

Now if there is no file at one of the location say either filepath or filepath1 then the email action is failing.

То, что я хочу, независимо от того, присутствует ли файл или нет, я хочу, чтобы действие электронной почты было успешным


person User12345    schedule 03.05.2017    source источник
comment
Дайте мне знать, какой подход вам нравится больше всего.   -  person Manish Saraf Bhardwaj    schedule 11.05.2017


Ответы (2)


Может быть два подхода к решению новых требований.

Подход #1 Добавить условное действие между действием оболочки и действием электронной почты

Действие оболочки будет выглядеть так:

path=/user/$USER/logging/${TIMESTAMP}/status/${TIMESTAMP}.fail_log
path1=/user/$USER/logging/`date -d "-1 days" '+%Y-%m-%d'`/status/`date -d "-1 days" '+%Y-%m-%d'`.fail_log

if [ -e "$path" ] && [ -e "$path1"]
then
    echo filePath=$path,$path1
elif [ -e "$path" ]
then
    echo filePath=$path
elif [ -e "$path1" ]
then
    echo filePath=$path1
else
    echo filePath=""
fi

условное действие будет выглядеть так:

if filePath = "" then
  call email_0 action # which has NO attachment tag.
else
  call email_2 action # which has attachment tag with two files.
end if

Ниже условного действия у вас будет два действия по электронной почте.

  1. с тегом вложения "<attachment>${wf:actionData('shell-05e6')['filePath']}</attachment>" и
  2. без тега прикрепления

Подход №2 Без условного действия.

Действие оболочки будет выглядеть так:

path=/user/$USER/logging/${TIMESTAMP}/status/${TIMESTAMP}.fail_log
path1=/user/$USER/logging/`date -d "-1 days" '+%Y-%m-%d'`/status/`date -d "-1 days" '+%Y-%m-%d'`.fail_log

if [ -e "$path" ] && [ -e "$path1"]
then
    echo filePath=$path,$path1
elif [ -e "$path" ]
then
    echo filePath=$path
elif [ -e "$path1" ]
then
    echo filePath=$path1
else
    echo filePath="/user/$USER/logging/No_Status_log.fail_log" # this is default file with no data. You have to create it only one time.
fi

При таком подходе всегда будет прикреплен один файл, даже если данные недоступны.

person Manish Saraf Bhardwaj    schedule 10.05.2017
comment
Просто хочу знать, какой подход вы будете следовать. - person Manish Saraf Bhardwaj; 11.05.2017
comment
Мне больше нравится второй подход - person User12345; 11.05.2017

Написать действие оболочки.

    #!/bin/sh
    #Need to write a code to find out file path. and assign to "fP".
    echo "filePath=$fP"   #Here "fP" is dynamically assign file path. 

Вы можете захватить выходные данные из сценария оболочки и передать их в действие электронной почты. В сценарии оболочки повторите свойство вроде 'filePath=$fP' и добавьте элемент захвата-вывода в действие оболочки. Это позволит вам захватить путь к файлу из сценария оболочки. В действии электронной почты вы можете передать захваченную переменную в качестве параметра как ${wf:actionData('shellAction')['filePath']}, где shellAction — это имя действия оболочки.

действие по электронной почте:

<attachment>${wf:actionData('shellAction')['filePath']}</attachment>
person Manish Saraf Bhardwaj    schedule 04.05.2017