/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive.scheduler.core;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.log4j.Logger;
import org.ow2.proactive.addons.email.exception.EmailException;
import org.ow2.proactive.scheduler.common.NotificationData;
import org.ow2.proactive.scheduler.common.SchedulerEvent;
import org.ow2.proactive.scheduler.common.job.JobInfo;
import org.ow2.proactive.scheduler.common.job.JobState;
import org.ow2.proactive.scheduler.core.properties.PASchedulerProperties;
import org.ow2.proactive.scheduler.util.JobLogger;
import org.ow2.proactive.scheduler.util.SendMail;
public class JobEmailNotification {
public static final String GENERIC_INFORMATION_KEY_EMAIL = "EMAIL";
public static final String GENERIC_INFORMATION_KEY_NOTIFICATION_EVENT = "NOTIFICATION_EVENTS";
private JobState jobState;
private SchedulerEvent eventType;
private SendMail sender;
private static final Logger logger = Logger.getLogger(JobEmailNotification.class);
private static final JobLogger jlogger = JobLogger.getInstance();
private static final String SUBJECT_TEMPLATE = "ProActive Job %s : %s";
private static final String BODY_TEMPLATE = "Job ID: %s\n" + "New Status: %s\n\n" + "--\n" +
"This email was auto-generated by ProActive Scheduling\n" +
"Hostname: %s";
public JobEmailNotification(JobState js, NotificationData<JobInfo> notification, SendMail sender) {
this.jobState = js;
this.eventType = notification.getEventType();
this.sender = sender;
}
public JobEmailNotification(JobState js, NotificationData<JobInfo> notification) {
this(js, notification, new SendMail());
}
public boolean doCheckAndSend() throws JobEmailNotificationException {
String jobStatus = jobState.getGenericInformation().get(GENERIC_INFORMATION_KEY_NOTIFICATION_EVENT);
List<String> jobStatusList = new ArrayList<>();
if (jobStatus != null) {
jobStatusList = Arrays.asList(jobStatus.toLowerCase().split("\\s*,\\s*"));
}
switch (eventType) {
case JOB_CHANGE_PRIORITY:
case JOB_IN_ERROR:
case JOB_PAUSED:
case JOB_PENDING_TO_FINISHED:
case JOB_PENDING_TO_RUNNING:
case JOB_RESTARTED_FROM_ERROR:
case JOB_RESUMED:
case JOB_RUNNING_TO_FINISHED:
case JOB_SUBMITTED:
break;
default:
logger.trace("Event not in the list of email notification, doing nothing");
return false;
}
if (!PASchedulerProperties.EMAIL_NOTIFICATIONS_ENABLED.getValueAsBoolean()) {
logger.debug("Notification emails disabled, doing nothing");
return false;
}
if (!jobStatusList.contains(eventType.toString().toLowerCase())) {
return false;
}
try {
sender.sender(getTo(), getSubject(), getBody());
return true;
} catch (EmailException e) {
throw new JobEmailNotificationException("Error sending email: " + e.getMessage(), e);
}
}
public void checkAndSend() {
try {
boolean sent = doCheckAndSend();
if (sent) {
jlogger.info(jobState.getId(), "sent notification email for finished job");
}
} catch (JobEmailNotificationException e) {
jlogger.warn(jobState.getId(), "failed to send email notification: " + e.getMessage());
logger.trace("Stack trace:", e);
}
}
private static String getFrom() throws JobEmailNotificationException {
String from = PASchedulerProperties.EMAIL_NOTIFICATIONS_SENDER_ADDRESS.getValueAsString();
if (from == null || from.isEmpty()) {
throw new JobEmailNotificationException("Sender address not set in scheduler configuration");
}
return from;
}
private String getTo() throws JobEmailNotificationException {
String to = jobState.getGenericInformation().get(GENERIC_INFORMATION_KEY_EMAIL);
if (to == null) {
throw new JobEmailNotificationException("Recipient address is not set in generic information");
}
return to;
}
private String getSubject() {
String jobID = jobState.getId().value();
String event = eventType.toString();
return String.format(SUBJECT_TEMPLATE, jobID, event);
}
private String getBody() {
String jobID = jobState.getId().value();
String status = jobState.getStatus().toString();
String hostname = "UNKNOWN";
try {
hostname = InetAddress.getLocalHost().getCanonicalHostName();
} catch (UnknownHostException e) {
logger.debug("Could not get hostname", e);
}
return String.format(BODY_TEMPLATE, jobID, status, hostname);
}
}