2016-07-25 25 views
1

Apache Oozieには、カスタムエンドポイントにジョブステータスの更新を通知するためのプロパティーがoozie.wf.workflow.notification.urlにあります。Oozieワークフロー通知に認証を追加します

<property> 
    <name>oozie.wf.workflow.notification.url</name> 
    <value>http://SERVER:8080/endpoint/oozieUpdate?jobId=$jobId%26status=$status</value> 
</property> 

私はエンドポイントが着信要求を認証しなければならないユースケースを持っていると私はそれがこの通知のURLに認証ヘッダーを送信するように、私はOozieを設定することを可能にする解決策を見つけることができません(基本認証など) 。それを行う方法はありますか?

答えて

1

これは、現時点ではoozie.wf.workflow.notification.urlを使用して行うことができますか?私はoozie source codeをチェックして、この発見した:

org.apache.oozie.client.OozieClient(定数に読んプロパティ):

public static final String WORKFLOW_NOTIFICATION_URL = "oozie.wf.workflow.notification.url"; 

org.apache.oozie.command.wf.WorkflowNotificationXCommand(定数はproxyConf変数を形成するために使用される):

public WorkflowNotificationXCommand(WorkflowJobBean workflow) { 
    super("job.notification", "job.notification", 0); 
    ParamChecker.notNull(workflow, "workflow"); 
    jobId = workflow.getId(); 
    url = workflow.getWorkflowInstance().getConf().get(OozieClient.WORKFLOW_NOTIFICATION_URL); 
    if (url != null) { 
     url = url.replaceAll(JOB_ID_PATTERN, workflow.getId()); 
     url = url.replaceAll(STATUS_PATTERN, workflow.getStatus().toString()); 
     proxyConf = workflow.getWorkflowInstance().getConf() 
       .get(OozieClient.WORKFLOW_NOTIFICATION_PROXY, ConfigurationService.get(NOTIFICATION_PROXY_KEY)); 
     LOG.debug("Proxy :" + proxyConf); 
    } 
} 

org.apache.oozie.command.NotificationXCommand(proxyConf変数を使用したWorkflowNotificationXCommandのスーパークラスのhttp呼び出し自体):

protected void sendNotification() { 
    if (url != null) { 
     Proxy proxy = getProxy(proxyConf); 
     try { 
      URL url = new URL(this.url); 
      HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(proxy); 
      urlConn.setConnectTimeout(getTimeOut()); 
      urlConn.setReadTimeout(getTimeOut()); 
      if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       handleRetry(); 
      } 
     } 
     catch (IOException ex) { 
      handleRetry(); 
     } 
    } 
    else { 
     LOG.info("No Notification URL is defined. Therefore nothing to notify for job " + jobId); 

    } 

} 

ご覧のとおり、httpURLConnection.setRequestProperty(,)を使用してヘッダーは設定されていません。

カスタムJavaアクションを使用して回避策を行うことはできますが、任意のヘッダーを使用してhttpコールを行うことができます。

1

回避策として、通知URLの置換変数を作成します。

<property> 
    <name>oozie.wf.workflow.notification.url</name> 
    <value>_NOTIFICATION_URL_</value> 
</property> 

次に、私がジョブを実行するたびに、別の秘密鍵をURLの中に含めます。

confXml.replaceAll("_NOTIFICATION_URL_", server + "/" + getRandomSecret()); 

この場合のトラストアンカーはHTTPSです。私が仕事からの通知を受け取ったとき、私はそれが秘密鍵を比較することによって攻撃者から来ていないことを確かめることができます。

関連する問題