2016-07-25 10 views
1

Apache Oozie имеет свойство oozie.wf.workflow.notification.url, чтобы уведомлять пользовательские конечные точки о обновлениях статуса работы.Добавить auth в уведомление рабочего процесса Oozie

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

У меня есть случай, когда использование конечная точка должна проходить проверку подлинности входящих запросов и я не могу найти решение, которое позволяет мне настроить Oozie так, что он будет посылать заголовки аутентификации для этого уведомления URL (Basic Auth, например) , Есть ли способ сделать это?

ответ

1

Сомневаюсь, что вы можете это сделать, используя oozie.wf.workflow.notification.url при текущем состоянии oozie. Я проверил 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 (сам http-вызов в суперклассе WorkflowNotificationXCommand с использованием переменной proxyConf):

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. Когда я получаю уведомление от задания, я могу убедиться, что он не приходит от злоумышленника, сравнивая секретные ключи.

 Смежные вопросы

  • Нет связанных вопросов^_^